@iowarp/clio-coder 0.3.1 → 0.3.3

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 (601) hide show
  1. package/CHANGELOG.md +233 -373
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.js} +43 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
  8. package/dist/chunk-2DJ2KNFG.js +2095 -0
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
  12. package/dist/chunk-2VTFPG5O.js +48 -0
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4VP4KH3K.js +962 -0
  16. package/dist/chunk-4XUGQOHA.js +797 -0
  17. package/dist/chunk-4ZG3XFUR.js +77 -0
  18. package/dist/chunk-5B2AEOW5.js +5407 -0
  19. package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
  20. package/dist/{chunk-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
  21. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  22. package/dist/chunk-65DEGPJ6.js +52 -0
  23. package/dist/chunk-6EJMN2Y3.js +17 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6SGHMWE3.js +277 -0
  26. package/dist/chunk-6XLNIQDB.js +27 -0
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/chunk-7MNJORFF.js +22 -0
  29. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  30. package/dist/chunk-AGYYIBLL.js +1069 -0
  31. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  32. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  33. package/dist/chunk-CBCAPZAA.js +229 -0
  34. package/dist/chunk-CMZWFGD2.js +352 -0
  35. package/dist/chunk-COU2UHX6.js +400 -0
  36. package/dist/chunk-DSELYM6W.js +1077 -0
  37. package/dist/chunk-DUYJ5IO6.js +644 -0
  38. package/dist/chunk-ECH6PKUQ.js +39 -0
  39. package/dist/chunk-ED4KHGC3.js +143 -0
  40. package/dist/chunk-EKMEHE4H.js +340 -0
  41. package/dist/chunk-FCSXB6T2.js +338 -0
  42. package/dist/chunk-FJ3H4MN5.js +48 -0
  43. package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G4BMMOKF.js +182 -0
  46. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  47. package/dist/chunk-HC4CLZ2Y.js +68 -0
  48. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  49. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  50. package/dist/chunk-I4HZDVNP.js +73 -0
  51. package/dist/chunk-IKCO5N3L.js +162 -0
  52. package/dist/chunk-IR4CFBFN.js +56 -0
  53. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  54. package/dist/chunk-J7CWMCQD.js +255 -0
  55. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  56. package/dist/chunk-KZWTDYJF.js +217 -0
  57. package/dist/chunk-LBMZMYH2.js +285 -0
  58. package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
  59. package/dist/chunk-LW6DSM3M.js +5135 -0
  60. package/dist/chunk-LWLEKMDQ.js +3482 -0
  61. package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
  62. package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
  63. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  64. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  65. package/dist/chunk-OAO4GE4M.js +619 -0
  66. package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
  67. package/dist/chunk-OKGUZO2U.js +34 -0
  68. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  69. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  70. package/dist/chunk-OQE5J4C6.js +73 -0
  71. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  72. package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
  73. package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
  74. package/dist/chunk-POHLU5DW.js +1186 -0
  75. package/dist/chunk-QKMUKYO7.js +4961 -0
  76. package/dist/chunk-SRDMMSEP.js +16405 -0
  77. package/dist/chunk-SST6Z5JA.js +80 -0
  78. package/dist/chunk-STBPMHSX.js +2456 -0
  79. package/dist/chunk-T6YILFSB.js +80 -0
  80. package/dist/chunk-TZK7PACC.js +174 -0
  81. package/dist/chunk-TZTZS7QK.js +227 -0
  82. package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
  83. package/dist/chunk-UOV2BYIW.js +107 -0
  84. package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
  85. package/dist/chunk-VAKQQHWR.js +434 -0
  86. package/dist/chunk-VG7TBQIY.js +128 -0
  87. package/dist/chunk-VJWL6YS5.js +244 -0
  88. package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-X4RCMKVQ.js +641 -0
  91. package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
  92. package/dist/chunk-XBXAASKX.js +18 -0
  93. package/dist/chunk-XN3L4EYL.js +46 -0
  94. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  95. package/dist/chunk-YHZX5GEU.js +193 -0
  96. package/dist/chunk-YXLYO42X.js +91 -0
  97. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  98. package/dist/chunk-ZI647VB5.js +37 -0
  99. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  100. package/dist/chunk-ZWMF7253.js +1882 -0
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-JOU4FXVA.js +25 -0
  103. package/dist/code-nav-7AX6FYE6.js +600 -0
  104. package/dist/codewiki/build-worker.js +66 -0
  105. package/dist/compile-cache-CVJMMODC.js +18 -0
  106. package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
  107. package/dist/{config-IRUQ7SE4.js → config-XCDVKR23.js} +92 -55
  108. package/dist/configure-4GAP54ZW.js +42 -0
  109. package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
  110. package/dist/context-5VKGUVJJ.js +866 -0
  111. package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
  126. package/dist/monitor-GE4ID3IA.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
  128. package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
  129. package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
  130. package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
  131. package/dist/{run-YTPEYQOH.js → run-ZU3QMZPZ.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
  137. package/dist/terminal-lease-BNAHVHBS.js +395 -0
  138. package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
  139. package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
  140. package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
  141. package/dist/{upgrade-33G2LMM5.js → upgrade-JQHHPQ4K.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
  143. package/dist/verify-375KUB3Y.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.js} +74 -34
  146. package/dist/worker/entry.js +221 -36
  147. package/dist/workspace-G4ZWUIPR.js +22 -0
  148. package/docs/README.md +22 -17
  149. package/docs/acp.md +168 -16
  150. package/docs/alcf-provider.md +1 -1
  151. package/docs/architecture.md +136 -7
  152. package/docs/artifact-versions.md +1 -1
  153. package/docs/built-in-agents.md +1 -1
  154. package/docs/capacity-and-scheduling.md +1 -1
  155. package/docs/commands-and-modes.md +114 -71
  156. package/docs/config-knobs-audit.md +1 -3
  157. package/docs/configuration-and-targets.md +174 -46
  158. package/docs/context-engine.md +29 -6
  159. package/docs/development-pipeline.md +26 -1
  160. package/docs/dispatch-architecture-rationale.md +1 -1
  161. package/docs/documentation-coverage.md +2 -2
  162. package/docs/documentation-guide.md +1 -1
  163. package/docs/environment-variables.md +13 -5
  164. package/docs/eval-runner.md +1 -1
  165. package/docs/evals-internal.md +1 -1
  166. package/docs/evidence-and-memory.md +6 -2
  167. package/docs/evolution.md +2 -2
  168. package/docs/exit-codes-and-output.md +15 -9
  169. package/docs/extensions-and-sharing.md +9 -9
  170. package/docs/fleet-dispatch.md +7 -5
  171. package/docs/git-commit-provenance.md +120 -0
  172. package/docs/glossary.md +1 -1
  173. package/docs/installation-and-lifecycle.md +34 -27
  174. package/docs/middleware-and-components.md +1 -1
  175. package/docs/model-catalog.md +45 -14
  176. package/docs/observability.md +8 -5
  177. package/docs/performance-methodology.md +491 -0
  178. package/docs/pi-boundary.md +72 -0
  179. package/docs/proactive-memory.md +3 -3
  180. package/docs/prompt-envelope-and-tools.md +24 -3
  181. package/docs/provider-adapter-cookbook.md +57 -4
  182. package/docs/release-cut-checklist.md +129 -115
  183. package/docs/safety-model.md +9 -5
  184. package/docs/scientific-validation.md +3 -3
  185. package/docs/session-lifecycle.md +55 -12
  186. package/docs/skills-marketplace.md +12 -8
  187. package/docs/time-conventions.md +1 -1
  188. package/docs/tool-usage.md +3 -3
  189. package/docs/trace-store.md +1 -1
  190. package/docs/troubleshooting.md +10 -7
  191. package/docs/tui-design.md +47 -10
  192. package/docs/worker-dispatch-mechanics.md +1 -1
  193. package/package.json +19 -22
  194. package/skills/coding/ast-grep/SKILL.md +136 -0
  195. package/skills/coding/ast-grep/evals.md +56 -0
  196. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  197. package/skills/coding/coding-standards/SKILL.md +113 -0
  198. package/skills/coding/coding-standards/evals.md +34 -0
  199. package/skills/coding/prototype/SKILL.md +86 -0
  200. package/skills/coding/prototype/evals.md +42 -0
  201. package/skills/coding/prototype/references/LOGIC.md +67 -0
  202. package/skills/coding/prototype/references/UI.md +112 -0
  203. package/skills/coding/tdd/SKILL.md +101 -0
  204. package/skills/coding/tdd/evals.md +41 -0
  205. package/skills/coding/tdd/references/mocking.md +59 -0
  206. package/skills/coding/tdd/references/tests.md +77 -0
  207. package/skills/context/context-handoff/SKILL.md +126 -0
  208. package/skills/context/context-handoff/evals.md +57 -0
  209. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  210. package/skills/context/context-prime/SKILL.md +95 -0
  211. package/skills/context/context-prime/evals.md +54 -0
  212. package/skills/meta/clio-dev/SKILL.md +91 -0
  213. package/skills/meta/clio-dev/evals.md +45 -0
  214. package/skills/meta/clio-test/SKILL.md +130 -0
  215. package/skills/meta/clio-test/evals.md +43 -0
  216. package/skills/meta/clio-test/references/harness.md +97 -0
  217. package/skills/meta/clio-test/references/test-map.md +59 -0
  218. package/skills/meta/credentials/SKILL.md +125 -0
  219. package/skills/meta/credentials/evals.md +104 -0
  220. package/skills/meta/find-skills/SKILL.md +72 -0
  221. package/skills/meta/find-skills/evals.md +47 -0
  222. package/skills/meta/herdr/SKILL.md +127 -0
  223. package/skills/meta/herdr/evals.md +38 -0
  224. package/skills/meta/skill-craft/SKILL.md +102 -0
  225. package/skills/meta/skill-craft/evals.md +41 -0
  226. package/skills/planning/architecture/SKILL.md +129 -0
  227. package/skills/planning/architecture/evals.md +36 -0
  228. package/skills/planning/backlog/SKILL.md +90 -0
  229. package/skills/planning/backlog/evals.md +43 -0
  230. package/skills/planning/prd/SKILL.md +82 -0
  231. package/skills/planning/prd/evals.md +49 -0
  232. package/skills/planning/product-intent/SKILL.md +112 -0
  233. package/skills/planning/product-intent/evals.md +36 -0
  234. package/skills/planning/tech-spec/SKILL.md +115 -0
  235. package/skills/planning/tech-spec/evals.md +47 -0
  236. package/skills/registry.yaml +136 -0
  237. package/skills/research/arxiv-literature/SKILL.md +104 -0
  238. package/skills/research/arxiv-literature/evals.md +58 -0
  239. package/skills/research/experiment-protocol/SKILL.md +122 -0
  240. package/skills/research/experiment-protocol/evals.md +91 -0
  241. package/skills/research/scientific-debugging/SKILL.md +119 -0
  242. package/skills/research/scientific-debugging/evals.md +138 -0
  243. package/skills/research/scientific-modernization/SKILL.md +138 -0
  244. package/skills/research/scientific-modernization/evals.md +84 -0
  245. package/skills/workflow/design-council/SKILL.md +139 -0
  246. package/skills/workflow/design-council/evals.md +97 -0
  247. package/skills/workflow/grill-me/SKILL.md +186 -0
  248. package/skills/workflow/grill-me/evals.md +78 -0
  249. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  250. package/skills/workflow/workflow-distiller/evals.md +107 -0
  251. package/src/cli/acp.ts +31 -4
  252. package/src/cli/clio.ts +68 -6
  253. package/src/cli/config-inspect.ts +28 -22
  254. package/src/cli/configure.ts +47 -9
  255. package/src/cli/context-clear.ts +2 -2
  256. package/src/cli/context-index.ts +21 -23
  257. package/src/cli/context.ts +13 -8
  258. package/src/cli/default-target.ts +9 -17
  259. package/src/cli/docs.ts +11 -5
  260. package/src/cli/evidence.ts +4 -1
  261. package/src/cli/extensions.ts +10 -1
  262. package/src/cli/fleet.ts +47 -6
  263. package/src/cli/index.ts +55 -26
  264. package/src/cli/memory.ts +3 -1
  265. package/src/cli/models.ts +1 -1
  266. package/src/cli/modes/json-stream.ts +37 -1
  267. package/src/cli/modes/print.ts +24 -9
  268. package/src/cli/run.ts +2 -2
  269. package/src/cli/skills-eval.ts +23 -8
  270. package/src/cli/skills.ts +19 -4
  271. package/src/cli/targets.ts +4 -0
  272. package/src/cli/text-layout.ts +15 -5
  273. package/src/cli/trace.ts +62 -14
  274. package/src/cli/upgrade.ts +18 -2
  275. package/src/cli/usage.ts +10 -3
  276. package/src/cli/wiki-generate.ts +2 -1
  277. package/src/core/agent-environment.ts +7 -0
  278. package/src/core/bash-exec.ts +72 -1
  279. package/src/core/boot-trace.ts +9 -4
  280. package/src/core/bus-events.ts +20 -4
  281. package/src/core/commit-attribution.ts +157 -0
  282. package/src/core/compile-cache.ts +159 -0
  283. package/src/core/config.ts +131 -2
  284. package/src/core/defaults.ts +39 -5
  285. package/src/core/domain-loader.ts +12 -5
  286. package/src/core/git-commit-attribution.ts +387 -0
  287. package/src/core/incomplete-installation.ts +45 -0
  288. package/src/core/response-schema.ts +1 -1
  289. package/src/core/safe-exec.ts +13 -1
  290. package/src/core/settings-layers.ts +155 -21
  291. package/src/core/skill-activation.ts +1 -1
  292. package/src/core/startup-timer.ts +3 -3
  293. package/src/core/state-file-lock.ts +13 -1
  294. package/src/core/termination.ts +78 -5
  295. package/src/domains/config/classify.ts +15 -3
  296. package/src/domains/config/extension.ts +19 -13
  297. package/src/domains/config/index.ts +10 -0
  298. package/src/domains/config/keybindings.ts +45 -9
  299. package/src/domains/context/bootstrap-prompt.ts +1 -1
  300. package/src/domains/context/bootstrap.ts +111 -18
  301. package/src/domains/context/clear.ts +16 -11
  302. package/src/domains/context/clio-md.ts +111 -9
  303. package/src/domains/context/codewiki/artifact.ts +400 -0
  304. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  305. package/src/domains/context/codewiki/build-worker.ts +54 -0
  306. package/src/domains/context/codewiki/coordinator.ts +182 -0
  307. package/src/domains/context/codewiki/indexer.ts +59 -144
  308. package/src/domains/context/codewiki/paths.ts +67 -0
  309. package/src/domains/context/codewiki/schema.ts +80 -0
  310. package/src/domains/context/codewiki/tree-sitter.ts +1 -1
  311. package/src/domains/context/contract.ts +11 -5
  312. package/src/domains/context/extension.ts +94 -143
  313. package/src/domains/context/fingerprint.ts +3 -1
  314. package/src/domains/context/index.ts +12 -22
  315. package/src/domains/context/project-metadata.ts +19 -0
  316. package/src/domains/context/prompt-context.ts +9 -10
  317. package/src/domains/context/refresh.ts +29 -21
  318. package/src/domains/context/runtime.ts +17 -0
  319. package/src/domains/context/wiki/generate.ts +39 -34
  320. package/src/domains/context/wiki/plan.ts +1 -1
  321. package/src/domains/context/wiki/prompts.ts +21 -8
  322. package/src/domains/dispatch/code-step.ts +20 -1
  323. package/src/domains/dispatch/extension.ts +158 -21
  324. package/src/domains/dispatch/failure-classification.ts +6 -0
  325. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  326. package/src/domains/dispatch/orphan-recovery.ts +50 -8
  327. package/src/domains/dispatch/receipt-integrity.ts +5 -0
  328. package/src/domains/dispatch/state.ts +31 -6
  329. package/src/domains/dispatch/transport.ts +2 -1
  330. package/src/domains/dispatch/types.ts +14 -0
  331. package/src/domains/dispatch/worker-spawn.ts +21 -2
  332. package/src/domains/eval/metrics/context.ts +1 -1
  333. package/src/domains/eval/types.ts +0 -1
  334. package/src/domains/evidence/build.ts +41 -1
  335. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  336. package/src/domains/lifecycle/migrations/index.ts +24 -4
  337. package/src/domains/middleware/hooks-io.ts +12 -0
  338. package/src/domains/middleware/skills-reminder.ts +30 -15
  339. package/src/domains/prompts/compiler.ts +142 -84
  340. package/src/domains/prompts/contract.ts +18 -2
  341. package/src/domains/prompts/extension.ts +39 -7
  342. package/src/domains/prompts/fragment-loader.ts +0 -1
  343. package/src/domains/prompts/fragments/identity/clio.md +2 -4
  344. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  345. package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
  346. package/src/domains/prompts/fragments/operating/contract.md +4 -50
  347. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  348. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  349. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  350. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  351. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  352. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  353. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  354. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  355. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  356. package/src/domains/prompts/preload.ts +3 -3
  357. package/src/domains/providers/auth/api-key.ts +1 -1
  358. package/src/domains/providers/auth/backend-file.ts +20 -10
  359. package/src/domains/providers/auth/backend-memory.ts +59 -4
  360. package/src/domains/providers/auth/boot-status.ts +65 -0
  361. package/src/domains/providers/auth/oauth.ts +2 -1
  362. package/src/domains/providers/auth/storage.ts +97 -38
  363. package/src/domains/providers/capabilities.ts +12 -4
  364. package/src/domains/providers/contract.ts +15 -4
  365. package/src/domains/providers/extension.ts +18 -6
  366. package/src/domains/providers/model-runtime-capabilities.ts +15 -4
  367. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
  368. package/src/domains/providers/plugins.ts +5 -3
  369. package/src/domains/providers/probe/fingerprint.ts +25 -5
  370. package/src/domains/providers/registry.ts +31 -10
  371. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  372. package/src/domains/providers/runtimes/builtins.ts +2 -2
  373. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  374. package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
  375. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  376. package/src/domains/providers/support.ts +6 -3
  377. package/src/domains/providers/types/local-model-quirks.ts +7 -9
  378. package/src/domains/providers/types/runtime-descriptor.ts +12 -1
  379. package/src/domains/providers/types/target-descriptor.ts +22 -0
  380. package/src/domains/resources/contract.ts +0 -1
  381. package/src/domains/resources/extension.ts +1 -3
  382. package/src/domains/resources/loader.ts +3 -4
  383. package/src/domains/resources/prompts/loader.ts +16 -2
  384. package/src/domains/resources/prompts/substitute.ts +1 -65
  385. package/src/domains/resources/skills/content-hash.ts +2 -0
  386. package/src/domains/resources/skills/install.ts +17 -0
  387. package/src/domains/resources/skills/loader.ts +17 -10
  388. package/src/domains/resources/skills/marketplace.ts +55 -9
  389. package/src/domains/safety/action-classifier.ts +4 -2
  390. package/src/domains/safety/audit.ts +8 -2
  391. package/src/domains/safety/extension.ts +1 -1
  392. package/src/domains/session/compaction/branch-summary.ts +3 -2
  393. package/src/domains/session/compaction/cut-point.ts +2 -1
  394. package/src/domains/session/compaction/tokens.ts +2 -1
  395. package/src/domains/session/context-ledger.ts +14 -0
  396. package/src/domains/session/contract.ts +15 -0
  397. package/src/domains/session/decision-board.ts +190 -0
  398. package/src/domains/session/entries.ts +66 -3
  399. package/src/domains/session/extension.ts +93 -12
  400. package/src/domains/session/retry.ts +10 -18
  401. package/src/domains/session/session-artifacts.ts +107 -0
  402. package/src/domains/session/task-board.ts +207 -13
  403. package/src/domains/session/tree/active-path.ts +44 -5
  404. package/src/domains/session/tree/fork.ts +26 -27
  405. package/src/domains/session/tree/preview.ts +2 -2
  406. package/src/domains/session/workspace/git-probe.ts +17 -11
  407. package/src/domains/user-tasks/store.ts +297 -0
  408. package/src/engine/acp/errors.ts +96 -0
  409. package/src/engine/acp/server.ts +1728 -146
  410. package/src/engine/acp/transport.ts +135 -14
  411. package/src/engine/acp/types.ts +26 -0
  412. package/src/engine/agent.ts +3 -3
  413. package/src/engine/ai.ts +32 -27
  414. package/src/engine/alcf-oauth.ts +26 -19
  415. package/src/engine/api-registry.ts +223 -0
  416. package/src/engine/apis/index.ts +3 -7
  417. package/src/engine/apis/llamacpp-residency.ts +49 -9
  418. package/src/engine/apis/lmstudio-residency.ts +5 -21
  419. package/src/engine/apis/lmstudio.ts +243 -0
  420. package/src/engine/apis/ollama-native.ts +24 -3
  421. package/src/engine/apis/openai-completions.ts +170 -91
  422. package/src/engine/apis/residency.ts +139 -3
  423. package/src/engine/apis/types.ts +16 -0
  424. package/src/engine/env-api-keys.ts +98 -0
  425. package/src/engine/gemma-channel-filter.ts +223 -0
  426. package/src/engine/instrumented-tui.ts +192 -0
  427. package/src/engine/messages.ts +14 -0
  428. package/src/engine/models.ts +42 -0
  429. package/src/engine/oauth.ts +16 -12
  430. package/src/engine/prompt-templates.ts +1 -0
  431. package/src/engine/provider-payload.ts +16 -59
  432. package/src/engine/strip-tokenizer-sentinels.ts +1 -1
  433. package/src/engine/truncate.ts +9 -0
  434. package/src/engine/tui.ts +17 -9
  435. package/src/engine/types.ts +3 -6
  436. package/src/engine/worker-runtime-capabilities.ts +5 -0
  437. package/src/engine/worker-runtime.ts +1 -1
  438. package/src/engine/worker-tools.ts +9 -4
  439. package/src/entry/boot-options.ts +50 -0
  440. package/src/entry/orchestrator.ts +288 -150
  441. package/src/interactive/application-controller.ts +89 -2
  442. package/src/interactive/chat-loop.ts +266 -41
  443. package/src/interactive/chat-panel.ts +715 -278
  444. package/src/interactive/chat-renderer.ts +306 -85
  445. package/src/interactive/clio-editor.ts +3 -8
  446. package/src/interactive/command-fallbacks.ts +2 -2
  447. package/src/interactive/context-overlay.ts +27 -1
  448. package/src/interactive/editor-submit.ts +253 -24
  449. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  450. package/src/interactive/export-html/index.ts +51 -0
  451. package/src/interactive/export-html/template.ts +45 -0
  452. package/src/interactive/export-html/tool-renderer.ts +54 -0
  453. package/src/interactive/footer/dashboard.ts +4 -0
  454. package/src/interactive/footer/notifications.ts +1 -1
  455. package/src/interactive/footer/widgets.ts +42 -22
  456. package/src/interactive/footer-panel.ts +8 -3
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +203 -17
  459. package/src/interactive/interactive-event-projection.ts +18 -1
  460. package/src/interactive/interactive-input-runtime.ts +50 -4
  461. package/src/interactive/interactive-presentation.ts +151 -19
  462. package/src/interactive/interactive-shell.ts +268 -14
  463. package/src/interactive/interactive-slash-runtime.ts +184 -117
  464. package/src/interactive/interactive-tickers.ts +38 -7
  465. package/src/interactive/keybinding-manager.ts +1 -1
  466. package/src/interactive/layout.ts +40 -3
  467. package/src/interactive/overlay-frame.ts +1 -1
  468. package/src/interactive/overlay-general-openers.ts +58 -1
  469. package/src/interactive/overlay-key-routing.ts +3 -0
  470. package/src/interactive/overlay-lifecycle.ts +13 -0
  471. package/src/interactive/overlay-permission-lifecycle.ts +2 -1
  472. package/src/interactive/overlay-session-lifecycle.ts +69 -12
  473. package/src/interactive/overlays/ask-user.ts +146 -24
  474. package/src/interactive/overlays/decisions.ts +300 -0
  475. package/src/interactive/overlays/help-reference.ts +15 -10
  476. package/src/interactive/overlays/model-selector.ts +34 -16
  477. package/src/interactive/overlays/session-selector.ts +18 -0
  478. package/src/interactive/overlays/settings.ts +105 -17
  479. package/src/interactive/overlays/skills-hub.ts +4 -4
  480. package/src/interactive/overlays/tree-selector.ts +41 -6
  481. package/src/interactive/render-trace.ts +499 -90
  482. package/src/interactive/renderers/compaction-summary.ts +2 -2
  483. package/src/interactive/renderers/diff.ts +115 -104
  484. package/src/interactive/renderers/mermaid.ts +53 -0
  485. package/src/interactive/renderers/tool-execution.ts +516 -168
  486. package/src/interactive/renderers/worker-entry.ts +20 -4
  487. package/src/interactive/session-switch-settlement.ts +10 -0
  488. package/src/interactive/slash-autocomplete.ts +6 -114
  489. package/src/interactive/slash-commands.ts +135 -47
  490. package/src/interactive/slash-spec.ts +9 -38
  491. package/src/interactive/status/controller.ts +5 -1
  492. package/src/interactive/status/index.ts +12 -1
  493. package/src/interactive/status/reasoning.ts +87 -0
  494. package/src/interactive/status/summary.ts +13 -2
  495. package/src/interactive/stdout-backpressure.ts +99 -0
  496. package/src/interactive/stream-pacer.ts +530 -0
  497. package/src/interactive/stream-pacing-policy.ts +66 -0
  498. package/src/interactive/tasks-overlay.ts +368 -14
  499. package/src/interactive/terminal-lease.ts +485 -0
  500. package/src/interactive/theme/tokens.ts +1 -1
  501. package/src/interactive/transcript-detail.ts +120 -0
  502. package/src/interactive/turn-context.ts +4 -3
  503. package/src/interactive/turn-persistence.ts +30 -13
  504. package/src/interactive/turn-queues.ts +12 -0
  505. package/src/interactive/turn-recovery.ts +25 -8
  506. package/src/interactive/turn-runtime.ts +79 -12
  507. package/src/interactive/turn-state.ts +10 -0
  508. package/src/interactive/view/artifacts.ts +114 -4
  509. package/src/interactive/view/view-overlay.ts +3 -0
  510. package/src/interactive/welcome-dashboard.ts +17 -16
  511. package/src/interactive/worker-receipts.ts +52 -3
  512. package/src/interactive/worker-stream.ts +5 -1
  513. package/src/tools/agent-tools.ts +23 -3
  514. package/src/tools/artifact.ts +2 -2
  515. package/src/tools/ask-user.ts +23 -13
  516. package/src/tools/bash.ts +30 -2
  517. package/src/tools/bootstrap.ts +34 -431
  518. package/src/tools/builtin-tool-catalog.ts +271 -0
  519. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  520. package/src/tools/codewiki/code-nav.ts +8 -22
  521. package/src/tools/codewiki/shared.ts +41 -38
  522. package/src/tools/context/docs-engine.ts +14 -3
  523. package/src/tools/context/index.ts +107 -28
  524. package/src/tools/context/surface.ts +19 -0
  525. package/src/tools/core-bootstrap.ts +168 -0
  526. package/src/tools/credential-present.ts +5 -5
  527. package/src/tools/dispatch-admission.ts +533 -0
  528. package/src/tools/dispatch-background.ts +54 -0
  529. package/src/tools/dispatch-event-text.ts +6 -0
  530. package/src/tools/dispatch-plan.ts +9 -4
  531. package/src/tools/dispatch-run-events.ts +238 -0
  532. package/src/tools/dispatch-runner.ts +2370 -0
  533. package/src/tools/dispatch-scout-admission.ts +295 -0
  534. package/src/tools/dispatch-types.ts +77 -0
  535. package/src/tools/dispatch.ts +67 -3161
  536. package/src/tools/find.ts +4 -2
  537. package/src/tools/grep.ts +2 -2
  538. package/src/tools/lazy-tool.ts +60 -0
  539. package/src/tools/ledger.ts +3 -3
  540. package/src/tools/monitor-surface.ts +36 -0
  541. package/src/tools/monitor.ts +2 -32
  542. package/src/tools/observers.ts +2 -2
  543. package/src/tools/presentation.ts +107 -0
  544. package/src/tools/registry.ts +45 -27
  545. package/src/tools/safe-exec.ts +2 -2
  546. package/src/tools/steer-surface.ts +17 -0
  547. package/src/tools/steer.ts +2 -13
  548. package/src/tools/tasks.ts +108 -11
  549. package/src/tools/truncate.ts +25 -184
  550. package/src/tools/verify/frontend.ts +3 -1
  551. package/src/tools/verify/index.ts +3 -38
  552. package/src/tools/verify/surface.ts +46 -0
  553. package/src/tools/web-fetch-surface.ts +23 -0
  554. package/src/tools/web-fetch.ts +2 -20
  555. package/src/tools/write.ts +7 -2
  556. package/src/worker/entry.ts +39 -2
  557. package/src/worker/spec-contract.ts +26 -5
  558. package/dist/chunk-7SS2CTV2.js +0 -61361
  559. package/dist/chunk-DKGKUHFA.js +0 -924
  560. package/dist/chunk-GEP36Y4X.js +0 -12796
  561. package/dist/chunk-XYWBQRDM.js +0 -137
  562. package/dist/clio-BZVGEUFJ.js +0 -58
  563. package/dist/configure-S7S6F6CL.js +0 -32
  564. package/docs/html/agents_blueprint.html +0 -936
  565. package/docs/html/alcf_blueprint.html +0 -324
  566. package/docs/html/architecture_blueprint.html +0 -850
  567. package/docs/html/commands_blueprint.html +0 -939
  568. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  569. package/docs/html/configuration_blueprint.html +0 -1080
  570. package/docs/html/context_blueprint.html +0 -603
  571. package/docs/html/documentation_blueprint.html +0 -832
  572. package/docs/html/environment_blueprint.html +0 -404
  573. package/docs/html/eval_blueprint.html +0 -743
  574. package/docs/html/evals_internal_blueprint.html +0 -190
  575. package/docs/html/evolution_blueprint.html +0 -674
  576. package/docs/html/extensions_blueprint.html +0 -2065
  577. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  578. package/docs/html/index.html +0 -919
  579. package/docs/html/lifecycle_blueprint.html +0 -723
  580. package/docs/html/memory_blueprint.html +0 -699
  581. package/docs/html/middleware_blueprint.html +0 -664
  582. package/docs/html/models_blueprint.html +0 -2366
  583. package/docs/html/observability_blueprint.html +0 -683
  584. package/docs/html/provider_adapter_blueprint.html +0 -245
  585. package/docs/html/safety_blueprint.html +0 -1386
  586. package/docs/html/shared.css +0 -571
  587. package/docs/html/shared.js +0 -143
  588. package/docs/html/skills_blueprint.html +0 -671
  589. package/docs/html/soak_blueprint.html +0 -182
  590. package/docs/html/tool_usage_blueprint.html +0 -350
  591. package/docs/html/tools_blueprint.html +0 -2249
  592. package/docs/html/trace_blueprint.html +0 -235
  593. package/docs/html/tui_design_blueprint.html +0 -374
  594. package/docs/html/validation_blueprint.html +0 -961
  595. package/docs/html/worker_dispatch_blueprint.html +0 -231
  596. package/src/core/release.ts +0 -2
  597. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  598. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  599. package/src/engine/apis/lmstudio-native.ts +0 -1438
  600. package/src/engine/apis/thinking-replay.ts +0 -11
  601. package/src/tools/string-enum.ts +0 -15
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Render-transaction hooks around pi-tui's two concrete renderers.
3
+ *
4
+ * pi-tui deliberately exposes `doRender`, overlay composition, and line
5
+ * normalization as protected seams. Clio uses those seams instead of
6
+ * inferring frames from terminal writes: one `doRender()` is one frame, while
7
+ * any number of terminal writes (including the regular renderer's IME cursor
8
+ * write) can belong to that frame.
9
+ */
10
+
11
+ import { type Terminal, TuiAltScreen, type TuiAltScreenOptions, TuiMainScreen } from "@earendil-works/pi-tui";
12
+
13
+ export type TuiRenderPhase = "overlay" | "normalization" | "cursor";
14
+
15
+ export interface TuiRenderObserver {
16
+ /** Optional fast-path used after a one-shot observer has delivered its frame. */
17
+ isEnabled?(): boolean;
18
+ beginFrame(fields: { mode: "regular" | "fullscreen"; columns: number; rows: number }): unknown;
19
+ endFrame(frame: unknown): void;
20
+ beginPhase(frame: unknown, phase: TuiRenderPhase): unknown;
21
+ endPhase(frame: unknown, phase: TuiRenderPhase, phaseToken: unknown): void;
22
+ }
23
+
24
+ export interface TuiRenderAdmission {
25
+ readonly blocked: boolean;
26
+ onWritable(listener: () => void): () => void;
27
+ }
28
+
29
+ class DeferredRenderAdmission {
30
+ private pending = false;
31
+ private force = false;
32
+ private release: (() => void) | null = null;
33
+
34
+ constructor(
35
+ private readonly admission: TuiRenderAdmission | undefined,
36
+ private readonly render: (force: boolean) => void,
37
+ ) {}
38
+
39
+ request(force: boolean): boolean {
40
+ if (!this.admission?.blocked) return false;
41
+ this.pending = true;
42
+ this.force ||= force;
43
+ this.release ??= this.admission.onWritable(() => {
44
+ this.release?.();
45
+ this.release = null;
46
+ if (!this.pending) return;
47
+ const pendingForce = this.force;
48
+ this.pending = false;
49
+ this.force = false;
50
+ this.render(pendingForce);
51
+ });
52
+ return true;
53
+ }
54
+
55
+ /** A direct/final render supersedes any older request held behind the gate. */
56
+ settled(): void {
57
+ this.pending = false;
58
+ this.force = false;
59
+ this.release?.();
60
+ this.release = null;
61
+ }
62
+ }
63
+
64
+ export class InstrumentedTuiMainScreen extends TuiMainScreen {
65
+ constructor(
66
+ terminal: Terminal,
67
+ private readonly renderObserver: TuiRenderObserver,
68
+ showHardwareCursor?: boolean,
69
+ logDirectory?: string,
70
+ renderAdmission?: TuiRenderAdmission,
71
+ ) {
72
+ super(terminal, showHardwareCursor, logDirectory);
73
+ this.deferredAdmission = new DeferredRenderAdmission(renderAdmission, (force) => super.requestRender(force));
74
+ }
75
+
76
+ override requestRender(force = false): void {
77
+ if (!this.deferredAdmission.request(force)) super.requestRender(force);
78
+ }
79
+
80
+ protected override doRender(): void {
81
+ this.deferredAdmission.settled();
82
+ if (this.renderObserver.isEnabled?.() === false) {
83
+ super.doRender();
84
+ return;
85
+ }
86
+ const frame = this.renderObserver.beginFrame({
87
+ mode: this.mode,
88
+ columns: this.terminal.columns,
89
+ rows: this.terminal.rows,
90
+ });
91
+ this.currentFrame = frame;
92
+ try {
93
+ super.doRender();
94
+ } finally {
95
+ this.currentFrame = undefined;
96
+ this.renderObserver.endFrame(frame);
97
+ }
98
+ }
99
+
100
+ protected override compositeOverlays(lines: string[], termWidth: number, termHeight: number): string[] {
101
+ return this.measure("overlay", () => super.compositeOverlays(lines, termWidth, termHeight));
102
+ }
103
+
104
+ protected override applyLineResets(lines: string[]): string[] {
105
+ return this.measure("normalization", () => super.applyLineResets(lines));
106
+ }
107
+
108
+ protected override extractCursorPosition(lines: string[], height: number): { row: number; col: number } | null {
109
+ return this.measure("cursor", () => super.extractCursorPosition(lines, height));
110
+ }
111
+
112
+ private measure<T>(phase: TuiRenderPhase, operation: () => T): T {
113
+ if (this.renderObserver.isEnabled?.() === false) return operation();
114
+ const frame = this.currentFrame;
115
+ if (frame === undefined) return operation();
116
+ const phaseToken = this.renderObserver.beginPhase(frame, phase);
117
+ try {
118
+ return operation();
119
+ } finally {
120
+ this.renderObserver.endPhase(frame, phase, phaseToken);
121
+ }
122
+ }
123
+
124
+ private currentFrame: unknown | undefined;
125
+ private readonly deferredAdmission: DeferredRenderAdmission;
126
+ }
127
+
128
+ export class InstrumentedTuiAltScreen extends TuiAltScreen {
129
+ private currentFrame: unknown | undefined;
130
+
131
+ constructor(
132
+ terminal: Terminal,
133
+ private readonly renderObserver: TuiRenderObserver,
134
+ showHardwareCursor?: boolean,
135
+ logDirectory?: string,
136
+ options?: TuiAltScreenOptions,
137
+ renderAdmission?: TuiRenderAdmission,
138
+ ) {
139
+ super(terminal, showHardwareCursor, logDirectory, options);
140
+ this.deferredAdmission = new DeferredRenderAdmission(renderAdmission, (force) => super.requestRender(force));
141
+ }
142
+
143
+ override requestRender(force = false): void {
144
+ if (!this.deferredAdmission.request(force)) super.requestRender(force);
145
+ }
146
+
147
+ protected override doRender(): void {
148
+ this.deferredAdmission.settled();
149
+ if (this.renderObserver.isEnabled?.() === false) {
150
+ super.doRender();
151
+ return;
152
+ }
153
+ const frame = this.renderObserver.beginFrame({
154
+ mode: this.mode,
155
+ columns: this.terminal.columns,
156
+ rows: this.terminal.rows,
157
+ });
158
+ this.currentFrame = frame;
159
+ try {
160
+ super.doRender();
161
+ } finally {
162
+ this.currentFrame = undefined;
163
+ this.renderObserver.endFrame(frame);
164
+ }
165
+ }
166
+
167
+ protected override compositeOverlays(lines: string[], termWidth: number, termHeight: number): string[] {
168
+ return this.measure("overlay", () => super.compositeOverlays(lines, termWidth, termHeight));
169
+ }
170
+
171
+ protected override applyLineResets(lines: string[]): string[] {
172
+ return this.measure("normalization", () => super.applyLineResets(lines));
173
+ }
174
+
175
+ protected override extractCursorPosition(lines: string[], height: number): { row: number; col: number } | null {
176
+ return this.measure("cursor", () => super.extractCursorPosition(lines, height));
177
+ }
178
+
179
+ private measure<T>(phase: TuiRenderPhase, operation: () => T): T {
180
+ if (this.renderObserver.isEnabled?.() === false) return operation();
181
+ const frame = this.currentFrame;
182
+ if (frame === undefined) return operation();
183
+ const phaseToken = this.renderObserver.beginPhase(frame, phase);
184
+ try {
185
+ return operation();
186
+ } finally {
187
+ this.renderObserver.endPhase(frame, phase, phaseToken);
188
+ }
189
+ }
190
+
191
+ private readonly deferredAdmission: DeferredRenderAdmission;
192
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * pi-agent-core owns the text that custom agent messages (bash executions,
3
+ * branch and compaction summaries) become when they are replayed to a model.
4
+ * Clio's replay builder maps its own session entries onto these so the
5
+ * wording never drifts from pi's `convertToLlm`.
6
+ */
7
+ export {
8
+ type BashExecutionMessage,
9
+ BRANCH_SUMMARY_PREFIX,
10
+ BRANCH_SUMMARY_SUFFIX,
11
+ bashExecutionToText,
12
+ COMPACTION_SUMMARY_PREFIX,
13
+ COMPACTION_SUMMARY_SUFFIX,
14
+ } from "@earendil-works/pi-agent-core";
@@ -0,0 +1,42 @@
1
+ import { type Api, createModels, type KnownProvider, type Model } from "@earendil-works/pi-ai";
2
+ import { amazonBedrockProvider } from "@earendil-works/pi-ai/providers/amazon-bedrock";
3
+ import { anthropicProvider } from "@earendil-works/pi-ai/providers/anthropic";
4
+ import { deepseekProvider } from "@earendil-works/pi-ai/providers/deepseek";
5
+ import { googleProvider } from "@earendil-works/pi-ai/providers/google";
6
+ import { groqProvider } from "@earendil-works/pi-ai/providers/groq";
7
+ import { mistralProvider } from "@earendil-works/pi-ai/providers/mistral";
8
+ import { openaiProvider } from "@earendil-works/pi-ai/providers/openai";
9
+ import { openaiCodexProvider } from "@earendil-works/pi-ai/providers/openai-codex";
10
+ import { openrouterProvider } from "@earendil-works/pi-ai/providers/openrouter";
11
+
12
+ /**
13
+ * Pi providers backing Clio's built-in runtime descriptors. Keep this list in
14
+ * lockstep with CATALOG_PROVIDER_BY_RUNTIME_ID; out-of-tree runtimes join the
15
+ * external compatibility universe before their modules evaluate.
16
+ */
17
+ const CONFIGURED_PROVIDER_FACTORIES = [
18
+ amazonBedrockProvider,
19
+ anthropicProvider,
20
+ deepseekProvider,
21
+ googleProvider,
22
+ groqProvider,
23
+ mistralProvider,
24
+ openaiProvider,
25
+ openaiCodexProvider,
26
+ openrouterProvider,
27
+ ] as const;
28
+
29
+ export const engineModels = createModels();
30
+ for (const factory of CONFIGURED_PROVIDER_FACTORIES) engineModels.setProvider(factory());
31
+
32
+ export function engineModelProviders(): KnownProvider[] {
33
+ return engineModels.getProviders().map((provider) => provider.id as KnownProvider);
34
+ }
35
+
36
+ export function engineModelsFor(provider: KnownProvider): Model<Api>[] {
37
+ return [...engineModels.getModels(provider)];
38
+ }
39
+
40
+ export function getEngineModel(provider: KnownProvider, modelId: string): Model<Api> | undefined {
41
+ return engineModels.getModel(provider, modelId);
42
+ }
@@ -11,17 +11,20 @@
11
11
  */
12
12
 
13
13
  import type {
14
- AuthInteraction,
15
14
  OAuthAuth,
16
15
  OAuthCredentials,
17
16
  OAuthLoginCallbacks,
18
17
  OAuthSelectPrompt,
18
+ ProviderAuthInteraction,
19
19
  } from "@earendil-works/pi-ai";
20
- import { findEnvKeys as piFindEnvKeys, getEnvApiKey as piGetEnvApiKey } from "@earendil-works/pi-ai/compat";
21
20
  import { anthropicProvider } from "@earendil-works/pi-ai/providers/anthropic";
22
21
  import { githubCopilotProvider } from "@earendil-works/pi-ai/providers/github-copilot";
23
22
  import { openaiCodexProvider } from "@earendil-works/pi-ai/providers/openai-codex";
24
23
  import { alcfOAuthProvider } from "./alcf-oauth.js";
24
+ import {
25
+ findEngineEnvKeys as findEngineEnvKeysRaw,
26
+ getEngineEnvApiKey as getEngineEnvApiKeyRaw,
27
+ } from "./env-api-keys.js";
25
28
 
26
29
  export type { OAuthCredentials, OAuthLoginCallbacks, OAuthSelectPrompt };
27
30
 
@@ -35,13 +38,14 @@ export interface EngineOAuthProvider {
35
38
  name: string;
36
39
  usesCallbackServer: boolean;
37
40
  login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
38
- refreshToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;
41
+ refreshToken(credentials: OAuthCredentials, signal: AbortSignal): Promise<OAuthCredentials>;
39
42
  getApiKey(credentials: OAuthCredentials): Promise<string>;
40
43
  }
41
44
 
42
45
  /** Adapt Clio's legacy login callbacks to pi's AuthInteraction. */
43
- function interactionFromLoginCallbacks(callbacks: OAuthLoginCallbacks): AuthInteraction {
44
- const interaction: AuthInteraction = {
46
+ function interactionFromLoginCallbacks(callbacks: OAuthLoginCallbacks): ProviderAuthInteraction {
47
+ const interaction: ProviderAuthInteraction = {
48
+ signal: callbacks.signal ?? new AbortController().signal,
45
49
  notify(event) {
46
50
  switch (event.type) {
47
51
  case "auth_url":
@@ -88,12 +92,11 @@ function interactionFromLoginCallbacks(callbacks: OAuthLoginCallbacks): AuthInte
88
92
  }
89
93
  },
90
94
  };
91
- if (callbacks.signal) interaction.signal = callbacks.signal;
92
95
  return interaction;
93
96
  }
94
97
 
95
98
  function fromOAuthAuth(id: string, auth: OAuthAuth | undefined, usesCallbackServer: boolean): EngineOAuthProvider {
96
- if (!auth) throw new Error(`pi-ai provider "${id}" no longer exposes an OAuth flow`);
99
+ if (!auth) throw new Error(`provider "${id}" does not expose an OAuth flow`);
97
100
  return {
98
101
  id,
99
102
  name: auth.name,
@@ -101,8 +104,8 @@ function fromOAuthAuth(id: string, auth: OAuthAuth | undefined, usesCallbackServ
101
104
  async login(callbacks) {
102
105
  return auth.login(interactionFromLoginCallbacks(callbacks));
103
106
  },
104
- async refreshToken(credentials) {
105
- return auth.refresh({ ...credentials, type: "oauth" });
107
+ async refreshToken(credentials, signal) {
108
+ return auth.refresh({ ...credentials, type: "oauth" }, signal);
106
109
  },
107
110
  async getApiKey(credentials) {
108
111
  const resolved = await auth.toAuth({ ...credentials, type: "oauth" });
@@ -133,7 +136,7 @@ function registry(): Map<string, EngineOAuthProvider> {
133
136
 
134
137
  export function getEngineEnvApiKey(providerId: string): string | undefined {
135
138
  try {
136
- return piGetEnvApiKey(providerId);
139
+ return getEngineEnvApiKeyRaw(providerId);
137
140
  } catch {
138
141
  return undefined;
139
142
  }
@@ -141,7 +144,7 @@ export function getEngineEnvApiKey(providerId: string): string | undefined {
141
144
 
142
145
  export function findEngineEnvKeys(providerId: string): string[] | undefined {
143
146
  try {
144
- return piFindEnvKeys(providerId);
147
+ return findEngineEnvKeysRaw(providerId);
145
148
  } catch {
146
149
  return undefined;
147
150
  }
@@ -179,10 +182,11 @@ export async function loginWithEngineOAuthProvider(
179
182
  export async function refreshEngineOAuthCredentials(
180
183
  providerId: string,
181
184
  credentials: OAuthCredentials,
185
+ signal: AbortSignal,
182
186
  ): Promise<OAuthCredentials> {
183
187
  const provider = registry().get(providerId);
184
188
  if (!provider) throw new Error(`unknown OAuth provider: ${providerId}`);
185
- return provider.refreshToken(credentials);
189
+ return provider.refreshToken(credentials, signal);
186
190
  }
187
191
 
188
192
  export async function getEngineOAuthApiKey(providerId: string, credentials: OAuthCredentials): Promise<string> {
@@ -0,0 +1 @@
1
+ export { parseCommandArgs, substituteArgs } from "@earendil-works/pi-agent-core";
@@ -1,10 +1,5 @@
1
1
  import { RESPONSE_SCHEMA_RUNTIME_ID } from "../core/response-schema.js";
2
2
  import type { ThinkingLevel } from "../domains/providers/index.js";
3
- import {
4
- defaultAnthropicBudgetForLevel,
5
- defaultAnthropicEffortForLevel,
6
- type ThinkingEffortByLevel,
7
- } from "../domains/providers/thinking-control-policy.js";
8
3
  import type { EngineModel } from "./types.js";
9
4
 
10
5
  function reasoningSummaryForLevel(level: ThinkingLevel | undefined): "concise" | "detailed" | undefined {
@@ -17,6 +12,10 @@ function isOpenAIResponsesApi(api: string): boolean {
17
12
  return api === "openai-codex-responses" || api === "openai-responses" || api === "azure-openai-responses";
18
13
  }
19
14
 
15
+ function isAnthropicMessagesApi(api: string): boolean {
16
+ return api === "anthropic-messages";
17
+ }
18
+
20
19
  function isRecord(value: unknown): value is Record<string, unknown> {
21
20
  return typeof value === "object" && value !== null && !Array.isArray(value);
22
21
  }
@@ -45,10 +44,6 @@ function namedToolDefinitions(tools: unknown, toolName: string): unknown[] | nul
45
44
  return narrowed.length > 0 ? narrowed : null;
46
45
  }
47
46
 
48
- function numberValue(value: unknown): number | undefined {
49
- return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : undefined;
50
- }
51
-
52
47
  function patchOpenAIReasoningSummaryPayload(
53
48
  payload: unknown,
54
49
  model: EngineModel,
@@ -69,65 +64,22 @@ function patchOpenAIReasoningSummaryPayload(
69
64
  };
70
65
  }
71
66
 
72
- function isAnthropicMessagesApi(api: string): boolean {
73
- return api === "anthropic-messages";
74
- }
75
-
76
- function anthropicThinkingLevelMap(model: EngineModel): ThinkingEffortByLevel | undefined {
77
- return model.thinkingLevelMap as ThinkingEffortByLevel | undefined;
78
- }
79
-
80
- function anthropicUsesAdaptiveThinking(model: EngineModel): boolean {
81
- const compat = model.compat as { forceAdaptiveThinking?: boolean } | undefined;
82
- return compat?.forceAdaptiveThinking === true;
83
- }
84
-
85
- function patchAnthropicThinkingPayload(
86
- payload: unknown,
87
- model: EngineModel,
88
- thinkingLevel: ThinkingLevel | undefined,
89
- ): unknown | undefined {
90
- if (!isAnthropicMessagesApi(model.api) || model.reasoning !== true) return undefined;
91
- if (!thinkingLevel || thinkingLevel === "off" || !isRecord(payload)) return undefined;
92
- const record = payload;
93
- const existingThinking = isRecord(record.thinking) ? record.thinking : {};
94
- const display = typeof existingThinking.display === "string" ? existingThinking.display : "summarized";
95
-
96
- if (anthropicUsesAdaptiveThinking(model)) {
97
- const effort = defaultAnthropicEffortForLevel(thinkingLevel, anthropicThinkingLevelMap(model));
98
- const existingOutputConfig = isRecord(record.output_config) ? record.output_config : {};
99
- return {
100
- ...record,
101
- thinking: { ...existingThinking, type: "adaptive", display },
102
- ...(effort ? { output_config: { ...existingOutputConfig, effort } } : {}),
103
- };
104
- }
105
-
106
- const maxTokens = numberValue(record.max_tokens) ?? model.maxTokens;
107
- const budgetTokens = defaultAnthropicBudgetForLevel(thinkingLevel, maxTokens);
108
- if (budgetTokens === undefined) return undefined;
109
- return {
110
- ...record,
111
- thinking: { ...existingThinking, type: "enabled", budget_tokens: budgetTokens, display },
112
- };
113
- }
114
-
115
67
  /**
116
68
  * Align provider payloads with Clio's effective thinking level.
117
69
  *
118
70
  * OpenAI Responses defaults reasoning summaries to "auto", which can yield no
119
- * visible thinking blocks. Anthropic's generic stream path can also under-map
120
- * Clio levels when xhigh/adaptive metadata is available only on the model.
71
+ * visible thinking blocks, and the agent loop has no option for the summary
72
+ * field, so it is set here. Anthropic thinking is pi-owned: pi-ai's
73
+ * `streamSimple` maps the agent's thinking level onto adaptive effort (via
74
+ * `model.thinkingLevelMap` and `compat.forceAdaptiveThinking`) or a bounded
75
+ * `budget_tokens`, so the payload is left untouched for that API.
121
76
  */
122
77
  export function patchProviderThinkingPayload(
123
78
  payload: unknown,
124
79
  model: EngineModel,
125
80
  thinkingLevel: ThinkingLevel | undefined,
126
81
  ): unknown | undefined {
127
- return (
128
- patchOpenAIReasoningSummaryPayload(payload, model, thinkingLevel) ??
129
- patchAnthropicThinkingPayload(payload, model, thinkingLevel)
130
- );
82
+ return patchOpenAIReasoningSummaryPayload(payload, model, thinkingLevel);
131
83
  }
132
84
 
133
85
  /**
@@ -234,7 +186,12 @@ export function patchToolChoiceNamedPayload(
234
186
  if (model.api === "mistral-conversations") {
235
187
  return { ...payload, tools, toolChoice: { type: "function", function: { name: toolName } } };
236
188
  }
237
- return { ...payload, tools, tool_choice: { type: "function", function: { name: toolName } } };
189
+ // Generic OpenAI-compatible servers reject the object form outright: both LM
190
+ // Studio and llama.cpp answer HTTP 400 with "Invalid tool_choice type:
191
+ // 'object'. Supported string values: none, auto, required". The tool surface
192
+ // is already narrowed to the single named definition above, so "required" is
193
+ // equivalent here and is the only spelling every server accepts.
194
+ return { ...payload, tools, tool_choice: "required" };
238
195
  }
239
196
 
240
197
  /** Attach llama-server's native JSON-schema response constraint without changing its tool surface. */
@@ -83,7 +83,7 @@ function isSentinelPrefix(tail: string): boolean {
83
83
  * at that point cannot be a sentinel and is emitted verbatim minus any
84
84
  * complete sentinels still embedded in it.
85
85
  */
86
- export interface SentinelStripper {
86
+ interface SentinelStripper {
87
87
  /** Sanitize the next streamed chunk, returning the safe-to-emit prefix. */
88
88
  push(chunk: string): string;
89
89
  /** Drain the trailing buffer at end-of-stream. */
@@ -0,0 +1,9 @@
1
+ export {
2
+ formatSize,
3
+ GREP_MAX_LINE_LENGTH,
4
+ type TruncationOptions,
5
+ type TruncationResult,
6
+ truncateHead,
7
+ truncateLine,
8
+ truncateTail,
9
+ } from "@earendil-works/pi-agent-core";
package/src/engine/tui.ts CHANGED
@@ -9,24 +9,25 @@ export type {
9
9
  AutocompleteProvider,
10
10
  AutocompleteSuggestions,
11
11
  Component,
12
- EditorOptions,
13
12
  EditorTheme,
14
- ImageTheme,
15
13
  Keybinding,
16
14
  KeybindingConflict,
17
15
  KeybindingDefinitions,
18
- Keybindings,
19
16
  KeybindingsConfig,
20
17
  KeyId,
21
18
  MarkdownTheme,
22
19
  OverlayHandle,
23
20
  OverlayOptions,
21
+ ScrollViewScrollbar,
24
22
  SelectItem,
25
23
  SelectListLayoutOptions,
26
24
  SettingItem,
27
25
  SettingsListTheme,
28
26
  SlashCommand,
29
27
  Terminal,
28
+ Tokens,
29
+ TUI,
30
+ TuiMode,
30
31
  } from "@earendil-works/pi-tui";
31
32
 
32
33
  /**
@@ -35,7 +36,7 @@ export type {
35
36
  * module; consumers accept this narrower shape so the helper is unit-testable
36
37
  * without a real ProcessTerminal.
37
38
  */
38
- export interface AgentProgressSink {
39
+ interface AgentProgressSink {
39
40
  setProgress(active: boolean): void;
40
41
  }
41
42
 
@@ -75,25 +76,32 @@ export {
75
76
  Container,
76
77
  Editor,
77
78
  fuzzyFilter,
78
- fuzzyMatch,
79
- getCapabilities,
80
79
  getKeybindings,
81
- Image,
82
80
  Input,
83
81
  isKeyRelease,
84
82
  KeybindingsManager,
85
- Loader,
86
83
  Markdown,
84
+ Marked,
87
85
  matchesKey,
88
86
  ProcessTerminal,
87
+ ScrollView,
89
88
  setKeybindings,
89
+ stripTerminalSequences,
90
90
  Text,
91
- TUI,
92
91
  TUI_KEYBINDINGS,
92
+ TuiAltScreen,
93
+ TuiMainScreen,
93
94
  truncateToWidth,
95
+ VStack,
94
96
  visibleWidth,
95
97
  wrapTextWithAnsi,
96
98
  } from "@earendil-works/pi-tui";
99
+ export {
100
+ InstrumentedTuiAltScreen,
101
+ InstrumentedTuiMainScreen,
102
+ type TuiRenderObserver,
103
+ type TuiRenderPhase,
104
+ } from "./instrumented-tui.js";
97
105
  export type { SelectListTheme } from "./select-list.js";
98
106
  /**
99
107
  * SelectList ships from the engine as a thin subclass that honors a design
@@ -9,13 +9,10 @@
9
9
  export type {
10
10
  AgentEvent,
11
11
  AgentMessage,
12
- AgentOptions,
13
- AgentState,
14
12
  AgentTool,
15
13
  AgentToolResult,
16
- StreamFn,
14
+ AgentToolUpdateCallback,
17
15
  } from "@earendil-works/pi-agent-core";
18
- export { Agent } from "@earendil-works/pi-agent-core";
19
16
 
20
17
  import type { AgentState as PiAgentState } from "@earendil-works/pi-agent-core";
21
18
 
@@ -36,6 +33,7 @@ export type MutableAgentState = Omit<PiAgentState, "errorMessage"> & {
36
33
  export type {
37
34
  AnthropicMessagesCompat,
38
35
  Api,
36
+ AuthOperationOptions,
39
37
  ImageContent,
40
38
  KnownProvider,
41
39
  Model,
@@ -53,14 +51,13 @@ import type { Api as PiApi, Model as PiModel } from "@earendil-works/pi-ai";
53
51
  */
54
52
  export type EngineModel = PiModel<PiApi>;
55
53
  export type {
56
- EditorOptions,
57
54
  EditorTheme,
58
55
  SelectItem,
59
56
  SelectListLayoutOptions,
60
57
  SettingItem,
61
58
  SettingsListTheme,
59
+ TUI,
62
60
  } from "@earendil-works/pi-tui";
63
- export { TUI } from "@earendil-works/pi-tui";
64
61
  // SelectListTheme carries the Clio design cursor as an engine augmentation; see
65
62
  // ./select-list.ts. Re-export the augmented type so every engine surface agrees.
66
63
  export type { SelectListTheme } from "./select-list.js";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Native worker registries expose no nested Clio dispatch contract. This is a
3
+ * compile-time runtime capability, not a setting.
4
+ */
5
+ export const WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH = false;
@@ -377,7 +377,7 @@ export function startWorkerRun(input: WorkerRunInput, emit: WorkerEventEmit): Wo
377
377
  // pi-ai is process-local. The orchestrator registers Clio API providers in
378
378
  // providers/extension.ts, but the worker subprocess starts a fresh process,
379
379
  // so it must register them here before any agent.prompt() touches a local
380
- // runtime (lmstudio-native, ollama-native).
380
+ // runtime (lmstudio, ollama-native).
381
381
  registerClioApiProviders();
382
382
  // The worker is a fresh process; mirror the orchestrator's global output
383
383
  // budget so dispatched runs honor settings.defaults.maxTokens too. Use the
@@ -28,11 +28,13 @@ import {
28
28
  } from "../domains/safety/protected-artifacts.js";
29
29
  import { CONFIRMED_SCOPE, isSubset, READONLY_SCOPE, WORKSPACE_SCOPE } from "../domains/safety/scope.js";
30
30
  import { effectiveToolNames } from "../tools/agent-tools.js";
31
- import { registerAllTools } from "../tools/bootstrap.js";
31
+ import { assertRegisteredBuiltinTools, registerCoreTools } from "../tools/core-bootstrap.js";
32
32
  import type { ToolProfileName } from "../tools/profiles.js";
33
33
  import { createRegistry, type RegistryDeps, type ToolRegistry } from "../tools/registry.js";
34
34
  import { type AgentLedgerPort, toolSignatureOf } from "../worker/protocol.js";
35
35
 
36
+ export { WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH } from "./worker-runtime-capabilities.js";
37
+
36
38
  /**
37
39
  * Build a worker-local SafetyContract that owns its own loop-detector state.
38
40
  * The state is per-worker-run (one subprocess per run) so two concurrent
@@ -154,8 +156,12 @@ export function createWorkerToolRegistry(
154
156
  // names a bare registry produces, so a conditional registration would drift
155
157
  // the signature and fail admission; only the injected port varies, and a run
156
158
  // without one answers that it has no coordination ledger.
157
- registerAllTools(registry, {
159
+ const registration = registerCoreTools(registry, {
158
160
  ...(agentLedger ? { agentLedger } : {}),
161
+ // A worker cannot install a skill or reach the operator who could, so
162
+ // its skill listing carries installed (or bound) skills only; the
163
+ // marketplace is the orchestrator's to offer.
164
+ skillMarketplace: false,
159
165
  getSkillLoaderOptions: () => ({
160
166
  trustProjectCompatRoots: skillLoaderOptions?.trustProjectCompatRoots === true,
161
167
  disableDiscovery: skillLoaderOptions?.noSkills === true,
@@ -164,6 +170,7 @@ export function createWorkerToolRegistry(
164
170
  : {}),
165
171
  }),
166
172
  });
173
+ assertRegisteredBuiltinTools(registry, registration, false);
167
174
  return registry;
168
175
  }
169
176
 
@@ -172,8 +179,6 @@ export function createWorkerToolRegistry(
172
179
  * mediates nested Clio dispatch. A constant, not a lookup: there is nothing to
173
180
  * vary by runtime, and a parameter would imply otherwise.
174
181
  */
175
- export const WORKER_RUNTIME_MEDIATES_CLIO_DISPATCH = false;
176
-
177
182
  export interface AttestedToolIdentityInput {
178
183
  allowedTools: ReadonlyArray<ToolName>;
179
184
  /** False when the resolved runtime mediates no tool calls at all. */