Every release, cut in the open.
The canonical version history of @namzu/sdk and every first-party provider package — the kernel, providers, and the computer-use surface. Releases are cut from cogitave/namzu and refreshed hourly.
@namzu/sdk
14 releases
Minor Changes
- —
d7c683e: Add lazy provider registration:
ProviderRegistry.registerLazy(type, loader, options?)plus async construction viaProviderRegistry.createAsync()/createProviderAsync().Hosts that must not bundle every provider client into every entrypoint can now register a dynamic-import loader instead of an eagerly imported class — no more hand-rolled construction switches outside the registry. Registration never invokes the loader; the first
createAsync()awaits it, validates the resolved{ create }module, and caches the factory. Concurrent first-creates share a single in-flight load, and only success is cached: a rejected load surfaces as the newLazyProviderLoadError(original failure oncause) and the next create retries.Capabilities integrate with capability negotiation: an optional
options.capabilitieshint letsgetCapabilities(type)answer before the provider is loaded (no hint ⇒ permissive default), the loaded module's declared capabilities replace the hint, and the constructed instance's ownLLMProvider.capabilitiesremain what the query runtime negotiates against.Lazy types are deliberately not constructible through the sync
create()/createProvider()— those throw the newLazyProviderSyncCreateErrordeterministically so sync behavior never depends on load timing. Existing eagerregister()/create()behavior is unchanged.
- —
Minor Changes
- —
cc6b5f3: Pluggable checkpoint persistence with cadence and growth controls.
Iteration checkpoints now flow through a new
CheckpointStoreinterface (types/run/checkpoint-store.ts) keyed by the full run scope (tenantId/projectId/sessionId/runId) instead of a filesystem path, so hosts can persist mid-turn resume state in a shared backend (e.g. Postgres) that survives machine loss:- —
QueryParams.checkpointStore?injects a store per run (mirrors the existingpathBuilder?override); the disk layout under the run's output directory remains the default via the new exportedDiskCheckpointStoreconformance adapter overRunDiskStore. - —
RunPersistenceConfig.checkpointStore?+RunPersistence.getCheckpointStore()/getRunScope()expose the same seam to embedded callers. - —The replay entry points (
listCheckpoints,prepareReplayState) accept an optionalcheckpointStore+scopepair; their disk-addressedbaseDirinputs are unchanged. - —
CheckpointManagernow takes(store: CheckpointStore, scope: CheckpointRunScope)— a breaking constructor change for direct constructions; the query pipeline threads it automatically.
Growth control on the run config, byte-identical by default:
- —
AgentRunConfig.checkpointEvery?(default 1 = every tool-call iteration, today's behavior) checkpoints iterations 1, 1+N, 1+2N, … and skips the HITLiteration_checkpointpark on off-cadence iterations. - —
AgentRunConfig.pruneKeepLast?(default undefined = never prune) prunes the run's checkpoint set down to the newest N after each iteration-checkpoint create.
- —
- —
f1f000c: Provider capability negotiation — degradation is now loud, not silent.
LLMProvidergains an optionalreadonly capabilities?: ProviderCapabilities(with a newsupportsVision?flag on the type) declaring what the DRIVER actually does with a request. Providers that declare nothing resolve to the exportedPERMISSIVE_PROVIDER_CAPABILITIESconstant (assume everything works — exactly the previous behavior), so third-party providers are unaffected.resolveProviderCapabilities(provider)performs the per-field permissive merge.query()consults the resolved capabilities before tooling bootstrap:- —Tools registered against a
supportsTools: falsedriver → a loudlog.warn, a newcapability_warningrun event, and every tool surface stripped (no<available_tools>prompt section, notoolsrequest param) so the model is never told about tools it cannot call. - —Image attachments on user messages against a
supportsVision: falsedriver →log.warn+ acapability_warningrun event so the host can surface that the images never reach the model. - —New
QueryParams.strictCapabilities?: boolean(defaultfalse) throws on either mismatch instead of degrading.
RunEventgains the additivecapability_warningvariant (capability: 'tools' | 'vision',providerId,message); the SSE/A2A bridges intentionally do not map it to a wire event yet. - —Tools registered against a
Patch Changes
- —
30c755d: Remove the dead task-notification busy-wait that could hang a run for minutes.
When the model ended its turn while the task gateway still listed a running agent task, the iteration loop polled an internal
pendingNotificationsqueue every 250ms for up torunConfig.timeoutMs(120s default) — but nothing has pushed onto that queue since theonTaskCompletedlistener was removed: every dispatch tool (create_task,continue_task,Agent) is blocking and already returns the worker's output as the dispatching tool_use's canonicaltool_result. The wait always injected nothing, then re-invoked the model with an unchanged conversation, so runs with an orphaned task (an interrupted tool execution, a cancel race) sporadically stalled for multiples of the timeout before finishing with the answer they already had.The superseded
<task-notification>envelope path is now fully torn out (waitAndInjectNotifications,injectOneTaskNotification, thependingNotificationsqueue and its XML/CDATA helpers). End-of-turn semantics with orphan running tasks are explicit: the run ends normally (end_turn) and a warning is logged that the orphans have no delivery path. Runs without orphan tasks are byte-identical.
- —
Minor Changes
- —
ac85934: Add a model-authored
ask_user_questionHITL surface to the coordinator toolset.HITLDecisionRequestgains auser_questionvariant carryingUserQuestionData(questionId = the askingtool_use_id, question text, optional header, 2-4 model-authored options, multiSelect, allowFreeText), andHITLResumeDecisiongainsanswer_question(selectedOptionIds, optional freeText, optional questionId echo as a misdirection guard). The tool registers only whenbuildCoordinatorToolsreceives BOTH aresumeHandlerand arunId(SupervisorAgent threads its configuredresumeHandlerthrough automatically), parks the run through the same ResumeHandler channel as plan approvals, and returns the user's answer verbatim as the tool result — selections quote question and labels, free text is rendered "in their own words", and an empty/misdirected/ mismatched answer yields an explicit "the user did not answer" sentinel instead of fabricated consent. The tool is deliberately NOT concurrency-safe so multiple questions in one assistant turn park strictly one at a time against host run-keyed park registries. Headless callers degrade safely:autoApproveHandleranswersuser_questionwith the no-selection sentinel ("No user is available to answer. Proceed using your best judgment."), so runs without an interactive ResumeHandler never deadlock and never invent a choice. Existing ResumeHandler implementations compile unchanged (additive union widening); bare plan-approval and tool-review flows are byte-identical. - —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
6c09394: Add an optional feedback channel to plan approvals:
HITLResumeDecision'sapprove_planvariant now carriesfeedback?: string, the plan-approval resume handler forwards it asPlanApprovalResponse.feedback, and the coordinatorapprove_plantool embeds approve-with-edits feedback in the model-visible tool result so the supervisor applies the user's edits atomically with the approval. Bare approvals are byte-identical to before; existing resume handlers compile and behave unchanged. - —
8c07556: Tool-loading economics: honor prompt caching in the Anthropic provider and make deferred-tool discovery ranked and bounded.
@namzu/anthropic:- —
cacheControlonChatCompletionParamsis now honored (it was silently dropped;cache_read_input_tokenswas always 0). The provider emits up to threecache_control: {type:'ephemeral'}breakpoints per request: the tools-array tail, the last'cache'-tagged system block, and the last message block (render order tools → system → messages). - —System messages are sent as a block array preserving
SystemMessage.cacheHintsegment boundaries instead of being joined into one string. The OAuth Claude Code identity block stays first. - —
toolChoice: 'none'now maps to Anthropic's first-classtool_choice: {type:'none'}instead of{type:'auto'}, andtool_choiceis only sent alongside atoolsparam. - —
parallelToolCalls: falsenow maps todisable_parallel_tool_use: trueon thetool_choice(previously unmapped).
@namzu/sdk:- —The runtime keeps the tools param byte-stable on forced-final iterations
(resource-limit finalization) and forbids tool use via
toolChoice: 'none'instead of omittingtools— omitting busted the whole prompt-cache prefix and risked a 400 withtool_use/tool_resultblocks in history. - —
ToolRegistry.toPromptSection()lists active tools name-only (their descriptions and schemas already ride the runtime tools param every request) and gives deferred tools a first-sentence hint (≤100 chars) so the model can discover what a deferred name does before searching. - —
ToolRegistry.searchDeferred()is now a ranked weighted search (exact name 12, name substring 8, description 5, argument names 3 — theToolCatalog.searchToolsweights) with generic CRUD verbs (list,read,create,update,get,find,delete,search) added to the stop-token set.search_toolsactivates only the top-5 ranked matches and reports up to 5 near-misses as name+hint WITHOUT activating them, so a retrieval miss becomes a cheap re-query instead of a dead end. Thesearch_toolsinput wire shape ({query}) is unchanged.
- —
Patch Changes
- —
999e4be: Context-management correctness fixes (Vandal round-3 architecture audit).
- —Compaction no longer orphans tool pairs.
runCompactionChecknow snaps the recent-window boundary throughfindSafeTrimIndex(previously wired only to the unusedConversationManagerstrategy classes), so a compaction cut can never leave atool_resultat the head of the recent window whosetool_usewas summarized away. That orphan otherwise makes the provider reject the very next turn with a 400 — compaction killing the long run it exists to keep alive. - —Resume preserves the compaction summary + working-memory slot. The
checkpoint-restore path used to drop EVERY system message, silently losing the
[COMPACTED CONTEXT]block (the only record of the older history a pass deleted) onresumeFromCheckpoint. It now re-pushes the fresh static/dynamic floor but preserves the compaction summary and the pinned working-memory slot. - —Within-turn usage is merged, not last-write-wins.
mergeTokenUsage(per-field high-water mark) replacesusage = chunk.usageincollect()and the iteration stream reducer, so a late usage frame that omits input/cache tokens no longer zeroes the counts captured earlier in the stream. - —HITL parks are cancellable.
awaitDecisionOrAbortraces the tool-review and iteration-checkpointresumeHandlerparks against the run's abort signal, so a Stop that arrives while parked resolves the park asabortinstead of hanging until the host answers. Degrades to a plain await when no controller is wired; fails closed toabortif the handler rejects.
All changes are internal correctness fixes; the provider/message wire contract is unchanged and existing consumers stay behaviourally identical outside the buggy edge cases above.
- —Compaction no longer orphans tool pairs.
- —
42f577e: Recreate shared run workspace manifest directories before atomic writes.
- —
9a0c5ee: Plan-rejection guidance now follows the user's feedback instead of baking in an unconditional revise loop. The old output told the supervisor to "revise your plan ... and call approve_plan again" even when the feedback explicitly asked it to stop, so a rejection meant to halt kept generating new plans. The output now instructs: follow the feedback — revise and re-submit only if changes were requested; acknowledge and end the turn if asked to stop; ask the user how to proceed when no feedback was given.
- —
0d1fb7b: Harden file intake and ACI readiness failure handling.
The built-in read tool now guides Office and PDF packages through extractor tooling instead of treating binary document containers as UTF-8 text. The ACI Standby Pool backend now deletes a claimed container group when IP or worker readiness polling fails before a Sandbox handle is returned.
- —
2c5dd7a: The supervisor's task ledger no longer fabricates success for workers that produced no result. Previously, when a task handle had no
result, the synthesized entry took its status fromhandle.state(cast to a terminal type) — so a handle reportingstate: 'completed'but carrying no result was counted towardcompletedTasks. The supervisor then reported "workers done" with empty outputs when the workers never actually produced anything.An absent result is now always synthesized as a terminal
'failed', so it can never count as a completed task. Handles that carry a realresultare preserved verbatim, so genuine workers are unaffected. The synthesis and tally are extracted intosynthesizeTaskResults/countCompletedTasksand covered by unit tests. - —
271e6cf: Accept plain-text
approve_planstep lists and normalize them into canonical step objects before execution. This keeps plan approval cards resilient when a provider emits numbered prose instead of an array-shaped argument. - —
b776acf: Make the package-version read bundle-safe.
version.tsread../package.jsonviacreateRequire(import.meta.url)at module-init with no guard. esbuild leavescreateRequirecalls as runtime requires and collapses the dist tree into a single file, so in a bundle../package.jsonno longer resolves and the read threw at import time — crashing the whole process on any code path that touches the SDK runtime (Cannot find module '../package.json'). Wrap the read in try/catch with a0.0.0fallback, mirroring the CLI's existingreadPackageVersion. Unbundled behaviour is unchanged (real version is read); a bundled build degrades the cosmetic version string instead of crashing.
- —
Minor Changes
- —
1df23b1:
SupervisorAgentConfigacceptsresumeHandlerandverificationGate.The supervisor's existing tool-review pipeline (drainQuery's
runToolReviewphase) was reachable only by callers that constructeddrainQueryarguments by hand —SupervisorAgent.runignored them entirely and always fell back toautoApproveHandler. Hosts that wanted "Ask before acting" semantics had no way to plug in.SupervisorAgent.runnow forwards both fields verbatim todrainQuerywhen the caller supplies them. Behaviour is unchanged for callers that omit them — the SDK still defaults to auto-approve.Migration:
new SupervisorAgent({...}).run(input, { ...config, // surface tool_review_requested events to the user; resolve when // they approve / modify / reject. resumeHandler: async ({ runId, toolCalls, ... }) => { return await waitForUserDecision(runId, toolCalls) }, // optionally pre-classify tools so trivial reads bypass review. verificationGate: { enabled: true, rules: [...] }, })
- —
Patch Changes
- —
ffe516c: Probe layer (typed observation + narrow veto) over AgentBus + RunEvent stream — ses_007 phases 0–3.
Public surface additions:
- —Typed probe observation.
probe.on(kind | kind[], handler, opts?)registers a typed handler scoped to one or more event kinds.probe.onAny(handler, opts?)is the catch-all tier preserving legacyAgentBus.onsemantics. Options:{ where, priority, name, override }. Events are frozen at the registry boundary; throws are isolated per probe. - —Narrow veto on tool execution.
probe.veto('tool_executing', handler, opts?)registers a veto handler. Handler returns'allow' | 'deny' | { action: 'deny', reason }.VetoableEventKind = 'tool_executing'in v1 (additive minor adds more kinds later). First-deny wins by ascending priority; subsequent veto handlers still fire for audit. Tool executor short-circuits beforetools.execute(...)on deny: returns a synthetic tool failure carryingProbeVetoError.messageso the LLM sees a normal tool-call failure with the probe name + reason. - —5 new bus event variants.
provider_call_start,provider_call_completed,provider_call_failed,vault_lookup,sandbox_decision. Joined to the existingAgentBusEventdiscriminated union. Snake_case real discriminants — no rename pass on existing events. - —Opt-in instrumentation wrappers.
wrapProviderWithProbes(provider, opts?)returns anLLMProviderthat emitsprovider_call_*around everychat/chatStreamcall (correlated by apcall_${string}callId, with optional usage telemetry).wrapVaultWithProbes(vault, opts?)emitsvault_lookupon everyretrieve(); the secret value is never included in the event payload (covered by a "no leakage" test). - —First-time public exposure of bus event types.
AgentBusEvent,AgentBusEventListener,CircuitBreakerSnapshot,FileLock, etc. were already reachable viaAgentBus.on(listener)at runtime but couldn't be statically typed by consumers. Now inpublic-types.ts. Pre-existing duplicateLockIddeclaration intypes/bus/was deduplicated to a re-export fromtypes/ids/in passing. - —Replay-aware probe context.
ProbeContext.isReplay: booleanflag wired throughbuildProbeContext({ runId?, isReplay? })so probes that bill or call external services can opt out on replayed runs (ctx.isReplay === true). Replay-execution wiring lands in a future session; the accessor is ready.
Integration:
- —
AgentBus.emitdispatches throughProbeRegistryfirst (typed-priority probes → legacybus.onlisteners →onAnycatch-all). Existingbus.on(listener)consumers see every event in unchanged relative order. - —
EventTranslator.emitEventdispatches everyRunEventthrough the same registry before the existing pendingEvents push + persist flow. - —
ToolExecutor.executeSinglecallsprobes.queryVeto({type: 'tool_executing', ...})immediately after the existingtool_executingemit, beforetools.execute(...).
Not yet wired (follow-up commits):
- —Per-run probes via
createRun({ probes: [...] })— the registry has the foundation; createRun plumbing lands in a follow-up. - —
wrapProviderWithProbes/wrapVaultWithProbesare opt-in helpers; the SDK's ownProviderRegistrydoes not auto-wrap registered providers yet. - —
sandbox_decisionships as a type only; emit site lands when a real sandbox provider exists (currentLocalSandboxProvideris a stub).
Public surface delta:
380 → 392runtime keys (verified against the regenerated baseline). Net new symbols added by this changeset:- —
probe,ProbeRegistry,createProbeRegistry,buildProbeContext,ProbeNameCollisionError,ProbeVetoError - —
wrapProviderWithProbes,wrapVaultWithProbes
Non-runtime (types-only) additions:
ProbeEventKind,ProbeEventOf<K>,ProbeContext,ProbeHandler<K>,ProbeOptions<K>,Unsubscribe,VetoableEventKind,VetoDecision,VetoHandler<K>,VetoOutcome,DoctorStatus,DoctorCategory,DoctorCheck,DoctorCheckContext,DoctorCheckResult,DoctorCheckRecord,DoctorReport,ProviderCallId,ProviderCallUsage,SandboxDecisionAction, plus first-time exposure of allAgentBusEventshape types.Doctor types ship in this release; the runtime registry + CLI command land in a subsequent ses_007 patch.
- —Typed probe observation.
- —
Patch Changes
- —
ddd0aad: Test-side hardening from ses_006 pre-freeze fix.
- —New test:
runtime/query/iteration/phases/advisory.test.ts— pins the advisory-phase mutation boundary where fired advisories inject user messages viarunMgr.pushMessage(createUserMessage(...)). 13 assertions covering early-return paths, happy-path exactly-once calls, envelope format, warnings + decisions rendering, and trigger-selection semantics. Before this test a regression removing thepushMessagecall atadvisory.ts:154would pass typecheck, lint, the coverage gate, and every existingsrc/advisory/*test. It now fails deterministically. - —
LogLevelgains'silent'— purely additive; the value short-circuits everylog()call. Used by the SDK's vitest setup to suppress unmockedgetRootLogger()stderr writes so GitHub Actions stops annotating[ERROR]-level log lines as workflow errors. Consumer impact: zero unless you pass'silent'toconfigureLogger()yourself. - —No runtime behavior change. No public surface additions beyond the one
LogLevelunion member.
- —New test:
- —
Patch Changes
- —
14ff062: Public-surface barrel split (ses_011-sdk-public-surface).
Note on bump level. Originally classified as minor when ses_011 froze on 2026-04-21. Downgraded to patch post-freeze (2026-04-21) as part of a repo-wide release-cadence policy decision: the pre-1.0 SDK reserves minor/major for feature-delta releases, and internal refactors that keep the public-surface baseline intact ride patch. This changeset explicitly preserved all 380 pre-existing public names (verified by
.github/scripts/verify-public-surface.mjs), so patch is semver-accurate at the name-set level. See.changeset/sdk-replay-primitive.mdfor the same-day rationale block.packages/sdk/src/index.tssplits from 357 lines of mixed re-exports into three focused bucket files, consumed through a thin 10-line root barrel:- —
public-types.ts— every type a consumer type-checks against (branded IDs, wire shapes, domain entities, store contracts, event unions, config types). - —
public-runtime.ts— every runtime value (classes, functions, constants, zod schemas, error classes, ID generators). - —
public-tools.ts— agent-tool surface (defineToolprimitive, built-in tools, domain builders, connector tool bridge,createRAGTool).
No consumer-visible change. All 380 previously-exported names continue to be exported; none removed, none added. Verified by a baseline snapshot (
.github/scripts/public-surface-baseline.json— captured at the tip of ses_010) plus a CI smoke test (.github/scripts/verify-public-surface.mjs) that loads@namzu/sdkat runtime and comparesObject.keys()against the baseline.Additional cleanup:
- —The
ProjectId/RunId/MessageId/SessionIddouble-channel (reachable through bothcontracts/andtypes/ids/) is closed. IDs come fromtypes/ids/uniformly;contracts/ids.tsis deleted;contracts/api.tsimports IDs from../types/ids/directly. - —The
RunStatuscarve-out is folded. Since ses_010 renamed the wire-side alias toWireRunStatus, the domainRunStatuscan flow throughtypes/run/index.tswith a plainexport *— no explicit carve-out needed.
- —
- —
2eccadd: Replay primitive v1 — fork an existing run from any stored checkpoint with optional mutation at the fork point (ses_005-deterministic-replay).
Note on bump level. This release adds new public exports (
prepareReplayState,listCheckpoints,projectEmergencyToCheckpoint,MutationNotApplicableError, theMutation/CheckpointListEntry/ReplayAttributiontypes,Run.replayOf?). In strict semver these would be a minor bump. Classified as patch here because the SDK is pre-1.0 and the project reserves minor/major for larger feature deltas — 0.5.0 should land with a more complete replay surface (5b end-to-end wrapper, reproduce mode, or similar) rather than just this state-preparation half. Decision logged 2026-04-21 post-freeze of ses_005.New public runtime values:
- —
prepareReplayState({ baseDir, runId, fromCheckpoint, mutate?, emergencyDir? })— pure-read helper that resolvesfromCheckpoint(CheckpointId | 'latest' | 'emergency'), applies mutations, and returns{ messages, sourceCheckpoint, attribution }ready to thread into aquery(...)call. - —
listCheckpoints({ baseDir, runId })— lists a run's checkpoints as lightweightCheckpointListEntryprojections. - —
projectEmergencyToCheckpoint(dump)— project anEmergencySaveDatasnapshot to anIterationCheckpointshape with deterministiccp_emergency_*id. - —
MutationNotApplicableError— thrown byprepareReplayStatewhen a mutation targets a tool call that is not pending at the fork point; carriesavailableToolCallIdsfor recovery.
New public types:
- —
Mutation— discriminated union; singleinjectToolResponsevariant in v1. - —
CheckpointListEntry— listing projection distinct from the pre-existing HITLCheckpointSummary. - —
ReplayAttribution—{ sourceRunId, fromCheckpointId, mutations, replayedAt }record. - —
Run.replayOf?: ReplayAttribution— optional attribution field;undefinedon original runs.
Scope and non-scope — v1 ships forked execution from a captured checkpoint, not byte-for-byte reproduction. Past the fork point, provider calls and tool calls execute live. Deterministic reproduce mode is deferred to a follow-up session.
A single-call
replay({ runId, opts })wrapper is intentionally not shipped in v1. ComposinglistCheckpoints → prepareReplayState → caller-owned query()is the v1 flow; the wrapper requires aReplayEnvironmentdesign (provider, tools, resume handler, session scope) that lands in a follow-up session.See
docs/sdk/runtime/replay.mdfor the full primitive docs, determinism envelope, and non-scope. - —
- —
9efae03: Type layering rationalised (ses_010-sdk-type-layering).
Note on bump level. Originally classified as minor when ses_010 froze on 2026-04-21. Downgraded to patch post-freeze (2026-04-21) as part of a repo-wide release-cadence policy decision: the pre-1.0 SDK reserves minor/major for feature-delta releases, and internal refactors that keep the public-surface baseline intact ride patch. This changeset introduced no consumer-visible new names and renamed
AgentRun → Runwith a@deprecatedalias, which the policy treats as a patch-level churn for 0.x. See.changeset/sdk-replay-primitive.mdfor the same-day rationale block.All pure shapes — entities, store contracts, wire types, events — now live under
packages/sdk/src/types/. Feature folders (session/,manager/,store/,agent/,provider/) contain runtime code only.Public surface changes:
- —
AgentRunrenamed toRun.AgentRunandAgentSessionare kept as@deprecatedtype aliases for the 0.4.x compatibility window — existing code importing either continues to compile. New code should useRun. - —Wire-side
Runinterface renamed toWireRun, mirroring the existingWireRunStatusprecedent. The root@namzu/sdkbarrel now exports domainRunand wireWireRunwith no collision. - —Internal folder
packages/sdk/src/session/hierarchy/removed. Only the@namzu/sdkroot barrel (.) is a supported import surface; deep-imports were never supported and the old path no longer exists.
No runtime behaviour change. Every entity previously exported (
Project,Thread,Session,SubSession,ActorRef,Lineage,Tenant) continues to be exported from@namzu/sdk. - —
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Minor Changes
- —
40eb841: Unblock BYO-provider use of
AgentManager.spawnand capture the full 0.2.x → 0.3.0 window.Bug Fixes
- —
AgentManager.sendMessageno longer requires bothconfigBuilderANDfactoryOptionstogether. The configBuilder now runs whenever it is registered;factoryOptionsdefaults to{}when absent. This closes the silent crash path that consumers following README's "getting started" install hit with Bedrock (ERESOLVE → bare-config → ReactiveAgent null access). - —
AgentFactoryOptions.apiKeyis now optional. BYO-provider flows (Bedrock IAM, customProviderRegistry.create(...)) no longer need to fabricate a meaningless emptyapiKeyjust to satisfy the type.
Breaking Changes carried over from the 0.2.x → 0.3.0 window
- —
feat(sdk)!: propagate threadId through runtime + wire archive gate— childConfig now receivessessionId/threadId/projectId/tenantIdautomatically from the parent context (stamped by AgentManager after configBuilder returns). configBuilder implementations that previously emitted these fields manually are unaffected; implementations relying on the old 0.2.0 three-ID triple (sessionId/projectId/tenantIdwithoutthreadId) will now seethreadIdpopulated on the child config.
Other
- —
knipintegrated as the dead-code detector (dev-only, no runtime surface change). - —
ThreadManager.archive/deleteprimitives added toSessionStore; wire-sidethread_idrenamed during the Thread→Project wire refactor (internal rename).
See commits since
sdk-v0.2.0for the full list; this changeset captures the visible-to-consumer summary. - —
All notable changes to Namzu are documented here.
- —
Features
- —sdk: close Task 10 known deltas + expose session hierarchy (Phase 9) [BREAKING]
- —sdk: add retention + archival primitives with deleteSession close-out (Phase 8)
- —sdk: add migration utilities for 0.2.0 upgrade path (Phase 7)
- —sdk: refactor AgentManager to spawn SubSession triple with kernel summarization (Phase 6) [BREAKING]
- —sdk: add SessionSummaryMaterializer kernel terminalization primitive (Phase 5)
- —sdk: add handoff state machine with atomic broadcast rollback (Phase 4)
- —sdk: add SessionStore + PathBuilder + git-worktree workspace driver (Phase 3) [BREAKING]
- —sdk: add RunEvent schemaVersion + sub-session lifecycle events (Phase 2) [BREAKING]
- —sdk: introduce session hierarchy type foundation (Phase 1) [BREAKING]
Testing
- —sdk: add Task 10 integration test coverage matrix (Phase 10)
Documentation
- —changelog: update for sdk-v0.1.7
- —readme: rewrite root + fix sdk stale ProviderFactory refs
Documentation
- —changelog: add 0.1.6 (sdk) and 0.1.0 (computer-use) entries; fix cliff tag prefix + workflow race
- —changelog: update for sdk-v0.1.6-rc.1
Features
- —bedrock: extract BedrockProvider to @namzu/bedrock package (Phase I.3 pilot)
- —openrouter: extract OpenRouterProvider to @namzu/openrouter package (Phase I.4)
Refactor
- —sdk: address Codex review — scope providers/ subfolder, hide registry reset
- —sdk: replace ProviderFactory with ProviderRegistry for per-vendor extraction [BREAKING]
Stable release of @namzu/sdk 0.1.6 (promoted from 0.1.6-rc.1).
- v0.1.6-rc.1pre-release
[sdk-v0.1.6-rc.1] — 2026-04-15
Documentation
- —changelog: update for v0.1.5
Features
- —sdk: add ComputerUseHost interface and computer_use tool
Miscellaneous
- —initialize namzu monorepo from sdk; add @namzu/computer-use capability package
[0.1.5] — 2026-04-15
Bug Fixes
- —emergency: uuid tmp suffix, outer try/catch, and explicit exit
- —store: resolve withLock race, delete deadlock, and atomic edge updates
Documentation
- —changelog: update for v0.1.5-rc.2
Refactor
- —barrels: route root barrel through sub-barrels (Path B)
- —connector: brand ConnectorId/TenantId on public interfaces [BREAKING]
Testing
- —store: add concurrency regression tests for DiskTaskStore
[0.1.5-rc.2] — 2026-04-14
Bug Fixes
- —plugin: wire MCP servers and fail fast on unsupported contributions
- —plugin: consume hook results and wire tool hooks in runtime
- —release: normalize pre-release counter to strip non-digit suffix
Documentation
- —changelog: update for v0.1.5-rc.1-fix
- —contracts: formalize wire/domain duality + refresh README
- —readme: rewrite code examples to match current SDK API
Refactor
- —plugin: remove duplicate PluginConfigSchema in types/
- —registry: migrate Agent/Connector/Tool registries to ManagedRegistry
- —run: remove legacy Session* aliases for run-centric classes
[0.1.5-rc.1] — 2026-04-12
Documentation
- —changelog: update for v0.1.4
Refactor
- —architectural cleanup and infrastructure improvements
[0.1.4] — 2026-04-11
Documentation
- —changelog: update for v0.1.4-rc.3
Features
- —sandbox isolation, new tools (edit/grep/ls), session-to-run migration
[0.1.4-rc.3] — 2026-04-10
Miscellaneous
- —release: derive version from git tag, no manual bump needed
[0.1.4-rc.2] — 2026-04-10
Bug Fixes
- —ci: remove duplicate --strip flag in git-cliff command
- —plugin: rename session hooks to run_start/run_end
- —release: use tag name as release title instead of prefixed name
Features
- —P3 + plugin architecture — emergency save, memory index, plugin system
- —P2 — AgentBus, prompt cache split, verification gate
- —integrate compaction loop and advisory phase into iteration pipeline
Miscellaneous
- —changelog: automate CHANGELOG.md via git-cliff in release workflow
[0.1.4-rc.1] — 2026-04-10
Bug Fixes
- —add description field to package.json, reorder README badges
Features
- —advisory: provider-agnostic advisory system with three-layer architecture
- —structured compaction, tool tiering, task router
- —output discipline, shell compression, pre-release workflow
Miscellaneous
- —remove BEFORE-RELEASE.md from repo
[0.1.3] — 2026-04-10
Bug Fixes
- —point entry fields to dist/ for bundler compatibility
Documentation
- —add npm, ci, license, typescript, node badges to README
[0.1.2] — 2026-04-10
Other
- —Namzu v0.1.1 — Wisdom, shared
Open-source AI agent framework by cogitave.
Let's build the agent layer together.
Refactor
- —constants centralization, strict lint, release automation
@namzu/anthropic
5 releases
Patch Changes
- —
f1f000c: Declare honest driver capabilities on each provider instance.
Every shipped driver now exposes
readonly capabilities(and re-exports its*_CAPABILITIESconstant from the client module) describing what the DRIVER does — not what the vendor API could do — so the SDK's capability negotiation can warn instead of silently degrading:- —
@namzu/ollama:supportsTools: false,supportsVision: false(the driver never sends tool schemas and drops image attachments). - —
@namzu/lmstudio:supportsToolscorrectedtrue→falseandsupportsFunctionCallingtrue→false— the driver folds tool messages into user text and never sends tool schemas;supportsVision: false. - —
@namzu/anthropic: full (supportsVision: true— image attachments already mapped). - —
@namzu/bedrock,@namzu/openrouter,@namzu/http: tools pass through (supportsTools: true) butsupportsVision: falseuntil their message translation maps attachments.
- —
- —
Minor Changes
- —
8c07556: Tool-loading economics: honor prompt caching in the Anthropic provider and make deferred-tool discovery ranked and bounded.
@namzu/anthropic:- —
cacheControlonChatCompletionParamsis now honored (it was silently dropped;cache_read_input_tokenswas always 0). The provider emits up to threecache_control: {type:'ephemeral'}breakpoints per request: the tools-array tail, the last'cache'-tagged system block, and the last message block (render order tools → system → messages). - —System messages are sent as a block array preserving
SystemMessage.cacheHintsegment boundaries instead of being joined into one string. The OAuth Claude Code identity block stays first. - —
toolChoice: 'none'now maps to Anthropic's first-classtool_choice: {type:'none'}instead of{type:'auto'}, andtool_choiceis only sent alongside atoolsparam. - —
parallelToolCalls: falsenow maps todisable_parallel_tool_use: trueon thetool_choice(previously unmapped).
@namzu/sdk:- —The runtime keeps the tools param byte-stable on forced-final iterations
(resource-limit finalization) and forbids tool use via
toolChoice: 'none'instead of omittingtools— omitting busted the whole prompt-cache prefix and risked a 400 withtool_use/tool_resultblocks in history. - —
ToolRegistry.toPromptSection()lists active tools name-only (their descriptions and schemas already ride the runtime tools param every request) and gives deferred tools a first-sentence hint (≤100 chars) so the model can discover what a deferred name does before searching. - —
ToolRegistry.searchDeferred()is now a ranked weighted search (exact name 12, name substring 8, description 5, argument names 3 — theToolCatalog.searchToolsweights) with generic CRUD verbs (list,read,create,update,get,find,delete,search) added to the stop-token set.search_toolsactivates only the top-5 ranked matches and reports up to 5 near-misses as name+hint WITHOUT activating them, so a retrieval miss becomes a cheap re-query instead of a dead end. Thesearch_toolsinput wire shape ({query}) is unchanged.
- —
Patch Changes
- —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Patch Changes
- —
40eb841: Widen
@namzu/sdkpeer range to>=0.1.6 <1.0.0.The previous peer range
^1 || ^0.1.6resolved to>=0.1.6 <0.2.0 || >=1.0.0, which excluded the published@namzu/sdk@0.2.0and causednpm install @namzu/sdk @namzu/<provider>to fail with ERESOLVE on a clean machine. The new range covers every pre-1.0 SDK minor from 0.1.6 onward; the 1.0 pledge will be the next explicit widening.This is the first release under the new Changesets-driven workflow and the wide-pre-1.0-peer convention. Consumers who followed the README's "getting started" install were previously blocked; after this release
npm install @namzu/sdk@latest @namzu/<provider>@latestresolves cleanly.
All notable changes to
@namzu/anthropicare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/anthropic v0.1.0
@namzu/bedrock
5 releases
Patch Changes
- —
f1f000c: Declare honest driver capabilities on each provider instance.
Every shipped driver now exposes
readonly capabilities(and re-exports its*_CAPABILITIESconstant from the client module) describing what the DRIVER does — not what the vendor API could do — so the SDK's capability negotiation can warn instead of silently degrading:- —
@namzu/ollama:supportsTools: false,supportsVision: false(the driver never sends tool schemas and drops image attachments). - —
@namzu/lmstudio:supportsToolscorrectedtrue→falseandsupportsFunctionCallingtrue→false— the driver folds tool messages into user text and never sends tool schemas;supportsVision: false. - —
@namzu/anthropic: full (supportsVision: true— image attachments already mapped). - —
@namzu/bedrock,@namzu/openrouter,@namzu/http: tools pass through (supportsTools: true) butsupportsVision: falseuntil their message translation maps attachments.
- —
- —
Patch Changes
- —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Patch Changes
- —
40eb841: Widen
@namzu/sdkpeer range to>=0.1.6 <1.0.0.The previous peer range
^1 || ^0.1.6resolved to>=0.1.6 <0.2.0 || >=1.0.0, which excluded the published@namzu/sdk@0.2.0and causednpm install @namzu/sdk @namzu/<provider>to fail with ERESOLVE on a clean machine. The new range covers every pre-1.0 SDK minor from 0.1.6 onward; the 1.0 pledge will be the next explicit widening.This is the first release under the new Changesets-driven workflow and the wide-pre-1.0-peer convention. Consumers who followed the README's "getting started" install were previously blocked; after this release
npm install @namzu/sdk@latest @namzu/<provider>@latestresolves cleanly.
All notable changes to
@namzu/bedrockare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/bedrock v0.1.0
@namzu/computer-use
4 releases
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Minor Changes
- —
40eb841: Move
@namzu/sdkfromdependenciestopeerDependencies.Previously,
@namzu/computer-use@0.1.0declared@namzu/sdkas a direct runtime dependency (workspace:^), which meant a consumer installing both packages would end up with two concurrent copies of@namzu/sdkinnode_modules— the one they installed themselves and the one computer-use resolved. This produces symbol-identity bugs (two separateAgentManagerclasses, two separateRunEventschemas, etc.) that surface as hard-to-diagnose "instanceof fails" at runtime.The correct shape, matching the 7 provider packages, is peer + dev:
- —
peerDependencies:@namzu/sdk: ">=0.1.6 <1.0.0"— consumer provides, resolved once. - —
devDependencies:@namzu/sdk: workspace:^— for local dev and type-checking.
Consumer migration: if you previously relied on
@namzu/computer-usepulling@namzu/sdkin transitively, install it explicitly:npm install @namzu/sdk @namzu/computer-useThis is technically a breaking change (the transitive resolution no longer works), but pre-1.0 SDK context and the runtime-corruption risk of the old shape justify correcting it as a minor bump.
- —
All notable changes to
@namzu/computer-useare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/computer-use v0.1.0
- v0.0.2-rc.1pre-release
Release of @namzu/computer-use v0.0.2-rc.1
@namzu/http
5 releases
Patch Changes
- —
f1f000c: Declare honest driver capabilities on each provider instance.
Every shipped driver now exposes
readonly capabilities(and re-exports its*_CAPABILITIESconstant from the client module) describing what the DRIVER does — not what the vendor API could do — so the SDK's capability negotiation can warn instead of silently degrading:- —
@namzu/ollama:supportsTools: false,supportsVision: false(the driver never sends tool schemas and drops image attachments). - —
@namzu/lmstudio:supportsToolscorrectedtrue→falseandsupportsFunctionCallingtrue→false— the driver folds tool messages into user text and never sends tool schemas;supportsVision: false. - —
@namzu/anthropic: full (supportsVision: true— image attachments already mapped). - —
@namzu/bedrock,@namzu/openrouter,@namzu/http: tools pass through (supportsTools: true) butsupportsVision: falseuntil their message translation maps attachments.
- —
- —
Patch Changes
- —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Patch Changes
- —
40eb841: Widen
@namzu/sdkpeer range to>=0.1.6 <1.0.0.The previous peer range
^1 || ^0.1.6resolved to>=0.1.6 <0.2.0 || >=1.0.0, which excluded the published@namzu/sdk@0.2.0and causednpm install @namzu/sdk @namzu/<provider>to fail with ERESOLVE on a clean machine. The new range covers every pre-1.0 SDK minor from 0.1.6 onward; the 1.0 pledge will be the next explicit widening.This is the first release under the new Changesets-driven workflow and the wide-pre-1.0-peer convention. Consumers who followed the README's "getting started" install were previously blocked; after this release
npm install @namzu/sdk@latest @namzu/<provider>@latestresolves cleanly.
All notable changes to
@namzu/httpare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/http v0.1.0
@namzu/lmstudio
5 releases
Patch Changes
- —
f1f000c: Declare honest driver capabilities on each provider instance.
Every shipped driver now exposes
readonly capabilities(and re-exports its*_CAPABILITIESconstant from the client module) describing what the DRIVER does — not what the vendor API could do — so the SDK's capability negotiation can warn instead of silently degrading:- —
@namzu/ollama:supportsTools: false,supportsVision: false(the driver never sends tool schemas and drops image attachments). - —
@namzu/lmstudio:supportsToolscorrectedtrue→falseandsupportsFunctionCallingtrue→false— the driver folds tool messages into user text and never sends tool schemas;supportsVision: false. - —
@namzu/anthropic: full (supportsVision: true— image attachments already mapped). - —
@namzu/bedrock,@namzu/openrouter,@namzu/http: tools pass through (supportsTools: true) butsupportsVision: falseuntil their message translation maps attachments.
- —
- —
Patch Changes
- —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Patch Changes
- —
40eb841: Widen
@namzu/sdkpeer range to>=0.1.6 <1.0.0.The previous peer range
^1 || ^0.1.6resolved to>=0.1.6 <0.2.0 || >=1.0.0, which excluded the published@namzu/sdk@0.2.0and causednpm install @namzu/sdk @namzu/<provider>to fail with ERESOLVE on a clean machine. The new range covers every pre-1.0 SDK minor from 0.1.6 onward; the 1.0 pledge will be the next explicit widening.This is the first release under the new Changesets-driven workflow and the wide-pre-1.0-peer convention. Consumers who followed the README's "getting started" install were previously blocked; after this release
npm install @namzu/sdk@latest @namzu/<provider>@latestresolves cleanly.
All notable changes to
@namzu/lmstudioare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/lmstudio v0.1.0
@namzu/ollama
5 releases
Patch Changes
- —
f1f000c: Declare honest driver capabilities on each provider instance.
Every shipped driver now exposes
readonly capabilities(and re-exports its*_CAPABILITIESconstant from the client module) describing what the DRIVER does — not what the vendor API could do — so the SDK's capability negotiation can warn instead of silently degrading:- —
@namzu/ollama:supportsTools: false,supportsVision: false(the driver never sends tool schemas and drops image attachments). - —
@namzu/lmstudio:supportsToolscorrectedtrue→falseandsupportsFunctionCallingtrue→false— the driver folds tool messages into user text and never sends tool schemas;supportsVision: false. - —
@namzu/anthropic: full (supportsVision: true— image attachments already mapped). - —
@namzu/bedrock,@namzu/openrouter,@namzu/http: tools pass through (supportsTools: true) butsupportsVision: falseuntil their message translation maps attachments.
- —
- —
Patch Changes
- —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Patch Changes
- —
40eb841: Widen
@namzu/sdkpeer range to>=0.1.6 <1.0.0.The previous peer range
^1 || ^0.1.6resolved to>=0.1.6 <0.2.0 || >=1.0.0, which excluded the published@namzu/sdk@0.2.0and causednpm install @namzu/sdk @namzu/<provider>to fail with ERESOLVE on a clean machine. The new range covers every pre-1.0 SDK minor from 0.1.6 onward; the 1.0 pledge will be the next explicit widening.This is the first release under the new Changesets-driven workflow and the wide-pre-1.0-peer convention. Consumers who followed the README's "getting started" install were previously blocked; after this release
npm install @namzu/sdk@latest @namzu/<provider>@latestresolves cleanly.
All notable changes to
@namzu/ollamaare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/ollama v0.1.0
@namzu/openai
5 releases
Patch Changes
- —
f1f000c: Map user-message image attachments to OpenAI
image_urlcontent parts.toOpenAIMessagesnow convertsUserMessage.attachmentsinto multimodal content parts (text first, then each image as animage_urlpart carrying adata:<mediaType>;base64,<data>URI), mirroring the Anthropic driver's image-block mapping. Previously attachments were silently dropped. The driver declaressupportsVision: trueand exposes its capabilities on the provider instance for the SDK's capability negotiation.
- —
Patch Changes
- —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Patch Changes
- —
40eb841: Widen
@namzu/sdkpeer range to>=0.1.6 <1.0.0.The previous peer range
^1 || ^0.1.6resolved to>=0.1.6 <0.2.0 || >=1.0.0, which excluded the published@namzu/sdk@0.2.0and causednpm install @namzu/sdk @namzu/<provider>to fail with ERESOLVE on a clean machine. The new range covers every pre-1.0 SDK minor from 0.1.6 onward; the 1.0 pledge will be the next explicit widening.This is the first release under the new Changesets-driven workflow and the wide-pre-1.0-peer convention. Consumers who followed the README's "getting started" install were previously blocked; after this release
npm install @namzu/sdk@latest @namzu/<provider>@latestresolves cleanly.
All notable changes to
@namzu/openaiare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/openai v0.1.0
@namzu/openrouter
5 releases
Patch Changes
- —
f1f000c: Declare honest driver capabilities on each provider instance.
Every shipped driver now exposes
readonly capabilities(and re-exports its*_CAPABILITIESconstant from the client module) describing what the DRIVER does — not what the vendor API could do — so the SDK's capability negotiation can warn instead of silently degrading:- —
@namzu/ollama:supportsTools: false,supportsVision: false(the driver never sends tool schemas and drops image attachments). - —
@namzu/lmstudio:supportsToolscorrectedtrue→falseandsupportsFunctionCallingtrue→false— the driver folds tool messages into user text and never sends tool schemas;supportsVision: false. - —
@namzu/anthropic: full (supportsVision: true— image attachments already mapped). - —
@namzu/bedrock,@namzu/openrouter,@namzu/http: tools pass through (supportsTools: true) butsupportsVision: falseuntil their message translation maps attachments.
- —
- —
Patch Changes
- —
9df35d1: Make a Stop abort the IN-FLIGHT model turn, not only between turns.
ChatCompletionParamsgains an optionalsignal?: AbortSignal. The query runtime threads the run's abort signal into every provider call (the streaming turn and the forced-final summary) and now drives the provider stream through a MANUAL iterator that RACES eachnext()against the abort — so a cancellation tears the turn down within a tick even if a transport buffers or ignores the signal, with the abort propagating out of the generator so the run settles ascancelled. The stream consumer cleans up on every exit (removes the abort listener, callsiterator.return()), and the natural-completion break re-checks the signal so a Stop that lands exactly as the turn finishes is recorded as cancelled rather than a normal end-of-turn.Every provider now honours the signal at the transport: Anthropic (
messages.create({ signal })), OpenAI (create(..., { signal })), Bedrock (send(..., { abortSignal })), OpenRouter + HTTP (compose with the request timeout viaAbortSignal.any), Ollama (the returned iterator's.abort()), and LM Studio (respond(..., { signal })→ the SDK's websocket cancel) — each plus a cheap per-chunksignal.throwIfAborted()for promptness.Fully additive and inert when unset: a never-aborted signal is behaviourally identical to omitting it, so existing callers and uncancelled runs are byte-identical.
- —
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —
Patch Changes
- —
40eb841: Widen
@namzu/sdkpeer range to>=0.1.6 <1.0.0.The previous peer range
^1 || ^0.1.6resolved to>=0.1.6 <0.2.0 || >=1.0.0, which excluded the published@namzu/sdk@0.2.0and causednpm install @namzu/sdk @namzu/<provider>to fail with ERESOLVE on a clean machine. The new range covers every pre-1.0 SDK minor from 0.1.6 onward; the 1.0 pledge will be the next explicit widening.This is the first release under the new Changesets-driven workflow and the wide-pre-1.0-peer convention. Consumers who followed the README's "getting started" install were previously blocked; after this release
npm install @namzu/sdk@latest @namzu/<provider>@latestresolves cleanly.
All notable changes to
@namzu/openrouterare documented in this file.The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- —
Release of @namzu/openrouter v0.1.0
cli
3 releases
Patch Changes
- —Updated dependencies [cc6b5f3]
- —Updated dependencies [f1f000c]
- —Updated dependencies [30c755d]
- —Updated dependencies [f1f000c]
- —Updated dependencies [f1f000c]
- —@namzu/sdk@1.2.0
- —@namzu/openai@1.0.2
- —@namzu/ollama@1.0.2
- —@namzu/anthropic@1.1.1
- —@namzu/openrouter@1.0.2
Minor Changes
- —11e1a70: run-stream gains
--session <key>and a newhistory --session <key>command: bind a headless turn to a persisted conversation in the cwd's.namzustore (keyed by an embedder's own session id), so prior turns load as context and the turn is appended.historyprints that conversation's{role,content}[]as JSON. This lets a host UI (the clawtool desktop) resume a session's transcript and keep multi-turn context across separate one-shot invocations. - —022b082: run-stream gains a
--providerflag (override the persona's configured provider for the turn, alongside --model). Newproviders-jsoncommand prints every registry provider with its detection state, default model, and a best-effort live model list ({provider,label,detected,default,models[]}[]) so a host UI can build a dynamic provider/model picker instead of a hardcoded list. listModels is probed per detected provider with a 3s race + free-text fallback. The listing path registers the vendor package (ensureRegistered) before constructing the provider, so a detected provider returns its real model catalog instead of an empty list — without it ProviderRegistry.create throws "Unsupported provider type" and the picker silently degrades to free-text for every provider. - —02f37e1: run-stream gains
--model,--instance, and--skills <a,b,c>flags so a host UI can drive which model answers, attribute the run to a named instance, and load specific skills' bodies into the turn (via the same extra-system channel the TUI's/skilluses). Adds askills-jsoncommand that prints discovered skills as{name, description, source}[]for a host's skill picker. - —1032736: Add
namzu run-stream— a headless streaming one-shot that runs the same agent as the TUI but emits one compact NDJSON line perAgentEvent(delta / tool-start / tool-end / error / done) to stdout, instead of buffering the final text likerun. Prior conversation history is read from stdin as a JSONMessage[]. This lets a host process (e.g. a desktop UI) line-scan stdout and render a turn live, with the host owning persistence — the equivalent of the TUI driven from another runtime.
Patch Changes
- —Updated dependencies [ac85934]
- —Updated dependencies [999e4be]
- —Updated dependencies [9df35d1]
- —Updated dependencies [42f577e]
- —Updated dependencies [6c09394]
- —Updated dependencies [9a0c5ee]
- —Updated dependencies [0d1fb7b]
- —Updated dependencies [2c5dd7a]
- —Updated dependencies [271e6cf]
- —Updated dependencies [8c07556]
- —Updated dependencies [b776acf]
- —@namzu/sdk@1.1.0
- —@namzu/anthropic@1.1.0
- —@namzu/openai@1.0.1
- —@namzu/openrouter@1.0.1
- —@namzu/ollama@1.0.1
- —11e1a70: run-stream gains
Patch Changes
- —Updated dependencies [1df23b1]
- —@namzu/sdk@0.6.0
- —Updated dependencies [1df23b1]
namzu
7 releases
Bug Fixes
- —emergency: uuid tmp suffix, outer try/catch, and explicit exit
- —store: resolve withLock race, delete deadlock, and atomic edge updates
Documentation
- —changelog: update for v0.1.5-rc.2
Refactor
- —barrels: route root barrel through sub-barrels (Path B)
- —connector: brand ConnectorId/TenantId on public interfaces [BREAKING]
Testing
- —store: add concurrency regression tests for DiskTaskStore
- v0.1.5-rc.2pre-release
Bug Fixes
- —plugin: wire MCP servers and fail fast on unsupported contributions
- —plugin: consume hook results and wire tool hooks in runtime
- —release: normalize pre-release counter to strip non-digit suffix
Documentation
- —changelog: update for v0.1.5-rc.1-fix
- —contracts: formalize wire/domain duality + refresh README
- —readme: rewrite code examples to match current SDK API
Refactor
- —plugin: remove duplicate PluginConfigSchema in types/
- —registry: migrate Agent/Connector/Tool registries to ManagedRegistry
- —run: remove legacy Session* aliases for run-centric classes
- v0.1.5-rc.1-fixpre-release
Documentation
- —changelog: update for v0.1.4-rc.3
Features
- —sandbox isolation, new tools (edit/grep/ls), session-to-run migration
- v0.1.4-rc.3pre-release
Miscellaneous
- —release: derive version from git tag, no manual bump needed
- v0.1.4-rc.1pre-release
9d4c180 chore(release): 0.1.4-rc.1 3658715 feat(advisory): provider-agnostic advisory system with three-layer architecture 53404c6 feat: structured compaction, tool tiering, task router efd2936 fix: add description field to package.json, reorder README badges b8abff8 feat: output discipline, shell compression, pre-release workflow c081c46 chore: remove BEFORE-RELEASE.md from repo
f832ce0 fix: point entry fields to dist/ for bundler compatibility e06b3b4 docs: add npm, ci, license, typescript, node badges to README
telemetry
2 releases
Patch Changes
- —b776acf: Make the package-version read bundle-safe.
version.tsread../package.jsonviacreateRequire(import.meta.url)at module-init with no guard. esbuild leavescreateRequirecalls as runtime requires and collapses the dist tree into a single file, so in a bundle../package.jsonno longer resolves and the read threw at import time — crashing the whole process on any code path that touches the SDK runtime (Cannot find module '../package.json'). Wrap the read in try/catch with a0.0.0fallback, mirroring the CLI's existingreadPackageVersion. Unbundled behaviour is unchanged (real version is read); a bundled build degrades the cosmetic version string instead of crashing.
- —b776acf: Make the package-version read bundle-safe.
Patch Changes
- —
c9b180d: Coordinated patch bump across all publishable packages after the
@namzu/telemetry@0.1.0extraction landed. No functional changes — this is a compatibility and release-pipeline validation cut to (a) exercise the Trusted Publisher binding for@namzu/telemetrythat was configured after the 0.1.0 bootstrap publish, and (b) give consumers a single aligned set of patch versions that all know about the new telemetry package.Resulting versions:
- —
@namzu/sdk→0.4.1 - —
@namzu/telemetry→0.1.1 - —
@namzu/computer-use→0.2.1 - —
@namzu/anthropic,@namzu/bedrock,@namzu/http,@namzu/lmstudio,@namzu/ollama,@namzu/openai,@namzu/openrouter→0.1.2
- —
- —