@iowarp/clio-coder 0.3.2 → 0.3.4

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 (259) hide show
  1. package/CHANGELOG.md +269 -458
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +3 -3
  4. package/dist/{acp-BIYHVZIM.js → acp-S5R4RR5B.js} +7 -6
  5. package/dist/{agents-YT6SSRIT.js → agents-P6DMMVZY.js} +24 -21
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-5TWEIYDN.js → auth-2XCZLPKS.js} +12 -8
  8. package/dist/{chunk-GGXXDWE4.js → chunk-22NAGB7X.js} +2 -2
  9. package/dist/{chunk-WMSVI4G2.js → chunk-2LZI5CAG.js} +133 -13
  10. package/dist/{chunk-OAO4GE4M.js → chunk-2TZWSW76.js} +2 -2
  11. package/dist/{chunk-OOJYHWRB.js → chunk-34475P3I.js} +2 -2
  12. package/dist/{chunk-WVO7V2QY.js → chunk-35MKKU5R.js} +4 -4
  13. package/dist/{chunk-LBNRH5WM.js → chunk-3HZ5RWN2.js} +5 -5
  14. package/dist/{chunk-AGYYIBLL.js → chunk-3JLKSKD7.js} +2 -2
  15. package/dist/{chunk-MBS4V7ZP.js → chunk-4JUF2NNX.js} +7 -7
  16. package/dist/{chunk-ZDOOVTXZ.js → chunk-4OC57DA6.js} +27 -4
  17. package/dist/chunk-5M54SPOL.js +926 -0
  18. package/dist/{chunk-STBPMHSX.js → chunk-7RXG6QRZ.js} +51 -11
  19. package/dist/{chunk-77VKQEHF.js → chunk-A2GZF7DC.js} +5 -5
  20. package/dist/{chunk-A3CYT5EX.js → chunk-AD2SYQYC.js} +55 -2
  21. package/dist/chunk-AOCYTWAV.js +449 -0
  22. package/dist/chunk-BEY543CS.js +258 -0
  23. package/dist/{chunk-6N5PTWMY.js → chunk-BP4OYD6A.js} +32 -13
  24. package/dist/chunk-BPGS2WCQ.js +612 -0
  25. package/dist/{chunk-J5HN4RYU.js → chunk-BRXQQJFP.js} +8 -8
  26. package/dist/chunk-CFGTUFWB.js +67 -0
  27. package/dist/{chunk-CBCAPZAA.js → chunk-E25LMLRW.js} +2 -2
  28. package/dist/{chunk-G2DE3C7R.js → chunk-EDRHSCIE.js} +4 -4
  29. package/dist/{chunk-4KLWL3UC.js → chunk-EFADSJET.js} +2 -2
  30. package/dist/{chunk-M6SHUN7Q.js → chunk-FO5ZOVUY.js} +2 -2
  31. package/dist/chunk-FYYLNIL5.js +313 -0
  32. package/dist/{chunk-EPVUXGXG.js → chunk-HV5X7OR2.js} +14 -12
  33. package/dist/{chunk-TZTZS7QK.js → chunk-HXG4IURW.js} +5 -3
  34. package/dist/{chunk-IGLFWIYI.js → chunk-K6WL7QZT.js} +3 -3
  35. package/dist/chunk-K7VKOLQQ.js +15 -0
  36. package/dist/{chunk-BMEMKKIT.js → chunk-KOHPCX4K.js} +2 -2
  37. package/dist/{chunk-V4RXGQ5Q.js → chunk-KRPY7NTG.js} +10 -7
  38. package/dist/chunk-LL4KHSZI.js +22 -0
  39. package/dist/{chunk-KJ5LWLOE.js → chunk-MEQ45TQ4.js} +15 -9
  40. package/dist/{chunk-5UUP6MWO.js → chunk-MV3K5QF2.js} +5 -436
  41. package/dist/{chunk-AO4RKG4M.js → chunk-N4CZJQRK.js} +5 -5
  42. package/dist/{chunk-ARBGF5F7.js → chunk-NILBFAPG.js} +14 -8
  43. package/dist/chunk-OZNBF4L3.js +23 -0
  44. package/dist/{verify-G6V4D2G7.js → chunk-PCZJO5TI.js} +127 -42
  45. package/dist/chunk-QQK64KLB.js +1360 -0
  46. package/dist/{chunk-6EJV5X2W.js → chunk-QQL5RT5M.js} +979 -1619
  47. package/dist/{chunk-LZSJBIVT.js → chunk-QWU7ZBO7.js} +70 -720
  48. package/dist/{chunk-2EHAIA3X.js → chunk-RD5U66HV.js} +3 -3
  49. package/dist/{chunk-OKGUZO2U.js → chunk-SPULKLCF.js} +4 -3
  50. package/dist/{chunk-OQ33BKR3.js → chunk-TTNYS3EA.js} +3 -60
  51. package/dist/chunk-TW3WDMVS.js +677 -0
  52. package/dist/chunk-TZSKNMZG.js +434 -0
  53. package/dist/{chunk-7MNJORFF.js → chunk-UL3WSD3F.js} +6 -1
  54. package/dist/{chunk-7EYHLWU7.js → chunk-UZHIZC5S.js} +7 -7
  55. package/dist/{chunk-QTYWRVRA.js → chunk-VAWWTKDP.js} +8 -8
  56. package/dist/{chunk-X75S7HFS.js → chunk-VEZEGCGW.js} +214 -20
  57. package/dist/{chunk-OHHN2SO4.js → chunk-VMNQ6OZA.js} +98 -202
  58. package/dist/chunk-VSNATDE6.js +122 -0
  59. package/dist/chunk-W6GROXXM.js +69 -0
  60. package/dist/chunk-WPQLXFOZ.js +375 -0
  61. package/dist/{chunk-ORBHGJC5.js → chunk-WR67VIZY.js} +3 -3
  62. package/dist/{chunk-3ZXDFGR5.js → chunk-X6COSD2O.js} +5 -5
  63. package/dist/chunk-ZGVHUX3M.js +66 -0
  64. package/dist/{chunk-MAW544W2.js → chunk-ZWMF7253.js} +4 -4
  65. package/dist/{chunk-MQSRRFWA.js → chunk-ZYKPLLNQ.js} +563 -546
  66. package/dist/cli/index.js +27 -23
  67. package/dist/{clio-4LY5K2AC.js → clio-J5JIOIDS.js} +7 -6
  68. package/dist/{code-nav-7AX6FYE6.js → code-nav-AXCXSBHX.js} +5 -3
  69. package/dist/{config-GTLUW2PR.js → config-OEBMIN2U.js} +37 -27
  70. package/dist/{configure-R6A64DHX.js → configure-PUQOSIXQ.js} +16 -13
  71. package/dist/{context-5VKGUVJJ.js → context-EKDCKUUZ.js} +82 -7
  72. package/dist/{context-RW5HC47S.js → context-MGSE4Z2T.js} +33 -23
  73. package/dist/{context-JFZEJ7W5.js → context-URSXPBCK.js} +17 -9
  74. package/dist/{context-clear-6ZHBAZZT.js → context-clear-KDAJRNUK.js} +33 -23
  75. package/dist/context-working-set-SBKMPPI2.js +1552 -0
  76. package/dist/{dispatch-runner-VKBRCWQC.js → dispatch-runner-MSWN72NK.js} +43 -29
  77. package/dist/{doctor-KI767GSN.js → doctor-7BSE27PJ.js} +10 -10
  78. package/dist/{eval-XSSNATB4.js → eval-IZGDOO4H.js} +9 -8
  79. package/dist/{evidence-UA6AWDQQ.js → evidence-SR7WXB5B.js} +51 -23
  80. package/dist/{evolve-QNTFGV6Z.js → evolve-K7VE2CBX.js} +30 -20
  81. package/dist/{fleet-Q7UOMUSG.js → fleet-7XMJNQNF.js} +48 -38
  82. package/dist/{fleet-preflight-DDN536IT.js → fleet-preflight-AQNAH644.js} +3 -3
  83. package/dist/{init-WBB65ZHQ.js → init-JGNPAYXT.js} +41 -31
  84. package/dist/{memory-MD3O64RI.js → memory-4ALKDJ4Q.js} +32 -22
  85. package/dist/{models-BZU34YWD.js → models-ZMMLFJNN.js} +22 -19
  86. package/dist/{monitor-MEQA5C3I.js → monitor-2F3T5KHP.js} +55 -43
  87. package/dist/{orchestrator-CGFKEP27.js → orchestrator-ORHT43JB.js} +2507 -1896
  88. package/dist/{reset-L2FQEE3E.js → reset-NXGTYNUO.js} +4 -3
  89. package/dist/{run-IV4Q6RLN.js → run-RF4WJGMT.js} +51 -41
  90. package/dist/{share-S5BZQC5I.js → share-UT3W6E4M.js} +5 -4
  91. package/dist/{skills-LQEKRDTN.js → skills-PSACKC5Q.js} +2 -2
  92. package/dist/{skills-eval-3DC4HEWS.js → skills-eval-WJSI55RZ.js} +34 -24
  93. package/dist/{targets-C4SSGQOB.js → targets-PIIRAOYS.js} +23 -20
  94. package/dist/{terminal-lease-IT5JW2NR.js → terminal-lease-ULWXWNVY.js} +5 -4
  95. package/dist/{upgrade-7TT7SQ3G.js → upgrade-346TZ6AV.js} +18 -17
  96. package/dist/{usage-GV4PKT3M.js → usage-6KKXR32N.js} +34 -24
  97. package/dist/verifiers-4UUM6TEE.js +1214 -0
  98. package/dist/verify-X5HDROLA.js +25 -0
  99. package/dist/{wiki-generate-DQF6Z66B.js → wiki-generate-7STOCIFZ.js} +42 -31
  100. package/dist/worker/entry.js +33 -24
  101. package/docs/README.md +8 -7
  102. package/docs/acp.md +1 -1
  103. package/docs/alcf-provider.md +1 -1
  104. package/docs/architecture.md +2 -2
  105. package/docs/artifact-versions.md +1 -1
  106. package/docs/built-in-agents.md +1 -1
  107. package/docs/capacity-and-scheduling.md +1 -1
  108. package/docs/commands-and-modes.md +53 -21
  109. package/docs/config-knobs-audit.md +1 -2
  110. package/docs/configuration-and-targets.md +15 -1
  111. package/docs/context-engine.md +64 -12
  112. package/docs/context-working-set.md +194 -0
  113. package/docs/development-pipeline.md +1 -1
  114. package/docs/documentation-coverage.md +5 -5
  115. package/docs/documentation-guide.md +6 -5
  116. package/docs/environment-variables.md +2 -1
  117. package/docs/eval-runner.md +1 -1
  118. package/docs/evals-internal.md +14 -1
  119. package/docs/evidence-and-memory.md +74 -2
  120. package/docs/evolution.md +1 -1
  121. package/docs/exit-codes-and-output.md +1 -1
  122. package/docs/extensions-and-sharing.md +2 -2
  123. package/docs/fleet-dispatch.md +22 -7
  124. package/docs/glossary.md +21 -1
  125. package/docs/installation-and-lifecycle.md +6 -6
  126. package/docs/middleware-and-components.md +1 -1
  127. package/docs/model-catalog.md +7 -9
  128. package/docs/observability.md +4 -4
  129. package/docs/performance-methodology.md +2 -2
  130. package/docs/proactive-memory.md +1 -1
  131. package/docs/prompt-envelope-and-tools.md +4 -4
  132. package/docs/provider-adapter-cookbook.md +1 -1
  133. package/docs/release-cut-checklist.md +35 -35
  134. package/docs/safety-model.md +23 -4
  135. package/docs/scientific-validation.md +21 -3
  136. package/docs/session-lifecycle.md +3 -3
  137. package/docs/skills-marketplace.md +1 -1
  138. package/docs/tool-usage.md +79 -12
  139. package/docs/trace-store.md +1 -1
  140. package/docs/troubleshooting.md +1 -1
  141. package/docs/tui-design.md +2 -2
  142. package/docs/worker-dispatch-mechanics.md +11 -1
  143. package/package.json +8 -11
  144. package/skills/meta/clio-test/SKILL.md +20 -17
  145. package/skills/meta/clio-test/evals.md +3 -3
  146. package/skills/meta/clio-test/references/harness.md +35 -6
  147. package/skills/meta/clio-test/references/test-map.md +20 -10
  148. package/skills/registry.yaml +2 -2
  149. package/skills/skill-marketplace.json +1 -1
  150. package/src/cli/context-working-set.ts +513 -0
  151. package/src/cli/context.ts +8 -0
  152. package/src/cli/evidence.ts +20 -2
  153. package/src/cli/index.ts +4 -0
  154. package/src/cli/verifiers.ts +325 -0
  155. package/src/core/bash-exec.ts +39 -14
  156. package/src/core/bus-events.ts +19 -4
  157. package/src/core/config.ts +54 -0
  158. package/src/core/defaults.ts +50 -3
  159. package/src/core/git-commit-attribution.ts +46 -21
  160. package/src/core/verification-scripts.ts +6 -0
  161. package/src/domains/agents/builtins/verifier.md +3 -0
  162. package/src/domains/config/classify.ts +1 -0
  163. package/src/domains/config/keybindings.ts +3 -3
  164. package/src/domains/context/working-set/contract.ts +161 -0
  165. package/src/domains/context/working-set/defaults.ts +28 -0
  166. package/src/domains/context/working-set/engine.ts +203 -0
  167. package/src/domains/context/working-set/fold.ts +62 -0
  168. package/src/domains/context/working-set/horizon.ts +38 -0
  169. package/src/domains/context/working-set/marker.ts +103 -0
  170. package/src/domains/context/working-set/path-index.ts +436 -0
  171. package/src/domains/context/working-set/payload.ts +152 -0
  172. package/src/domains/context/working-set/policies/age-horizon.ts +55 -0
  173. package/src/domains/context/working-set/policies/index.ts +21 -0
  174. package/src/domains/context/working-set/policies/structural.ts +160 -0
  175. package/src/domains/context/working-set/project.ts +132 -0
  176. package/src/domains/context/working-set/protect.ts +109 -0
  177. package/src/domains/context/working-set/recall.ts +177 -0
  178. package/src/domains/context/working-set/replay/controls.ts +112 -0
  179. package/src/domains/context/working-set/replay/load-clio.ts +199 -0
  180. package/src/domains/context/working-set/replay/metrics.ts +185 -0
  181. package/src/domains/context/working-set/replay/reference-graph.ts +79 -0
  182. package/src/domains/context/working-set/replay/report.ts +139 -0
  183. package/src/domains/context/working-set/replay/runner.ts +325 -0
  184. package/src/domains/context/working-set/replay/synthetic.ts +422 -0
  185. package/src/domains/context/working-set/replay/trace.ts +21 -0
  186. package/src/domains/context/working-set/visible.ts +54 -0
  187. package/src/domains/evidence/build.ts +112 -45
  188. package/src/domains/evidence/eval.ts +24 -7
  189. package/src/domains/evidence/index.ts +53 -0
  190. package/src/domains/evidence/ordering.ts +12 -0
  191. package/src/domains/evidence/run-trust.ts +221 -0
  192. package/src/domains/evidence/store.ts +46 -6
  193. package/src/domains/evidence/trust-status.ts +854 -0
  194. package/src/domains/evidence/types.ts +26 -0
  195. package/src/domains/middleware/memory-intervention.ts +3 -0
  196. package/src/domains/middleware/stalled-turn.ts +165 -4
  197. package/src/domains/safety/autonomy.ts +1 -1
  198. package/src/domains/safety/default-path-policy.ts +8 -0
  199. package/src/domains/safety/finish-contract.ts +4 -3
  200. package/src/domains/safety/policy-engine.ts +48 -6
  201. package/src/domains/session/compaction/compact.ts +23 -1
  202. package/src/domains/session/compaction/cut-point.ts +2 -0
  203. package/src/domains/session/compaction/tokens.ts +16 -1
  204. package/src/domains/session/context-ledger.ts +2 -0
  205. package/src/domains/session/entries.ts +107 -1
  206. package/src/domains/session/manager.ts +9 -2
  207. package/src/domains/session/migrations/index.ts +22 -3
  208. package/src/engine/acp/server.ts +3 -0
  209. package/src/engine/agent.ts +18 -1
  210. package/src/engine/session.ts +9 -3
  211. package/src/entry/orchestrator.ts +16 -4
  212. package/src/interactive/chat-loop-messages.ts +18 -6
  213. package/src/interactive/chat-panel.ts +571 -244
  214. package/src/interactive/chat-renderer.ts +79 -39
  215. package/src/interactive/context-meter.ts +10 -0
  216. package/src/interactive/context-overlay.ts +81 -6
  217. package/src/interactive/context-recall-command.ts +110 -0
  218. package/src/interactive/editor-submit.ts +26 -1
  219. package/src/interactive/footer/widgets.ts +22 -20
  220. package/src/interactive/footer-panel.ts +6 -1
  221. package/src/interactive/interactive-application.ts +2 -0
  222. package/src/interactive/interactive-event-projection.ts +12 -0
  223. package/src/interactive/interactive-slash-runtime.ts +49 -8
  224. package/src/interactive/model-session-replay.ts +21 -0
  225. package/src/interactive/overlay-general-openers.ts +6 -0
  226. package/src/interactive/overlay-session-lifecycle.ts +8 -4
  227. package/src/interactive/overlays/ask-user.ts +146 -24
  228. package/src/interactive/renderers/tool-execution.ts +167 -56
  229. package/src/interactive/session-transcript.ts +2 -2
  230. package/src/interactive/slash-commands.ts +29 -2
  231. package/src/interactive/status/index.ts +12 -1
  232. package/src/interactive/status/reasoning.ts +87 -0
  233. package/src/interactive/status/summary.ts +13 -2
  234. package/src/interactive/transcript-detail.ts +120 -0
  235. package/src/interactive/turn-context.ts +238 -88
  236. package/src/interactive/turn-middleware.ts +6 -6
  237. package/src/tools/agent-tools.ts +11 -4
  238. package/src/tools/bash.ts +144 -82
  239. package/src/tools/builtin-tool-catalog.ts +18 -6
  240. package/src/tools/context/index.ts +105 -3
  241. package/src/tools/context/surface.ts +3 -2
  242. package/src/tools/core-bootstrap.ts +21 -0
  243. package/src/tools/dispatch-runner.ts +9 -7
  244. package/src/tools/monitor.ts +28 -20
  245. package/src/tools/presentation.ts +107 -0
  246. package/src/tools/registry.ts +65 -7
  247. package/src/tools/result-disposition.ts +550 -0
  248. package/src/tools/result-shaping.ts +262 -19
  249. package/src/tools/safe-exec.ts +2 -0
  250. package/src/tools/verify/authoring.ts +1119 -0
  251. package/src/tools/verify/catalog.ts +346 -0
  252. package/src/tools/verify/index.ts +13 -3
  253. package/src/tools/verify/scripts.ts +135 -37
  254. package/src/tools/verify/surface.ts +9 -5
  255. package/src/tools/worker-evidence.ts +35 -12
  256. package/dist/chunk-MNA4JGU4.js +0 -255
  257. package/dist/chunk-SRF2PJNW.js +0 -184
  258. package/dist/chunk-T6YILFSB.js +0 -80
  259. package/dist/chunk-VAKQQHWR.js +0 -434
@@ -2,7 +2,15 @@
2
2
  * Strict session-format version reader.
3
3
  *
4
4
  * Runs before every session resume. Earlier pre-1.0 formats are disposable
5
- * local state and must not be transformed into the current format.
5
+ * local state and must not be transformed into the current format. A version
6
+ * from the future is refused for the opposite reason: the file is not
7
+ * disposable, it belongs to a newer Clio, and this build would silently drop
8
+ * whatever that build understood and this one does not. Downgrading and
9
+ * resuming would then write the truncated reading back over the original.
10
+ *
11
+ * Version 3 to 4 is the one additive step: 4 only adds the working-set kinds
12
+ * (`contextEviction`, `contextRecall`), so a version-3 ledger is read as-is
13
+ * and the metadata is restamped. Nothing in the file changes.
6
14
  */
7
15
 
8
16
  import { CURRENT_SESSION_FORMAT_VERSION } from "../../../engine/session.js";
@@ -10,6 +18,9 @@ import type { SessionMeta } from "../contract.js";
10
18
 
11
19
  export { CURRENT_SESSION_FORMAT_VERSION };
12
20
 
21
+ /** Oldest version this build reads without transforming the ledger. */
22
+ export const OLDEST_READABLE_SESSION_FORMAT_VERSION = 3;
23
+
13
24
  export interface MigrationResult {
14
25
  migrated: boolean;
15
26
  from: number;
@@ -18,10 +29,18 @@ export interface MigrationResult {
18
29
 
19
30
  export function runMigrations(meta: SessionMeta, sessionPath: string): MigrationResult {
20
31
  const from = meta.sessionFormatVersion ?? 1;
21
- if (from < CURRENT_SESSION_FORMAT_VERSION) {
32
+ if (from < OLDEST_READABLE_SESSION_FORMAT_VERSION) {
33
+ throw new Error(
34
+ `session metadata has an unsupported format version (expected version ${CURRENT_SESSION_FORMAT_VERSION}, got ${from}): ${sessionPath}. Remove the session directory to start a new session.`,
35
+ );
36
+ }
37
+ if (from > CURRENT_SESSION_FORMAT_VERSION) {
22
38
  throw new Error(
23
- `session metadata has an unsupported format version (expected version 3, got ${from}): ${sessionPath}. Remove the session directory to start a new session.`,
39
+ `session was written by a newer Clio (format version ${from}, this build reads version ${CURRENT_SESSION_FORMAT_VERSION}): ${sessionPath}. Upgrade clio-coder to resume this session.`,
24
40
  );
25
41
  }
42
+ if (from < CURRENT_SESSION_FORMAT_VERSION) {
43
+ return { migrated: true, from, to: CURRENT_SESSION_FORMAT_VERSION };
44
+ }
26
45
  return { migrated: false, from, to: from };
27
46
  }
@@ -12,6 +12,7 @@ import type { SessionContract, SessionMeta } from "../../domains/session/contrac
12
12
  import type { MessageEntry, SessionEntry } from "../../domains/session/entries.js";
13
13
  import { filterEntriesToActivePath } from "../../domains/session/tree/active-path.js";
14
14
  import type { ToolRegistry } from "../../tools/registry.js";
15
+ import { toolResultPresentationText } from "../../tools/result-disposition.js";
15
16
  import type { AgentMessage } from "../types.js";
16
17
  import { ACP_TURN_FAILED_MESSAGE, AcpRequestError, AcpTimeoutError, acpErrorMessage } from "./errors.js";
17
18
  import type { AcpJsonRpcPeerTransport } from "./transport.js";
@@ -537,6 +538,8 @@ function applyStopReason(active: ActivePrompt, message: unknown): void {
537
538
  function outputText(value: unknown): string {
538
539
  if (typeof value === "string") return value;
539
540
  if (!isRecord(value)) return "";
541
+ const presentationText = toolResultPresentationText(value);
542
+ if (presentationText !== null) return presentationText;
540
543
  if (Array.isArray(value.content)) return contentText(value.content);
541
544
  if (typeof value.output === "string") return value.output;
542
545
  if (typeof value.text === "string") return value.text;
@@ -11,6 +11,7 @@
11
11
  */
12
12
 
13
13
  import { Agent, type AgentOptions, type StreamFn } from "@earendil-works/pi-agent-core";
14
+ import { isDispositionedToolResultError } from "../tools/result-disposition.js";
14
15
  import { engineStreamSimple } from "./api-registry.js";
15
16
 
16
17
  export type EngineAgentOptions = Omit<AgentOptions, "streamFn"> & { streamFn?: StreamFn };
@@ -20,8 +21,24 @@ export interface EngineAgentHandle {
20
21
  state(): Agent["state"];
21
22
  }
22
23
 
24
+ function dispositionAwareAfterToolCall(
25
+ delegate: AgentOptions["afterToolCall"],
26
+ ): NonNullable<AgentOptions["afterToolCall"]> {
27
+ return async (context, signal) => {
28
+ const override = await delegate?.(context, signal);
29
+ const effectiveResult =
30
+ override?.details === undefined ? context.result : { ...context.result, details: override.details };
31
+ if (isDispositionedToolResultError(effectiveResult)) return { ...override, isError: true };
32
+ return override;
33
+ };
34
+ }
35
+
23
36
  export function createEngineAgent(options: EngineAgentOptions = {}): EngineAgentHandle {
24
- const agent = new Agent({ streamFn: engineStreamSimple, ...options });
37
+ const agent = new Agent({
38
+ streamFn: engineStreamSimple,
39
+ ...options,
40
+ afterToolCall: dispositionAwareAfterToolCall(options.afterToolCall),
41
+ });
25
42
  return {
26
43
  agent,
27
44
  state: () => agent.state,
@@ -57,13 +57,19 @@ export interface ClioSessionMeta {
57
57
  platform: string;
58
58
  nodeVersion: string;
59
59
  /**
60
- * Version 3 on every new session. Readers reject earlier versions and
61
- * sessions that omit this field.
60
+ * Version 4 on every new session. Readers reject earlier versions, sessions
61
+ * that omit this field, and versions from the future.
62
62
  */
63
63
  sessionFormatVersion?: number;
64
64
  }
65
65
 
66
- export const CURRENT_SESSION_FORMAT_VERSION = 3;
66
+ /**
67
+ * Version 4 adds the working-set ledger kinds (`contextEviction`,
68
+ * `contextRecall`). A version-3 reader would parse those entries as unknown
69
+ * kinds and replay a session as if nothing had been evicted, so the bump is
70
+ * what makes an older Clio refuse the file instead of misreading it.
71
+ */
72
+ export const CURRENT_SESSION_FORMAT_VERSION = 4;
67
73
 
68
74
  export interface ClioSessionJsonlHeader {
69
75
  type: "session";
@@ -161,8 +161,8 @@ import {
161
161
  import { openSession, readSessionTailTurns, sessionCurrentPath, sessionPaths } from "../engine/session.js";
162
162
  import type { EngineModel } from "../engine/types.js";
163
163
  import { createChatLoop } from "../interactive/chat-loop.js";
164
- import { buildReplayAgentMessagesFromTurns } from "../interactive/chat-renderer.js";
165
164
  import { type RunIo, startInteractive } from "../interactive/index.js";
165
+ import { buildModelReplayAgentMessagesFromTurns } from "../interactive/model-session-replay.js";
166
166
  import type { BootOptions } from "./boot-options.js";
167
167
 
168
168
  export type { BootOptions, HeadlessSamplingOverrides } from "./boot-options.js";
@@ -1236,7 +1236,16 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1236
1236
  // one object the dispatch tool and the keypress both hold.
1237
1237
  const dispatchBackground = createDispatchBackgroundRegistry();
1238
1238
  registerAllTools(toolRegistry, {
1239
- ...(session ? { session } : {}),
1239
+ ...(session
1240
+ ? {
1241
+ session,
1242
+ readSessionEntries: () => {
1243
+ const meta = session.current();
1244
+ return meta ? readSessionEntriesForCompact(meta.id) : [];
1245
+ },
1246
+ onContextRecalled: (payload) => bus.emit(BusChannels.ContextRecalled, payload),
1247
+ }
1248
+ : {}),
1240
1249
  taskBoard,
1241
1250
  userTasks,
1242
1251
  dispatch,
@@ -1612,7 +1621,10 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1612
1621
  // parent onto.
1613
1622
  chat.resetForSession(
1614
1623
  leafTurnId,
1615
- buildReplayAgentMessagesFromTurns(readCurrentSessionEntries(), leafTurnId ? { activeLeafTurnId: leafTurnId } : {}),
1624
+ buildModelReplayAgentMessagesFromTurns(
1625
+ readCurrentSessionEntries(),
1626
+ leafTurnId ? { activeLeafTurnId: leafTurnId } : {},
1627
+ ),
1616
1628
  );
1617
1629
  } catch (err) {
1618
1630
  chat.resetForSession(leafTurnId);
@@ -1664,7 +1676,7 @@ export async function bootOrchestrator(options: BootOptions = {}): Promise<BootR
1664
1676
  ? {
1665
1677
  readSessionEntries: readSessionEntriesForCompact,
1666
1678
  buildReplayMessages: (entries: ReadonlyArray<SessionEntry>, leafTurnId: string | null) =>
1667
- buildReplayAgentMessagesFromTurns(entries, leafTurnId === null ? {} : { activeLeafTurnId: leafTurnId }),
1679
+ buildModelReplayAgentMessagesFromTurns(entries, leafTurnId === null ? {} : { activeLeafTurnId: leafTurnId }),
1668
1680
  }
1669
1681
  : {}),
1670
1682
  providers,
@@ -555,21 +555,33 @@ export function toolResultSummary(result: unknown): Record<string, unknown> {
555
555
  const bytes = Buffer.byteLength(text, "utf8");
556
556
  const details = recordValue(obj?.details);
557
557
  const size = recordValue(details?.resultSize);
558
+ const disposition = recordValue(details?.resultDisposition);
558
559
  const truncation = recordValue(details?.truncation);
559
560
  const observation = recordValue(details?.observation);
560
561
  const offloadPath =
561
- typeof observation?.offloadPath === "string"
562
- ? observation.offloadPath
563
- : typeof size?.offloadPath === "string"
564
- ? size.offloadPath
565
- : null;
562
+ typeof disposition?.offloadPath === "string"
563
+ ? disposition.offloadPath
564
+ : typeof observation?.offloadPath === "string"
565
+ ? observation.offloadPath
566
+ : typeof size?.offloadPath === "string"
567
+ ? size.offloadPath
568
+ : null;
569
+ const displayedBytes =
570
+ typeof disposition?.displayedBytes === "number" && Number.isFinite(disposition.displayedBytes)
571
+ ? disposition.displayedBytes
572
+ : bytes;
566
573
  return {
567
- bytes,
574
+ bytes: displayedBytes,
568
575
  truncated:
576
+ disposition?.presentationTruncated === true ||
569
577
  size?.truncated === true ||
570
578
  truncation?.truncated === true ||
571
579
  observation?.truncated === true ||
572
580
  text.includes("[tool result truncated]"),
581
+ ...(typeof disposition?.capturedBytes === "number" ? { capturedBytes: disposition.capturedBytes } : {}),
582
+ ...(typeof disposition?.displayedBytes === "number" ? { displayedBytes: disposition.displayedBytes } : {}),
583
+ ...(typeof disposition?.contextBytes === "number" ? { contextBytes: disposition.contextBytes } : {}),
584
+ ...(disposition?.contextTruncated === true ? { contextTruncated: true } : {}),
573
585
  ...(typeof size?.policy === "string" ? { policy: size.policy } : {}),
574
586
  ...(typeof size?.followUpHint === "string" ? { followUpHint: size.followUpHint } : {}),
575
587
  ...(offloadPath !== null ? { offloadPath } : {}),