@namzu/cli 24.0.0 → 25.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/CHANGELOG.md +841 -0
  2. package/README.md +1 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +1 -0
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/drain.d.ts +0 -23
  7. package/dist/commands/drain.d.ts.map +1 -1
  8. package/dist/commands/drain.js +23 -9
  9. package/dist/commands/drain.js.map +1 -1
  10. package/dist/commands/resident-flags.d.ts +6 -1
  11. package/dist/commands/resident-flags.d.ts.map +1 -1
  12. package/dist/commands/resident-flags.js +39 -1
  13. package/dist/commands/resident-flags.js.map +1 -1
  14. package/dist/commands/resident-learning.d.ts +6 -0
  15. package/dist/commands/resident-learning.d.ts.map +1 -0
  16. package/dist/commands/resident-learning.js +293 -0
  17. package/dist/commands/resident-learning.js.map +1 -0
  18. package/dist/commands/resident.d.ts.map +1 -1
  19. package/dist/commands/resident.js +42 -4
  20. package/dist/commands/resident.js.map +1 -1
  21. package/dist/commands/run-flags.d.ts +2 -2
  22. package/dist/commands/run-flags.d.ts.map +1 -1
  23. package/dist/commands/run-flags.js +6 -6
  24. package/dist/commands/run-flags.js.map +1 -1
  25. package/dist/commands/run-stream.d.ts.map +1 -1
  26. package/dist/commands/run-stream.js +9 -10
  27. package/dist/commands/run-stream.js.map +1 -1
  28. package/dist/commands/run.d.ts.map +1 -1
  29. package/dist/commands/run.js +3 -2
  30. package/dist/commands/run.js.map +1 -1
  31. package/dist/config/load.d.ts.map +1 -1
  32. package/dist/config/load.js +27 -4
  33. package/dist/config/load.js.map +1 -1
  34. package/dist/config/run-limits.d.ts +11 -0
  35. package/dist/config/run-limits.d.ts.map +1 -0
  36. package/dist/config/run-limits.js +64 -0
  37. package/dist/config/run-limits.js.map +1 -0
  38. package/dist/config/schema.d.ts +12 -4
  39. package/dist/config/schema.d.ts.map +1 -1
  40. package/dist/config/schema.js.map +1 -1
  41. package/dist/context/runtime-message.d.ts.map +1 -1
  42. package/dist/context/runtime-message.js +6 -0
  43. package/dist/context/runtime-message.js.map +1 -1
  44. package/dist/integrations/plugins/runtime.d.ts +19 -1
  45. package/dist/integrations/plugins/runtime.d.ts.map +1 -1
  46. package/dist/integrations/plugins/runtime.js +89 -1
  47. package/dist/integrations/plugins/runtime.js.map +1 -1
  48. package/dist/integrations/plugins/settings.d.ts +15 -0
  49. package/dist/integrations/plugins/settings.d.ts.map +1 -0
  50. package/dist/integrations/plugins/settings.js +106 -0
  51. package/dist/integrations/plugins/settings.js.map +1 -0
  52. package/dist/integrations/resident/inspection.d.ts +10 -0
  53. package/dist/integrations/resident/inspection.d.ts.map +1 -0
  54. package/dist/integrations/resident/inspection.js +263 -0
  55. package/dist/integrations/resident/inspection.js.map +1 -0
  56. package/dist/integrations/resident/learning-sources.d.ts +4 -0
  57. package/dist/integrations/resident/learning-sources.d.ts.map +1 -0
  58. package/dist/integrations/resident/learning-sources.js +79 -0
  59. package/dist/integrations/resident/learning-sources.js.map +1 -0
  60. package/dist/integrations/resident/learning-storage.d.ts +5 -0
  61. package/dist/integrations/resident/learning-storage.d.ts.map +1 -0
  62. package/dist/integrations/resident/learning-storage.js +51 -0
  63. package/dist/integrations/resident/learning-storage.js.map +1 -0
  64. package/dist/integrations/resident/runner-launch.d.ts +5 -0
  65. package/dist/integrations/resident/runner-launch.d.ts.map +1 -1
  66. package/dist/integrations/resident/runner-launch.js +2 -0
  67. package/dist/integrations/resident/runner-launch.js.map +1 -1
  68. package/dist/integrations/resident/runner-store.d.ts.map +1 -1
  69. package/dist/integrations/resident/runner-store.js +2 -4
  70. package/dist/integrations/resident/runner-store.js.map +1 -1
  71. package/dist/integrations/resident/runner-worker.js +3 -0
  72. package/dist/integrations/resident/runner-worker.js.map +1 -1
  73. package/dist/integrations/resident/session-step.d.ts +6 -1
  74. package/dist/integrations/resident/session-step.d.ts.map +1 -1
  75. package/dist/integrations/resident/session-step.js +110 -14
  76. package/dist/integrations/resident/session-step.js.map +1 -1
  77. package/dist/integrations/resident/storage.d.ts.map +1 -1
  78. package/dist/integrations/resident/storage.js +7 -6
  79. package/dist/integrations/resident/storage.js.map +1 -1
  80. package/dist/integrations/resident/tool-evidence.d.ts +6 -0
  81. package/dist/integrations/resident/tool-evidence.d.ts.map +1 -0
  82. package/dist/integrations/resident/tool-evidence.js +117 -0
  83. package/dist/integrations/resident/tool-evidence.js.map +1 -0
  84. package/dist/integrations/resident/verification.d.ts +11 -0
  85. package/dist/integrations/resident/verification.d.ts.map +1 -0
  86. package/dist/integrations/resident/verification.js +109 -0
  87. package/dist/integrations/resident/verification.js.map +1 -0
  88. package/dist/integrations/sessions/compaction-evidence.d.ts +5 -0
  89. package/dist/integrations/sessions/compaction-evidence.d.ts.map +1 -0
  90. package/dist/integrations/sessions/compaction-evidence.js +59 -0
  91. package/dist/integrations/sessions/compaction-evidence.js.map +1 -0
  92. package/dist/integrations/sessions/context-inventory.js +1 -1
  93. package/dist/integrations/sessions/context-inventory.js.map +1 -1
  94. package/dist/integrations/sessions/conversation-search.d.ts +56 -8
  95. package/dist/integrations/sessions/conversation-search.d.ts.map +1 -1
  96. package/dist/integrations/sessions/conversation-search.js +600 -63
  97. package/dist/integrations/sessions/conversation-search.js.map +1 -1
  98. package/dist/integrations/sessions/database.d.ts +5 -0
  99. package/dist/integrations/sessions/database.d.ts.map +1 -0
  100. package/dist/integrations/sessions/database.js +34 -0
  101. package/dist/integrations/sessions/database.js.map +1 -0
  102. package/dist/integrations/sessions/evidence-page-validation.d.ts +8 -0
  103. package/dist/integrations/sessions/evidence-page-validation.d.ts.map +1 -0
  104. package/dist/integrations/sessions/evidence-page-validation.js +74 -0
  105. package/dist/integrations/sessions/evidence-page-validation.js.map +1 -0
  106. package/dist/integrations/sessions/evidence-recall.d.ts +5 -0
  107. package/dist/integrations/sessions/evidence-recall.d.ts.map +1 -0
  108. package/dist/integrations/sessions/evidence-recall.js +173 -0
  109. package/dist/integrations/sessions/evidence-recall.js.map +1 -0
  110. package/dist/integrations/sessions/paths.d.ts +7 -0
  111. package/dist/integrations/sessions/paths.d.ts.map +1 -0
  112. package/dist/integrations/sessions/paths.js +14 -0
  113. package/dist/integrations/sessions/paths.js.map +1 -0
  114. package/dist/integrations/sessions/run-discovery.d.ts +24 -0
  115. package/dist/integrations/sessions/run-discovery.d.ts.map +1 -0
  116. package/dist/integrations/sessions/run-discovery.js +142 -0
  117. package/dist/integrations/sessions/run-discovery.js.map +1 -0
  118. package/dist/integrations/sessions/store.d.ts +8 -18
  119. package/dist/integrations/sessions/store.d.ts.map +1 -1
  120. package/dist/integrations/sessions/store.js +14 -39
  121. package/dist/integrations/sessions/store.js.map +1 -1
  122. package/dist/integrations/sessions/transcript-export.d.ts +0 -1
  123. package/dist/integrations/sessions/transcript-export.d.ts.map +1 -1
  124. package/dist/integrations/sessions/transcript-export.js +3 -2
  125. package/dist/integrations/sessions/transcript-export.js.map +1 -1
  126. package/dist/integrations/sessions/turn-evidence.d.ts +0 -9
  127. package/dist/integrations/sessions/turn-evidence.d.ts.map +1 -1
  128. package/dist/integrations/sessions/turn-evidence.js +5 -2
  129. package/dist/integrations/sessions/turn-evidence.js.map +1 -1
  130. package/dist/integrations/state/report.d.ts.map +1 -1
  131. package/dist/integrations/state/report.js +78 -21
  132. package/dist/integrations/state/report.js.map +1 -1
  133. package/dist/integrations/subagents/parent.d.ts +3 -2
  134. package/dist/integrations/subagents/parent.d.ts.map +1 -1
  135. package/dist/integrations/subagents/parent.js +11 -6
  136. package/dist/integrations/subagents/parent.js.map +1 -1
  137. package/dist/integrations/subagents/policy.d.ts +2 -5
  138. package/dist/integrations/subagents/policy.d.ts.map +1 -1
  139. package/dist/integrations/subagents/policy.js +2 -5
  140. package/dist/integrations/subagents/policy.js.map +1 -1
  141. package/dist/integrations/subagents/runtime.d.ts +7 -0
  142. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  143. package/dist/integrations/subagents/runtime.js +9 -7
  144. package/dist/integrations/subagents/runtime.js.map +1 -1
  145. package/dist/permissions/rules.d.ts +2 -8
  146. package/dist/permissions/rules.d.ts.map +1 -1
  147. package/dist/permissions/rules.js +19 -10
  148. package/dist/permissions/rules.js.map +1 -1
  149. package/dist/tui/App.d.ts +0 -12
  150. package/dist/tui/App.d.ts.map +1 -1
  151. package/dist/tui/App.js +245 -19
  152. package/dist/tui/App.js.map +1 -1
  153. package/dist/tui/ChoicePicker.d.ts +2 -1
  154. package/dist/tui/ChoicePicker.d.ts.map +1 -1
  155. package/dist/tui/ChoicePicker.js +10 -8
  156. package/dist/tui/ChoicePicker.js.map +1 -1
  157. package/dist/tui/ToolOutputViewer.js +1 -1
  158. package/dist/tui/ToolOutputViewer.js.map +1 -1
  159. package/dist/tui/agent.d.ts +20 -3
  160. package/dist/tui/agent.d.ts.map +1 -1
  161. package/dist/tui/agent.js +211 -39
  162. package/dist/tui/agent.js.map +1 -1
  163. package/dist/tui/conversation-evidence-view.d.ts +6 -0
  164. package/dist/tui/conversation-evidence-view.d.ts.map +1 -0
  165. package/dist/tui/conversation-evidence-view.js +96 -0
  166. package/dist/tui/conversation-evidence-view.js.map +1 -0
  167. package/dist/tui/conversation-history.d.ts +3 -1
  168. package/dist/tui/conversation-history.d.ts.map +1 -1
  169. package/dist/tui/conversation-history.js +16 -1
  170. package/dist/tui/conversation-history.js.map +1 -1
  171. package/dist/tui/markdownParser.d.ts.map +1 -1
  172. package/dist/tui/markdownParser.js +2 -1
  173. package/dist/tui/markdownParser.js.map +1 -1
  174. package/dist/tui/plugin-view.d.ts +9 -0
  175. package/dist/tui/plugin-view.d.ts.map +1 -0
  176. package/dist/tui/plugin-view.js +59 -0
  177. package/dist/tui/plugin-view.js.map +1 -0
  178. package/dist/tui/run-interruption.d.ts +2 -2
  179. package/dist/tui/run-interruption.d.ts.map +1 -1
  180. package/dist/tui/run-interruption.js +5 -1
  181. package/dist/tui/run-interruption.js.map +1 -1
  182. package/dist/tui/run-limits-settings.d.ts +39 -0
  183. package/dist/tui/run-limits-settings.d.ts.map +1 -0
  184. package/dist/tui/run-limits-settings.js +88 -0
  185. package/dist/tui/run-limits-settings.js.map +1 -0
  186. package/dist/tui/slashCommands.d.ts +6 -1
  187. package/dist/tui/slashCommands.d.ts.map +1 -1
  188. package/dist/tui/slashCommands.js +40 -9
  189. package/dist/tui/slashCommands.js.map +1 -1
  190. package/dist/tui/types.d.ts +4 -2
  191. package/dist/tui/types.d.ts.map +1 -1
  192. package/package.json +7 -7
package/CHANGELOG.md CHANGED
@@ -1,5 +1,846 @@
1
1
  # @namzu/cli
2
2
 
3
+ ## 25.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - f33c62b: A run now suspends for a background job the model said it was waiting on, instead of settling over it. When the model stops calling tools and a job named by `wait_for_job` is still running, the run waits — no provider request, no tokens — for the job's exit, an operator message, or the settle grace, whichever comes first. On an exit the model gets one more turn with the `[Background job update]` line in front of it; on neither, the run settles and names the job.
8
+
9
+ This is the same bounded, zero-token wait `CompletionInbox` already gave a delegated task, and it shares the delegated task's grace — half of what the run has left before it must start finishing — under a ceiling of its own: two minutes, or `NAMZU_JOB_HOLD_MAX_MS`. On a run with a `timeoutMs` the grace comes out of what is left rather than being added to it, so time a `wait_for_job` call already spent shortens the hold by the same amount. On a run WITHOUT one — no run deadline, which is what the CLI ships — there is no remainder to take a share of, and the task ceiling would be a flat hour; that hour is sound for a task, which cannot outlive it, and wrong for a job, which can run forever. The two-minute job ceiling is what bounds that case, so a `wait_for_job` that ran its own bound out is followed by two more minutes at most, not by a second hour. The iteration limit still bounds all of it, and the wait starts nothing and stops nothing.
10
+
11
+ **Wait-intent is explicit.** Only a job `wait_for_job` named is awaited, and only for the rest of the run that named it. A job nobody waited on — a dev server, a watcher — never holds a run open, and there is no opt-in flag on `bash run_in_background` that changes that.
12
+
13
+ **Why this is `minor` and not `major`.** The signal is new: no run that exists today can have an awaited job, because nothing before this could mark one. A host that never calls `wait_for_job` sees the loop it saw before, so no default changes and no existing behaviour is withdrawn.
14
+
15
+ Additive API:
16
+
17
+ - `Run.abandonedJobIds` — awaited jobs still running when the run ended, the job-side counterpart to `abandonedTaskIds`. Naming them is not stopping them: a run-owned job is still stopped by the run's own teardown, and one bound to the host's session keeps running.
18
+ - `RUNTIME_CONTEXT_MESSAGE_KINDS` gains `'job-exit'`, the provenance on the message that carries an exit delivered by the wait. Consumers that exhaustively switch on `RuntimeContextMessageKind` need a case for it.
19
+ - `BackgroundJobRegistryRef` gains an optional `markAwaited(id)`, and `bindOwner`'s options take an `onAwaited(id)` callback that backs it. Both are optional; a host that wires neither gets the previous behaviour, which is no hold.
20
+ - `NAMZU_JOB_HOLD_MAX_MS` sets the job ceiling above, in milliseconds, beside the `NAMZU_JOB_WAIT_*` knobs `wait_for_job` already reads. Unset is two minutes.
21
+
22
+ - 6ae4072: The repeat-call advisory (notices, then escalates, when a tool is called with identical arguments over and over) now reaches the model even when the repeated tool's result is structured content — an image, a document, an MCP resource block — rather than plain text. `attachRepeatNotice` previously required the trailing tool result to be a string and silently dropped the notice otherwise; it now falls back to delivering the advisory as its own runtime-context message immediately after the tool-result batch. No thresholds changed, and a repeat that keeps succeeding is still only ever noticed, never refused.
23
+
24
+ `RuntimeContextMessageKind` gains a `'repeat-call'` member for this fallback message. A consumer that exhaustively switches over the union (the CLI's transcript labeling did) needs a case for it; `@namzu/cli` adds one in this release.
25
+
26
+ - 92ab1d9: A resumed conversation keeps the file witnesses it earned. The observation ledger is process memory, and every resume path handed the run an empty one: the derived work context could admit nothing, and the first thing a resumed agent did was read back a file whose whole body was in the transcript it had just been given.
27
+
28
+ The new export `seedObservationLedger(messages, tracker, { workingDirectory, additionalDirectories, sandboxed })` rebuilds a ledger from a conversation's own history. `resumeRun` and `query`'s checkpoint resume call it for you, from the history as repaired rather than as checkpointed, so the ledger describes exactly what the model is about to be shown; the CLI calls it the first time a turn asks for a conversation's tracker, which covers `/resume`, `namzu run --resume`/`--continue`, and a forked conversation — each seeded from its own messages, once. Call it directly if you keep a tracker per conversation and restore one yourself. Nothing is persisted and no session-store schema changes; a host that does nothing sees exactly today's behaviour.
29
+
30
+ What a replay may conclude is what the projection would admit, by the same predicates and the same bounded replay. A `write` whose call and successful receipt are both intact restores its body and its witness; the `edit` calls above it are replayed hop by hop and restore the chain. A `read` never supplies a body — the line numbering is never undone to recover one — and can only confirm one already reconstructed, by rendering it forward through the read tool's own renderer and comparing the whole rendering with the receipt. A windowed read, a read that shows something else, a cleared receipt, a hop that no longer applies, a body past the bounds and a call whose arguments run past what a replay reads as evidence each withdraw whatever the pass held for that path. So do the two cases where the transcript settles no outcome: a call it never answered — the unknown-outcome result the kernel's own repair writes for one included — may have landed with the file half written, and a mutation it refused is a tool's own report about that path, a drift refusal above all, made after reading the disk. Each of those costs the path it names and no other. A path whose walk ends holding no body is entered in the ledger nowhere, and a path this conversation only ever read establishes nothing.
31
+
32
+ No file's content is read. The one thing the seed does touch the filesystem for is the key each entry is filed under: a ledger entry identifies a file rather than a spelling, so `read`, `write` and `edit` all key on the path canonicalized through its symlinks, and entries filed any other way would be entries no mutation ever checks and no drift refusal can ever withdraw. The paths named in the history are therefore resolved exactly as the tools resolve them — `additionalDirectories` included — before the walk begins. Under a sandbox the keys are the paths as written and no host path is consulted.
33
+
34
+ Only content-backed observations are restored, so a seeded ledger is never weaker than the empty one a resume starts from. A path whose body could not be reconstructed is left OUT of the ledger rather than entered without a fingerprint: `hasRead` is the read-before-overwrite refusal, and granting it with no body to compare would let a full overwrite of a file that changed while the session was closed through with nothing checked. Every path the replay does not restore therefore behaves exactly as it does today. A fingerprint it does restore is a claim derived from history and is still compared with the real file at mutation time, so a file changed while the session was closed is refused there and the refusal withdraws the path from the projection.
35
+
36
+ Three things seed nothing at all, each leaving today's empty ledger: a history naming more than 1,024 distinct path spellings — the ones only `read` names included, and two spellings of one file counting twice — which is resolved whole or not at all rather than in a prefix that cannot say what a mutation replaced; a tool call id claimed by two calls or answered by two receipts, `read` included, since the receipt that was hidden could be the observation that withdrew a claim; and a mutation no path can be recovered from, whatever came back to it — one declaring no `path`, one whose path no longer resolves inside the directories the run may reach (a refused write to a path outside them is one of these: a key is what withdrawing one path rather than the whole pass takes), or one the provider stream cut off mid-JSON, whose arguments are recorded as `{}`. A merely large call is none of these: the argument bound governs what may be believed, not what may be attributed, so an oversize `write` withdraws its own path's body and leaves every other witness standing.
37
+
38
+ `read`'s numbering and windowing move to `tools/builtins/read-render.ts` as pure functions, which is what lets the forward-render comparison run the tool's own renderer rather than a copy of it. The tool's output is unchanged, byte for byte.
39
+
40
+ - 7ca8c7d: Add a `wait_for_job` builtin tool: it blocks on a background job's exit under a run-length bound and an idle bound that resets on new output, and returns the job's accumulated output in one call — the shell-job counterpart to the existing `wait_for_task`. Neither bound stops the job; a timeout reports which clock ran out and the output read so far, with a `next_offset` to resume from. Ships by default alongside `job` and `bash`, and refuses cleanly on a host with no background job registry.
41
+
42
+ `job`'s own description no longer instructs polling with `action: "read"` in a loop; it now points at `wait_for_job` instead. `read` and `list` are unchanged.
43
+
44
+ `BackgroundJobRegistry` gains a public `waitForExit(id, { signal })`, resolving immediately for a job that has already exited and honouring an abort signal. `BackgroundJobRegistryRef` (the tool-context surface) gains an optional `waitForExit` of the same shape — additive, so an existing host implementing this interface directly keeps working without it; `wait_for_job` refuses cleanly when it is absent.
45
+
46
+ - Updated dependencies [68e535b]
47
+ - Updated dependencies [a9e4b19]
48
+ - Updated dependencies [a54dc71]
49
+ - Updated dependencies [86a3818]
50
+ - Updated dependencies [03630cd]
51
+ - Updated dependencies [f33c62b]
52
+ - Updated dependencies [a8df193]
53
+ - Updated dependencies [8bfe291]
54
+ - Updated dependencies [6ae4072]
55
+ - Updated dependencies [dd8702d]
56
+ - Updated dependencies [92ab1d9]
57
+ - Updated dependencies [e6d6d1e]
58
+ - Updated dependencies [7ca8c7d]
59
+ - Updated dependencies [6551d15]
60
+ - @namzu/sdk@40.0.0
61
+ - @namzu/zen@1.0.2
62
+ - @namzu/computer-use@1.4.2
63
+ - @namzu/anthropic@5.1.1
64
+ - @namzu/ollama@2.2.2
65
+ - @namzu/openai@3.1.1
66
+ - @namzu/openrouter@2.4.0
67
+
68
+ ## 25.0.0
69
+
70
+ ### Major Changes
71
+
72
+ - 9463b6f: Background job `read` and `list` calls now count as read-only observations by default; starting commands and `job kill` retain their existing approval requirements. SDK `defineTool` accepts an input predicate for `readOnly`.
73
+
74
+ Explicit CLI `ask` rules are now enforced rather than omitted, so they can request review ahead of a wildcard allowance or the read-only default. SDK custom-pattern rules support `decision: 'review'`, with an `authorization.explicitReview` marker on review summaries. Read-only and accept-edits exemptions honor it; explicit auto modes and prior approvals keep their meaning.
75
+
76
+ To keep reviewing every background-job operation in prompt mode, configure `permissions: { job: ask }`, or supply a matching SDK custom-pattern review rule. If an old `ask` entry was intended to inherit default behavior, remove that entry instead. Deny rules, plan-mode mutation restrictions, job ownership and sandbox boundaries remain enforced.
77
+
78
+ - b2e5551: Default CLI main runs and built-in delegated agents to unlimited token usage,
79
+ iterations and run duration. Previously main runs defaulted to 50 iterations,
80
+ children to 40, and both to a one-hour deadline. To keep bounded execution, set
81
+ positive `limits.maxIterations` and `limits.timeoutMs` in your configuration;
82
+ explicit values apply to both the main run and built-in children. SDK embedding
83
+ defaults and file-defined specialist iteration settings remain unchanged.
84
+
85
+ Add Run limits to `/config`: edit tokens, model turns and duration, or remove all
86
+ three caps. Changes apply to new turns and their children for the current TUI
87
+ session; running work retains its captured limits and usage ledger. Resuming a paused
88
+ CLI run reloads its own saved limits instead of replacing them with launch defaults. Persistent
89
+ limits still come from the configuration files. Usage accounting, cancellation,
90
+ permissions and provider quotas continue to apply in unlimited mode.
91
+
92
+ - fe6e0fb: Avoid reading and parsing a shared compaction record once for every removed
93
+ message. A search reuses one authenticated record within that operation; later
94
+ calls revalidate it. Text manifests, integrity checks, cancellation and page
95
+ limits remain in effect.
96
+
97
+ CLI manual compaction now stores one `compaction_shed` event containing all
98
+ removed messages, matching automatic compaction, instead of one event per message.
99
+ Consumers of raw manual-maintenance events must iterate the `messages` array
100
+ and use search results' `seq` and `part` addresses, rather than assuming `part: 0`
101
+ or one sequence per message. Existing archives and SDK event readers remain
102
+ supported. No config change is required for ordinary CLI use.
103
+
104
+ - 64b3da9: New `search_conversation` calls now exclude successful outputs of `search_conversation` and `read_conversation` by default. Previously, explicit searches included them and could find their own earlier results as repeated evidence.
105
+
106
+ To keep the previous unfiltered behavior or inspect retrieval outputs themselves, pass `includeRetrievalResults: true` on a new search. Omit the option when continuing a cursor: its source filter is preserved, and incompatible changes are rejected. Failed retrievals and records with unknown tool names or success status remain searchable. Exact reads of known authorized records remain available. SDK evidence-source defaults are unchanged.
107
+
108
+ - cff2b6a: Conversation search now ignores letter case by default: searching for `destination` also finds `Destination`. Pass `caseSensitive: true` to `search_conversation` to keep the former behavior. Continue pages with the same query and case setting.
109
+
110
+ SDK run-evidence search adds optional `caseSensitive` (default `true`, unchanged). Active and closed run sources now return distinct matching passages within one text chunk, with continuation at the match limit, rather than hiding later passages in that chunk. Exact retained text, UTF-8/UTF-16 offsets, integrity verification and per-call I/O limits remain intact. Case-insensitive searches bypass exact-case filters and may read more bytes or require more pages.
111
+
112
+ - 32080b1: Durable `drain` now mounts `search_conversation` and `read_conversation` under
113
+ the persisted conversation's ownership and honors configured compaction,
114
+ memory and web options. These options were previously omitted from its host.
115
+ It can recover original retained command output without running the command
116
+ again or treating an internal backing file as workspace content.
117
+
118
+ The retained-output preview default on this entrypoint now follows the CLI's
119
+ 4,000-character setting instead of its previous 40,000-character preview. Set
120
+ `compaction.retainedToolPreviewChars: 0` to preserve the former preview behavior.
121
+ Previously ignored compaction, memory and web configuration now takes effect;
122
+ review those keys when upgrading an unattended drainer.
123
+
124
+ A resumed run that ends as failed or cancelled is now reported in `failed`
125
+ with exit code 1 instead of being reported as a successful drain.
126
+
127
+ - b2d5b01: Support explicit unlimited run guards while retaining measured token usage.
128
+ Set `tokenBudget: 0`, `maxIterations: 0` and `timeoutMs: 0` in SDK run options,
129
+ or in the CLI's `limits` configuration, to disable those three caps. The CLI's
130
+ `--token-budget 0` and `--max-iterations 0` now override configured caps; blank,
131
+ negative and unsafe numeric values are refused. Omitted defaults are unchanged.
132
+
133
+ SDK breaking change: `maxIterations: 0` and `timeoutMs: 0` previously prevented
134
+ progress; they now disable those guards, consistently with the token limit.
135
+ Hosts that used zero to prevent a run from starting must refuse admission or
136
+ pass an already-aborted signal instead. Use positive values for finite guards.
137
+
138
+ CLI breaking change: an explicitly configured `limits.maxIterations` now applies
139
+ to built-in subagents too, instead of always giving them 40 iterations. Existing
140
+ configurations with a smaller value can stop children earlier; larger values
141
+ permit more work. Omit that setting to retain the previous child default (40)
142
+ and parent default (50), or define a specialist agent with its own iteration
143
+ configuration when the two must differ. The new `limits.timeoutMs` setting also
144
+ reaches child runs and blocking delegation tools. `0` does not bypass a finite
145
+ ancestor token cap, permissions, operator cancellation or unresolved usage.
146
+
147
+ - f49a4b8: Add optional run-metered, tool-free `PrepareStepContext.generateText` and
148
+ `createEvidenceRecallStep({ resolveQuery: true })` for resolving historical
149
+ follow-ups against bounded visible conversation. Generated search terms must
150
+ occur in the question or exact cited history. SDK query resolution defaults off.
151
+
152
+ In the CLI, conversations with `compaction.recallEvidence: true` now resolve
153
+ eligible conversational queries by default. This can add one provider request
154
+ per operator input, up to 512 output tokens and ten seconds before local
155
+ retrieval. It consumes the same run token budget. Set
156
+ `compaction.resolveEvidenceQueries: false` to keep the previous literal-query,
157
+ local-only behavior. Automatic recall itself still defaults off.
158
+
159
+ - c4aaf9b: Interactive CLI sessions now honor `limits.maxIterations` and `limits.tokenBudget` from user and trusted project configuration. Previously these configured limits were ignored by TUI startup, although headless commands applied them. This also applies when rebuilding a session after a model change or reopening a conversation. To keep interactive cumulative tokens unlimited, omit `limits.tokenBudget` from the effective config and use `--token-budget` for individual headless runs. Omitted defaults remain unchanged; `limits.waitForProviderMs` remains a headless policy.
160
+
161
+ SDK closing prose requested by a token, cost or time warning now preserves the triggering limit's stop reason instead of reporting `end_turn`. The partial text is still returned, including when allowance remains, but this path skips prose answer review and must not be treated as verified completion. Cancellation and validated native structured-output settlement retain their existing behavior.
162
+
163
+ - 97acc32: Resident run/start now automatically retrieve bounded original tool evidence
164
+ from earlier settled admissions before model requests, under both context
165
+ profiles. Previously these admissions exposed explicit archive tools only.
166
+ Set `compaction.recallEvidence: false` to retain that previous behavior. This
167
+ adds local archive I/O and request context; it does not add query-planning
168
+ inference, replay actions or grant ordinary chats/delegated agents access.
169
+
170
+ SDK hosts can attach `createResidentEvidenceRecallStep` to an admitted run.
171
+ It preserves historical Session/run/claim addresses and shares bounded evidence
172
+ selection with conversation recall. Resident tool sources also support bounded
173
+ token queries and exact cursor-only recovery, retaining query/filter identity
174
+ across reopening. Incomplete results do not establish absence.
175
+
176
+ Resident Sessions now leave signal handling to their enclosing host. Previously
177
+ the SDK emergency handler could exit immediately on SIGINT/SIGTERM before the
178
+ host wrote cleanup/runner receipts. Cancellation now drains through the resident
179
+ lifecycle and preserves the interrupted claim for inspected reconciliation.
180
+
181
+ - 6cd24e9: Enable automatic historical evidence recall by default in recorded CLI conversations, including resumed conversations and resident turns using the conversation host. Previously, omitted `compaction.recallEvidence` disabled this preparation even when original tool text had been shortened to a retained preview.
182
+
183
+ Follow-ups may now make an additional bounded, metered model call to resolve the historical subject, then read scoped conversation evidence into the next request. This adds inference usage and possible latency; it shares the run's provider, effort, token budget and cancellation. Retrieval retains its existing four-page, 8 MiB read and 6,000-character context ceilings.
184
+
185
+ Set `compaction.recallEvidence: false` to retain the previous default, disabling both automatic archive reads and query-planning inference. Set `compaction.resolveEvidenceQueries: false` to keep automatic literal retrieval without the extra inference. Explicit archive tools remain available. SDK host defaults and stateless archive access are unchanged.
186
+
187
+ - f92daf8: Resident `run` and `start` now default to `--learning-disclosure on-demand` in the resident context profile. Previously all accepted learned skill bodies were included automatically; now the model sees their descriptions and can read relevant guidance with `read_resident_skill`. To retain automatic inclusion, pass `--learning-disclosure eager`. The interactive context profile and ordinary chat retain their existing behavior. Stored learning is unchanged.
188
+
189
+ The SDK adds `createResidentStepContext`, which returns prompt contributions and a read-only skill tool bound by the host to one admitted run. Source dependencies are checked when instructions are read and before subsequent requests. Existing `createResidentStepContributions` callers retain eager disclosure.
190
+
191
+ - 5d31eea: Resident learning hosts and direct skill promotions now require a `protection` plan with disjoint `verification` and `confirmation` task IDs chosen before candidate generation. Existing hosts without this field are refused before inference. Include at least one real preservation task per round, with two measured successful baseline trials and two successful candidate trials. Missing or uncertain controls block activation; losing one established success rejects the candidate even when aggregate scores improve.
192
+
193
+ Update `ResidentLearningCycleOptions`, discovery hosts, and `ResidentSkillEvaluation` callers to supply this plan and its actual paired evidence. Historical stored skills remain readable but do not gain protection evidence retroactively. Generic `reviewHarnessCandidate` callers can opt into the same checks with its third argument. CLI learning summaries display protected-task outcomes.
194
+
195
+ - f1e33a1: Resident wake calls now retain all accepted inputs until the next step settles, instead of replacing the previous wake reason. `ResidentState.wakeEvidence` exposes immutable reasons and receipt times; the SDK resident prompt and both CLI resident profiles include the complete batch. CLI resident status shows pending input counts.
196
+
197
+ The new default accepts at most 16 pending inputs and 16,000 total reason characters per pursuit. Overflow rejects the new wake without discarding accepted evidence. Callers that previously sent an unlimited series of replacement wakes must process each batch before sending more, or coalesce superseded inputs before calling `wake`. Custom callbacks should read `wakeEvidence` rather than only the latest `reason`.
198
+
199
+ Standalone resident records now write schema 2 and agenda records schema 6. Older processes refuse these new formats: upgrade all processes sharing the store together. Prior formats remain readable without inventing historical inputs. Crashed steps keep their pending evidence; only successful exact-claim settlement or explicit inspected reconciliation consumes it.
200
+
201
+ - b888779: Separate the SDK's overflow threshold from the size of an authenticated retained-output preview. `query`/`resumeRun` and `ReactiveAgent` accept `retainedToolPreviewChars`; unset or zero preserves the existing behavior. A shorter preview is used only after full host text and its integrity manifest are saved. Storage failure keeps the ordinary text budget. Rich blocks and independently supplied model text keep their existing handling.
202
+
203
+ Recorded CLI conversations now default to at most 4,000 characters for these retained overflow previews, previously up to 40,000. The 40,000-character spill threshold and ordinary smaller results are unchanged. Set `compaction.retainedToolPreviewChars: 0` in CLI configuration to retain the previous preview size. This applies to new tool results in ordinary turns and resumed runs, without rewriting existing history. Stateless sessions and delegated workers retain their existing defaults.
204
+
205
+ - ea5367d: The CLI now requires Node.js 22.13+ and stores session metadata in
206
+ `NAMZU_HOME/state/sessions.sqlite`, with artifacts directly under
207
+ `NAMZU_HOME/sessions/<sessionId>/`. It no longer creates or reads a `projects/`
208
+ runtime tree. Generated memory remains isolated under `memory/<projectId>/`,
209
+ and resident state moves to `residents/<projectId>/<agent>/`.
210
+
211
+ This changes the default persisted CLI format. Existing project trees are left
212
+ untouched and are not imported automatically. Back up the original application
213
+ home and retain the older CLI to access its conversations, generated memory
214
+ and residents. Credentials, preferences and authored configuration keep their
215
+ locations. Update custom artifact readers to the new session paths.
216
+
217
+ The SDK adds the optional `SqliteSessionStore` driver and an exact `directory`
218
+ option for `DiskMemoryStore`. Existing SDK drivers, formats and defaults remain
219
+ unchanged; SQLite is loaded only when its driver is used.
220
+
221
+ `history` now accepts real conversation UUIDs as well as host keys, and with no
222
+ key reads the most recent workspace conversation as its help documents.
223
+
224
+ ### Minor Changes
225
+
226
+ - 2a1e0e5: Preserve provider-identified public assistant message items through streaming,
227
+ settlement and conversation persistence. The SDK adds optional `textParts`
228
+ snapshots, `textPart` delta metadata and `selectAssistantText`. Completed content
229
+ selects explicitly final answers instead of concatenating intermediate progress
230
+ into the answer; ordinary unphased streams retain their existing behavior.
231
+
232
+ The Codex subscription driver maps native message phases and verifies the original
233
+ public parts before native replay. The CLI exposes optional item metadata on
234
+ delta events, separates streamed item bubbles and uses the settled answer for
235
+ turn completion. Consumers that manually concatenate deltas should use completed
236
+ content when they want the final answer; deltas still contain public progress.
237
+
238
+ - ce55c21: Add experimental `createEvidenceRecallStep` and its typed host retrieval contract.
239
+ It ranks a bounded pool of authenticated historical passages and supplies exact
240
+ excerpts with source/error/preview labels in request-only context. Every request
241
+ revalidates ownership and source data; deadlines discard late reads without
242
+ accumulating overlapping retrieval or replaying actions.
243
+
244
+ Recorded CLI conversations can opt in with `compaction.recallEvidence: true`.
245
+ The default remains off. Automatic recall excludes the requesting invocation;
246
+ explicit conversation search/read still cover live evidence, more pages and
247
+ complete text. This adds historical context, not automatic verification of
248
+ current workspace state or a guarantee of exhaustive recall.
249
+
250
+ - bb0281b: Add optional `EvidenceRecallBatch.continuations` with exported
251
+ `EvidenceRecallContinuation` hints for bounded, host-mounted read-only tools.
252
+ Incomplete recall now reports its status even when no new passage is selected,
253
+ so missing context cannot silently look like an exhaustive negative search.
254
+ Hint arguments and output are bounded within the existing context allowance.
255
+
256
+ CLI `search_conversation` accepts `cursor` alone to restore the original query,
257
+ case setting and excluded invocation. Automatic recall supplies these handles
258
+ when live or earlier-run traversal has more pages. The model can continue from
259
+ that position without replaying an action or starting the same scan again.
260
+ New searches still require a literal query. Scope, expiry, source-integrity
261
+ checks and read limits remain enforced; live handles require the same active
262
+ writer and never downgrade to another source. Automatic recall remains opt-in.
263
+
264
+ - 2869fbe: Add an optional SQLite resident learning journal with atomic event/summary updates, scoped ancestry and recorded usage, plus hash-verified immutable JSON artifacts. `runStoredResidentLearningCycle` connects existing generation and independent evaluation callbacks to the journal without adding another model loop. The store requires Node.js 22.13 or newer when used; other SDK stores retain their existing support.
265
+
266
+ Add `namzu resident learn <experiment.learning.mjs>` for explicit trusted host modules and `namzu resident learning [cycle-id]` for read-only inspection. Modules select and bound their own providers and evaluators. Interrupted work and incomplete prices remain visible; these commands do not automatically replay experiments, activate unverified guidance or start background learning. Records live in `state/learning.sqlite` and `learning/artifacts/`; accepted skills remain in the existing resident agenda.
267
+
268
+ Expose `pathBuilder`, `runStore` and `checkpointStore` on `runAgent`, forwarding the kernel's existing host storage controls. Hosts can separate generated execution evidence from a searched workspace. Omitting these options preserves the SDK's current local layout; the CLI retains its application-home layout.
269
+
270
+ - d5d2b9a: Expose optional `recordedAt` Unix milliseconds on evidence search matches, exact read pages and recall candidates. CLI conversation search/read and automatic recall preserve the stored event time, including each included occurrence of equal text. Callers can distinguish recording times without inferring them from run IDs, file times or run-start metadata.
271
+
272
+ Unknown or invalid stored timestamps stay absent; custom recall callbacks must omit unknown times and supply positive integer milliseconds within the JavaScript Date range when known. The timestamp dates recording, not fact validity; compaction copies carry their own copy time. Sequence still orders one run, and clocks across runs do not establish causal order. Existing retrieval ordering, scope, read limits and source validation remain unchanged.
273
+
274
+ - b971796: Expose `classifyEvidenceSource`, `EvidenceRecordKind` and `EVIDENCE_RECORD_GUIDANCE` for hosts presenting authenticated text evidence. Automatic recall uses the same classification. The helper interprets source tags only; it does not authenticate text or establish that its claims are true.
275
+
276
+ CLI `search_conversation` matches and located `read_conversation` pages now include `recordKind` with interpretation guidance. Exact reads also preserve recorded `toolName` and `isError`, leaving missing status unknown. Tool names exceeding 256 JSON-encoded UTF-8 bytes are omitted consistently. Original text, addresses, scope checks and pagination remain unchanged.
277
+
278
+ - 0a0baf2: Add bounded resident activity inspection and a reusable consumption projection in the SDK. The CLI's new `namzu resident inspect` command reports retained admissions, settlements, archived pursuits, historical verification receipts and known versus missing usage across process restarts.
279
+
280
+ Root usage and descendant-inclusive token totals remain separate. Missing or interrupted receipts are explicitly incomplete; unpriced tokens do not imply free work. Cost reports cover the root invocation, not descendant prices or a provider bill. Inspection does not impose a new lifetime spending limit or change existing execution defaults. Use `--max-revisions` or the returned `--cursor` to inspect histories beyond the default bounded range.
281
+
282
+ - 4828eb0: Add opt-in learning discovery from retained, host-scored failures. Hosts can record observations and authorize evaluator revisions; the SDK selects an eligible task against the installed guidance, then uses the existing generation, verification and fresh confirmation cycle. Task claims survive process restarts and prevent concurrent or accidental duplicate experiments. Provider errors, unresolved usage and obsolete observations are excluded from selection.
283
+
284
+ The CLI accepts discovery hosts in `resident learn` and adds `resident learning --observations` for paginated inspection. Compact output includes failure reasons and verification/confirmation pass counts so inspection does not require following raw artifact hashes. Existing explicit-failure hosts remain supported. Learning storage upgrades to schema 2 on its next write; older SDK builds restricted to schema 1 cannot reopen that upgraded database. Keep a database backup if a rollback to such a build is required.
285
+
286
+ - b649224: Expose optional `PrepareStepContext.captureRunEvidence(maxReadBytes?, signal?)`
287
+ for authenticated text from the current invocation's writer. It rejects local
288
+ or run cancellation and settled invocations; unsupported stores return
289
+ `undefined`. Automatic evidence recall forwards this capability with its own
290
+ deadline and revokes new captures when the recall pass ends.
291
+
292
+ With `compaction.recallEvidence: true`, recorded CLI turns now recall missing
293
+ observations from the current run, including after compaction. Up to two live
294
+ pages share the existing four-page, 8 MiB read ceiling with earlier runs;
295
+ explicit conversation tools still handle further pages and exact full text.
296
+ The default remains off. Captured observations describe the past and do not
297
+ establish current workspace contents or replay a tool action.
298
+
299
+ - e0b30c2: The `/plugins` menu can now explicitly remember a plugin's enabled or disabled state across restarts and model switches. Session-only controls keep their existing behavior. A remembered disabled plugin remains visible without importing its executable modules or starting its MCP servers. Choices belong to the plugin's canonical directory and name, so another project's same-named plugin is unaffected. Settings are stored privately in `NAMZU_HOME/plugin-settings`; loading configuration and project trust still apply.
300
+ - 6394010: Learning hosts can supply an optional `explore` callback to run environment experiments before generating guidance. The SDK retains bounded observations and their digest, then provides them to `generate` as `context.exploration`. Missing usage, cancellation, stale state or evidence-journal failure prevents continuing to synthesis or activation.
301
+
302
+ The CLI forwards the callback, shows its exploration phase and retains evidence in SQLite. Hosts that omit it keep their current behavior. Event consumers opting into this feature should handle the new `explore` stage and `exploration` event kind. Exploration needs separately authorized tools and independent evaluation; enabling it does not automatically start learning in ordinary conversations.
303
+
304
+ - f4b3ffb: Residents can retrieve earlier settled summaries and consumed wake inputs when
305
+ the latest summary omits needed evidence. The SDK adds experimental
306
+ `DiskResidentAgenda.history`, `ResidentHistorySource` and related result types,
307
+ `buildResidentHistoryTools`, and optional `ResidentStepPromptOptions.history`.
308
+ Searches are bounded and paged, tied to one pursuit and an explicit upper
309
+ revision, and report unreadable evidence without treating it as proven absence.
310
+
311
+ CLI foreground and managed resident runs mount the two read-only recall tools
312
+ in both context profiles, including deferred loading. Ordinary conversations
313
+ and delegated children do not inherit the resident's history. These tools read
314
+ existing immutable revisions; they do not restore full tool transcripts, replay
315
+ actions, or change the persisted schema.
316
+
317
+ - d1a6ce5: Residents can search and page original retained tool text from earlier settled invocations, even when the latest summary or compacted context omits it. The SDK adds bounded disk indexing, scoped source interfaces and `search_resident_tools` / `read_resident_tool` builders. The CLI binds them to the admitted pursuit, matching attempt receipts and invocation ownership; ordinary conversations gain no cross-session access.
318
+
319
+ Fix fresh disk-backed runs capturing their output directory before store initialization, which could leave oversized tool output as an unrecoverable preview. New spills record chunk integrity manifests, and new run metadata records its own tenant/project/Session/run scope independently of shared token accounting. The existing 40,000-character model-visible cap remains unchanged. Older unscoped runs are unavailable through this API; older truncated records without authenticated spills remain explicitly partial. Missing or modified output is never replayed or presented as an intact original.
320
+
321
+ - 8095541: Allow resident skill candidates to declare source revision dependencies. Their approval hash includes those bindings, and context projection withholds a bound skill unless every dependency matches fresh host observations. Unbound candidates keep their existing hashes and behavior. SDK hosts can resolve revisions per model request; the CLI resident profile supports bounded workspace-file SHA-256 observations.
322
+
323
+ Correct TUI stop messages for unresolved usage and accounting failures, including unlimited runs, so they no longer claim the token allowance was exhausted.
324
+
325
+ - bdf923d: Add `/plugins` to inspect loaded plugins and enable or disable them for an idle session. The menu reports registered tools and skills, shows plugin scope and directory, and explains how to configure loading when it is off. Changes reset on restart or model switch; configuration and plugin files are retained. Active sends, compaction and durable resumes prevent plugin changes, and session cleanup waits for a pending change to settle.
326
+
327
+ Fix discovery when project and user plugin locations resolve to the same directory under an explicit application home. Load that directory once as user scope; project-only scope still excludes it. Distinct plugin directories remain discoverable even if their authority roots match.
328
+
329
+ - 0a36260: Add `createJsonClaimVerifier` for host-configured scalar JSON claims and observation-time receipts. It rejects mismatched, incomplete, historical or foreign observations, bounds verification time and bytes, and exposes pending observation drainage. Hosts supply an authorized read adapter; this does not verify arbitrary prose or establish atomic/future source state.
330
+
331
+ Resident `run` and `start` accept `--verify <manifest>` to require configured claims before recording completion. The manifest explicitly authorizes bounded host file reads, is snapshotted per invocation, and applies to every admitted pursuit. Rejected values use the existing repair budget; only the reviewed answer can complete. Existing invocation behavior is unchanged without the flag.
332
+
333
+ ### Patch Changes
334
+
335
+ - 7bb8163: SDK evidence sources now accept `matchMode: 'token'` for complete Unicode
336
+ letter/number/underscore terms, with the same lowercase keys used by bounded
337
+ evidence ranking. The default remains literal substring search. Token queries
338
+ must contain one token per term; use literal mode for phrases or punctuation.
339
+ Continuations retain their matching mode, and token search authenticates the
340
+ preceding chunk when checking a word boundary within the existing I/O budget.
341
+
342
+ CLI automatic evidence recall uses this mode to keep incidental substrings
343
+ such as `in` inside `Packing`, or `3` inside `13000`, from consuming its candidate
344
+ slots. Explicit conversation search still supports literal substrings.
345
+ Whole-word frequency can still limit bounded discovery; this change does not
346
+ claim complete or globally ranked archive retrieval.
347
+
348
+ - 6663561: Prose `reviewAnswer` callbacks now fail the run when they throw or return a malformed verdict. Previously a thrown error accepted the answer without review. To keep a deliberately permissive policy, catch the error in the host callback and explicitly return `{ accept: true }`; return `{ accept: false, feedback }` only when requesting a bounded correction. Rejection feedback must be a nonempty string.
349
+
350
+ `maxAnswerReviews` now rejects negative, fractional, non-finite or unsafe values. Use a nonnegative safe integer (default three corrections). Rejection counts and feedback are saved together in checkpoints, so resuming the same checkpoint preserves the remaining allowance even after history compaction. Cancellation stops waiting for a pending reviewer; external work started by the callback must still honor its signal.
351
+
352
+ The CLI inherits these SDK semantics for host-supplied reviewers. Its command gate already converts unavailable checks to bounded rejection and keeps that behavior. Forced finalization, terminal tools and structured output retain their separate settlement paths.
353
+
354
+ - 6e4a820: Recover original oversized tool text in ordinary conversations after compaction or restart. `search_conversation` and `read_conversation` now use authenticated retained output for closed scoped runs while preserving assistant-message and compaction-history search. Search results can provide a UTF-8 byte position for reading near a match; returned character positions remain UTF-16. Missing or changed originals are explicitly unavailable, and partial legacy records remain previews.
355
+
356
+ The SDK adds `createDiskRunTextEvidenceSource` and its public types, a bounded text view alongside the existing tool-only evidence source, plus an optional smaller per-operation read ceiling. New spill manifests record character positions without changing the existing tool-only source interface.
357
+
358
+ Headless `run --resume`/`--continue` and persistent `run-stream --session` now receive conversation retrieval tools. Both search and read remain available with deferred tool loading. Hosts still authorize the invoking conversation; no tool is replayed to recover its result.
359
+
360
+ - bde219d: Preserve underscores within identifiers in assistant replies. For example,
361
+ `RUN_LIMITS_READY` now displays exactly as returned instead of losing its
362
+ underscores to italic formatting. Standalone underscore emphasis still works;
363
+ stored conversation content is unchanged.
364
+ - 61d47e1: Clean up application homes created by the CLI test suite after both passing and failing tests, with a run-owned parent and final runner-exit sweep for late TUI persistence. Explicitly supplied homes remain untouched, including when a test changes `NAMZU_HOME`. This prevents development and CI runs from accumulating temporary session state; installed CLI behavior is unchanged.
365
+ - eb2e7ba: Preserve Codex native response items when the subscription stream sends them as completed output-item events but leaves the final response output empty. Newly recorded conversations now retain those reasoning and tool-call items for eligible tool continuations and resume. The same correction retains hosted citations and reports tool-call finish reasons correctly. Existing route and message-integrity checks remain in force; native state already discarded by older versions cannot be recovered by upgrading.
366
+ - 738d012: Recover a retained conversation passage after restart without spending a model
367
+ turn on every empty index page. Each read now advances through at most eight
368
+ lookup pages within its existing 8 MiB allowance, checking source ownership and
369
+ integrity before each operation. A continuation still returns when the work or
370
+ byte allowance requires another call. Durable addresses, exact text, read offsets
371
+ and cancellation behavior are unchanged.
372
+ - bd4bd2e: Allow automatic evidence-query resolution to use one explicitly marked compaction summary as a derived lookup reference after original turns leave visible history. The existing six-excerpt, 64-message and inference limits remain; ordinary system policy and tool text are excluded. Query-resolution basis metadata may now include `source: "compaction-summary"`. This provenance marks a derived reference, not proof of the requested fact: answers still require retained originals. Recorded CLI conversations use this through their existing recall configuration.
373
+ - 17933cf: Conversation search now advances through fully searched, nonmatching indexed runs in the same call instead of requiring a model round trip for each irrelevant run. It keeps the shared 8 MiB read ceiling, bounded directory discovery, source ownership checks and existing result limits. Partial index pages and matching pages still return control with a continuation when needed; unavailable evidence remains explicitly incomplete.
374
+
375
+ The read tool now asks the model to copy the search result's exact byte position, and gives actionable recovery guidance when an estimated position splits a UTF-8 character. It continues to refuse invalid reads rather than silently adjusting the requested position.
376
+
377
+ - f1cd16e: Conversation search and read results now show concise source and page-status summaries in the TUI. Retained previews, partial pages, unavailable search runs and recorded tool errors stay visible instead of appearing as plain complete text. Ctrl+O retains the full returned JSON and uses a single-line window heading. Tool responses sent to the model, stored evidence, access checks and retrieval limits are unchanged.
378
+ - 77eac40: Conversation search can return matches from several completely searched runs in one call instead of stopping at the first matching run. The existing result limit, 12,000-byte match allowance, 8 MiB read ceiling and bounded directory discovery still apply. The host reserves output space before each SDK operation and adjusts its requested match count to the available room, including escaped text and source metadata. Partial index pages still yield their continuation, and missing or changed evidence remains incomplete. Callers should continue to use returned cursors rather than assume a page belongs to one run.
379
+ - df686fc: System messages can now carry `source: { type: 'compaction-summary' }`.
380
+ Kernel-generated compaction summaries receive this marker. When retained,
381
+ their text is searchable and readable as `compaction_shed:summary`, preserving
382
+ exact text and existing part positions. Ordinary system text with the same
383
+ heading and older unmarked archives keep their previous classification.
384
+
385
+ Automatic evidence recall orders matching source records before known derived
386
+ summaries within its bounded candidate pool, using separate relevance statistics.
387
+ Summaries remain available as passages and exact read addresses; they are not
388
+ deleted. CLI evidence guidance explains that these are derived text, not
389
+ independent observations. Recall limits and opt-in settings are unchanged.
390
+
391
+ - e954d02: Automatic evidence recall now reports `omittedPassages` when eligible distinct
392
+ records do not fit the selected passage count or context size. Bounded
393
+ `additionalEvidence` addresses let archive tools recover withheld text;
394
+ `omittedAddresses` reports addresses which also could not fit. The original
395
+ scope checks and character ceiling remain in force.
396
+
397
+ The context can now retain an omission notice and read address even when no
398
+ whole excerpt fits. `incomplete` continues to describe source traversal, rather
399
+ than implying that every matched record was presented. In the CLI these
400
+ addresses work with the existing `read_conversation` tool. This corrects hidden
401
+ selection loss without changing the recall opt-in or adding model calls to the
402
+ retrieval hook itself.
403
+
404
+ - df143c8: Expose optional `excerptComplete` on retained-evidence search matches and recall candidates. Built-in sources prove whether the displayed excerpt contains a whole full-retained text part using validated UTF-8 bounds. A partial excerpt or retained preview reports false; custom sources that omit the field remain unknown.
405
+
406
+ CLI conversation search and automatic recall preserve this information and explain when reading the same unchanged part adds no text or independent evidence. The field describes one text part, not the truth of its claims or coverage of the whole conversation. Existing scope, integrity, cancellation and context limits remain enforced.
407
+
408
+ - 45c8292: Fix opt-in evidence query resolution skipping follow-up questions after six or
409
+ more assistant progress messages. Within the existing 64-message scan, retain
410
+ the nearest preceding operator request and five recent updates when progress
411
+ would otherwise fill all six reference slots. The prompt, retrieval and scan
412
+ ceilings remain unchanged. A missing or compacted-away request is not invented.
413
+
414
+ Do not rewind the reference window to an older identical question when the
415
+ current retained input is outside visible history, such as steering carried on
416
+ a tool result. Use the known message object as the boundary when available;
417
+ otherwise consider bounded recent history instead of inventing a position.
418
+
419
+ Normalize grounded filenames and punctuation-separated identifiers into the
420
+ same word tokens used by evidence discovery. A valid term such as
421
+ `sevkiyatlar.txt` no longer causes the entire optional plan to fail; all expanded
422
+ tokens must remain grounded and fit the existing 16-token ceiling.
423
+
424
+ Cover this behavior through the CLI Session host, including the existing
425
+ `resolveEvidenceQueries: false` opt-out. The CLI adds no default model call.
426
+
427
+ - 6a6921c: Report unavailable automatic historical evidence in temporary model context instead of silently dropping every sign of a failed query plan or read. The short status distinguishes planning failure, retrieval failure, timeout and an earlier read still pending; it does not imply that the requested history is absent.
428
+
429
+ Raw error bodies, malformed plans and rejected source data stay out of the note. Existing error diagnostics and direct callback rejections remain, parent cancellation stops work, and context/read bounds still apply. Explicit archive tools remain available, and a failed cached query plan does not trigger an extra model call each iteration. No status note is stored as operator conversation history.
430
+
431
+ - 691342c: Automatic conversation recall now labels selected passages and visible-source
432
+ references with their producer kind. Prior assistant statements are identified
433
+ as claims rather than proof of observed file state or successful actions.
434
+
435
+ Within the existing candidate and context limits, selection keeps the best
436
+ lexical match first and then considers matching records from other producer
437
+ kinds before repeating a kind. This prevents repeated model claims from taking
438
+ every slot when a tool record is available. Derived summaries remain last.
439
+ Archive bytes, explicit search/read tools and access boundaries are unchanged;
440
+ these labels and ranking do not establish truth or independent corroboration.
441
+
442
+ - 612879e: Recover text blocks in compacted tool results that also contain images or
443
+ documents. Scoped conversation search and exact reads now include those blocks
444
+ after compaction and restart, without mixing binary bytes or inserted separators
445
+ into the text. Existing plain-text part addresses keep pointing to the same
446
+ content. Newly written large archives retain the additional text parts; old
447
+ archives are not rewritten. Unindexed legacy scans report skipped block arrays
448
+ as incomplete instead of claiming a complete search. No configuration changes
449
+ are required; automatic CLI recall remains opt-in.
450
+ - e7bc7a1: When optional conversation query planning finds competing referents, preserve
451
+ that interpretation for the main model instead of silently skipping recall.
452
+ A temporary note carries validated quotes and asks the model to clarify if
453
+ needed; it is labelled as a fallible interpretation, not historical evidence.
454
+ No subject is selected for automatic retrieval in this case. The note shares
455
+ the existing context allowance and cancellation, and new operator input clears
456
+ the cached interpretation. SDK defaults and CLI configuration keys are unchanged.
457
+ - 3e09024: Learning candidates and learning cycles can declare `purpose: 'exploration'` for instructions intended to improve an explorer. Their purpose is covered by the content digest, and generation cannot redirect the host-admitted purpose. A skill cannot change purpose under the same name.
458
+
459
+ `projectResidentLearning` continues to select task guidance by default. Exploration policies require an explicit matching purpose and are reported as `different-purpose` when withheld. Existing skills without a purpose retain their task behavior and hashes. CLI resident steps therefore keep exploration policies out of ordinary task context. Explicit exploration projection still requires matching source revisions and does not grant tools or start inference.
460
+
461
+ - d1be0be: Stabilize goal conversation UI tests by waiting for the enabled composer before
462
+ typing commands, including after conversation replacement. Tests continue to
463
+ exercise durable goal ordering and automatic continuation without increasing
464
+ timeouts or changing CLI behavior.
465
+ - 43124f0: When automatic evidence query resolution is enabled, allow its existing bounded
466
+ planner to select grounded subject words for discovery. A named record can now
467
+ focus the search without generic field words filling context with other records.
468
+ Source spelling, quoted context and every candidate's conversation ownership
469
+ are validated before use.
470
+
471
+ Temporary context reports the selected focus, observed focus words and locally
472
+ excluded passages. An empty focused scan is explicitly not proof of archive
473
+ absence. Explicit conversation search/read tools remain available with their
474
+ existing semantics; no additional model call or retrieval budget is introduced.
475
+ SDK query resolution remains opt-in. CLI integration checks cover archived
476
+ observations after reopening a conversation.
477
+
478
+ - e40044b: Correct evidence-source guidance for questions about earlier observations. The SDK coding-agent doctrine now distinguishes retained historical content from current workspace reads, preserves exact identifiers in reports and requires unavailable history to be reported honestly. Recorded CLI turns explain how to recover clipped details with their conversation search/read tools, before compaction as well as after restart. The guidance is omitted when those tools are unavailable and remains stable across a run. Search responses explicitly distinguish remaining pages from unavailable evidence so a matching announcement is not confused with the original observation. Storage, permissions, retrieval bounds and freshness checks for edits are unchanged.
479
+ - 6446182: Fix opt-in evidence query planning failing when a model rewrites a word's
480
+ spelling or inflection. The internal planner selects numbered words supplied
481
+ by the host; retrieval receives the original spellings after quote validation.
482
+ The vocabulary shares the existing 12,000-character preparation allowance,
483
+ offers at most 256 distinct spellings, and reports omissions. Each plan still
484
+ selects at most 16 words. Literal retrieval remains the SDK default, and the
485
+ CLI's existing query-resolution opt-out remains available.
486
+
487
+ Keep present-state plans from expanding with historical terms. Invalid IDs or
488
+ quotes still reject optional preparation instead of weakening source grounding.
489
+ Update the CLI Session regression for the internal selection protocol.
490
+
491
+ - 77272e3: Read retained original observations after a process exits before recording a
492
+ terminal run status. Disk evidence factories accept `consistency: 'snapshot'`
493
+ for explicitly scoped nonterminal runs; the existing default remains `closed`.
494
+ Snapshot reads validate ownership and unchanged source bytes on every operation
495
+ without acquiring an execution lease, resuming tools or changing run metadata.
496
+
497
+ The CLI now uses this mode for recorded `idle`, `pending` and `running` runs
498
+ outside its requesting live writer. An incomplete final JSONL fragment is
499
+ excluded within the existing bounded I/O allowance without editing the source.
500
+ Search remains incomplete for nonterminal snapshots; a full read describes only
501
+ the selected retained text. File or metadata changes require a fresh search,
502
+ and missing or altered retained originals remain unavailable.
503
+
504
+ - 5996a84: Recover retained tool text while the same invocation is still running. The SDK adds optional `ToolContext.captureRunEvidence` and `RunStore.captureTextEvidence` capabilities; custom stores need not implement them. Disk events carry additive integrity links so new appends do not invalidate earlier search/read continuations. Scope changes, damaged records and modified retained outputs are refused; torn boundaries remain explicitly incomplete.
505
+
506
+ CLI conversation search and read use this capability for the requesting invocation, preserving exact output after compaction without repeating the original action. Live cursors expire when the writer is replaced; start a new search after restart. Closed-run retrieval continues to support durable run/event/part references.
507
+
508
+ Conversation search also identifies the originating tool and directs callers to read the full passage, so original observations can be distinguished from prior retrieval excerpts.
509
+
510
+ - ebfb3b4: Preserve original messages removed by CLI `/compact`, including exact user details
511
+ absent from its summary, for conversation search/read after restart. Failed
512
+ retention keeps the existing conversation; messages whose serialized form exceeds
513
+ 3 MiB are refused before replacement.
514
+
515
+ SDK consumers handling `compaction_shed.reason` or `ShedPass.reason` exhaustively
516
+ must add the new `manual` case. Both manual compaction helpers accept optional
517
+ `onShed` to await host-owned retention before returning replacement history;
518
+ callback failure rejects the operation. Existing callers without a callback keep
519
+ their projection-only behavior.
520
+
521
+ - 7168bbf: Avoid returning an underfilled conversation-search response solely because an internal SDK index page ended. Search can follow up to seven internal continuations while preserving its existing requested match count, 12,000-byte match output allowance and 8 MiB read ceiling. Public cursors still resume remaining work, and each internal page revalidates scope and source integrity. A later validation failure removes that run's accumulated matches from the current response; cancellation still aborts the call. Run counts describe distinct runs visited within the response.
522
+ - 7182f1b: Fix conversation evidence searches that permanently excluded runs after the
523
+ first 100 directory entries. `search_conversation` now returns a continuation
524
+ for later discovery batches, including empty batches containing no run IDs.
525
+ `read_conversation` and automatic recall keep their existing exact-text,
526
+ ownership, byte and page limits; no tool action is replayed.
527
+
528
+ Discovery resources are bounded to 32 scans and 128 cached name pages per
529
+ process and expire after ten minutes. Concurrent reads of one continuation
530
+ share its page. Directory changes require restarting discovery, and CLI
531
+ Session shutdown closes abandoned scans. Batch order is not chronological
532
+ or globally ranked; automatic recall remains opt-in and non-exhaustive.
533
+
534
+ - c329408: Fix repeated historical observations filling every automatic evidence-recall
535
+ passage slot and excluding a different record such as a correction. Exact equal
536
+ text with the same producer, retention and error status now shares a passage
537
+ before bounded BM25 scoring. Copies retain their separate source addresses;
538
+ changed identifiers, previews and errors remain distinct.
539
+
540
+ Request context includes `otherOccurrences` for additional addresses and
541
+ `omittedOccurrences` when the character allowance cannot hold all addresses in
542
+ the retrieved pool. Distinct text takes priority over extra addresses. No archive
543
+ record is removed, no current-state or cross-run chronology is inferred, and
544
+ explicit search/read tools are unchanged. CLI automatic recall remains opt-in
545
+ with `compaction.recallEvidence: true`; no read or passage limits increase.
546
+
547
+ - e1b8bc7: Fix live evidence continuations incorrectly reporting an exhaustive search
548
+ after automatic recall had encountered a preview or unavailable original.
549
+ The continuation now retains omissions from the same live scan, even when its
550
+ remaining pages contain only valid records and are fully consumed.
551
+
552
+ `unavailableRuns` remains a count for the current call. A final page can have
553
+ zero new unavailable runs while `incomplete` remains true because an earlier
554
+ record was missing. Healthy scans still finish normally; a separate historical
555
+ scan's omissions do not taint the live cursor. No additional reads, model calls,
556
+ action replay or broader access are introduced.
557
+
558
+ - 10e9984: Add optional `RunEvidenceSearchOptions.excludeSuccessfulTools` to omit successful
559
+ results from up to 16 exact tool names during bounded discovery. The default
560
+ excludes nothing. Filter membership is bound to continuations; exact reads stay
561
+ available and errors or unknown provenance remain searchable. Search results and
562
+ `EvidenceRecallBatch` can report optional `excludedToolResults`, counting skipped
563
+ visits rather than unique facts. A positive count can produce an explanatory
564
+ recall context even when no passage is selected.
565
+
566
+ Preserve tool name and explicit error status in compacted text when the same
567
+ record contains an unambiguous, correctly ordered call/result pair. Newly written
568
+ large compaction archives retain that metadata; older archives without it stay
569
+ unknown. Text addresses, original messages and copy timestamps are unchanged.
570
+
571
+ When CLI automatic evidence recall is enabled, successful `search_conversation`
572
+ and `read_conversation` results no longer occupy its initial candidate slots,
573
+ allowing original observations behind repeated archive quotes to be considered.
574
+ Automatic cursors preserve this filter. Start a new literal search without that
575
+ cursor to inspect the quoted search/read results. This fixes candidate pollution
576
+ without increasing budgets or changing the default-disabled recall option.
577
+
578
+ - 4801a6f: Automatic evidence recall now recognizes text already present in tool text
579
+ blocks and earlier preparation stages. Those passages receive source references
580
+ instead of occupying slots intended for missing information. Images, documents
581
+ and private reasoning are not treated as visible text, and separate blocks are
582
+ never joined to invent a matching passage. Existing scope validation, context
583
+ limits and opt-in behavior are unchanged.
584
+
585
+ CLI automatic discovery can fill a candidate page from several completely
586
+ searched runs, within the same byte, output and page limits. It no longer
587
+ spends one automatic page on every small matching run. Explicit literal
588
+ searches retain their early return; unfinished source pages still require
589
+ continuation. Serialized matches, including escaping, share the output cap.
590
+
591
+ - b9e0f37: Add the experimental `refineEvidenceRecallTerms` SDK helper for bounded lexical
592
+ coverage checks. Hosts can use the returned strict query subset to search terms
593
+ missing from candidate excerpts without introducing another model call.
594
+
595
+ When `compaction.recallEvidence` is enabled, the CLI spends existing retrieval
596
+ pages on uncovered terms so frequent words are less likely to hide an earlier
597
+ observation. Original and focused cursors retain their own query and omission
598
+ state. The four-page, two-live-page and 8 MiB read limits remain in force;
599
+ explicit conversation searches retain literal matching. No configuration or
600
+ stored-data migration is required.
601
+
602
+ - 2bcf017: Improve automatic resident evidence selection when a long objective/summary
603
+ loses its subject or frequent matches hide a rarer requested observation.
604
+ Selection samples both ends of bounded fields and can spend existing search
605
+ pages on uncovered query words. Original and corrected observations retain
606
+ separate provenance; ambiguous references are not silently resolved.
607
+
608
+ Disk evidence sources and the resident source factory now advertise
609
+ `supportsTermRefinement`. SDK callers can supply `refineTerms` with an existing
610
+ token-search cursor to branch a strict subset at its authenticated position.
611
+ Returned cursors use the subset; the original broad cursor remains valid.
612
+ Scope, filters, read ceilings and automatic page/context limits stay enforced.
613
+ Custom sources without this capability use a fresh subset search; the resident
614
+ factory restarts within the selected invocation when its resolved backend
615
+ cannot refine a cursor.
616
+
617
+ - e63ca83: Add `PrepareStepResult.context` for current observations carried after history in a labelled runtime message for this request only. It is separate from `system` authority, counted in subsequent stages' context estimates, and never replaces operator intent or accumulates in conversation history.
618
+
619
+ The emitted `RuntimeContextMessageKind` union now includes `step-context`. Consumers with exhaustive switches or records over that exported union must handle the new kind as runtime-generated context, not operator input. This is the SDK's breaking surface; existing `prepareStep.system` callers retain their behavior.
620
+
621
+ The CLI moves its changing context inventory into this field. OpenAI and Anthropic request conversion no longer moves that inventory ahead of conversation history as system text. This preserves history placement without promising cache hits or reduced billed tokens.
622
+
623
+ Anthropic message caching now places its breakpoint before request-only step context, so the cached boundary ends on stable history rather than the inventory that changes next step. Requests without step context keep their existing breakpoint.
624
+
625
+ - 52f2d09: Resumed conversations and earlier-prompt forks no longer show blank assistant
626
+ rows for tool-only messages. Retained public commentary and final-answer items
627
+ are restored as separate entries when they still match the saved answer. Edited
628
+ or compacted content takes precedence over stale parts. Tool results and provider
629
+ replay state remain unchanged for the next model request.
630
+ - 2e93158: Preserve full permitted shell output before condensing similar lines. Previously,
631
+ condensation happened before retention, so omitted row values could be lost even
632
+ though conversation search reported the stored result as complete. Historical
633
+ search and reads can now recover those originals without repeating the command.
634
+
635
+ Compact output carries its recovery path. Authenticated retention may also write
636
+ an artifact for a condensed result below the normal size cap. If retention fails,
637
+ the ordinary bounded original is shown instead; hook-redacted text stays redacted.
638
+
639
+ - 1d651d0: Keep large compacted histories searchable, including short user text attached to
640
+ large images and individual long text messages. The disk store writes a bounded
641
+ `compaction_archive` storage record and saves original messages and authenticated
642
+ text chunks under the run's `compaction-output/` directory. Full SDK event readers
643
+ restore the original `compaction_shed` event with its attachments and metadata.
644
+
645
+ Raw JSONL consumers must handle this new storage record or switch to
646
+ `RunDiskStore.readEvents()` / `readRunEventsIn()`. Preserve `compaction-output/`
647
+ with the transcript when copying a run. Upgrade SDK readers before consuming new
648
+ archives. Existing inline records remain readable; older oversized records are
649
+ not converted automatically.
650
+
651
+ CLI manual compaction now offloads messages above 3 MiB instead of refusing them.
652
+ Automatic compaction and scoped search/read use the same SDK mechanism. Archive
653
+ write failures and limits still prevent the history replacement.
654
+
655
+ - 281859f: Correct recovery guidance in shortened tool output. The kernel no longer assumes that workspace `read`/`grep` tools can open internal retained-output paths. It directs recovery through the host-authorized tools and distinguishes the saved observation from a fresh read of its source. Existing permissions, exact retention and preview limits are unchanged; previously recorded previews are not rewritten.
656
+ - c795e3f: Read an already located conversation passage directly through its authenticated
657
+ SDK address instead of searching index pages again. This removes an unnecessary
658
+ empty read page after late search matches. Source ownership and bytes are checked
659
+ again on every read; changed evidence is refused.
660
+
661
+ The host retains at most 128 locations for ten minutes without retaining their
662
+ payloads. Expiry, eviction or restart falls back to the existing bounded lookup
663
+ using the same run/sequence/part address. Closing a conversation now releases
664
+ both search and read cursors, as well as these temporary locations.
665
+
666
+ - 0fa8941: Allow a host to bound a resident tool-evidence operation across history,
667
+ invocation resolution and archive reads with `maxReadBytes`. Configure the
668
+ source's `resolutionReadBytes` with a host-enforced document-read ceiling;
669
+ bounded calls refuse to proceed without that declaration. Their `chargedBytes`
670
+ includes the declared resolution allowance, and a failed source search without
671
+ a byte receipt conservatively consumes the remainder. Calls without the new
672
+ option retain their separate existing limits.
673
+
674
+ The CLI declares the existing size bounds of its two attempt receipts, making
675
+ its source usable by bounded host retrieval. This does not enable automatic
676
+ resident recall yet. Returned pages must match their resolved invocation's
677
+ tenant/project/Session/run identity, and cancelled reads cannot expose a late
678
+ backend result. Custom sources must honor the read limits they accept.
679
+
680
+ - 3c60512: Add optional writer-owned `PersistedRunEvent.previousTextRecord` links for live
681
+ text retrieval. Bounded searches can reach earlier observations without spending
682
+ their record allowance on intervening nontext lifecycle events. Operational JSONL
683
+ records and adjacent links remain intact. Missing text links retain adjacent
684
+ traversal, and malformed content or incomplete history cannot be skipped as if
685
+ the archive were complete.
686
+
687
+ The CLI's opt-in automatic evidence recall benefits from these links within its
688
+ existing page and byte limits. No extra model call or tool action replay is used.
689
+ This is selected-text integrity checking, not a full audit of skipped operational
690
+ records; the `compaction.recallEvidence` default remains off.
691
+
692
+ - 6c682d8: Text evidence searches accept `excludeDerivedSummaries`, defaulting to false.
693
+ This excludes only explicitly marked compaction summaries, binds the selection
694
+ into cursors, and reports `excludedSummaries` as skipped part visits. Summary
695
+ text remains available through unfiltered searches and exact reads.
696
+
697
+ When a partial automatic CLI evidence page contains derived summaries, the host
698
+ can spend its existing refinement page on source records instead. The general
699
+ cursor and already retrieved summaries are preserved. This helps discovery reach
700
+ original observations behind repeated summaries without increasing the four-page,
701
+ 8 MiB read or context allowances. Explicit tool continuations restore the exact
702
+ filter; new literal searches remain unfiltered. An incomplete scan still cannot
703
+ establish absence.
704
+
705
+ - 656e79d: Add optional cancellation signals to `ToolContext.captureRunEvidence` and
706
+ `RunStore.captureTextEvidence`. Existing implementations that accept fewer
707
+ arguments remain compatible; custom stores should observe the supplied signal
708
+ to stop their own I/O promptly.
709
+
710
+ Tool evidence capture now observes the tool's deadline and nested dispatch
711
+ cancellation, and refuses use after the tool call settles even if its parent
712
+ run is still working. Cancelling a local read leaves other calls available.
713
+ Queued cancelled captures are skipped without releasing a writer lock early.
714
+ An uncooperative custom store can still delay later appends until its pending
715
+ operation settles, although the cancelled caller stops waiting immediately.
716
+ CLI conversation search and exact reads also forward their operation signal
717
+ when capturing live evidence.
718
+
719
+ - 3c6326f: Prevent checkpoint resume from repeating a tool that started but never recorded
720
+ its completion. Previously, resuming a partially completed batch could execute
721
+ such a call again, duplicating an external effect. The resumed conversation now
722
+ receives an explicit unknown outcome and can verify current state before further
723
+ work. Completed calls remain recovered and proven unstarted calls can continue.
724
+
725
+ Add optional `RunStore.readToolExecutions` and exported `ToolExecutionSnapshot` /
726
+ `ToolExecutionRecord` types. Disk and memory stores implement the scan; custom
727
+ stores without it use their strict `readEvents` contract. Missing or contradictory
728
+ execution evidence does not authorize replay. The disk scan has documented size
729
+ bounds; exceeded bounds produce unknown outcomes instead of automatic re-execution.
730
+
731
+ Explicitly answered durable questions may still re-enter their own asking tool,
732
+ without granting the same exception to interrupted siblings.
733
+
734
+ CLI `drain` now passes configured run limits to its resume host. Previously a
735
+ bounded run could fail with a token-budget root-limit mismatch because `drain`
736
+ silently used an unlimited limit. Keep the original token limit in configuration;
737
+ the existing ledger still enforces its spent allowance.
738
+
739
+ - 3c6ef94: Validate returned archive pages before exposing their text or caching an address.
740
+ Conversation search, exact reads and automatic recall now consistently reject
741
+ pages with mismatched ownership, invalid retrieval bounds or inconsistent text
742
+ positions. Exact reads also reject a wrong sequence/part during address lookup
743
+ and discard results returned after cancellation. Faulty captured sources report
744
+ unavailable evidence instead of contributing text to the conversation. Existing
745
+ built-in storage integrity checks and retrieval limits are unchanged.
746
+ - f3b377e: Project bounded file-evidence references and owned worker status into model requests. A successful write body is referenced only while its complete call input and receipt remain visible and match the conversation's observation fingerprint. Existing disk-drift checks still run before mutations. Observations without content now invalidate an earlier fingerprint instead of carrying it forward.
747
+
748
+ `FileReadTracker.recordRead` accepts an optional third argument for a successful full-body write's tool-call ID, exposed through the optional `writeCallId` method. The built-in tracker preserves this witness across identical observations and clears it on changed or unknown content. Existing custom trackers remain valid; trackers without the witness do not enable the new file reference projection.
749
+
750
+ Add `CompletionInbox.describeOwnedWork()` for a non-consuming snapshot of up to sixteen owned tasks, separating scheduler state from delivery to history. The runtime uses it to keep available results visible after operator steering; delivery does not claim that a user-facing synthesis was produced. No automatic relaunch, answer-verification inference or persisted duplicate transcript is added.
751
+
752
+ - fd0d270: Automatic evidence recall now retains bounded source references for exact text already visible in conversation history. The temporary context can contain `visibleEvidence` entries binding an exact bounded `textQuote` to an `address` for a host archive-read tool, recording time when known, source and retention/error metadata. `omittedVisibleEvidence` reports references withheld by the existing character limit. Quotes repeat at most 512 UTF-16 units to make the source association explicit; full records remain available through the read address. Visible quotes and new passages share `maxPassages`, with new text taking priority.
753
+
754
+ An otherwise complete recall pass may now return source metadata even when all matching text is already visible. Consumers should not assume every recall block contains new passage text. New-text ranking is independent of visible copies, and source ownership, revalidation, read limits and cancellation remain enforced. CLI models can use each reference's `address` with `read_conversation` to recover the exact source association without searching again or replaying an action.
755
+
756
+ - Updated dependencies [40651dd]
757
+ - Updated dependencies [b156888]
758
+ - Updated dependencies [7bb8163]
759
+ - Updated dependencies [2d26b44]
760
+ - Updated dependencies [6663561]
761
+ - Updated dependencies [2a1e0e5]
762
+ - Updated dependencies [ce55c21]
763
+ - Updated dependencies [9463b6f]
764
+ - Updated dependencies [de53442]
765
+ - Updated dependencies [6e4a820]
766
+ - Updated dependencies [28d3874]
767
+ - Updated dependencies [985db49]
768
+ - Updated dependencies [eb2e7ba]
769
+ - Updated dependencies [bd4bd2e]
770
+ - Updated dependencies [fe6e0fb]
771
+ - Updated dependencies [bb0281b]
772
+ - Updated dependencies [cff2b6a]
773
+ - Updated dependencies [df686fc]
774
+ - Updated dependencies [e954d02]
775
+ - Updated dependencies [2869fbe]
776
+ - Updated dependencies [b1e3bc5]
777
+ - Updated dependencies [df143c8]
778
+ - Updated dependencies [45c8292]
779
+ - Updated dependencies [6e14db9]
780
+ - Updated dependencies [6a6921c]
781
+ - Updated dependencies [691342c]
782
+ - Updated dependencies [d5d2b9a]
783
+ - Updated dependencies [b971796]
784
+ - Updated dependencies [e9a4192]
785
+ - Updated dependencies [612879e]
786
+ - Updated dependencies [e7bc7a1]
787
+ - Updated dependencies [b2d5b01]
788
+ - Updated dependencies [3e09024]
789
+ - Updated dependencies [f49a4b8]
790
+ - Updated dependencies [43124f0]
791
+ - Updated dependencies [e40044b]
792
+ - Updated dependencies [6446182]
793
+ - Updated dependencies [0a0baf2]
794
+ - Updated dependencies [c4aaf9b]
795
+ - Updated dependencies [77272e3]
796
+ - Updated dependencies [7579aa0]
797
+ - Updated dependencies [5996a84]
798
+ - Updated dependencies [ebfb3b4]
799
+ - Updated dependencies [4828eb0]
800
+ - Updated dependencies [97acc32]
801
+ - Updated dependencies [c329408]
802
+ - Updated dependencies [b649224]
803
+ - Updated dependencies [10e9984]
804
+ - Updated dependencies [4801a6f]
805
+ - Updated dependencies [b9e0f37]
806
+ - Updated dependencies [2bcf017]
807
+ - Updated dependencies [e63ca83]
808
+ - Updated dependencies [830f81e]
809
+ - Updated dependencies [6394010]
810
+ - Updated dependencies [f4b3ffb]
811
+ - Updated dependencies [9a4877a]
812
+ - Updated dependencies [f92daf8]
813
+ - Updated dependencies [22203b0]
814
+ - Updated dependencies [5d31eea]
815
+ - Updated dependencies [9ea5074]
816
+ - Updated dependencies [f1e33a1]
817
+ - Updated dependencies [2e93158]
818
+ - Updated dependencies [1d651d0]
819
+ - Updated dependencies [b888779]
820
+ - Updated dependencies [281859f]
821
+ - Updated dependencies [d1a6ce5]
822
+ - Updated dependencies [d81aca6]
823
+ - Updated dependencies [61aab1f]
824
+ - Updated dependencies [ea5367d]
825
+ - Updated dependencies [0fa8941]
826
+ - Updated dependencies [3c60512]
827
+ - Updated dependencies [8095541]
828
+ - Updated dependencies [6c682d8]
829
+ - Updated dependencies [bdf923d]
830
+ - Updated dependencies [656e79d]
831
+ - Updated dependencies [3c6326f]
832
+ - Updated dependencies [0a36260]
833
+ - Updated dependencies [f3b377e]
834
+ - Updated dependencies [fd0d270]
835
+ - Updated dependencies [2869fbe]
836
+ - @namzu/sdk@39.0.0
837
+ - @namzu/openai@3.1.1
838
+ - @namzu/anthropic@5.1.1
839
+ - @namzu/zen@1.0.1
840
+ - @namzu/computer-use@1.4.2
841
+ - @namzu/ollama@2.2.2
842
+ - @namzu/openrouter@2.4.0
843
+
3
844
  ## 24.0.0
4
845
 
5
846
  ### Major Changes