Libraries
@veltdev/node
October 9, 2026
New Features
- [REST API]: Added typed response envelopes.
VeltApiResponse<TResult>is{ result?: TResult; error?: VeltApiErrorBody };TResultisApiResultfor most services,unknownformemory,Approval*Resultforapproval(listDefinitionsandlistExecutionspage bynextCursor), andAskAiResultforrewriter.askAi. The envelope types andRestUserare exported from the package root. Learn more →
Improvements
-
[REST API]: Corrected
AccessTypeto'public' | 'organizationPrivate' | 'restricted'. The removed values'private'and'organizationPublic'were always rejected by the API. Learn more → -
[REST API]: Corrected
AccessRoleto'editor' | 'viewer'. REST user fields (addUsers,updateUsers,addPermissions,from,assignedTo,actionUser,notifyUsers) now takeRestUser, where each contact needsuserIdand a role needsid. Learn more → -
[Comments]: Marked
Location.idas required. Comment annotationstatusneedsid,nameandtype('default' | 'ongoing' | 'terminal'),priorityneedsidandname,visibilityneedsorganizationIdfororganizationPrivateanduserIdsforrestricted, andpageInfoneedsurlandpath. Learn more → -
[REST API]: Corrected
updateActivities: items are identified byid(activityIdstays as a deprecated alias),changesis a record keyed by field name (the 2.0.x type declared it as an array), and acustomactivity requirestargetEntityId. Learn more → -
[REST API]: Corrected
createAgent:description,enabled,contextGathering(withstrategies) andexecutionare required, andinstructionsunlessexecutionStrategyis'service'.postProcess.pinResolutionis rejected by the API and typednever. Learn more → -
[Access Control]: Corrected
getPermissions: at least one offolderIdsordocumentIdsis required. Learn more → -
[REST API]: Replaced the shared
UserwithRestUserin REST user fields (addUsers,updateUsers,addPermissions,from,assignedTo,actionUser,notifyUsers). A variable typed asUsermust match theRestUsershape before you pass it. Runtime behavior is unchanged. -
[REST API]: Changed
ActivityInputandCreateAgentRequestto type aliases (unions). An interface can no longerextendsthem; use an intersection type instead. -
[REST API]: Deprecated the top-level
status,messageandnextPageTokenonVeltApiResponse. The API never sent them; readresult.status,result.messageandresult.nextPageToken. They are removed in the next major.
Bug Fixes
- [REST API]: Fixed
createAgentcalls that followed the 2.0.x type being rejected for missing fields. The type now matches what the API requires. Learn more →
September 30, 2026
Improvements
- [Self Hosting]: Added a typed
contextfield toPartialCommentAnnotation. Velt client 6.0.17+ sends the TipTap anchor text to the comment resolver ascontext.textEditorConfig.textand reads it back fromgetComments;saveCommentsandgetCommentspass it through unchanged. No API change. Learn more →
September 25, 2026
Improvements
- [Core]: Corrected the README shipped in the npm package. It now covers PostgreSQL, the optional database drivers, and the install error at
initialize(). No API change. Learn more →
September 24, 2026
Breaking Changes
-
[Core]: The database driver is now checked at
initialize(). A config with adatabaseblock fails at startup when its driver is not installed, with the command to run, for examplePostgreSQL support requires 'npm install pg'. If you only callsdk.api.*, remove thedatabaseblock. Learn more → -
[Self Hosting]:
saveAttachmentnow stores a closed set of fields:attachmentId,file,name,mimeType, andmetadatawith its known keys. Other fields, a top-levelurl, and null metadata keys are no longer stored, and a save without afileURL or file data returns 400. Learn more → -
[Self Hosting]: An empty
organizationIdingetComments,getReactions,getRecorderAnnotations, andgetNotificationsnow returns 400 witherrorCode: 'INVALID_INPUT'. Learn more → -
[Core]: An unknown
database.typenow throws atinitialize(). A second SDK instance pointed at a different database withoutawait sdk.close()now throws at its firstsdk.selfHosting.*call. Learn more →
New Features
-
[Self Hosting]: Added a PostgreSQL backend. Set
database: { type: 'postgresql', connection_string: 'postgresql://...' }and everysdk.selfHosting.*method behaves as it does on MongoDB. Each collection is a table with one JSONBdatacolumn; the SDK creates the schema, tables, and indexes on first connection (manage_schema: true). Installpgalongside the SDK. Learn more → -
[Self Hosting]: Added
postgresSchemaSql(config), which returns the PostgreSQL DDL for your config. Hand it to a migration role when your application role cannot create tables and you setmanage_schema: false. Learn more → -
[Self Hosting]: Added
resolveUserIdsByEmail()to the users service. It resolves a list of email addresses to user IDs for the frontend’s anonymous-user data provider and returns a map of email to user ID. Learn more → -
[Self Hosting]: Added
sdk.selfHosting.database, which resolves to the connected adapter for the configured database. Use it for a readiness check or to write data the resolvers do not write, such as seeding users. Learn more → -
[Core]: Added REST-only initialization.
VeltSDK.initialize({ apiKey, authToken })without adatabaseblock now works and servessdk.api.*. Learn more →
Improvements
-
[Core]: Made both database drivers optional peer dependencies. Install
@veltdev/nodealone for the REST API backend, and addmongodborpgfor self-hosting. Learn more → -
[Self Hosting]: A MongoDB
connection_stringalone is now enough; the database name comes from its path. An explicitdatabase_nameoverrides the database in the connection string on both backends. Learn more → -
[Self Hosting]:
pool_min_sizeandpool_max_sizenow apply to MongoDB as well as PostgreSQL and are validated atinitialize(). MongoDB defaults are unchanged. Learn more →
Bug Fixes
-
[Core]: Fixed
import { VeltSDK } from '@veltdev/node'failing on Node 18 and on Node 20 before 20.19. ES module imports now load on every supported Node version. No API change. - [Self Hosting]: Fixed an issue where two concurrent saves of the same annotation on MongoDB could fail with a duplicate-key error. The losing write is now retried once and both succeed. No API change.
August 10, 2026
Breaking Changes
-
Removed request fields that the API does not accept: Seven fields are removed from request types because the API ignored them — they never had the effect their names implied. Each has a documented replacement:
No working request changes behaviour — these fields were inert. TypeScript will flag every affected call site at compile time. Learn more →
New Features
-
Agent filters on
getCommentAnnotations:sdk.api.commentAnnotations.getCommentAnnotations()now acceptsagentId,executionId,agentType,agentSource,agentSuggestions, andagentCommentsto scope a listing to agent-authored annotations. Supply at most one per request. Agent filtering is annotation-scoped and requires advanced queries to be enabled on your workspace. Learn more → -
veltUserIds,veltAllOrganizationsanduniqueIdongetAllUserData:sdk.api.gdpr.getAllUserData()acceptsveltUserIdsto fetch data for a set of Velt-side user IDs,veltAllOrganizationsto span every organization rather than one, anduniqueIdas a correlation value echoed back on the response. Learn more → -
skipResourceExistenceValidationongetPermissions:sdk.api.accessControl.getPermissions()acceptsskipResourceExistenceValidationto skip the existence check on the supplied folder/document IDs. Whenfalse(the default) the API errors if any ID does not resolve. Learn more →
Bug Fixes
- Agent-filtered annotation counts no longer return unfiltered totals:
getCommentAnnotationsCount()previously accepted anagentFieldsfilter that the API silently ignored, so the returned count covered all annotations rather than the agent-scoped subset — with nothing in the response to indicate it. The count endpoint does not support agent filtering; to count a filtered subset, list with the agent filters above and count the result. Learn more →
August 10, 2026
Breaking Changes
- Approval loop types removed:
ApprovalLoop,ApprovalLoopRejectTrigger,ApprovalLoopExhaustionPolicy,ApprovalHumanNodeOnReject, andApprovalHumanNodeOnRejectLoopBackare removed. Loop regions are no longer part of the workflow definition contract — the API had already been rejecting definitions that carried aloopsarray or a per-nodeonReject, so no working definition changes behaviour. Express loops as edges instead: anon: 'reject'back-edge carrying aloopobject, for example{ from: 'review', to: 'draft', on: 'reject', loop: { maxIterations: 3 } }. Learn more →
New Features
-
Approval Workflows — notification nodes: New
ApprovalNotificationNodeandApprovalNotificationNodeConfigsend a formatted email or Slack message built from upstream step output.recipientsis required forchannel: 'email',slackTargetforchannel: 'slack', andformataccepts'text','html', or'slack-blocks'(Slack only). Learn more → -
Approval Workflows — installable-app triggers: New
ApprovalAppTriggerbinds a definition to a connected GitHub App or Vercel Integration, withrepoFilter,projectFilter,allowedEvents, andpayloadFilters(ApprovalAppTriggerPayloadFilter) to gate on values inside the provider’s webhook body. A trigger drives at most one mechanism —inboundWebhook,schedule, andappTriggerare mutually exclusive. Learn more → -
Approval Workflows — scheduled triggers: New
ApprovalScheduleTriggerstarts an execution on a cron schedule, withcron,timezone(IANA),enabled, and an optional staticpayloadTemplatemerged into the dispatched trigger context. Learn more → -
Approval Workflows —
purgeondeleteDefinition: Passpurge: trueto hard-delete a definition and its version snapshots instead of leaving a tombstone. Both paths free the definition ID for re-creation; the response echoespurgedso you can tell which ran. Learn more → -
Approval Workflows — static agent-node URLs: Agent nodes accept a static
url, andurlPathis relaxed from required to optional. One of the two must be present;urltakes precedence when both are supplied. Learn more → -
Comment Annotations — agent-scoped delete filters:
deleteCommentAnnotations()acceptsagentSuggestions(fresh, unaccepted suggestions),agentId(a specific agent’s annotations), andagentUrls(a list of page URLs, matched as an OR-group). All three combine, so a crawl can delete “this agent’s still-pending suggestions for these pages” without affecting a concurrent batch. They require advanced queries on your workspace; when unavailable the API fails closed rather than widening to a document-wide delete. Learn more → -
Comment Annotations — suggestion payloads: New
CommentAnnotationSuggestionandCommentAnnotationSuggestionStatustypes, pluspageInfo, on the add and update paths. On add,statusis server-owned and always stamped'pending'; on update (updatedData.suggestion) the object is replaced wholesale andstatusis honored.documentIdsis also accepted on the annotation count request. Learn more → -
Agents — per-execution AI configuration: New
AgentAiConfigon an agent’s execution settings (provider,responseMimeType,maxToolTurns), andAgentAiConfigOverridewithAgentLlmProvider('gemini' | 'claude' | 'openai') onrunExecution()for per-run overrides including adefaultModelsper-provider policy map. The override requires at least one field — an empty object is rejected. Learn more → -
Agents —
deviceTypeandannotationVisibility:runExecution()acceptsdeviceType('mobile' | 'desktop', defaults to desktop) to choose the emulated device, andannotationVisibility('public' | 'private', defaults to private) to control who can see the annotations the run creates. Learn more → -
Agents —
partialexecution status:AgentExecutionStatusadds'partial'for a mixed outcome, where the run produced usable results but at least one URL or batch failed. It is distinct from'error', which is reserved for total failures. Learn more → -
Documents — metadata filters on
getDocumentsCount:getDocumentsCount()accepts the samefiltersarray asgetDocuments()(up to 10 entries; keys auto-prefixed withmetadata.unless already prefixed). It cannot be combined withexcludeFolderDocs. When filters are sent the response includesfiltersApplied— afalsevalue means the filtered aggregate failed andcountis an unfiltered fallback. Learn more → -
Memory —
includeRulesonsearchKnowledge: SetincludeRules: trueto additionally search the workspace’s extracted-rules corpus and merge those hits with knowledge-chunk results. Each result then carries akindof'chunk'or'rule', and rule hits also carryruleIdand an optionalcategory. Omitting it returns the previous chunk-only shape, andlimitbecomes the combined cap across both corpora. Learn more →
June 19, 2026
New Features
-
CommentResolverSaveEventenum: New enum with 14 additional non-core comment save events (status change, priority change, assign, approve, comment-level reactions, subscribe/unsubscribe, and more) that the Velt frontend can opt into sending to the save resolver endpoint viaResolverConfig.additionalSaveEvents. Theeventfield onSaveCommentResolverRequestis widened fromResolverActionstoResolverActions | CommentResolverSaveEvent | string— fully additive, so every existing value remains assignable. New export from@veltdev/node. Learn more → -
targetCommentonSaveCommentResolverRequest: New optionaltargetComment?: PartialCommentfield carrying the comment the action occurred on, resolved by the frontend fromcommentId. It is request context for your handler only and is never persisted bysaveComments. Learn more → -
Resolver token verify helper (
sdk.selfHosting.verifyToken): New fail-closed helper that verifies the auth credential the Velt frontend forwards to endpoint-based resolvers. The helper itself does not open or query MongoDB; in@veltdev/node@1.0.7,VeltSDK.initializestill validates the top-leveldatabaseconfig before you can accesssdk.selfHosting. Supports built-in JWT/JWKS verification (via the optionaljosepeer dependency, pinned to^5for Node 18) and custom callbacks, and is authentication only — it never makes an authorization decision. Configured via the new optionalresolverAuthonVeltConfig. New exports:VerifyTokenResult,RESOLVER_AUTH_ERROR_CODES,ResolverAuthErrorCode,ResolverAuthConfig,ResolverAuthJwtConfig,ResolverAuthVerifyCallback,ResolverAuthService. Learn more →
June 16, 2026
Breaking Changes
PartialReactionAnnotation.userrenamed tofrom: The reacting-user field onPartialReactionAnnotationis renamed fromusertofrom, matching the Velt frontend SDK’sPartialReactionAnnotation.from(andReactionAnnotation.from). This affects self-hosting reaction resolvers (sdk.selfHosting.getReactions()):saveReactions()now persists the reacting user underfrom, and resolved reactions exposefrom. Code that reads or writes the reacting user must usefrominstead ofuser. Learn more →
June 16, 2026
New Features
-
Opt-in field allowlist for REST add/update methods: The add/update methods on
activities,commentAnnotations(including comment-level add/update), andnotificationsnow accept an optionalFieldFilterOptionssecond argument. Passing{ filterUnknownFields: true }narrows the request to exactly the fields the backend endpoint accepts and silently drops unknown keys. It is off by default, fail-open (a filter error never blocks a write), and top-level scoped, so nested open-typed objects likeactionUserandcontextpass through whole. Learn more → -
New field-allowlist exports: A new field-allowlist module exported from
@veltdev/nodeexposes the filter primitives (filterRequest,pickKnownFields), theFilterSpecandFieldFilterOptionstypes, and the per-method specs (ADD_ACTIVITIES_SPEC,UPDATE_ACTIVITIES_SPEC,ADD_COMMENT_ANNOTATIONS_SPEC,UPDATE_COMMENT_ANNOTATIONS_SPEC,ADD_COMMENTS_SPEC,UPDATE_COMMENTS_SPEC,ADD_NOTIFICATIONS_SPEC,UPDATE_NOTIFICATIONS_SPEC) so advanced callers can reuse the same fail-open filtering logic. Learn more →
June 12, 2026
New Features
-
AI Agents API (
sdk.api.agents): NewAgentsServicefor managing AI agents, versioned config, agent groups, executions, analytics, and prompt tooling (24 methods). Also exported directly from@veltdev/node. Learn more → -
Memory API (
sdk.api.memory): NewMemoryServicefor semantic search over judgments, knowledge-base ingestion/management, reviewer profiles, patterns/stats, alerting, and maintenance jobs (24 methods, all typesMemory-prefixed). Also exported from@veltdev/node. Learn more → -
Approval Workflows API (
sdk.api.approval): NewApprovalServicefor defining approval/review workflows (graphs of agent, human, and webhook nodes) and dispatching/resolving executions and steps (14 methods, routes under/v2/workflow/*, all typesApproval-prefixed). Also exported from@veltdev/node. Learn more → -
CRDT —
deleteCrdtData:sdk.api.crdtgainsdeleteCrdtDatato delete CRDT editor data for a document (omiteditorIdsto delete all editors). Learn more → -
Documents —
getDocumentsCount:sdk.api.documentsgainsgetDocumentsCountto return a document count for an organization, with optional folder scoping. Learn more → -
Users — counts, document users & invites:
sdk.api.usersgains 7 methods:getUsersCount,getDocUsers,addUserInvite,respondToUserInvite,getUserInvites,getUserInvitations, andgetInvitedPendingUsersCount. Learn more → -
Workspace — domain requests, key config, service configs & advanced webhooks:
sdk.api.workspacegains 19 methods spanning additional-URL/domain requests, API key copy + config, notification/permission-provider/activity service configs, and the advanced (Svix) webhook endpoint suite. Learn more →
Improvements
getApiKeyMetadatanow targets theapikeyconfigendpoint:sdk.api.workspace.getApiKeyMetadata()now posts to/v2/workspace/apikeyconfig/get(was/v2/workspace/apikeymetadata/get). The method name and signature are unchanged, so no caller changes are required. Learn more →
May 19, 2026
New Features
-
PartialCommentAnnotationtyped fields:PartialCommentAnnotationgains four new typed fields —from,assignedTo,targetTextRange, andresolvedByUserId.resolvedByUserIduses three-state semantics (absent / explicitnull/ string) to correctly round-trip unresolve actions without droppingnull. Learn more → -
PartialTargetTextRangeinterface: NewPartialTargetTextRangeinterface withpartialTargetTextRangeFromDict/partialTargetTextRangeToDictserializers for structured text-range data. Learn more → -
PartialCommentround-trip helpers:PartialCommentgainspartialCommentFromDict/partialCommentToDicthelpers that pass through unknown keys, preserving forward compatibility. Learn more → -
sdkVersiononBaseMetadata:BaseMetadatanow includes ansdkVersionfield.baseMetadataFromDict/baseMetadataToDictserializers are exposed on the public package surface. Learn more →

