@iowarp/clio-coder 0.3.7 → 0.3.9

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 (400) hide show
  1. package/CHANGELOG.md +80 -0
  2. package/README.md +13 -4
  3. package/dist/{acp-SK4MD6MM.js → acp-7LOELQFP.js} +13 -13
  4. package/dist/{agents-2FN2K6ME.js → agents-FIBG2SHA.js} +41 -37
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-QIYZWM5I.js → auth-OI4LIH2I.js} +31 -24
  7. package/dist/builtins-AD25UL3C.js +17 -0
  8. package/dist/{chunk-5FR74PWO.js → chunk-2JDWVJND.js} +2 -2
  9. package/dist/chunk-3DPEIQKN.js +113 -0
  10. package/dist/{chunk-EOOQZZDE.js → chunk-3DUR4WUA.js} +19 -19
  11. package/dist/{chunk-WHJYKASB.js → chunk-3MRC2YSQ.js} +2 -2
  12. package/dist/{chunk-EBEFWSGL.js → chunk-3UUY7R3Z.js} +14 -10
  13. package/dist/{chunk-LADCF22A.js → chunk-3V5AYSEQ.js} +113 -54
  14. package/dist/{chunk-BMWK7ZIZ.js → chunk-465CC7FK.js} +16 -13
  15. package/dist/{chunk-5WIGXA4T.js → chunk-47CMYGET.js} +111 -4
  16. package/dist/{chunk-CEYBNUGC.js → chunk-4H6ULJ3H.js} +378 -36
  17. package/dist/{chunk-YTYFXUI3.js → chunk-4LJX2PUC.js} +9 -9
  18. package/dist/{chunk-DOOEX22V.js → chunk-56KB5IJP.js} +5 -5
  19. package/dist/{chunk-SPULKLCF.js → chunk-5DQRIYDZ.js} +2 -2
  20. package/dist/{chunk-TSHXZTOQ.js → chunk-5HFBWUMU.js} +23 -11
  21. package/dist/{chunk-5UJ6ECTS.js → chunk-5PVQ4SRS.js} +80 -8
  22. package/dist/{chunk-ZWLZP4ZT.js → chunk-5QKCQQ3E.js} +359 -17
  23. package/dist/{chunk-6M7VS3J3.js → chunk-5T7RBWN2.js} +111 -5
  24. package/dist/chunk-774ILSRL.js +172 -0
  25. package/dist/chunk-7C6RYZGQ.js +391 -0
  26. package/dist/{chunk-GH5622CP.js → chunk-A2NJGIB3.js} +2 -2
  27. package/dist/{chunk-C4JBQ5SR.js → chunk-AD7Y7STJ.js} +6 -6
  28. package/dist/{chunk-GEYXPTRF.js → chunk-AEYBF3TB.js} +33 -12
  29. package/dist/{chunk-2SFS6XQE.js → chunk-AMKHQW3C.js} +3 -2
  30. package/dist/{chunk-D4MDIG46.js → chunk-B5CSFE7B.js} +7 -7
  31. package/dist/{chunk-MXI6J5JF.js → chunk-B5XRQOLB.js} +10 -10
  32. package/dist/{chunk-X2KV5FXT.js → chunk-BVDVID7E.js} +2 -2
  33. package/dist/{chunk-JNXPYBB4.js → chunk-CA42X6KT.js} +3 -3
  34. package/dist/{chunk-VREKEFLL.js → chunk-D73KXYPF.js} +3 -3
  35. package/dist/{chunk-JTSEDYVQ.js → chunk-DG4M6ZUE.js} +7 -7
  36. package/dist/{chunk-DQA7QLMD.js → chunk-EBOC7MT3.js} +10 -25
  37. package/dist/{chunk-KZ2H5X4G.js → chunk-ECUO3KDP.js} +129 -14
  38. package/dist/{chunk-JRIO5UD2.js → chunk-EQ63NRB7.js} +5 -5
  39. package/dist/{chunk-YD734TPH.js → chunk-FALJGAWU.js} +2 -2
  40. package/dist/{chunk-GWS3VEIW.js → chunk-FWDFM5ZU.js} +24 -3
  41. package/dist/{chunk-XEGB6BCN.js → chunk-GAYUJ7LE.js} +68 -14
  42. package/dist/{chunk-UND3GU2L.js → chunk-H7IXIC72.js} +2 -2
  43. package/dist/{chunk-IR4CFBFN.js → chunk-HAY4ZE2P.js} +12 -12
  44. package/dist/{chunk-UVDSQ6LW.js → chunk-HCBCAYZU.js} +74 -147
  45. package/dist/{chunk-4DWFMQDR.js → chunk-HJB5IUKP.js} +89 -145
  46. package/dist/{chunk-M4AKACEO.js → chunk-HKO36JWF.js} +33 -5
  47. package/dist/{chunk-KCMKRQX4.js → chunk-HPCTNZM2.js} +45 -82
  48. package/dist/{chunk-465YSENW.js → chunk-IFBNV6H6.js} +3 -3
  49. package/dist/{chunk-FJ3H4MN5.js → chunk-IHKBWSXF.js} +2 -2
  50. package/dist/chunk-JEQQR47K.js +3025 -0
  51. package/dist/{chunk-FO5ZOVUY.js → chunk-KV2AOLDF.js} +27 -7
  52. package/dist/chunk-LU7P4LHA.js +33 -0
  53. package/dist/{chunk-6TUKSZVF.js → chunk-LXPJXFM5.js} +11 -11
  54. package/dist/{chunk-VQNODYQ4.js → chunk-MIX5N5AC.js} +488 -3668
  55. package/dist/chunk-MLOK6ZOS.js +2888 -0
  56. package/dist/{chunk-ZZMN5OM4.js → chunk-MV2VUEJC.js} +2 -2
  57. package/dist/{chunk-MVVUPGPW.js → chunk-MXHC5QYU.js} +6 -6
  58. package/dist/{chunk-OBMAI2DP.js → chunk-N3PBVRTZ.js} +12 -388
  59. package/dist/{chunk-WJHBC77E.js → chunk-N5XKWMDW.js} +17 -7
  60. package/dist/{chunk-5C3AQNDW.js → chunk-NNNWO6F2.js} +124 -36
  61. package/dist/{chunk-UFQ3F4FW.js → chunk-NQ6UCCOD.js} +4 -4
  62. package/dist/chunk-NUGM5KR6.js +165 -0
  63. package/dist/{chunk-DMD2AGVS.js → chunk-NZU6YDNV.js} +20 -18
  64. package/dist/{chunk-WHGPSPT5.js → chunk-O6I4CIEU.js} +151 -13
  65. package/dist/{chunk-XN3L4EYL.js → chunk-OEDBCISO.js} +2 -2
  66. package/dist/{chunk-PD3MESLB.js → chunk-P3JGPQFL.js} +4 -4
  67. package/dist/{chunk-UHXRNZ2J.js → chunk-PNY46YEY.js} +23 -6
  68. package/dist/{chunk-THKY7CD7.js → chunk-PZ4I4JE2.js} +134 -29
  69. package/dist/{chunk-SROCI7ZU.js → chunk-QQ7EKM72.js} +5 -5
  70. package/dist/{chunk-QCTRSGHQ.js → chunk-R7LNVMCS.js} +91 -53
  71. package/dist/{chunk-GOXNB3AO.js → chunk-RAPCMZL4.js} +75 -4
  72. package/dist/chunk-RKKLTLYB.js +45 -0
  73. package/dist/{chunk-OB5HIGJY.js → chunk-RKRLDWD3.js} +4 -1
  74. package/dist/{chunk-DJNLUABN.js → chunk-S4COXYBG.js} +588 -32
  75. package/dist/{chunk-3HAPLH5M.js → chunk-T3Z6VAAF.js} +172 -11
  76. package/dist/{chunk-FOT2FX5J.js → chunk-TD7UE2L5.js} +12 -10
  77. package/dist/{chunk-UUANF5CR.js → chunk-TEO2TLVN.js} +856 -967
  78. package/dist/{chunk-FCSXB6T2.js → chunk-UOSL25KY.js} +14 -2
  79. package/dist/{chunk-EELBMBT6.js → chunk-VKBMFOYV.js} +74 -15
  80. package/dist/chunk-VO2LKSTM.js +165 -0
  81. package/dist/{chunk-5C77SEEY.js → chunk-VPTUJU4P.js} +3 -3
  82. package/dist/{chunk-WEH5XRJQ.js → chunk-WIE7ZOSW.js} +2 -2
  83. package/dist/{chunk-J7PIKKWC.js → chunk-WXCJ7VME.js} +8 -8
  84. package/dist/{chunk-4DGYLA73.js → chunk-XDOQXGFO.js} +22 -7
  85. package/dist/{chunk-PPAMZ32Z.js → chunk-XK56QHLX.js} +6 -1
  86. package/dist/{chunk-AB4XIIVB.js → chunk-YKOFT37S.js} +6 -6
  87. package/dist/chunk-YSEHGPCT.js +127 -0
  88. package/dist/{chunk-HFSBBKSQ.js → chunk-YW7UVM5V.js} +138 -3
  89. package/dist/cli/index.js +32 -32
  90. package/dist/{clio-WBVQEBKO.js → clio-LT5V7SSZ.js} +9 -9
  91. package/dist/{code-nav-FGGFIE7L.js → code-nav-LMW275PA.js} +5 -5
  92. package/dist/codewiki/build-worker.js +4 -4
  93. package/dist/{components-F7OEATSO.js → components-ZFA3SAER.js} +8 -8
  94. package/dist/{config-TRBL3RCF.js → config-RXS5T3JT.js} +98 -65
  95. package/dist/{configure-OLCVPHNM.js → configure-2WYWSCSD.js} +26 -22
  96. package/dist/{context-MJIJ6GOX.js → context-I3BTOTCS.js} +12 -12
  97. package/dist/{context-XEWE3MOJ.js → context-MVOORGMF.js} +54 -47
  98. package/dist/{context-WFPKQSM6.js → context-PALKKQYL.js} +28 -28
  99. package/dist/{context-clear-KNOS2JPB.js → context-clear-N2WOYZ2K.js} +53 -46
  100. package/dist/{context-index-SSR5ECNE.js → context-index-HNG3MOME.js} +6 -6
  101. package/dist/{context-working-set-EUXAZI6N.js → context-working-set-MIEVECVZ.js} +17 -18
  102. package/dist/{dispatch-runner-B7MTOVKL.js → dispatch-runner-VVA4SRRH.js} +90 -61
  103. package/dist/{docs-FLJTIDSE.js → docs-7LQ23DLM.js} +8 -8
  104. package/dist/doctor-TWBWFK5V.js +165 -0
  105. package/dist/eval-IJ5VEZDJ.js +4483 -0
  106. package/dist/{evidence-JZNBUOQZ.js → evidence-L5APPXNV.js} +68 -61
  107. package/dist/{evolve-FJVC4KKI.js → evolve-RGNKFJ52.js} +47 -40
  108. package/dist/{extensions-IQL36S7K.js → extensions-7WYWUX5A.js} +13 -7
  109. package/dist/{fleet-BDKYJFCP.js → fleet-6CNVBZZP.js} +113 -76
  110. package/dist/{fleet-commands-ZFIWZSB3.js → fleet-commands-L2SXSYEI.js} +10 -10
  111. package/dist/{fleet-graph-Y6HPXIVF.js → fleet-graph-2J3OOIPO.js} +17 -15
  112. package/dist/{fleet-preflight-BHSNPBMH.js → fleet-preflight-CZRJ4JP5.js} +5 -6
  113. package/dist/{fleet-validate-BIYREGIK.js → fleet-validate-C5RI6DP7.js} +20 -19
  114. package/dist/{init-LQUB5COQ.js → init-VBN2ACVA.js} +70 -63
  115. package/dist/{library-NJAHIGG4.js → library-JHGUMLY2.js} +22 -20
  116. package/dist/{memory-OG6HOYKM.js → memory-K4OQIYWG.js} +49 -42
  117. package/dist/{models-5ZG5XY7J.js → models-2NCZUWDD.js} +35 -29
  118. package/dist/{monitor-TJ7AMTGB.js → monitor-MMVTJABD.js} +64 -45
  119. package/dist/{orchestrator-WZYB54DM.js → orchestrator-ZKBPCHW6.js} +1971 -520
  120. package/dist/{paths-XUC7GS6E.js → paths-DBXMZMDU.js} +5 -5
  121. package/dist/registry-LG64LTF4.js +11 -0
  122. package/dist/{reset-PXQT45IY.js → reset-DD5JGOY3.js} +11 -11
  123. package/dist/{run-FQ74YF62.js → run-QEGNX7FL.js} +89 -83
  124. package/dist/{share-FW7SVCL3.js → share-JKD3BQMW.js} +20 -18
  125. package/dist/{skills-7E7IRB3R.js → skills-LMQIKDOZ.js} +23 -21
  126. package/dist/{skills-eval-LI75W6OK.js → skills-eval-I7X2774U.js} +59 -52
  127. package/dist/{steer-GGWFUJUD.js → steer-CF5TDANS.js} +3 -3
  128. package/dist/support-I7LOJLIF.js +38 -0
  129. package/dist/{targets-4CIFKCTW.js → targets-RUSR6B5Z.js} +77 -42
  130. package/dist/{terminal-lease-WUZY7ZV5.js → terminal-lease-QYVORFR4.js} +6 -4
  131. package/dist/{trace-PNCASAXC.js → trace-ODOQIVIW.js} +61 -6
  132. package/dist/{uninstall-7FV7IP4E.js → uninstall-ZJF5H5ZN.js} +8 -8
  133. package/dist/{upgrade-K2HVIVMQ.js → upgrade-XANW3FXB.js} +29 -26
  134. package/dist/{usage-GTZELZQX.js → usage-4H7ZRXQT.js} +110 -61
  135. package/dist/{verifiers-RLAHT27O.js → verifiers-UZXNBZEB.js} +13 -13
  136. package/dist/{verify-BX3BRKH5.js → verify-BVKWTNDL.js} +9 -9
  137. package/dist/{wiki-generate-ASIFASCN.js → wiki-generate-MY7WV2QI.js} +76 -69
  138. package/dist/worker/entry.js +69 -66
  139. package/docs/alcf-provider.md +1 -1
  140. package/docs/architecture.md +1 -1
  141. package/docs/artifact-versions.md +11 -5
  142. package/docs/built-in-agents.md +1 -1
  143. package/docs/capacity-and-scheduling.md +23 -2
  144. package/docs/commands-and-modes.md +2 -2
  145. package/docs/configuration-and-targets.md +37 -5
  146. package/docs/context-engine.md +63 -4
  147. package/docs/documentation-coverage.md +3 -3
  148. package/docs/documentation-guide.md +1 -1
  149. package/docs/environment-variables.md +2 -0
  150. package/docs/eval-runner.md +262 -11
  151. package/docs/evals-internal.md +72 -2
  152. package/docs/evidence-and-memory.md +77 -12
  153. package/docs/evolution.md +1 -1
  154. package/docs/extensions-and-sharing.md +3 -1
  155. package/docs/fleet-dispatch.md +34 -9
  156. package/docs/glossary.md +21 -1
  157. package/docs/installation-and-lifecycle.md +1 -1
  158. package/docs/middleware-and-components.md +1 -1
  159. package/docs/model-catalog.md +1 -1
  160. package/docs/observability.md +54 -3
  161. package/docs/proactive-memory.md +127 -14
  162. package/docs/prompt-envelope-and-tools.md +22 -2
  163. package/docs/provider-adapter-cookbook.md +1 -1
  164. package/docs/release-cut-checklist.md +60 -41
  165. package/docs/safety-model.md +1 -1
  166. package/docs/scientific-validation.md +1 -1
  167. package/docs/skills-marketplace.md +1 -1
  168. package/docs/tool-usage.md +1 -1
  169. package/docs/trace-store.md +1 -1
  170. package/docs/troubleshooting.md +87 -0
  171. package/docs/tui-design.md +1 -1
  172. package/docs/worker-dispatch-mechanics.md +1 -1
  173. package/package.json +2 -2
  174. package/src/cli/agents.ts +1 -1
  175. package/src/cli/argv.ts +5 -0
  176. package/src/cli/config-inspect.ts +33 -6
  177. package/src/cli/config.ts +1 -1
  178. package/src/cli/configure.ts +107 -23
  179. package/src/cli/doctor-state-size.ts +82 -0
  180. package/src/cli/doctor.ts +7 -1
  181. package/src/cli/eval.ts +80 -16
  182. package/src/cli/evidence.ts +30 -25
  183. package/src/cli/extensions.ts +5 -1
  184. package/src/cli/fleet-preflight.ts +2 -12
  185. package/src/cli/fleet.ts +32 -3
  186. package/src/cli/shared.ts +1 -0
  187. package/src/cli/targets.ts +45 -11
  188. package/src/cli/trace.ts +63 -4
  189. package/src/cli/usage.ts +63 -14
  190. package/src/cli/validate-model.ts +60 -5
  191. package/src/core/bus-events.ts +54 -1
  192. package/src/core/cache-telemetry.ts +42 -0
  193. package/src/core/commit-attribution.ts +4 -4
  194. package/src/core/config.ts +18 -0
  195. package/src/core/defaults.ts +36 -6
  196. package/src/core/endpoint-key.ts +27 -0
  197. package/src/core/path-boundary.ts +100 -0
  198. package/src/core/residency-target-key.ts +25 -0
  199. package/src/core/response-schema.ts +36 -2
  200. package/src/domains/agents/extension.ts +2 -11
  201. package/src/domains/agents/fleet-contract.ts +30 -12
  202. package/src/domains/agents/recipe.ts +7 -1
  203. package/src/domains/agents/registry.ts +73 -5
  204. package/src/domains/agents/result-contract.ts +128 -17
  205. package/src/domains/agents/write-boundary.ts +15 -50
  206. package/src/domains/config/classify.ts +3 -0
  207. package/src/domains/context/codewiki/coordinator.ts +12 -4
  208. package/src/domains/context/project-rules.ts +51 -1
  209. package/src/domains/dispatch/admission.ts +40 -3
  210. package/src/domains/dispatch/assignment-reconcile.ts +22 -5
  211. package/src/domains/dispatch/assignment-store.ts +151 -14
  212. package/src/domains/dispatch/capacity-lease.ts +98 -9
  213. package/src/domains/dispatch/contract.ts +26 -1
  214. package/src/domains/dispatch/delegation-plan.ts +2 -5
  215. package/src/domains/dispatch/execution-plan.ts +44 -4
  216. package/src/domains/dispatch/execution-role.ts +9 -1
  217. package/src/domains/dispatch/extension.ts +309 -96
  218. package/src/domains/dispatch/fleet-run.ts +78 -4
  219. package/src/domains/dispatch/gate-role-prompts.ts +38 -0
  220. package/src/domains/dispatch/heartbeat.ts +32 -8
  221. package/src/domains/dispatch/index.ts +6 -1
  222. package/src/domains/dispatch/intent-requirements.ts +40 -0
  223. package/src/domains/dispatch/intent.ts +84 -8
  224. package/src/domains/dispatch/orphan-recovery.ts +5 -0
  225. package/src/domains/dispatch/path-scope.ts +370 -0
  226. package/src/domains/dispatch/receipt-integrity.ts +2 -1
  227. package/src/domains/dispatch/reservation-store.ts +116 -8
  228. package/src/domains/dispatch/state.ts +4 -0
  229. package/src/domains/dispatch/types.ts +14 -7
  230. package/src/domains/dispatch/validation.ts +6 -3
  231. package/src/domains/dispatch/worker-spawn.ts +25 -11
  232. package/src/domains/dispatch/write-boundary-enforcer.ts +62 -0
  233. package/src/domains/dispatch/write-boundary.ts +262 -22
  234. package/src/domains/eval/artifacts/store.ts +62 -0
  235. package/src/domains/eval/compare/behavioral.ts +224 -0
  236. package/src/domains/eval/compare/compare.ts +355 -2
  237. package/src/domains/eval/compare/envelope.ts +128 -0
  238. package/src/domains/eval/compare/gates.ts +24 -6
  239. package/src/domains/eval/compare/thresholds.ts +30 -3
  240. package/src/domains/eval/execution-provenance.ts +240 -0
  241. package/src/domains/eval/metrics/aggregate.ts +136 -0
  242. package/src/domains/eval/metrics/call-ledger-stream.ts +112 -0
  243. package/src/domains/eval/metrics/evidence.ts +79 -2
  244. package/src/domains/eval/metrics/tracked.ts +413 -0
  245. package/src/domains/eval/provenance.ts +117 -0
  246. package/src/domains/eval/reports/comparison.ts +128 -0
  247. package/src/domains/eval/reports/junit.ts +17 -3
  248. package/src/domains/eval/reports/markdown.ts +3 -3
  249. package/src/domains/eval/reports/text.ts +14 -0
  250. package/src/domains/eval/run-compare.ts +20 -0
  251. package/src/domains/eval/runners/clio-run.ts +139 -2
  252. package/src/domains/eval/runners/external-command.ts +28 -3
  253. package/src/domains/eval/schema/adapter.ts +111 -0
  254. package/src/domains/eval/schema/artifact.ts +20 -0
  255. package/src/domains/eval/schema/behavioral-metrics.ts +204 -0
  256. package/src/domains/eval/schema/behavioral.ts +520 -0
  257. package/src/domains/eval/schema/execution-envelope.ts +194 -0
  258. package/src/domains/eval/schema/serving.ts +74 -0
  259. package/src/domains/eval/schema/suite.ts +38 -8
  260. package/src/domains/eval/schema/validate.ts +58 -3
  261. package/src/domains/eval/schema/verdict.ts +237 -0
  262. package/src/domains/eval/suites/resolve.ts +2 -0
  263. package/src/domains/eval/suites/run.ts +264 -33
  264. package/src/domains/eval/verifiers/command.ts +2 -1
  265. package/src/domains/eval/workspaces/temp-copy.ts +145 -13
  266. package/src/domains/evidence/build.ts +68 -21
  267. package/src/domains/evidence/eval.ts +2 -12
  268. package/src/domains/evidence/findings-markdown.ts +33 -0
  269. package/src/domains/evidence/index.ts +21 -0
  270. package/src/domains/evidence/provenance.ts +46 -11
  271. package/src/domains/evidence/run-trust.ts +7 -113
  272. package/src/domains/evidence/trust-projection.ts +274 -0
  273. package/src/domains/evidence/trust-status.ts +145 -17
  274. package/src/domains/evidence/types.ts +4 -0
  275. package/src/domains/extensions/compatibility.ts +285 -0
  276. package/src/domains/extensions/discovery.ts +126 -4
  277. package/src/domains/extensions/resources.ts +21 -9
  278. package/src/domains/extensions/state.ts +18 -5
  279. package/src/domains/extensions/types.ts +6 -1
  280. package/src/domains/lifecycle/doctor.ts +209 -2
  281. package/src/domains/memory/index.ts +14 -0
  282. package/src/domains/memory/task-bank-promotion.ts +64 -0
  283. package/src/domains/memory/task-memory-policy.ts +77 -8
  284. package/src/domains/memory/task-memory-spend.ts +131 -0
  285. package/src/domains/memory/task-memory-status.ts +7 -0
  286. package/src/domains/memory/task-memory-telemetry.ts +2 -0
  287. package/src/domains/middleware/index.ts +1 -0
  288. package/src/domains/middleware/memory-intervention.ts +69 -5
  289. package/src/domains/middleware/memory-step-endpoint.ts +71 -0
  290. package/src/domains/observability/background-memory-usage.ts +140 -0
  291. package/src/domains/observability/cost.ts +1 -1
  292. package/src/domains/observability/index.ts +7 -0
  293. package/src/domains/observability/out-of-turn-usage.ts +51 -2
  294. package/src/domains/observability/trace-store.ts +192 -2
  295. package/src/domains/prompts/compiler.ts +100 -13
  296. package/src/domains/prompts/contract.ts +3 -5
  297. package/src/domains/providers/endpoint-capacity.ts +96 -0
  298. package/src/domains/providers/extension.ts +30 -2
  299. package/src/domains/providers/index.ts +10 -0
  300. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +243 -1
  301. package/src/domains/providers/runtime-resolution.ts +8 -1
  302. package/src/domains/providers/runtimes/common/probe-helpers.ts +31 -9
  303. package/src/domains/providers/runtimes/local-native/llamacpp-anthropic.ts +1 -1
  304. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  305. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +1 -1
  306. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +1 -1
  307. package/src/domains/providers/runtimes/local-native/llamacpp.ts +4 -1
  308. package/src/domains/providers/runtimes/local-native/lmstudio.ts +4 -1
  309. package/src/domains/providers/runtimes/local-native/ollama-native.ts +6 -1
  310. package/src/domains/providers/types/capability-flags.ts +2 -0
  311. package/src/domains/providers/types/target-descriptor.ts +2 -0
  312. package/src/domains/resources/common-loader.ts +3 -0
  313. package/src/domains/resources/prompts/loader.ts +184 -17
  314. package/src/domains/safety/call-target.ts +52 -0
  315. package/src/domains/safety/policy-engine.ts +5 -5
  316. package/src/domains/safety/run-effects.ts +96 -2
  317. package/src/domains/safety/scope.ts +7 -12
  318. package/src/domains/session/context-accounting.ts +52 -1
  319. package/src/domains/session/context-ledger.ts +37 -13
  320. package/src/domains/session/index.ts +6 -0
  321. package/src/domains/session/prompt-cache.ts +140 -0
  322. package/src/domains/session/prompt-manifest.ts +42 -0
  323. package/src/engine/acp/adapter.ts +18 -3
  324. package/src/engine/acp/server.ts +4 -1
  325. package/src/engine/ai.ts +35 -0
  326. package/src/engine/apis/llamacpp-residency.ts +55 -3
  327. package/src/engine/apis/lmstudio.ts +25 -5
  328. package/src/engine/apis/ollama-native.ts +2 -1
  329. package/src/engine/apis/openai-completions.ts +80 -17
  330. package/src/engine/apis/residency-lock.ts +3 -1
  331. package/src/engine/apis/residency.ts +34 -1
  332. package/src/engine/prompt-templates.ts +18 -1
  333. package/src/engine/provider-payload.ts +29 -1
  334. package/src/engine/worker-runtime.ts +6 -3
  335. package/src/entry/orchestrator.ts +176 -30
  336. package/src/interactive/chat-loop-messages.ts +26 -7
  337. package/src/interactive/chat-loop.ts +318 -41
  338. package/src/interactive/chat-panel.ts +62 -8
  339. package/src/interactive/clio-editor.ts +45 -8
  340. package/src/interactive/context-activity.ts +5 -1
  341. package/src/interactive/context-meter.ts +1 -1
  342. package/src/interactive/context-overlay.ts +40 -10
  343. package/src/interactive/cost-overlay.ts +64 -6
  344. package/src/interactive/dispatch-board.ts +127 -5
  345. package/src/interactive/fleet-run-preview.ts +41 -15
  346. package/src/interactive/handoff-round.ts +41 -2
  347. package/src/interactive/interactive-application.ts +24 -1
  348. package/src/interactive/interactive-event-projection.ts +14 -0
  349. package/src/interactive/interactive-input-runtime.ts +8 -0
  350. package/src/interactive/interactive-presentation.ts +4 -0
  351. package/src/interactive/interactive-shell.ts +20 -17
  352. package/src/interactive/interactive-slash-runtime.ts +27 -4
  353. package/src/interactive/memory-overlay.ts +8 -0
  354. package/src/interactive/mutation-preview.ts +295 -0
  355. package/src/interactive/overlay-general-openers.ts +16 -0
  356. package/src/interactive/overlay-key-routing.ts +38 -0
  357. package/src/interactive/overlay-lifecycle.ts +38 -5
  358. package/src/interactive/overlay-permission-lifecycle.ts +22 -2
  359. package/src/interactive/overlay-session-lifecycle.ts +73 -9
  360. package/src/interactive/overlays/ask-user.ts +91 -19
  361. package/src/interactive/overlays/help-reference.ts +4 -0
  362. package/src/interactive/overlays/prompts.ts +11 -1
  363. package/src/interactive/overlays/settings.ts +176 -48
  364. package/src/interactive/permission-hint.ts +34 -2
  365. package/src/interactive/permission-overlay.ts +159 -9
  366. package/src/interactive/prewarm.ts +197 -0
  367. package/src/interactive/render-trace.ts +162 -15
  368. package/src/interactive/renderers/tool-execution.ts +4 -0
  369. package/src/interactive/side-question.ts +58 -1
  370. package/src/interactive/slash-commands.ts +7 -2
  371. package/src/interactive/status/controller.ts +11 -0
  372. package/src/interactive/status/state-machine.ts +54 -2
  373. package/src/interactive/status/types.ts +7 -0
  374. package/src/interactive/terminal-lease.ts +2 -0
  375. package/src/interactive/turn-context.ts +299 -31
  376. package/src/interactive/turn-persistence.ts +14 -4
  377. package/src/interactive/turn-prewarm.ts +364 -0
  378. package/src/interactive/turn-queues.ts +7 -4
  379. package/src/interactive/turn-runtime.ts +8 -1
  380. package/src/interactive/turn-state.ts +23 -0
  381. package/src/interactive/view/artifacts.ts +42 -9
  382. package/src/interactive/view/view-overlay.ts +43 -6
  383. package/src/interactive/worker-receipts.ts +14 -2
  384. package/src/interactive/worker-stream.ts +8 -0
  385. package/src/tools/ask-user.ts +43 -2
  386. package/src/tools/dispatch-admission.ts +12 -13
  387. package/src/tools/dispatch-arguments.ts +27 -0
  388. package/src/tools/dispatch-plan.ts +46 -9
  389. package/src/tools/dispatch-runner.ts +48 -13
  390. package/src/tools/dispatch-scout.ts +1 -1
  391. package/src/tools/monitor.ts +13 -0
  392. package/src/tools/registry.ts +16 -0
  393. package/src/tools/worker-evidence.ts +19 -13
  394. package/src/worker/spec-contract.ts +2 -1
  395. package/dist/chunk-AOCYTWAV.js +0 -449
  396. package/dist/chunk-HWUFFB6L.js +0 -83
  397. package/dist/chunk-R346GLFC.js +0 -31
  398. package/dist/chunk-ZGH7FGS5.js +0 -1079
  399. package/dist/doctor-RN4YKO2X.js +0 -87
  400. package/dist/eval-RUBJVSNQ.js +0 -2557
@@ -16,6 +16,7 @@ import {
16
16
  type Usage,
17
17
  } from "@earendil-works/pi-ai";
18
18
  import { openAICompletionsApi } from "@earendil-works/pi-ai/api/openai-completions.lazy";
19
+ import type { BackendCompletionTimings, BackendTimingsSource } from "../../core/cache-telemetry.js";
19
20
  import type { ResponseModelIdObservation } from "../../core/response-model-id.js";
20
21
  import {
21
22
  type AppliedThinking,
@@ -41,6 +42,8 @@ declare module "@earendil-works/pi-ai" {
41
42
  interface AssistantMessage {
42
43
  /** Direct observation of model-id presence in an OpenAI-compatible response. */
43
44
  responseModelIdObservation?: ResponseModelIdObservation;
45
+ /** Backend-reported prefill and prediction timings when available. */
46
+ backendTimings?: BackendCompletionTimings;
44
47
  }
45
48
  }
46
49
 
@@ -95,13 +98,57 @@ function isPlainRecord(value: unknown): value is Record<string, unknown> {
95
98
  interface ResponseModelIdCapture {
96
99
  reportedModelId: string | null;
97
100
  observed: boolean;
98
- done: boolean;
101
+ modelIdDone: boolean;
102
+ backendTimings: BackendCompletionTimings | null;
103
+ backendTimingsSource: BackendTimingsSource | null;
99
104
  buffer: string;
100
105
  decoder: TextDecoder | null;
101
106
  }
102
107
 
103
- function observeResponseModelIdLine(line: string, capture: ResponseModelIdCapture): void {
104
- if (capture.done) return;
108
+ function nonnegativeFiniteNumber(value: unknown): number | null {
109
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : null;
110
+ }
111
+
112
+ /**
113
+ * The operator's llama.cpp router reported build b226-2115b73d8. Its nonstream
114
+ * response placed a `{ prompt_n, prompt_ms, predicted_n, predicted_ms, cache_n }`
115
+ * timing object at the top level. Its stream placed the timing object on the
116
+ * final SSE JSON event without `timings_per_token`. Setting
117
+ * `timings_per_token: true` repeated cumulative timing objects for individual
118
+ * tokens. LM Studio's OpenAI-compatible stream and nonstream responses omitted
119
+ * timings both with and without that flag. Its native runtime reported
120
+ * llama.cpp-win-x86_64-nvidia-cuda12-avx2 2.29.0.
121
+ */
122
+ function backendCompletionTimings(value: unknown, source: BackendTimingsSource): BackendCompletionTimings | null {
123
+ if (!isPlainRecord(value)) return null;
124
+ const promptN = nonnegativeFiniteNumber(value.prompt_n);
125
+ const predictedN = nonnegativeFiniteNumber(value.predicted_n);
126
+ const promptMs = nonnegativeFiniteNumber(value.prompt_ms);
127
+ const predictedMs = nonnegativeFiniteNumber(value.predicted_ms);
128
+ if (promptN === null || predictedN === null || promptMs === null || predictedMs === null) return null;
129
+ const cacheN = nonnegativeFiniteNumber(value.cache_n);
130
+ return {
131
+ promptTokens: promptN + (cacheN ?? 0),
132
+ cachedTokens: cacheN,
133
+ predictedTokens: predictedN,
134
+ promptMs,
135
+ predictedMs,
136
+ source,
137
+ };
138
+ }
139
+
140
+ function backendTimingsSourceForModel(model: Model<Api>): BackendTimingsSource | null {
141
+ const metadata = (model as Model<Api> & ClioRuntimeMetadata).clio;
142
+ if (model.provider === "llamacpp" && metadata?.runtimeId === "llamacpp") return "llamacpp-timings";
143
+ if (model.provider === "lmstudio" && metadata?.runtimeId === "lmstudio") return "lmstudio-timings";
144
+ return null;
145
+ }
146
+
147
+ function captureCanStopEarly(capture: ResponseModelIdCapture): boolean {
148
+ return capture.modelIdDone && capture.backendTimingsSource === null;
149
+ }
150
+
151
+ function observeResponseMetadataLine(line: string, capture: ResponseModelIdCapture): void {
105
152
  const normalized = line.endsWith("\r") ? line.slice(0, -1) : line;
106
153
  if (!normalized.startsWith("data:")) return;
107
154
  const data = normalized.slice("data:".length).trimStart();
@@ -109,10 +156,16 @@ function observeResponseModelIdLine(line: string, capture: ResponseModelIdCaptur
109
156
  try {
110
157
  const payload = JSON.parse(data) as unknown;
111
158
  if (!isPlainRecord(payload)) return;
112
- const model = payload.model;
113
- if (typeof model === "string" && model.trim().length > 0) {
114
- capture.reportedModelId = model.trim();
115
- capture.done = true;
159
+ if (!capture.modelIdDone) {
160
+ const model = payload.model;
161
+ if (typeof model === "string" && model.trim().length > 0) {
162
+ capture.reportedModelId = model.trim();
163
+ capture.modelIdDone = true;
164
+ }
165
+ }
166
+ if (capture.backendTimingsSource !== null) {
167
+ const timings = backendCompletionTimings(payload.timings, capture.backendTimingsSource);
168
+ if (timings !== null) capture.backendTimings = timings;
116
169
  }
117
170
  } catch {
118
171
  // A partial or vendor-specific event is pi-ai's parsing concern. This
@@ -125,14 +178,14 @@ function observeResponseModelIdBytes(
125
178
  capture: ResponseModelIdCapture,
126
179
  flush = false,
127
180
  ): void {
128
- if (capture.done || !capture.decoder) return;
181
+ if (!capture.decoder) return;
129
182
  capture.buffer += chunk ? capture.decoder.decode(chunk, { stream: !flush }) : capture.decoder.decode();
130
183
  let newline = capture.buffer.indexOf("\n");
131
184
  while (newline >= 0) {
132
185
  const line = capture.buffer.slice(0, newline);
133
186
  capture.buffer = capture.buffer.slice(newline + 1);
134
- observeResponseModelIdLine(line, capture);
135
- if (capture.done) {
187
+ observeResponseMetadataLine(line, capture);
188
+ if (captureCanStopEarly(capture)) {
136
189
  capture.buffer = "";
137
190
  capture.decoder = null;
138
191
  return;
@@ -140,10 +193,10 @@ function observeResponseModelIdBytes(
140
193
  newline = capture.buffer.indexOf("\n");
141
194
  }
142
195
  if (flush && capture.buffer.length > 0) {
143
- observeResponseModelIdLine(capture.buffer, capture);
196
+ observeResponseMetadataLine(capture.buffer, capture);
144
197
  capture.buffer = "";
145
198
  }
146
- if (capture.done || flush) capture.decoder = null;
199
+ if (captureCanStopEarly(capture) || flush) capture.decoder = null;
147
200
  }
148
201
 
149
202
  function captureResponseModelId(response: Response, capture: ResponseModelIdCapture): Response {
@@ -154,12 +207,12 @@ function captureResponseModelId(response: Response, capture: ResponseModelIdCapt
154
207
  new TransformStream<Uint8Array, Uint8Array>({
155
208
  transform(chunk, controller) {
156
209
  capture.observed = true;
157
- if (!capture.done) observeResponseModelIdBytes(chunk, capture);
210
+ observeResponseModelIdBytes(chunk, capture);
158
211
  controller.enqueue(chunk);
159
212
  },
160
213
  flush() {
161
214
  capture.observed = true;
162
- if (!capture.done) observeResponseModelIdBytes(undefined, capture, true);
215
+ observeResponseModelIdBytes(undefined, capture, true);
163
216
  },
164
217
  }),
165
218
  );
@@ -171,13 +224,16 @@ function captureResponseModelId(response: Response, capture: ResponseModelIdCapt
171
224
  }
172
225
 
173
226
  function withResponseModelIdCapture<TOptions extends StreamOptions>(
227
+ model: Model<Api>,
174
228
  options: TOptions,
175
229
  sourceFactory: (capturedOptions: TOptions) => AssistantMessageEventStream,
176
230
  ): AssistantMessageEventStream {
177
231
  const capture: ResponseModelIdCapture = {
178
232
  reportedModelId: null,
179
233
  observed: false,
180
- done: false,
234
+ modelIdDone: false,
235
+ backendTimings: null,
236
+ backendTimingsSource: backendTimingsSourceForModel(model),
181
237
  buffer: "",
182
238
  decoder: new TextDecoder(),
183
239
  };
@@ -197,8 +253,13 @@ function withResponseModelIdCapture<TOptions extends StreamOptions>(
197
253
  ? { state: "not-reported" }
198
254
  : { state: "reported", reportedModelId: capture.reportedModelId }
199
255
  : { state: "not-observed" };
200
- if (event.type === "done") event.message.responseModelIdObservation = observation;
201
- else if (event.type === "error") event.error.responseModelIdObservation = observation;
256
+ if (event.type === "done") {
257
+ event.message.responseModelIdObservation = observation;
258
+ if (capture.backendTimings !== null) event.message.backendTimings = capture.backendTimings;
259
+ } else if (event.type === "error") {
260
+ event.error.responseModelIdObservation = observation;
261
+ if (capture.backendTimings !== null) event.error.backendTimings = capture.backendTimings;
262
+ }
202
263
  annotated.push(event as AssistantMessageEvent);
203
264
  }
204
265
  annotated.end();
@@ -863,6 +924,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
863
924
  stripNeverReasoningFromStream(
864
925
  filterGemmaChannelStream(
865
926
  withResponseModelIdCapture(
927
+ model,
866
928
  withRemainingContextBudget(model, effectiveContext, withSamplers),
867
929
  (capturedOptions) =>
868
930
  withLocalResidency(
@@ -895,6 +957,7 @@ export const openAICompletionsApiProvider: EngineApiProvider<"openai-completions
895
957
  stripNeverReasoningFromStream(
896
958
  filterGemmaChannelStream(
897
959
  withResponseModelIdCapture(
960
+ model,
898
961
  withRemainingContextBudget(model, effectiveContext, withSamplers),
899
962
  (capturedOptions) =>
900
963
  withLocalResidency(
@@ -12,12 +12,14 @@
12
12
  import { join } from "node:path";
13
13
  import { withStateFileLock } from "../../core/state-file-lock.js";
14
14
  import { clioStatePath } from "../../core/xdg.js";
15
+ import { canonicalEndpointKey } from "../../domains/providers/endpoint-capacity.js";
15
16
 
16
17
  /** Total time one process waits for another's mutation before proceeding unlocked. */
17
18
  const LOCK_WAIT_MS = 120_000;
18
19
 
19
20
  function lockTargetFor(targetKey: string): string {
20
- return join(clioStatePath(), "residency-locks", targetKey.replace(/[^a-zA-Z0-9._-]+/g, "_"));
21
+ const key = canonicalEndpointKey(targetKey) ?? targetKey;
22
+ return join(clioStatePath(), "residency-locks", key.replace(/[^a-zA-Z0-9._-]+/g, "_"));
21
23
  }
22
24
 
23
25
  /** Run `fn` while holding the per-target residency lock. */
@@ -35,7 +35,12 @@
35
35
  * unload/load against the same server.
36
36
  */
37
37
 
38
- import { BusChannels, type RuntimeNoticeKind, type RuntimeNoticePayload } from "../../core/bus-events.js";
38
+ import {
39
+ BusChannels,
40
+ type ResidencyMutationPayload,
41
+ type RuntimeNoticeKind,
42
+ type RuntimeNoticePayload,
43
+ } from "../../core/bus-events.js";
39
44
  import type { ProtectedModelRef, ResidencyRole } from "../../core/residency-protection.js";
40
45
  import { getSharedBus } from "../../core/shared-bus.js";
41
46
  import { withResidencyLock } from "./residency-lock.js";
@@ -73,6 +78,11 @@ export function emitResidencyNotice(notice: ResidencyNotice): void {
73
78
  }
74
79
  }
75
80
 
81
+ /** Publish one successful residency mutation to in-process cache telemetry. */
82
+ export function emitResidencyMutation(mutation: Omit<ResidencyMutationPayload, "at">): void {
83
+ getSharedBus().emit(BusChannels.ResidencyMutation, { ...mutation, at: Date.now() });
84
+ }
85
+
76
86
  // --- configured-model protection ---------------------------------------------
77
87
 
78
88
  // Wire model ids the operator's own configuration references, with the role
@@ -543,6 +553,13 @@ async function restoreEvictedModels(
543
553
  try {
544
554
  await adapter.reloadEvicted(entry.modelId);
545
555
  restored.push(entry.modelId);
556
+ emitResidencyMutation({
557
+ targetKey: adapter.targetKey,
558
+ targetId: adapter.targetId,
559
+ runtimeId: adapter.runtimeId,
560
+ model: entry.modelId,
561
+ operation: "load",
562
+ });
546
563
  } catch {
547
564
  failed.push(entry.modelId);
548
565
  }
@@ -705,6 +722,13 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
705
722
  await adapter.unload(entry.modelId);
706
723
  forgetClioLoaded(adapter.targetKey, entry.modelId);
707
724
  evicted.push(entry);
725
+ emitResidencyMutation({
726
+ targetKey: adapter.targetKey,
727
+ targetId: adapter.targetId,
728
+ runtimeId: adapter.runtimeId,
729
+ model: entry.modelId,
730
+ operation: "evict",
731
+ });
708
732
  } catch {
709
733
  // Best-effort: a failed unload self-heals on the next reconcile.
710
734
  }
@@ -712,6 +736,15 @@ export async function reconcileResidency(adapter: ResidencyAdapter): Promise<Rec
712
736
  if (!adapter.load) return;
713
737
  try {
714
738
  await adapter.load(adapter.keepModelId);
739
+ if (!plan.keepResident) {
740
+ emitResidencyMutation({
741
+ targetKey: adapter.targetKey,
742
+ targetId: adapter.targetId,
743
+ runtimeId: adapter.runtimeId,
744
+ model: adapter.keepModelId,
745
+ operation: "load",
746
+ });
747
+ }
715
748
  } catch (error) {
716
749
  // The eviction bought nothing: the slot it freed is still empty and
717
750
  // the target is now serving less than before the reconcile. Put back
@@ -1 +1,18 @@
1
- export { parseCommandArgs, substituteArgs } from "@earendil-works/pi-agent-core";
1
+ import { parseCommandArgs, substituteArgs as substituteParsedArgs } from "@earendil-works/pi-agent-core";
2
+
3
+ export { parseCommandArgs };
4
+
5
+ const RAW_ARGUMENTS_PLACEHOLDER = /\$ARGUMENTS/g;
6
+
7
+ /**
8
+ * Substitute prompt arguments while optionally retaining the exact raw text
9
+ * for `$ARGUMENTS`. Positional, slice, and `$@` placeholders keep Pi's
10
+ * shell-style parsing semantics.
11
+ */
12
+ export function substituteArgs(content: string, args: string[], rawArguments?: string): string {
13
+ if (rawArguments === undefined) return substituteParsedArgs(content, args);
14
+ return content
15
+ .split(RAW_ARGUMENTS_PLACEHOLDER)
16
+ .map((segment) => substituteParsedArgs(segment, args))
17
+ .join(rawArguments);
18
+ }
@@ -1,4 +1,4 @@
1
- import { RESPONSE_SCHEMA_RUNTIME_ID } from "../core/response-schema.js";
1
+ import { RESPONSE_SCHEMA_RUNTIME_ID, type ResponseSchemaDialect } from "../core/response-schema.js";
2
2
  import type { ThinkingLevel } from "../domains/providers/index.js";
3
3
  import type { EngineModel } from "./types.js";
4
4
 
@@ -217,6 +217,34 @@ function patchLlamaCppResponseSchemaPayload(
217
217
  };
218
218
  }
219
219
 
220
+ /**
221
+ * Apply a JSON-schema response constraint in the dialect the runtime takes.
222
+ *
223
+ * Unlike the worker patcher above, this one is for a seam that treats native
224
+ * enforcement as an optimization: the caller looks the dialect up first and
225
+ * simply does not call this when there is none, so an unconstrained request
226
+ * still goes out and the prompt-level instruction carries it (issue #223).
227
+ * Returns undefined when the payload is not an object, which leaves it alone.
228
+ */
229
+ export function patchResponseSchemaPayloadForDialect(
230
+ payload: unknown,
231
+ dialect: ResponseSchemaDialect,
232
+ responseSchema: Record<string, unknown>,
233
+ schemaName: string,
234
+ ): unknown | undefined {
235
+ if (!isRecord(payload)) return undefined;
236
+ if (dialect === "llamacpp-json-object") {
237
+ return { ...payload, response_format: { type: "json_object", schema: responseSchema } };
238
+ }
239
+ return {
240
+ ...payload,
241
+ response_format: {
242
+ type: "json_schema",
243
+ json_schema: { name: schemaName, strict: true, schema: responseSchema },
244
+ },
245
+ };
246
+ }
247
+
220
248
  export interface WorkerPayloadPatchOptions {
221
249
  runtimeId: string;
222
250
  thinkingLevel?: ThinkingLevel;
@@ -23,7 +23,7 @@ import { type ToolName, ToolNames } from "../core/tool-names.js";
23
23
  import {
24
24
  type ObservedReadRanges,
25
25
  type ObservedRunEffects,
26
- parseResultContract,
26
+ parseWorkerResultContract,
27
27
  RESULT_CONTRACT_REPAIR_LIMIT,
28
28
  type ResultContract,
29
29
  resultContractRepairMessages,
@@ -362,8 +362,11 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
362
362
  assertResponseSchemaRuntime(input);
363
363
  // The wire carries the contract as data; the one strict parser owns its
364
364
  // shape. The worker subprocess may not import it (it stays slim), so the
365
- // check lands here, before any model call.
366
- if (input.resultContract !== undefined) parseResultContract(input.resultContract, "WorkerSpec.resultContract");
365
+ // check lands here, before any model call. The wire parser, not the recipe
366
+ // one: a dispatch request may override the seated recipe's postcondition
367
+ // with a kind the coordinator authors, and the recipe parser refusing those
368
+ // killed every council vote member with a fatal spec error.
369
+ if (input.resultContract !== undefined) parseWorkerResultContract(input.resultContract, "WorkerSpec.resultContract");
367
370
  if (input.runtime.id === "claude-sdk") {
368
371
  return startClaudeSdkWorkerRun(input, emit);
369
372
  }