@iowarp/clio-coder 0.5.0 → 0.5.2

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 (312) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/CHANGELOG.md +35 -0
  3. package/CONTRIBUTING.md +9 -0
  4. package/README.md +12 -9
  5. package/ROADMAP.md +30 -5
  6. package/dist/{acp-KS7ARGV6.js → acp-F6PGOFZ4.js} +2 -2
  7. package/dist/{agents-YOGJ2YEJ.js → agents-ZHP4R6EX.js} +22 -21
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/{auth-CEDCO6O6.js → auth-N75U2H3Z.js} +4 -4
  10. package/dist/{chunk-D3KWFOUT.js → chunk-23UIXH6Z.js} +3 -3
  11. package/dist/{chunk-ZR5YA6ZF.js → chunk-36XVK5P5.js} +5 -5
  12. package/dist/{chunk-AVSR2HKI.js → chunk-3DZ4LPLS.js} +6 -6
  13. package/dist/{chunk-LYJJ6546.js → chunk-3GSPCWFX.js} +12 -12
  14. package/dist/{chunk-CRHPCPZP.js → chunk-4KC4CHKJ.js} +2 -2
  15. package/dist/{chunk-4VDHLCF5.js → chunk-4WJBWKMI.js} +2 -2
  16. package/dist/{chunk-KBUTSJSR.js → chunk-4XBYHXGK.js} +2 -2
  17. package/dist/{chunk-6W75D37F.js → chunk-53P775GE.js} +6 -3
  18. package/dist/{chunk-XZWSP67B.js → chunk-5APYAXCB.js} +2 -2
  19. package/dist/{chunk-D65E25JG.js → chunk-67HPYNTJ.js} +2 -2
  20. package/dist/{chunk-5JQR5B4D.js → chunk-6KV4KCQZ.js} +4 -4
  21. package/dist/{chunk-V4XJWDHR.js → chunk-6UKFRTXI.js} +2 -1
  22. package/dist/{chunk-NDPF2N2L.js → chunk-7DW7CJW2.js} +2 -2
  23. package/dist/{chunk-5KQEUIWM.js → chunk-7LUEQODV.js} +4 -4
  24. package/dist/{chunk-LNOXCGN2.js → chunk-7UFDIOBT.js} +3 -3
  25. package/dist/{chunk-DXSETN72.js → chunk-7WUGNN43.js} +2 -2
  26. package/dist/{chunk-V35KZDUZ.js → chunk-AA3GRZWS.js} +2 -2
  27. package/dist/{chunk-X4CEFOSG.js → chunk-ADO3OQIC.js} +4 -4
  28. package/dist/{chunk-UX2L5CUD.js → chunk-AI36V3ON.js} +3 -3
  29. package/dist/{chunk-B7GY6QER.js → chunk-B26OUMJW.js} +2 -2
  30. package/dist/{chunk-LAR7DX5E.js → chunk-B5TASTCK.js} +153 -62
  31. package/dist/{chunk-TGWZXJ7L.js → chunk-BEMQK5Q7.js} +92 -84
  32. package/dist/{chunk-RNDCROSG.js → chunk-CNXU7TR2.js} +3 -3
  33. package/dist/{chunk-3JLTRPN7.js → chunk-CVMUXT64.js} +35 -66
  34. package/dist/{chunk-733ZBT5P.js → chunk-E74MJF6G.js} +4 -4
  35. package/dist/{chunk-T2MDZES3.js → chunk-EBMTBE76.js} +3 -3
  36. package/dist/{chunk-OZ76TLGU.js → chunk-EEITU7S6.js} +2 -2
  37. package/dist/{chunk-GRHOXDKB.js → chunk-ELDJWJKM.js} +97 -14
  38. package/dist/{chunk-GCQFN7YI.js → chunk-EMYEQLWO.js} +2 -2
  39. package/dist/{chunk-LTWH2ACR.js → chunk-EQPFEDFV.js} +222 -127
  40. package/dist/{chunk-TDGYTWM6.js → chunk-F4I3H56H.js} +2 -2
  41. package/dist/chunk-F6KCJO3U.js +523 -0
  42. package/dist/{chunk-FGSQHUCK.js → chunk-F6VKWTTY.js} +5 -5
  43. package/dist/{chunk-UJD5MPP6.js → chunk-FLNXQQ5B.js} +2 -2
  44. package/dist/{chunk-EX57VVWW.js → chunk-FOSRJ2VZ.js} +4 -4
  45. package/dist/{chunk-ZARZ4POR.js → chunk-G5ZDQQE3.js} +3 -3
  46. package/dist/{chunk-HQVN7G4F.js → chunk-G62JBPXN.js} +7 -7
  47. package/dist/{chunk-ZJPORZTC.js → chunk-GIAI7A2K.js} +2 -2
  48. package/dist/chunk-GPTR6OTU.js +2551 -0
  49. package/dist/{chunk-EZD2BXGP.js → chunk-GUFQPTQK.js} +2 -2
  50. package/dist/{chunk-OPD7GL6F.js → chunk-H6FQVNZC.js} +8 -7
  51. package/dist/chunk-H7REJ7L5.js +80 -0
  52. package/dist/{chunk-EYTLV3W3.js → chunk-HTWTORF7.js} +2 -2
  53. package/dist/{chunk-DF6PI6GN.js → chunk-I6UKQPGS.js} +3 -3
  54. package/dist/{chunk-ISHUS7HC.js → chunk-JRW236JT.js} +3 -3
  55. package/dist/{chunk-DE2LU267.js → chunk-KKAJGT3B.js} +3 -2
  56. package/dist/{chunk-OV62D6KO.js → chunk-KQMYL5GR.js} +3 -3
  57. package/dist/{chunk-QDUUOZ3S.js → chunk-KWMFC7FN.js} +3 -3
  58. package/dist/{chunk-R7FGRZNF.js → chunk-LXYHCCIZ.js} +9 -9
  59. package/dist/{chunk-NFSK2VNU.js → chunk-LZMTVVN4.js} +2 -2
  60. package/dist/{chunk-62UK7AGW.js → chunk-M5PMRZSR.js} +397 -44
  61. package/dist/chunk-MMZMM6SW.js +131 -0
  62. package/dist/{chunk-FFYTC2KQ.js → chunk-MNABNEBX.js} +2 -2
  63. package/dist/{chunk-XMDBTYCH.js → chunk-N3CWOGVF.js} +3 -3
  64. package/dist/{chunk-VYRQHORQ.js → chunk-NMQSO6Z6.js} +4 -3
  65. package/dist/{chunk-R2UUNSNQ.js → chunk-O3ZAF7UY.js} +18 -5
  66. package/dist/{chunk-4SYHGVDE.js → chunk-OQNCLZI4.js} +4 -4
  67. package/dist/{chunk-EG4ARXPC.js → chunk-OX6QTA4N.js} +3 -3
  68. package/dist/{chunk-P4GNZPXO.js → chunk-OYUS3UZP.js} +2 -2
  69. package/dist/{chunk-OQ2EOAHA.js → chunk-PF36KOGI.js} +291 -112
  70. package/dist/{chunk-55RMDDFM.js → chunk-PGQG7ZMW.js} +2 -2
  71. package/dist/{chunk-CBAQPTDU.js → chunk-PIU6BXXW.js} +2 -2
  72. package/dist/{chunk-EKV4UBCM.js → chunk-PZBQUJ2F.js} +2 -2
  73. package/dist/{chunk-7RET77VB.js → chunk-Q2HKY32Y.js} +2 -2
  74. package/dist/{chunk-U6YTUVOX.js → chunk-Q4RMNWMZ.js} +4 -4
  75. package/dist/chunk-Q6FRR3AQ.js +48 -0
  76. package/dist/{chunk-6RJMYYIE.js → chunk-QJSIAJBY.js} +3 -3
  77. package/dist/{chunk-DOUISWEE.js → chunk-QOJ4ERMU.js} +5 -5
  78. package/dist/{chunk-IFPDAD7R.js → chunk-RWSRKXLT.js} +3 -3
  79. package/dist/{chunk-T33IYTZM.js → chunk-SAASVMIY.js} +3 -3
  80. package/dist/{chunk-2DTIWSAW.js → chunk-SEQDH6JC.js} +3 -3
  81. package/dist/{chunk-BRCOSE7O.js → chunk-SZUO5BSE.js} +2 -2
  82. package/dist/{chunk-HOEDA42N.js → chunk-T7HZ7KJF.js} +2 -2
  83. package/dist/{chunk-OJXOA6YU.js → chunk-TL6LNERH.js} +2 -2
  84. package/dist/{chunk-UCINIRHW.js → chunk-TPCZXWLT.js} +3 -3
  85. package/dist/{chunk-ZUKUCZYZ.js → chunk-TQ2KTH4A.js} +2 -2
  86. package/dist/{chunk-4WOOTKFD.js → chunk-U3FETNQB.js} +341 -20
  87. package/dist/{chunk-5B3RTYAK.js → chunk-UGDSB4AN.js} +2 -2
  88. package/dist/{chunk-VKHLUZNO.js → chunk-UZ7YBL43.js} +3 -3
  89. package/dist/{chunk-QNUQ7K7D.js → chunk-VKMSEO7Y.js} +4 -4
  90. package/dist/{chunk-IN7DGBVS.js → chunk-VLX5VZ35.js} +5 -5
  91. package/dist/{chunk-SJGS3GDI.js → chunk-WAGBMMNX.js} +5 -5
  92. package/dist/{chunk-BFOSV5EZ.js → chunk-WX2YCH7F.js} +2 -2
  93. package/dist/{chunk-3LT34CAM.js → chunk-XBIGUILU.js} +32 -17
  94. package/dist/{chunk-XDHUDE5K.js → chunk-XKYBFRWR.js} +5 -5
  95. package/dist/{chunk-U5QU5ZOD.js → chunk-XYPWFSU5.js} +3 -3
  96. package/dist/{chunk-YBUECLAF.js → chunk-YEJQDODA.js} +2 -2
  97. package/dist/{chunk-YQ6XEFVK.js → chunk-Z74OGONW.js} +39 -7
  98. package/dist/{chunk-I4ELN5BX.js → chunk-ZTNOEJRI.js} +2 -2
  99. package/dist/cli/index.js +26 -26
  100. package/dist/{clio-K2PBVCEM.js → clio-4IKFE25F.js} +2 -2
  101. package/dist/{clio-context-tools-GR4OHFSO.js → clio-context-tools-OHJXYX4R.js} +25 -23
  102. package/dist/{code-nav-4X3OI6DK.js → code-nav-XPM3MY5I.js} +7 -7
  103. package/dist/{config-Q5J7UBAB.js → config-343YS25T.js} +43 -41
  104. package/dist/{config-graph-P3555574.js → config-graph-WI263KDX.js} +43 -41
  105. package/dist/{configure-KIJ32ZO6.js → configure-GZDG4HER.js} +21 -21
  106. package/dist/{context-LFBQOSXT.js → context-4OFO7N7Y.js} +12 -12
  107. package/dist/{context-WBH3KSVR.js → context-JLK2RLOG.js} +42 -40
  108. package/dist/{context-NNLBES2Y.js → context-O6DIWCF6.js} +23 -21
  109. package/dist/{context-clear-YOHMQ6SQ.js → context-clear-MR7KOGQI.js} +42 -40
  110. package/dist/{context-working-set-MRAEVDNV.js → context-working-set-YZAD3KWO.js} +14 -13
  111. package/dist/{data-tool-JJPBGMQJ.js → data-tool-EKD7DFHG.js} +7 -7
  112. package/dist/{detail-RHJOTGN4.js → detail-YZPHFEVJ.js} +43 -41
  113. package/dist/{dispatch-runner-NC7PYNIO.js → dispatch-runner-VKVXVTWJ.js} +44 -42
  114. package/dist/{doctor-S5KZ2GTN.js → doctor-53AVQXAO.js} +17 -16
  115. package/dist/{doctor-deep-2EJQSHIZ.js → doctor-deep-BLRB2NCG.js} +5 -5
  116. package/dist/{eval-3D6M36N7.js → eval-P3BQSLQE.js} +21 -20
  117. package/dist/{evidence-XNVPPLVK.js → evidence-6LLI6SZH.js} +44 -42
  118. package/dist/{evidence-6IYN52ET.js → evidence-HTN3JLUO.js} +42 -40
  119. package/dist/{evidence-JVECPI3F.js → evidence-NJRE3R5H.js} +42 -40
  120. package/dist/{evolve-TLPUDJDM.js → evolve-WWZHJVJP.js} +42 -40
  121. package/dist/{fleet-WKVBF5SZ.js → fleet-GGZ4BVJE.js} +64 -62
  122. package/dist/{fleet-6RJWIOEO.js → fleet-QG3IIWWM.js} +44 -42
  123. package/dist/{fleet-commands-L6WFT7KZ.js → fleet-commands-J2ZIKISQ.js} +7 -7
  124. package/dist/{fleet-decisions-BTQMWU5A.js → fleet-decisions-Y2Q7375Q.js} +8 -8
  125. package/dist/{fleet-graph-553DZ67Q.js → fleet-graph-TCBCCCBP.js} +11 -11
  126. package/dist/{fleet-inspect-236FZPRB.js → fleet-inspect-KOLKBC56.js} +44 -42
  127. package/dist/{fleet-preflight-NZQHABWO.js → fleet-preflight-44UNCC4Y.js} +27 -25
  128. package/dist/{fleet-validate-7NLAE26R.js → fleet-validate-K2FXRZVA.js} +13 -13
  129. package/dist/{fleet-verify-E3RO6A5W.js → fleet-verify-AS444WDW.js} +42 -40
  130. package/dist/{fleet-view-KMZQY7YJ.js → fleet-view-X4JU4J6O.js} +43 -41
  131. package/dist/gui/ops-worker.js +9 -9
  132. package/dist/gui/reads-worker.js +9 -8
  133. package/dist/{init-DV5B6HQG.js → init-VSOWFHVL.js} +54 -52
  134. package/dist/{interactive-OXGYZYAS.js → interactive-JRCBENLZ.js} +1733 -577
  135. package/dist/{interop-J7UOBOSF.js → interop-JR6BCY7R.js} +10 -10
  136. package/dist/{inventory-OEGIL6PY.js → inventory-3JUGLVJI.js} +43 -41
  137. package/dist/{library-ROZAMUIL.js → library-7BOH3Y7N.js} +15 -15
  138. package/dist/{library-B3UPGY4V.js → library-7PFONXUI.js} +9 -9
  139. package/dist/{library-MXQA5DLT.js → library-TUYZMFIA.js} +7 -7
  140. package/dist/{library-import-2LTWOVBD.js → library-import-TJVXKLDK.js} +10 -10
  141. package/dist/{library-inventory-LJ3XHLWO.js → library-inventory-MD3AYTP4.js} +9 -9
  142. package/dist/{library-validation-DARHHUNW.js → library-validation-ZDLITEA3.js} +7 -7
  143. package/dist/{mcp-2GSPYQ54.js → mcp-EFCWUPUR.js} +3 -3
  144. package/dist/{memory-J3STUUIK.js → memory-Q2YVOKK5.js} +42 -40
  145. package/dist/{models-Y3GMFJ2V.js → models-M7BOCW7F.js} +17 -16
  146. package/dist/{monitor-LHNH577J.js → monitor-2HD3MC67.js} +47 -45
  147. package/dist/{orchestrator-DTAPXULA.js → orchestrator-OUW3ZN6Y.js} +1894 -226
  148. package/dist/{panes-A743ONZ5.js → panes-TTPPSYCL.js} +3 -3
  149. package/dist/{preload-OJBMAIXF.js → preload-A47C2NUF.js} +42 -40
  150. package/dist/{providers-CMETPZNS.js → providers-T43W7EL4.js} +4 -4
  151. package/dist/{resources-FY6XYFN2.js → resources-TP6X2V6W.js} +20 -11
  152. package/dist/{run-H64MEVTA.js → run-LDSBPMCS.js} +61 -59
  153. package/dist/{share-CAFMMQLM.js → share-URHKKMHR.js} +9 -9
  154. package/dist/{skills-ERKQUC7L.js → skills-E477MOOO.js} +13 -11
  155. package/dist/{skills-eval-CQ23MYQK.js → skills-eval-AIBR2L7H.js} +583 -93
  156. package/dist/{skills-inventory-TVUYJDVN.js → skills-inventory-HLMKY3R5.js} +13 -11
  157. package/dist/{slash-commands-ROG3KIFJ.js → slash-commands-LIIZKA5Y.js} +28 -26
  158. package/dist/{startup-background-KDWCQMWT.js → startup-background-JR2KDK6R.js} +43 -41
  159. package/dist/{steer-KKYXJSH4.js → steer-D7RTAPCM.js} +3 -3
  160. package/dist/{system-ZDW44ZGX.js → system-X2P5N4IY.js} +14 -13
  161. package/dist/{targets-AJWA6E7Z.js → targets-VFFAKUFM.js} +25 -24
  162. package/dist/{tasks-6L2JJRC5.js → tasks-ERAWZA22.js} +6 -6
  163. package/dist/{terminal-lease-YFUSDPAD.js → terminal-lease-V2N2BIKQ.js} +2 -2
  164. package/dist/{trace-LA5MVR4Y.js → trace-MA5BT7XY.js} +3 -3
  165. package/dist/{usage-XSILDHKF.js → usage-WYFY2L6M.js} +50 -48
  166. package/dist/{verifiers-ECA5GIHL.js → verifiers-TYIW2XKF.js} +7 -7
  167. package/dist/{verify-R6QQCCEB.js → verify-242UFYTP.js} +6 -6
  168. package/dist/{web-fetch-PVZNMBOB.js → web-fetch-LRAGYU6Y.js} +3 -3
  169. package/dist/{wiki-generate-RP22WP5K.js → wiki-generate-OFKOX2T6.js} +53 -51
  170. package/dist/worker/entry.js +31 -29
  171. package/docs/architecture/architecture.md +1 -0
  172. package/docs/architecture/context-engine.md +4 -2
  173. package/docs/architecture/observability.md +6 -4
  174. package/docs/architecture/prompt-envelope-and-tools.md +1 -1
  175. package/docs/architecture/session-lifecycle.md +1 -1
  176. package/docs/architecture/tui-design.md +12 -9
  177. package/docs/gui/parity/02-slash-and-surfaces.md +1 -1
  178. package/docs/guide/commands-and-modes.md +91 -5
  179. package/docs/guide/configuration-and-targets.md +2 -2
  180. package/docs/guide/context-continuity.md +49 -0
  181. package/docs/guide/proactive-memory.md +6 -3
  182. package/library/registry.yaml +292 -32
  183. package/library/skills/README.md +27 -2
  184. package/library/skills/context/context-handoff/SKILL.md +10 -4
  185. package/library/skills/meta/clio-coder-dev/SKILL.md +92 -88
  186. package/library/skills/meta/clio-coder-dev/evals.md +51 -46
  187. package/library/skills/meta/clio-coder-dev/plugin.json +2 -2
  188. package/library/skills/meta/clio-coder-dev/references/change-map.md +49 -0
  189. package/library/skills/meta/clio-coder-test/SKILL.md +89 -142
  190. package/library/skills/meta/clio-coder-test/evals.md +58 -62
  191. package/library/skills/meta/clio-coder-test/plugin.json +2 -2
  192. package/library/skills/meta/clio-coder-test/references/harness.md +3 -3
  193. package/library/skills/meta/clio-coder-test/references/lifecycle-validation.md +30 -0
  194. package/library/skills/meta/clio-coder-test/references/test-map.md +60 -89
  195. package/library/skills/registry.yaml +5 -5
  196. package/library/skills/skill-marketplace.json +12 -14
  197. package/package.json +1 -1
  198. package/src/cli/skills-eval.ts +1064 -54
  199. package/src/cli/usage.ts +2 -2
  200. package/src/core/clio-repo.ts +3 -0
  201. package/src/core/tool-names.ts +1 -0
  202. package/src/domains/context/budget/inspection.ts +9 -0
  203. package/src/domains/context/budget/live-view.ts +418 -0
  204. package/src/domains/context/budget/pressure.ts +393 -0
  205. package/src/domains/context/budget/request-fit.ts +15 -0
  206. package/src/domains/evidence/build.ts +24 -0
  207. package/src/domains/gateway/mcp/client.ts +1 -1
  208. package/src/domains/memory/commit-state.ts +160 -0
  209. package/src/domains/memory/operations.ts +18 -10
  210. package/src/domains/memory/prompt-cache.ts +95 -0
  211. package/src/domains/memory/prompt-section.ts +50 -7
  212. package/src/domains/memory/relevance.ts +93 -0
  213. package/src/domains/memory/restoration.ts +78 -0
  214. package/src/domains/memory/store.ts +39 -1
  215. package/src/domains/middleware/memory-intervention.ts +116 -24
  216. package/src/domains/observability/background-memory-usage.ts +1 -1
  217. package/src/domains/observability/cost.ts +3 -3
  218. package/src/domains/observability/extension.ts +1 -1
  219. package/src/domains/observability/metrics.ts +1 -1
  220. package/src/domains/prompts/compiler.ts +1 -1
  221. package/src/domains/prompts/extension.ts +38 -1
  222. package/src/domains/quota/anthropic-max-provider.ts +134 -0
  223. package/src/domains/quota/anthropic-usage.ts +220 -0
  224. package/src/domains/quota/antigravity-provider.ts +339 -0
  225. package/src/domains/quota/cache.ts +87 -0
  226. package/src/domains/quota/claude-code-provider.ts +169 -0
  227. package/src/domains/quota/codex-provider.ts +237 -0
  228. package/src/domains/quota/presentation.ts +240 -0
  229. package/src/domains/quota/registry.ts +23 -0
  230. package/src/domains/quota/service.ts +93 -0
  231. package/src/domains/quota/summary-feed.ts +86 -0
  232. package/src/domains/quota/types.ts +84 -0
  233. package/src/domains/resources/index.ts +11 -0
  234. package/src/domains/resources/skills/catalog-view.ts +571 -0
  235. package/src/domains/resources/skills/lexical-match.ts +136 -0
  236. package/src/domains/resources/skills/loader.ts +38 -0
  237. package/src/domains/resources/skills/promotion.ts +1 -55
  238. package/src/domains/resources/skills/provenance-pin.ts +50 -20
  239. package/src/domains/safety/action-classifier.ts +1 -0
  240. package/src/domains/session/compaction/branch-summary.ts +4 -1
  241. package/src/domains/session/compaction/compact.ts +18 -2
  242. package/src/domains/session/compaction/cut-point.ts +20 -1
  243. package/src/domains/session/compaction/tokens.ts +48 -3
  244. package/src/domains/session/context-accounting.ts +8 -1
  245. package/src/domains/session/continuity/carry.ts +59 -0
  246. package/src/domains/session/continuity/contract.ts +592 -0
  247. package/src/domains/session/continuity/evidence.ts +290 -0
  248. package/src/domains/session/continuity/fold.ts +1075 -0
  249. package/src/domains/session/continuity/note.ts +79 -0
  250. package/src/domains/session/continuity/operator-request.ts +104 -0
  251. package/src/domains/session/continuity/persistence.ts +408 -0
  252. package/src/domains/session/continuity/ports.ts +231 -0
  253. package/src/domains/session/continuity/projection.ts +538 -0
  254. package/src/domains/session/continuity/validate.ts +352 -0
  255. package/src/domains/session/entries.ts +50 -3
  256. package/src/domains/session/index.ts +48 -0
  257. package/src/domains/session/migrations/index.ts +7 -3
  258. package/src/domains/session/tree/fork.ts +15 -1
  259. package/src/domains/session/usage.ts +2 -2
  260. package/src/engine/acp/commands.ts +1 -1
  261. package/src/engine/agent.ts +133 -9
  262. package/src/engine/session.ts +13 -6
  263. package/src/entry/orchestrator.ts +116 -33
  264. package/src/interactive/chat-loop-messages.ts +2 -2
  265. package/src/interactive/chat-loop.ts +219 -63
  266. package/src/interactive/chat-renderer.ts +99 -8
  267. package/src/interactive/context-overlay.ts +24 -3
  268. package/src/interactive/continuity-controller.ts +526 -0
  269. package/src/interactive/dispatch-board.ts +21 -3
  270. package/src/interactive/footer/dashboard.ts +25 -1
  271. package/src/interactive/footer/key-hints.ts +2 -2
  272. package/src/interactive/footer/pages.ts +70 -27
  273. package/src/interactive/footer/widgets.ts +32 -7
  274. package/src/interactive/footer-panel.ts +1 -1
  275. package/src/interactive/interactive-application.ts +7 -2
  276. package/src/interactive/interactive-input-runtime.ts +2 -2
  277. package/src/interactive/interactive-presentation.ts +15 -0
  278. package/src/interactive/interactive-slash-runtime.ts +45 -8
  279. package/src/interactive/interactive-tickers.ts +7 -1
  280. package/src/interactive/model-session-replay.ts +130 -3
  281. package/src/interactive/output-reserve.ts +35 -0
  282. package/src/interactive/overlay-general-openers.ts +12 -8
  283. package/src/interactive/overlay-key-routing.ts +6 -9
  284. package/src/interactive/overlay-lifecycle.ts +10 -6
  285. package/src/interactive/overlay-session-lifecycle.ts +21 -14
  286. package/src/interactive/quota-view.ts +229 -0
  287. package/src/interactive/session-last-turn.ts +1 -1
  288. package/src/interactive/session-transcript.ts +2 -1
  289. package/src/interactive/session-usage-reseed.ts +2 -2
  290. package/src/interactive/side-question.ts +2 -2
  291. package/src/interactive/slash-commands.ts +28 -9
  292. package/src/interactive/turn-context.ts +686 -63
  293. package/src/interactive/turn-middleware.ts +39 -6
  294. package/src/interactive/turn-persistence.ts +15 -2
  295. package/src/interactive/turn-prewarm.ts +1 -1
  296. package/src/interactive/turn-runtime.ts +48 -5
  297. package/src/interactive/{cost-overlay.ts → usage-overlay.ts} +121 -33
  298. package/src/interactive/welcome-dashboard.ts +26 -3
  299. package/src/tools/agent-tools.ts +3 -1
  300. package/src/tools/bootstrap.ts +6 -0
  301. package/src/tools/builtin-tool-catalog.ts +9 -0
  302. package/src/tools/context/index.ts +148 -113
  303. package/src/tools/context/surface.ts +11 -7
  304. package/src/tools/core-bootstrap.ts +4 -0
  305. package/src/tools/observation.ts +8 -2
  306. package/src/tools/policy.ts +3 -0
  307. package/src/tools/self-compact.ts +31 -0
  308. package/src/tools/surface.ts +1 -0
  309. package/src/tools/tasks.ts +1 -1
  310. package/dist/chunk-CTFPFW3H.js +0 -44
  311. package/dist/chunk-EOJPDNUP.js +0 -1325
  312. package/dist/chunk-I4Y4WKZR.js +0 -386
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Building `ContinuityFoldEvidence` from an actual session ledger.
3
+ *
4
+ * `contract.ts` states what a caller's resolver must have proven before the
5
+ * fold will treat a reference as authority. This module is that resolver for
6
+ * Clio's ledger. It reads one ordered array, the full applicable ledger before
7
+ * the replay cut, and every `position` it emits is an index into that same
8
+ * array, because that is the only coordinate system the fold accepts.
9
+ *
10
+ * It resolves nothing it cannot prove. A control request whose timestamp does
11
+ * not parse establishes no renewal base, so it is dropped rather than emitted
12
+ * with a guessed time; an eviction that two commits both claim is ambiguous, so
13
+ * neither claim becomes evidence. Dropping is the safe direction: missing
14
+ * evidence leaves a transaction recall-only, while a fabricated row would
15
+ * license execution.
16
+ */
17
+
18
+ import type { MessageEntry, SessionEntry } from "../entries.js";
19
+ import type {
20
+ ContinuityFoldEvidence,
21
+ ContinuityOutcomeEvidence,
22
+ OperatorResumeAuthorityEvidence,
23
+ TerminalResponseEvidence,
24
+ } from "./contract.js";
25
+ import { isHandoffRecoveryRequestEntry } from "./operator-request.js";
26
+
27
+ export interface ContinuityEvidenceInput {
28
+ /** The full applicable ledger before the replay cut, in ledger order. */
29
+ entries: ReadonlyArray<SessionEntry>;
30
+ /**
31
+ * Turn ids on the selected path. An operator control request whose claimed
32
+ * leaf is not on it was made on another branch and authorizes nothing here.
33
+ * Defaults to the message turns in `entries`.
34
+ */
35
+ pathTurnIds?: ReadonlyArray<string>;
36
+ /**
37
+ * Records the reader could not parse. A torn fragment must not become
38
+ * permission, so this count travels into the fold rather than being dropped
39
+ * by the collector that already skipped the line (§6).
40
+ */
41
+ unreadableRecords: number;
42
+ }
43
+
44
+ /**
45
+ * Classify one assistant response for acknowledgement.
46
+ *
47
+ * `success` is affirmative, not a default. The producer
48
+ * (`interactive/chat-loop-messages.ts:assistantSessionPayload`) writes
49
+ * `stopReason` **only** for a terminal failure, so a successful turn carries no
50
+ * stop reason at all and demanding a canonical success value would reject every
51
+ * real success. What can be required is everything else: no failure marker, no
52
+ * error message, visible nonempty text, and no tool call still outstanding.
53
+ *
54
+ * That last condition is the one that matters most here. A turn whose content
55
+ * holds a tool call has not terminated, whatever text it also produced: the host
56
+ * reads those structured calls to decide the run continues. Treating it as a
57
+ * terminal success would let an acknowledgement cite a turn that was still
58
+ * working.
59
+ */
60
+ function terminalStatus(entry: MessageEntry): TerminalResponseEvidence["status"] {
61
+ const payload = entry.payload;
62
+ if (!payload || typeof payload !== "object") return "empty";
63
+ const record = payload as Record<string, unknown>;
64
+ const stop = record.stopReason;
65
+ if (stop === "error") return "error";
66
+ if (stop === "aborted") return "aborted";
67
+ if (stop === "interrupted") return "interrupted";
68
+ if (typeof record.errorMessage === "string" && record.errorMessage.length > 0) return "error";
69
+ // Any other recorded stop reason is a recorded failure or a non-terminal
70
+ // stop (`toolUse`, `length`); neither acknowledges a delivery.
71
+ if (stop !== undefined && stop !== "stop") return "empty";
72
+ if (record.continuityDeliveryId !== undefined && stop !== "stop") return "empty";
73
+ const content = Array.isArray(record.content) ? record.content : [];
74
+ for (const block of content) {
75
+ if (!block || typeof block !== "object") continue;
76
+ if ((block as Record<string, unknown>).type === "toolCall") return "empty";
77
+ }
78
+ if (typeof record.text === "string" && record.text.trim().length > 0) return "success";
79
+ for (const block of content) {
80
+ if (!block || typeof block !== "object") continue;
81
+ const typed = block as Record<string, unknown>;
82
+ if (typed.type === "text" && typeof typed.text === "string" && typed.text.trim().length > 0) return "success";
83
+ }
84
+ return "empty";
85
+ }
86
+
87
+ /**
88
+ * Assistant responses, classified for acknowledgement.
89
+ *
90
+ * The continuation turn is the turn the response answers, which is the response
91
+ * entry's structural parent. Packet 03 mints `delivered.continuationTurnId` as
92
+ * that same turn id when it hands the replacement context over, so the two ends
93
+ * of the binding meet on one ledger pointer rather than on a runtime handle.
94
+ * A response with no parent answers nothing and is skipped.
95
+ */
96
+ function terminalResponses(entries: ReadonlyArray<SessionEntry>): TerminalResponseEvidence[] {
97
+ const rows: TerminalResponseEvidence[] = [];
98
+ const messages = new Map(
99
+ entries.filter((entry): entry is MessageEntry => entry.kind === "message").map((entry) => [entry.turnId, entry]),
100
+ );
101
+ for (let position = 0; position < entries.length; position += 1) {
102
+ const entry = entries[position];
103
+ if (entry?.kind !== "message" || entry.role !== "assistant" || entry.parentTurnId === null) continue;
104
+ let continuationTurnId = entry.parentTurnId;
105
+ const payload = entry.payload as { continuityDeliveryId?: unknown } | null;
106
+ if (typeof payload?.continuityDeliveryId === "string") {
107
+ const delivery = entries
108
+ .slice(0, position)
109
+ .filter(
110
+ (candidate) =>
111
+ candidate.kind === "handoffTransaction" &&
112
+ candidate.event.phase === "delivered" &&
113
+ candidate.event.deliveryId === payload.continuityDeliveryId,
114
+ );
115
+ if (delivery.length !== 1) continue;
116
+ const intent = delivery[0];
117
+ if (intent?.kind !== "handoffTransaction" || intent.event.phase !== "delivered") continue;
118
+ const visited = new Set<string>();
119
+ let ancestor: string | null = entry.parentTurnId;
120
+ while (ancestor && ancestor !== intent.event.continuationTurnId && !visited.has(ancestor)) {
121
+ visited.add(ancestor);
122
+ const parent = messages.get(ancestor);
123
+ // New operator input ends this delivery's authority, even on the same branch.
124
+ if (parent?.role === "user") break;
125
+ ancestor = parent?.parentTurnId ?? null;
126
+ }
127
+ if (ancestor !== intent.event.continuationTurnId) continue;
128
+ continuationTurnId = ancestor;
129
+ }
130
+ rows.push({ entryId: entry.turnId, continuationTurnId, status: terminalStatus(entry), position });
131
+ }
132
+ return rows;
133
+ }
134
+
135
+ /**
136
+ * Operator control requests, from the reserved typed subtype only.
137
+ *
138
+ * A display echo of `/context compact` and the text of a user turn are not
139
+ * authority and never reach this list: the only carrier is the validated
140
+ * `contextHandoffRecoveryRequest` record (§3.1). `acceptedAtMs` comes from the
141
+ * record's own durable timestamp, which is the one base a renewed deadline may
142
+ * be measured from.
143
+ */
144
+ function resumeAuthorities(
145
+ entries: ReadonlyArray<SessionEntry>,
146
+ pathTurnIds: ReadonlySet<string>,
147
+ ): OperatorResumeAuthorityEvidence[] {
148
+ const rows: OperatorResumeAuthorityEvidence[] = [];
149
+ // The immutable branch anchor each handoff actually recorded. A request has
150
+ // to agree with it, and the only place that fact exists is the transaction's
151
+ // own records.
152
+ const anchorByHandoff = new Map<string, string | null>();
153
+ for (const entry of entries) {
154
+ const identity =
155
+ entry.kind === "handoffTransaction"
156
+ ? entry.identity
157
+ : entry.kind === "continuityCommit"
158
+ ? entry.continuity.identity
159
+ : entry.kind === "compactionSummary"
160
+ ? entry.continuity?.identity
161
+ : undefined;
162
+ if (identity === undefined) continue;
163
+ if (!anchorByHandoff.has(identity.handoffId)) anchorByHandoff.set(identity.handoffId, identity.branchAnchorTurnId);
164
+ }
165
+ for (let position = 0; position < entries.length; position += 1) {
166
+ const entry = entries[position];
167
+ if (!isHandoffRecoveryRequestEntry(entry)) continue;
168
+ const acceptedAtMs = Date.parse(entry.timestamp);
169
+ if (!Number.isFinite(acceptedAtMs)) continue;
170
+ const data = entry.data;
171
+ if (data === undefined) continue;
172
+ // 02A matches handoff, action, answered head, session and order, and
173
+ // explicitly leaves these bindings to the resolver. They cannot be
174
+ // recovered later either: `OperatorResumeAuthorityEvidence` does not carry
175
+ // the branch fields, so an unbound request checked here is unbound
176
+ // forever. A request naming a sibling branch or an unrelated leaf is
177
+ // dropped rather than emitted with its bindings discarded.
178
+ if (!anchorByHandoff.has(data.handoffId)) continue;
179
+ if (anchorByHandoff.get(data.handoffId) !== data.branchAnchorTurnId) continue;
180
+ // The envelope's structural parent is the leaf the request claims it was
181
+ // made at. §3.1 requires `parentTurnId` to equal the selected message leaf,
182
+ // so a record whose envelope and payload disagree is not the adopted shape.
183
+ if (entry.parentTurnId !== data.selectedLeafTurnId) continue;
184
+ // And that leaf has to be on the path this projection is about. A request
185
+ // made on a branch the reader is not standing on grants nothing here.
186
+ if (data.selectedLeafTurnId !== null && !pathTurnIds.has(data.selectedLeafTurnId)) continue;
187
+ rows.push({
188
+ operatorRequestEntryId: entry.turnId,
189
+ handoffId: data.handoffId,
190
+ action: data.action,
191
+ pausedOrFailedEntryId: data.pausedOrFailedEntryId,
192
+ originSessionId: data.sessionId,
193
+ position,
194
+ acceptedAtMs,
195
+ });
196
+ }
197
+ return rows;
198
+ }
199
+
200
+ /**
201
+ * Summary and eviction records bound to the commit that produced them.
202
+ *
203
+ * The two outcomes carry different strengths of binding and this resolver does
204
+ * not pretend otherwise. A `summarized` outcome is self-declaring: the summary
205
+ * carries the continuity payload, so it names its own handoff and commit, and a
206
+ * summary belonging to another transaction can never be mistaken for it. An
207
+ * `evicted` outcome has no such field, because `contextEviction` is a
208
+ * working-set record that predates continuity and gains nothing from carrying a
209
+ * handoff payload. Its binding is therefore the commit's own `evictionRef`,
210
+ * qualified two ways: exactly one commit in this input may claim the eviction,
211
+ * and the eviction must be positioned before the commit that claims it, which
212
+ * is the order §5's write group produces. An eviction two commits both claim is
213
+ * ambiguous and yields no evidence for either.
214
+ */
215
+ function outcomeRefs(entries: ReadonlyArray<SessionEntry>): ContinuityOutcomeEvidence[] {
216
+ const rows: ContinuityOutcomeEvidence[] = [];
217
+ const positions = new Map<string, number>();
218
+ for (let position = 0; position < entries.length; position += 1) {
219
+ const entry = entries[position];
220
+ if (entry === undefined) continue;
221
+ if (!positions.has(entry.turnId)) positions.set(entry.turnId, position);
222
+ if (entry.kind === "compactionSummary" && entry.continuity !== undefined) {
223
+ rows.push({
224
+ entryId: entry.turnId,
225
+ outcome: "summarized",
226
+ handoffId: entry.continuity.identity.handoffId,
227
+ commitId: entry.continuity.identity.commitId,
228
+ position,
229
+ });
230
+ }
231
+ }
232
+ // Eviction claims come from a commit row **and** from a summary carrying that
233
+ // commit. Reading only commit rows would withhold the binding in precisely
234
+ // the situation reconstruction exists for: the commit row is the thing that
235
+ // went missing, and the validated carry is what proves it existed. The carry
236
+ // names the same immutable identity and the same original outcome, so it is
237
+ // the same claim, not a different one; a carry never turns an evicted outcome
238
+ // into a summarized one, because the outcome is read off the carried commit.
239
+ const claims = new Map<string, { handoffId: string; commitId: string; claimedAt: number } | null>();
240
+ for (let position = 0; position < entries.length; position += 1) {
241
+ const entry = entries[position];
242
+ const payload =
243
+ entry?.kind === "continuityCommit"
244
+ ? entry.continuity
245
+ : entry?.kind === "compactionSummary"
246
+ ? entry.continuity
247
+ : undefined;
248
+ if (payload === undefined) continue;
249
+ const ref = payload.commit.evictionRef;
250
+ if (ref === undefined || payload.commit.outcome !== "evicted") continue;
251
+ const identity = payload.identity;
252
+ // The ordering bound is the commit's own recorded position when the row is
253
+ // present, and the carrying record's position otherwise. Both are real
254
+ // positions of real records in this one array.
255
+ const claimedAt = positions.get(payload.commit.entry.turnId) ?? position;
256
+ const existing = claims.get(ref);
257
+ if (existing === undefined) {
258
+ claims.set(ref, { handoffId: identity.handoffId, commitId: identity.commitId, claimedAt });
259
+ continue;
260
+ }
261
+ // A second claim only conflicts when it is a different transaction. An
262
+ // identical duplicate, a commit row and the summary that carries it
263
+ // included, is idempotent, here as in the fold.
264
+ if (existing !== null && (existing.handoffId !== identity.handoffId || existing.commitId !== identity.commitId)) {
265
+ claims.set(ref, null);
266
+ }
267
+ }
268
+ for (const [ref, claim] of claims) {
269
+ if (claim === null) continue;
270
+ const position = positions.get(ref);
271
+ if (position === undefined || position >= claim.claimedAt) continue;
272
+ if (entries[position]?.kind !== "contextEviction") continue;
273
+ rows.push({ entryId: ref, outcome: "evicted", handoffId: claim.handoffId, commitId: claim.commitId, position });
274
+ }
275
+ return rows;
276
+ }
277
+
278
+ /** Resolve every evidence list the fold needs from one ordered ledger. */
279
+ export function resolveContinuityEvidence(input: ContinuityEvidenceInput): ContinuityFoldEvidence {
280
+ const pathTurnIds = new Set(
281
+ input.pathTurnIds ??
282
+ input.entries.filter((entry): entry is MessageEntry => entry.kind === "message").map((entry) => entry.turnId),
283
+ );
284
+ return {
285
+ resumeAuthorities: resumeAuthorities(input.entries, pathTurnIds),
286
+ terminalResponses: terminalResponses(input.entries),
287
+ outcomeRefs: outcomeRefs(input.entries),
288
+ unreadableRecords: input.unreadableRecords,
289
+ };
290
+ }