@iowarp/clio-coder 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/CHANGELOG.md +90 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.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-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/chunk-2VTFPG5O.js +48 -0
  12. package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4KLWL3UC.js +18 -0
  16. package/dist/chunk-4VP4KH3K.js +962 -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-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  21. package/dist/chunk-65DEGPJ6.js +52 -0
  22. package/dist/chunk-6EJMN2Y3.js +17 -0
  23. package/dist/chunk-6EJV5X2W.js +16405 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6XLNIQDB.js +27 -0
  26. package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
  29. package/dist/chunk-7MNJORFF.js +22 -0
  30. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  31. package/dist/chunk-AGYYIBLL.js +1069 -0
  32. package/dist/chunk-AO4RKG4M.js +277 -0
  33. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  34. package/dist/chunk-ARBGF5F7.js +174 -0
  35. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  36. package/dist/chunk-CBCAPZAA.js +229 -0
  37. package/dist/chunk-CMZWFGD2.js +352 -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-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
  42. package/dist/chunk-FCSXB6T2.js +338 -0
  43. package/dist/chunk-FJ3H4MN5.js +48 -0
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G2DE3C7R.js +644 -0
  46. package/dist/chunk-G4BMMOKF.js +182 -0
  47. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  48. package/dist/chunk-HC4CLZ2Y.js +68 -0
  49. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  50. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  51. package/dist/chunk-I4HZDVNP.js +73 -0
  52. package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
  53. package/dist/chunk-IKCO5N3L.js +162 -0
  54. package/dist/chunk-IR4CFBFN.js +56 -0
  55. package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
  56. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  57. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  58. package/dist/chunk-KJ5LWLOE.js +1077 -0
  59. package/dist/chunk-LBMZMYH2.js +285 -0
  60. package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
  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-MAW544W2.js +1882 -0
  64. package/dist/chunk-MBS4V7ZP.js +217 -0
  65. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  66. package/dist/chunk-MNA4JGU4.js +255 -0
  67. package/dist/chunk-MQSRRFWA.js +3428 -0
  68. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  69. package/dist/chunk-OAO4GE4M.js +619 -0
  70. package/dist/chunk-OHHN2SO4.js +5135 -0
  71. package/dist/chunk-OKGUZO2U.js +34 -0
  72. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  73. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  74. package/dist/chunk-OQE5J4C6.js +73 -0
  75. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  76. package/dist/chunk-POHLU5DW.js +1186 -0
  77. package/dist/chunk-QKMUKYO7.js +4961 -0
  78. package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
  79. package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
  80. package/dist/chunk-SST6Z5JA.js +80 -0
  81. package/dist/chunk-STBPMHSX.js +2456 -0
  82. package/dist/chunk-T6YILFSB.js +80 -0
  83. package/dist/chunk-TZTZS7QK.js +227 -0
  84. package/dist/chunk-UOV2BYIW.js +107 -0
  85. package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
  86. package/dist/chunk-VAKQQHWR.js +434 -0
  87. package/dist/chunk-VG7TBQIY.js +128 -0
  88. package/dist/chunk-VJWL6YS5.js +244 -0
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-WMSVI4G2.js +2095 -0
  91. package/dist/chunk-WVO7V2QY.js +797 -0
  92. package/dist/chunk-X4RCMKVQ.js +641 -0
  93. package/dist/chunk-X75S7HFS.js +374 -0
  94. package/dist/chunk-XN3L4EYL.js +46 -0
  95. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  96. package/dist/chunk-YHZX5GEU.js +193 -0
  97. package/dist/chunk-YXLYO42X.js +91 -0
  98. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  99. package/dist/chunk-ZI647VB5.js +37 -0
  100. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-4LY5K2AC.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-GTLUW2PR.js} +92 -55
  108. package/dist/configure-R6A64DHX.js +42 -0
  109. package/dist/context-5VKGUVJJ.js +866 -0
  110. package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
  111. package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
  126. package/dist/monitor-MEQA5C3I.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
  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-IV4Q6RLN.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
  137. package/dist/terminal-lease-IT5JW2NR.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-7TT7SQ3G.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
  143. package/dist/verify-G6V4D2G7.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.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 +362 -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 +42 -6
  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 +173 -47
  444. package/src/interactive/chat-renderer.ts +262 -72
  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 +228 -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 +20 -2
  456. package/src/interactive/footer-panel.ts +2 -2
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +201 -17
  459. package/src/interactive/interactive-event-projection.ts +6 -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 +176 -114
  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/decisions.ts +300 -0
  474. package/src/interactive/overlays/help-reference.ts +15 -10
  475. package/src/interactive/overlays/model-selector.ts +34 -16
  476. package/src/interactive/overlays/session-selector.ts +18 -0
  477. package/src/interactive/overlays/settings.ts +105 -17
  478. package/src/interactive/overlays/skills-hub.ts +4 -4
  479. package/src/interactive/overlays/tree-selector.ts +41 -6
  480. package/src/interactive/render-trace.ts +499 -90
  481. package/src/interactive/renderers/compaction-summary.ts +2 -2
  482. package/src/interactive/renderers/diff.ts +115 -104
  483. package/src/interactive/renderers/mermaid.ts +53 -0
  484. package/src/interactive/renderers/tool-execution.ts +386 -133
  485. package/src/interactive/renderers/worker-entry.ts +20 -4
  486. package/src/interactive/session-switch-settlement.ts +10 -0
  487. package/src/interactive/slash-autocomplete.ts +6 -114
  488. package/src/interactive/slash-commands.ts +135 -47
  489. package/src/interactive/slash-spec.ts +9 -38
  490. package/src/interactive/status/controller.ts +5 -1
  491. package/src/interactive/stdout-backpressure.ts +99 -0
  492. package/src/interactive/stream-pacer.ts +530 -0
  493. package/src/interactive/stream-pacing-policy.ts +66 -0
  494. package/src/interactive/tasks-overlay.ts +368 -14
  495. package/src/interactive/terminal-lease.ts +485 -0
  496. package/src/interactive/theme/tokens.ts +1 -1
  497. package/src/interactive/turn-context.ts +4 -3
  498. package/src/interactive/turn-persistence.ts +30 -13
  499. package/src/interactive/turn-queues.ts +12 -0
  500. package/src/interactive/turn-recovery.ts +25 -8
  501. package/src/interactive/turn-runtime.ts +79 -12
  502. package/src/interactive/turn-state.ts +10 -0
  503. package/src/interactive/view/artifacts.ts +114 -4
  504. package/src/interactive/view/view-overlay.ts +3 -0
  505. package/src/interactive/welcome-dashboard.ts +17 -16
  506. package/src/interactive/worker-receipts.ts +52 -3
  507. package/src/interactive/worker-stream.ts +5 -1
  508. package/src/tools/agent-tools.ts +23 -3
  509. package/src/tools/artifact.ts +2 -2
  510. package/src/tools/ask-user.ts +23 -13
  511. package/src/tools/bash.ts +30 -2
  512. package/src/tools/bootstrap.ts +34 -431
  513. package/src/tools/builtin-tool-catalog.ts +265 -0
  514. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  515. package/src/tools/codewiki/code-nav.ts +8 -22
  516. package/src/tools/codewiki/shared.ts +41 -38
  517. package/src/tools/context/docs-engine.ts +14 -3
  518. package/src/tools/context/index.ts +107 -28
  519. package/src/tools/context/surface.ts +19 -0
  520. package/src/tools/core-bootstrap.ts +168 -0
  521. package/src/tools/credential-present.ts +5 -5
  522. package/src/tools/dispatch-admission.ts +533 -0
  523. package/src/tools/dispatch-background.ts +54 -0
  524. package/src/tools/dispatch-event-text.ts +6 -0
  525. package/src/tools/dispatch-plan.ts +9 -4
  526. package/src/tools/dispatch-run-events.ts +238 -0
  527. package/src/tools/dispatch-runner.ts +2370 -0
  528. package/src/tools/dispatch-scout-admission.ts +295 -0
  529. package/src/tools/dispatch-types.ts +77 -0
  530. package/src/tools/dispatch.ts +67 -3161
  531. package/src/tools/find.ts +4 -2
  532. package/src/tools/grep.ts +2 -2
  533. package/src/tools/lazy-tool.ts +60 -0
  534. package/src/tools/ledger.ts +3 -3
  535. package/src/tools/monitor-surface.ts +36 -0
  536. package/src/tools/monitor.ts +2 -32
  537. package/src/tools/observers.ts +2 -2
  538. package/src/tools/registry.ts +39 -27
  539. package/src/tools/safe-exec.ts +2 -2
  540. package/src/tools/steer-surface.ts +17 -0
  541. package/src/tools/steer.ts +2 -13
  542. package/src/tools/tasks.ts +108 -11
  543. package/src/tools/truncate.ts +25 -184
  544. package/src/tools/verify/frontend.ts +3 -1
  545. package/src/tools/verify/index.ts +3 -38
  546. package/src/tools/verify/surface.ts +46 -0
  547. package/src/tools/web-fetch-surface.ts +23 -0
  548. package/src/tools/web-fetch.ts +2 -20
  549. package/src/tools/write.ts +7 -2
  550. package/src/worker/entry.ts +39 -2
  551. package/src/worker/spec-contract.ts +26 -5
  552. package/dist/chunk-7SS2CTV2.js +0 -61361
  553. package/dist/chunk-DKGKUHFA.js +0 -924
  554. package/dist/chunk-GEP36Y4X.js +0 -12796
  555. package/dist/chunk-XYWBQRDM.js +0 -137
  556. package/dist/clio-BZVGEUFJ.js +0 -58
  557. package/dist/configure-S7S6F6CL.js +0 -32
  558. package/docs/html/agents_blueprint.html +0 -936
  559. package/docs/html/alcf_blueprint.html +0 -324
  560. package/docs/html/architecture_blueprint.html +0 -850
  561. package/docs/html/commands_blueprint.html +0 -939
  562. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  563. package/docs/html/configuration_blueprint.html +0 -1080
  564. package/docs/html/context_blueprint.html +0 -603
  565. package/docs/html/documentation_blueprint.html +0 -832
  566. package/docs/html/environment_blueprint.html +0 -404
  567. package/docs/html/eval_blueprint.html +0 -743
  568. package/docs/html/evals_internal_blueprint.html +0 -190
  569. package/docs/html/evolution_blueprint.html +0 -674
  570. package/docs/html/extensions_blueprint.html +0 -2065
  571. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  572. package/docs/html/index.html +0 -919
  573. package/docs/html/lifecycle_blueprint.html +0 -723
  574. package/docs/html/memory_blueprint.html +0 -699
  575. package/docs/html/middleware_blueprint.html +0 -664
  576. package/docs/html/models_blueprint.html +0 -2366
  577. package/docs/html/observability_blueprint.html +0 -683
  578. package/docs/html/provider_adapter_blueprint.html +0 -245
  579. package/docs/html/safety_blueprint.html +0 -1386
  580. package/docs/html/shared.css +0 -571
  581. package/docs/html/shared.js +0 -143
  582. package/docs/html/skills_blueprint.html +0 -671
  583. package/docs/html/soak_blueprint.html +0 -182
  584. package/docs/html/tool_usage_blueprint.html +0 -350
  585. package/docs/html/tools_blueprint.html +0 -2249
  586. package/docs/html/trace_blueprint.html +0 -235
  587. package/docs/html/tui_design_blueprint.html +0 -374
  588. package/docs/html/validation_blueprint.html +0 -961
  589. package/docs/html/worker_dispatch_blueprint.html +0 -231
  590. package/src/core/release.ts +0 -2
  591. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  592. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  593. package/src/engine/apis/lmstudio-native.ts +0 -1438
  594. package/src/engine/apis/thinking-replay.ts +0 -11
  595. package/src/tools/string-enum.ts +0 -15
@@ -0,0 +1,1077 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ canonicalJson,
4
+ sha256
5
+ } from "./chunk-6EJV5X2W.js";
6
+ import {
7
+ ToolNames
8
+ } from "./chunk-CGKSTWHD.js";
9
+ import {
10
+ ceilChars,
11
+ extractReasoningTokens
12
+ } from "./chunk-LZSJBIVT.js";
13
+ import {
14
+ settingsPath
15
+ } from "./chunk-A3CYT5EX.js";
16
+ import {
17
+ expandConfigPath
18
+ } from "./chunk-SST6Z5JA.js";
19
+ import {
20
+ isEngineContextOverflow
21
+ } from "./chunk-FCSXB6T2.js";
22
+ import {
23
+ init_esm_shims
24
+ } from "./chunk-3R73A4XB.js";
25
+
26
+ // src/cli/steer-channel.ts
27
+ init_esm_shims();
28
+ import * as fs from "node:fs";
29
+ import * as readline from "node:readline";
30
+ function setupSteerChannel(filePath, onLine) {
31
+ let closed = false;
32
+ let watcher = null;
33
+ let stream = null;
34
+ let rl = null;
35
+ try {
36
+ const stats = fs.statSync(filePath);
37
+ if (stats.isFIFO()) {
38
+ stream = fs.createReadStream(filePath);
39
+ rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
40
+ rl.on("line", (line) => {
41
+ if (closed) return;
42
+ const trimmed = line.trim();
43
+ if (trimmed.length > 0) {
44
+ onLine(trimmed);
45
+ }
46
+ });
47
+ } else {
48
+ let bytesRead = 0;
49
+ let leftover = "";
50
+ const readNewContent = () => {
51
+ if (closed) return;
52
+ try {
53
+ const currentStats = fs.statSync(filePath);
54
+ if (currentStats.size > bytesRead) {
55
+ let fd;
56
+ const buffer = Buffer.alloc(currentStats.size - bytesRead);
57
+ try {
58
+ fd = fs.openSync(filePath, "r");
59
+ fs.readSync(fd, buffer, 0, buffer.length, bytesRead);
60
+ } finally {
61
+ if (fd !== void 0) fs.closeSync(fd);
62
+ }
63
+ bytesRead = currentStats.size;
64
+ const text = `${leftover}${buffer.toString("utf-8")}`;
65
+ const lines = text.split(/\r?\n/);
66
+ leftover = lines.pop() ?? "";
67
+ for (const line of lines) {
68
+ if (closed) return;
69
+ const trimmed = line.trim();
70
+ if (trimmed.length > 0) {
71
+ onLine(trimmed);
72
+ }
73
+ }
74
+ }
75
+ } catch (_err) {
76
+ }
77
+ };
78
+ readNewContent();
79
+ watcher = fs.watch(filePath, (event) => {
80
+ if (event === "change") {
81
+ readNewContent();
82
+ }
83
+ });
84
+ }
85
+ } catch (err) {
86
+ process.stderr.write(
87
+ `clio-coder run: failed to setup steer channel: ${err instanceof Error ? err.message : String(err)}
88
+ `
89
+ );
90
+ }
91
+ return () => {
92
+ closed = true;
93
+ if (watcher) {
94
+ watcher.close();
95
+ }
96
+ if (rl) {
97
+ rl.close();
98
+ }
99
+ if (stream) {
100
+ stream.destroy();
101
+ }
102
+ };
103
+ }
104
+
105
+ // src/cli/modes/json-stream.ts
106
+ init_esm_shims();
107
+
108
+ // src/interactive/chat-loop-messages.ts
109
+ init_esm_shims();
110
+ import { randomUUID } from "node:crypto";
111
+
112
+ // src/domains/providers/errors.ts
113
+ init_esm_shims();
114
+ var ContextOverflowError = class extends Error {
115
+ kind = "context-overflow";
116
+ original;
117
+ constructor(message, original) {
118
+ super(message);
119
+ this.name = "ContextOverflowError";
120
+ this.original = original;
121
+ }
122
+ };
123
+ function isContextOverflowError(err) {
124
+ if (err instanceof ContextOverflowError) return true;
125
+ if (!err || typeof err !== "object") return false;
126
+ return err.kind === "context-overflow";
127
+ }
128
+ function toContextOverflowError(err) {
129
+ if (isContextOverflowError(err))
130
+ return err instanceof ContextOverflowError ? err : new ContextOverflowError(
131
+ typeof err.message === "string" ? err.message : "context overflow",
132
+ err
133
+ );
134
+ const message = extractMessage(err);
135
+ if (!message) return null;
136
+ if (isEngineContextOverflow(message)) return new ContextOverflowError(message, err);
137
+ return null;
138
+ }
139
+ function extractMessage(err) {
140
+ if (typeof err === "string") return err;
141
+ if (err instanceof Error) return err.message;
142
+ if (err && typeof err === "object") {
143
+ const m = err.message;
144
+ if (typeof m === "string") return m;
145
+ }
146
+ return "";
147
+ }
148
+
149
+ // src/interactive/chat-loop-messages.ts
150
+ function notConfiguredNotice() {
151
+ return [
152
+ "[Clio Coder] orchestrator not configured. Set one up with:",
153
+ " clio-coder configure --id <id> --runtime <runtime> --url <url> --model <model> --set-orchestrator",
154
+ "or, when targets already exist: clio-coder targets use <id> --model <model>",
155
+ `(orchestrator.target + orchestrator.model live in ${settingsPath()})`
156
+ ].join("\n");
157
+ }
158
+ function extractText(message) {
159
+ if (!message || typeof message !== "object" || message === null || !("role" in message) || message.role !== "assistant") {
160
+ return "";
161
+ }
162
+ const content = "content" in message && Array.isArray(message.content) ? message.content : [];
163
+ return content.filter((item) => item?.type === "text" && typeof item.text === "string").map((item) => item.text).join("");
164
+ }
165
+ function extractUserText(message) {
166
+ if (!message || typeof message !== "object" || message === null || !("role" in message) || message.role !== "user") {
167
+ return "";
168
+ }
169
+ const content = "content" in message ? message.content : "";
170
+ if (typeof content === "string") return content;
171
+ if (!Array.isArray(content)) return "";
172
+ return content.filter((item) => item?.type === "text" && typeof item.text === "string").map((item) => item.text).join("");
173
+ }
174
+ function extractThinking(message) {
175
+ if (!message || typeof message !== "object" || message === null || !("role" in message) || message.role !== "assistant") {
176
+ return "";
177
+ }
178
+ const content = "content" in message && Array.isArray(message.content) ? message.content : [];
179
+ return content.filter(
180
+ (item) => item?.type === "thinking" && typeof item.thinking === "string"
181
+ ).map((item) => item.thinking).join("");
182
+ }
183
+ function terminalFailureFromAssistantMessage(message) {
184
+ if (!message || typeof message !== "object" || message === null || !("role" in message) || message.role !== "assistant") {
185
+ return null;
186
+ }
187
+ const stopReason = message.stopReason;
188
+ if (stopReason !== "error" && stopReason !== "aborted") return null;
189
+ const rawError = message.errorMessage;
190
+ const errorMessage = typeof rawError === "string" && rawError.length > 0 ? rawError : stopReason === "aborted" ? "request aborted" : "model target returned an error";
191
+ return { stopReason, errorMessage, message };
192
+ }
193
+ function isSelfExplainingAbort(view) {
194
+ if (view.stopReason !== "aborted") return false;
195
+ if (typeof view.errorMessage === "string" && view.errorMessage.length > 0) return false;
196
+ return view.text.trim().length > 0;
197
+ }
198
+ function isLengthStopAssistantMessage(message) {
199
+ return !!message && typeof message === "object" && message !== null && "role" in message && message.role === "assistant" && message.stopReason === "length";
200
+ }
201
+ function isEmptyAbortedAssistantMessage(message) {
202
+ if (!message || typeof message !== "object" || message === null || !("role" in message) || message.role !== "assistant") {
203
+ return false;
204
+ }
205
+ if (message.stopReason !== "aborted") return false;
206
+ if (extractText(message).trim().length > 0) return false;
207
+ return !hasStructuredToolCall(message);
208
+ }
209
+ function lengthStopMetadata(message) {
210
+ const usage = message.usage;
211
+ const metadata = {
212
+ kind: "provider_length_stop",
213
+ stopReason: "length",
214
+ message: "Model target hit its generation/output limit before a complete assistant response. This is not a safety denial; compacting helps only when the prompt and tool observations are also near the context window."
215
+ };
216
+ if (usage && typeof usage === "object") {
217
+ const u = usage;
218
+ for (const [from, to] of [
219
+ ["input", "inputTokens"],
220
+ ["output", "outputTokens"],
221
+ ["totalTokens", "totalTokens"]
222
+ ]) {
223
+ const value = u[from];
224
+ if (typeof value === "number" && Number.isFinite(value)) metadata[to] = value;
225
+ }
226
+ }
227
+ return metadata;
228
+ }
229
+ function hasStructuredToolCall(message) {
230
+ if (!message || typeof message !== "object" || !("content" in message) || !Array.isArray(message.content))
231
+ return false;
232
+ return message.content.some((block) => block?.type === "toolCall");
233
+ }
234
+ function toolNamesFromAgentState(tools) {
235
+ const names = [];
236
+ for (const tool of tools) {
237
+ if (!tool || typeof tool !== "object") continue;
238
+ const name = tool.name;
239
+ if (typeof name === "string" && name.trim().length > 0) names.push(name);
240
+ }
241
+ return names;
242
+ }
243
+ function noticeMessage(text) {
244
+ return {
245
+ role: "assistant",
246
+ content: [{ type: "text", text }],
247
+ stopReason: "aborted",
248
+ timestamp: Date.now()
249
+ };
250
+ }
251
+ function pendingSkillRequestPreamble(requests) {
252
+ const named = requests.filter((request) => request.name.trim().length > 0);
253
+ if (named.length === 0) return "";
254
+ const allowed = [...new Set(named.map((request) => request.name.trim()))];
255
+ const lines = named.map((request) => {
256
+ const status = request.installed ? "installed" : "not-installed";
257
+ const args = request.args.trim();
258
+ return `- ${request.name} (${status}, source=${request.source})${args.length > 0 ? ` \u2014 task: ${args}` : ""}`;
259
+ });
260
+ return [
261
+ "[Skill request]",
262
+ ...lines,
263
+ `First call context with scope="skills" and name for: ${allowed.join(", ")}. Only these pending skill names are allowed this turn. After the skill loads, follow the loaded workflow.`
264
+ ].join("\n");
265
+ }
266
+ function toolSignatureFromState(tools) {
267
+ const schemas = [];
268
+ for (const tool of tools) {
269
+ if (!tool || typeof tool !== "object" || Array.isArray(tool)) continue;
270
+ const record = tool;
271
+ schemas.push({
272
+ name: typeof record.name === "string" ? record.name : "",
273
+ description: typeof record.description === "string" ? record.description : "",
274
+ parameters: record.parameters ?? null
275
+ });
276
+ }
277
+ schemas.sort((a, b) => a.name.localeCompare(b.name));
278
+ return sha256(canonicalJson(schemas));
279
+ }
280
+ function fallbackIdentityPrompt() {
281
+ return [
282
+ "You are Clio, the coding agent in IOWarp's CLIO ecosystem of agentic science (NSF-funded, iowarp.ai).",
283
+ "CLIO stands for Context Layer for Input/Output. Named after the Greek muse of history, you focus on HPC and scientific-software engineering.",
284
+ "Whichever weights run you, your name and persona are Clio. You are not Claude, GPT, Qwen, Gemini, Llama, Mistral, or any other vendor's assistant."
285
+ ].join(" ");
286
+ }
287
+ function createPendingSkillToolPolicy(requests) {
288
+ const allowedSkillNames = [
289
+ ...new Set(requests.map((request) => request.name.trim()).filter((name) => name.length > 0))
290
+ ];
291
+ if (allowedSkillNames.length === 0) return void 0;
292
+ return {
293
+ allowedSkillNames,
294
+ requests: [...requests],
295
+ loadedSkillNames: /* @__PURE__ */ new Set(),
296
+ loadedSkillPolicies: /* @__PURE__ */ new Map()
297
+ };
298
+ }
299
+ function createAskUserToolPolicy(activeTools) {
300
+ if (!activeTools.some((tool) => tool.name === ToolNames.AskUser)) return void 0;
301
+ const now = (/* @__PURE__ */ new Date()).toISOString();
302
+ return {
303
+ id: randomUUID(),
304
+ status: "idle",
305
+ startedAt: now,
306
+ updatedAt: now,
307
+ rounds: [],
308
+ decisions: [],
309
+ inFlight: false,
310
+ cancelled: false,
311
+ answerCount: 0,
312
+ callCount: 0,
313
+ maxCalls: 6,
314
+ askedQuestionKeys: /* @__PURE__ */ new Set()
315
+ };
316
+ }
317
+ function sumRunUsage(messages) {
318
+ const summary = {
319
+ tokens: 0,
320
+ costUsd: 0,
321
+ input: 0,
322
+ output: 0,
323
+ cacheRead: 0,
324
+ cacheWrite: 0,
325
+ reasoning: 0,
326
+ apiCalls: 0,
327
+ hadReasoning: false,
328
+ hadUsage: false
329
+ };
330
+ for (const raw of messages) {
331
+ const message = raw;
332
+ if (!message || typeof message !== "object") continue;
333
+ if (message.role !== "assistant") continue;
334
+ const usage = message.usage;
335
+ if (!usage || typeof usage !== "object") continue;
336
+ summary.hadUsage = true;
337
+ summary.apiCalls += 1;
338
+ const input = typeof usage.input === "number" ? usage.input : 0;
339
+ const output = typeof usage.output === "number" ? usage.output : 0;
340
+ const cacheRead = typeof usage.cacheRead === "number" ? usage.cacheRead : 0;
341
+ const cacheWrite = typeof usage.cacheWrite === "number" ? usage.cacheWrite : 0;
342
+ summary.input += input;
343
+ summary.output += output;
344
+ summary.cacheRead += cacheRead;
345
+ summary.cacheWrite += cacheWrite;
346
+ const reasoning = extractReasoningTokens(usage);
347
+ if (reasoning !== null) {
348
+ summary.reasoning += reasoning;
349
+ summary.hadReasoning = true;
350
+ }
351
+ if (typeof usage.totalTokens === "number" && usage.totalTokens > 0) {
352
+ summary.tokens += usage.totalTokens;
353
+ } else {
354
+ summary.tokens += input + output + cacheRead + cacheWrite;
355
+ }
356
+ const total = usage.cost?.total;
357
+ if (typeof total === "number") summary.costUsd += total;
358
+ }
359
+ return summary;
360
+ }
361
+ function backendCacheVerdict(input, cacheRead) {
362
+ if (cacheRead > 0) return input >= 2e3 ? "partial" : "hot";
363
+ return input >= 2e3 ? "cold" : "small";
364
+ }
365
+ function assistantSessionPayload(message, failure) {
366
+ const text = extractText(message).trim();
367
+ const thinking = extractThinking(message).trim();
368
+ const payload = { text };
369
+ const raw = message;
370
+ if (Array.isArray(raw.content)) payload.content = raw.content;
371
+ if (thinking.length > 0) payload.thinking = thinking;
372
+ for (const key of ["usage", "api", "provider", "model", "responseModel", "responseId", "diagnostics"]) {
373
+ if (raw[key] !== void 0) payload[key] = raw[key];
374
+ }
375
+ if (failure && !isSelfExplainingAbort({ stopReason: raw.stopReason, errorMessage: raw.errorMessage, text })) {
376
+ payload.stopReason = failure.stopReason;
377
+ payload.errorMessage = failure.errorMessage;
378
+ } else {
379
+ const stopReason = raw.stopReason;
380
+ if (stopReason !== void 0) payload.stopReason = stopReason;
381
+ if (stopReason === "length") payload.contextExhaustion = lengthStopMetadata(message);
382
+ }
383
+ return payload;
384
+ }
385
+ function estimatedUsageForInterruptedTurn(message, promptSideTokens) {
386
+ if (message.stopReason !== "aborted") return null;
387
+ const reported = message.usage;
388
+ if (reported && typeof reported === "object") {
389
+ for (const key of ["input", "output", "cacheRead", "cacheWrite", "totalTokens"]) {
390
+ const value = reported[key];
391
+ if (typeof value === "number" && value > 0) return null;
392
+ }
393
+ }
394
+ const streamedChars = extractText(message).length + extractThinking(message).length;
395
+ if (streamedChars === 0 && promptSideTokens <= 0) return null;
396
+ const input = Math.max(0, Math.round(promptSideTokens));
397
+ const output = streamedChars > 0 ? Math.max(1, ceilChars(streamedChars)) : 0;
398
+ return {
399
+ input,
400
+ output,
401
+ cacheRead: 0,
402
+ cacheWrite: 0,
403
+ reasoning: 0,
404
+ totalTokens: input + output,
405
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
406
+ estimated: true
407
+ };
408
+ }
409
+ function hasPersistableAssistantContent(payload, failure) {
410
+ if (failure) return true;
411
+ if (payload.stopReason === "length") return true;
412
+ if (typeof payload.text === "string" && payload.text.trim().length > 0) return true;
413
+ if (typeof payload.thinking === "string" && payload.thinking.trim().length > 0) return true;
414
+ if (Array.isArray(payload.content) && payload.content.length > 0) return true;
415
+ return false;
416
+ }
417
+ function recordValue(value) {
418
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
419
+ }
420
+ function textFromToolResultContent(content) {
421
+ if (!Array.isArray(content)) return "";
422
+ return content.map((block) => {
423
+ const item = recordValue(block);
424
+ if (item?.type !== "text" || typeof item?.text !== "string") return "";
425
+ return item.text;
426
+ }).join("");
427
+ }
428
+ function toolResultSummary(result2) {
429
+ const obj = recordValue(result2);
430
+ const text = textFromToolResultContent(obj?.content) || (typeof result2 === "string" ? result2 : "");
431
+ const bytes = Buffer.byteLength(text, "utf8");
432
+ const details = recordValue(obj?.details);
433
+ const size = recordValue(details?.resultSize);
434
+ const truncation = recordValue(details?.truncation);
435
+ const observation = recordValue(details?.observation);
436
+ const offloadPath = typeof observation?.offloadPath === "string" ? observation.offloadPath : typeof size?.offloadPath === "string" ? size.offloadPath : null;
437
+ return {
438
+ bytes,
439
+ truncated: size?.truncated === true || truncation?.truncated === true || observation?.truncated === true || text.includes("[tool result truncated]"),
440
+ ...typeof size?.policy === "string" ? { policy: size.policy } : {},
441
+ ...typeof size?.followUpHint === "string" ? { followUpHint: size.followUpHint } : {},
442
+ ...offloadPath !== null ? { offloadPath } : {},
443
+ // Observation envelope counts (OBSERVE plane): unit, shown/total counts
444
+ // and bytes, format, exact continuation, offload path. Persisted with
445
+ // the turn so the ledger line renders identically live and on replay.
446
+ ...observation !== null ? { observation } : {}
447
+ };
448
+ }
449
+ function runtimeSupportsTools(agentRuntime) {
450
+ return agentRuntime.runtimeResolution.capabilityDecisions.tools === true;
451
+ }
452
+ function detectTerminalFailureFromState(agent) {
453
+ const msgs = agent.state.messages;
454
+ const tail = Array.isArray(msgs) ? msgs[msgs.length - 1] : void 0;
455
+ const failure = terminalFailureFromAssistantMessage(tail);
456
+ if (failure) return failure;
457
+ return null;
458
+ }
459
+ function pruneFailedAssistantFromContext(agent) {
460
+ const messages = agent.state.messages;
461
+ const tail = Array.isArray(messages) ? messages[messages.length - 1] : void 0;
462
+ if (!terminalFailureFromAssistantMessage(tail)) return;
463
+ agent.state.messages = messages.slice(0, -1);
464
+ }
465
+ function detectOverflowFromState(agent) {
466
+ const direct = agent.state.errorMessage;
467
+ if (typeof direct === "string" && direct.length > 0) {
468
+ const match = toContextOverflowError(direct);
469
+ if (match) return match;
470
+ }
471
+ const msgs = agent.state.messages;
472
+ const tail = Array.isArray(msgs) ? msgs[msgs.length - 1] : void 0;
473
+ if (tail && typeof tail === "object" && tail.stopReason === "error") {
474
+ const em = tail.errorMessage;
475
+ if (typeof em === "string") {
476
+ const match = toContextOverflowError(em);
477
+ if (match) return match;
478
+ }
479
+ }
480
+ return null;
481
+ }
482
+
483
+ // src/cli/modes/json-stream.ts
484
+ function projectHeadlessJsonEvent(event) {
485
+ if (event.type === "message_update") return null;
486
+ if (event.type === "text_delta") {
487
+ return { type: event.type, contentIndex: event.contentIndex, delta: event.delta };
488
+ }
489
+ if (event.type === "thinking_delta") {
490
+ return { type: event.type, contentIndex: event.contentIndex, delta: event.delta };
491
+ }
492
+ if (event.type === "message_end") {
493
+ return { ...event, message: withoutStreamedContent(event.message) };
494
+ }
495
+ if (event.type === "agent_end") return segmentSummary(event.type, event.messages);
496
+ if (event.type === "turn_end") {
497
+ return { type: event.type, message: withoutStreamedContent(event.message) };
498
+ }
499
+ return event;
500
+ }
501
+ function withoutStreamedContent(message) {
502
+ if (!isRecord(message) || message.role !== "assistant" || !Array.isArray(message.content)) return message;
503
+ const content = message.content.map((block) => {
504
+ if (!isRecord(block)) return block;
505
+ if (block.type === "text" && typeof block.text === "string") {
506
+ const { text: _text, ...rest } = block;
507
+ return { ...rest, streamed: true, textLength: block.text.length };
508
+ }
509
+ if (block.type === "thinking" && typeof block.thinking === "string") {
510
+ const { thinking: _thinking, ...rest } = block;
511
+ return { ...rest, streamed: true, thinkingLength: block.thinking.length };
512
+ }
513
+ return block;
514
+ });
515
+ return { ...message, content };
516
+ }
517
+ function projectDispatchJsonEvent(event) {
518
+ if (!isRecord(event) || event.type !== "agent_end" || !Array.isArray(event.messages)) return event;
519
+ const { messages: _messages, ...rest } = event;
520
+ return { ...rest, ...segmentSummary("agent_end", event.messages) };
521
+ }
522
+ function segmentSummary(type, messages) {
523
+ const usage = sumRunUsage(messages);
524
+ return {
525
+ type,
526
+ messageCount: messages.length,
527
+ usage: {
528
+ input: usage.input,
529
+ output: usage.output,
530
+ cacheRead: usage.cacheRead,
531
+ cacheWrite: usage.cacheWrite,
532
+ reasoning: usage.reasoning,
533
+ totalTokens: usage.tokens,
534
+ costUsd: usage.costUsd,
535
+ apiCalls: usage.apiCalls,
536
+ measured: usage.hadUsage
537
+ }
538
+ };
539
+ }
540
+ function isRecord(value) {
541
+ return typeof value === "object" && value !== null && !Array.isArray(value);
542
+ }
543
+
544
+ // src/core/file-references.ts
545
+ init_esm_shims();
546
+ import { existsSync, readFileSync, statSync as statSync2 } from "node:fs";
547
+ import path2 from "node:path";
548
+
549
+ // src/utils/image-resize.ts
550
+ init_esm_shims();
551
+
552
+ // src/utils/exif-orientation.ts
553
+ init_esm_shims();
554
+ function byte(bytes, offset) {
555
+ return bytes[offset] ?? 0;
556
+ }
557
+ function readOrientationFromTiff(bytes, tiffStart) {
558
+ if (tiffStart + 8 > bytes.length) return 1;
559
+ const byteOrder = byte(bytes, tiffStart) << 8 | byte(bytes, tiffStart + 1);
560
+ const le = byteOrder === 18761;
561
+ const read16 = (pos) => {
562
+ if (le) return byte(bytes, pos) | byte(bytes, pos + 1) << 8;
563
+ return byte(bytes, pos) << 8 | byte(bytes, pos + 1);
564
+ };
565
+ const read32 = (pos) => {
566
+ if (le) {
567
+ return byte(bytes, pos) | byte(bytes, pos + 1) << 8 | byte(bytes, pos + 2) << 16 | byte(bytes, pos + 3) << 24;
568
+ }
569
+ return (byte(bytes, pos) << 24 | byte(bytes, pos + 1) << 16 | byte(bytes, pos + 2) << 8 | byte(bytes, pos + 3)) >>> 0;
570
+ };
571
+ const ifdOffset = read32(tiffStart + 4);
572
+ const ifdStart = tiffStart + ifdOffset;
573
+ if (ifdStart + 2 > bytes.length) return 1;
574
+ const entryCount = read16(ifdStart);
575
+ for (let i = 0; i < entryCount; i++) {
576
+ const entryPos = ifdStart + 2 + i * 12;
577
+ if (entryPos + 12 > bytes.length) return 1;
578
+ if (read16(entryPos) === 274) {
579
+ const value = read16(entryPos + 8);
580
+ return value >= 1 && value <= 8 ? value : 1;
581
+ }
582
+ }
583
+ return 1;
584
+ }
585
+ function hasExifHeader(bytes, offset) {
586
+ return byte(bytes, offset) === 69 && byte(bytes, offset + 1) === 120 && byte(bytes, offset + 2) === 105 && byte(bytes, offset + 3) === 102 && byte(bytes, offset + 4) === 0 && byte(bytes, offset + 5) === 0;
587
+ }
588
+ function findJpegTiffOffset(bytes) {
589
+ let offset = 2;
590
+ while (offset < bytes.length - 1) {
591
+ if (byte(bytes, offset) !== 255) return -1;
592
+ const marker = byte(bytes, offset + 1);
593
+ if (marker === 255) {
594
+ offset++;
595
+ continue;
596
+ }
597
+ if (marker === 225) {
598
+ if (offset + 4 >= bytes.length) return -1;
599
+ const segmentStart = offset + 4;
600
+ if (segmentStart + 6 > bytes.length) return -1;
601
+ if (!hasExifHeader(bytes, segmentStart)) return -1;
602
+ return segmentStart + 6;
603
+ }
604
+ if (offset + 4 > bytes.length) return -1;
605
+ const length = byte(bytes, offset + 2) << 8 | byte(bytes, offset + 3);
606
+ offset += 2 + length;
607
+ }
608
+ return -1;
609
+ }
610
+ function findWebpTiffOffset(bytes) {
611
+ let offset = 12;
612
+ while (offset + 8 <= bytes.length) {
613
+ const chunkId = String.fromCharCode(
614
+ byte(bytes, offset),
615
+ byte(bytes, offset + 1),
616
+ byte(bytes, offset + 2),
617
+ byte(bytes, offset + 3)
618
+ );
619
+ const chunkSize = byte(bytes, offset + 4) | byte(bytes, offset + 5) << 8 | byte(bytes, offset + 6) << 16 | byte(bytes, offset + 7) << 24;
620
+ const dataStart = offset + 8;
621
+ if (chunkId === "EXIF") {
622
+ if (dataStart + chunkSize > bytes.length) return -1;
623
+ return chunkSize >= 6 && hasExifHeader(bytes, dataStart) ? dataStart + 6 : dataStart;
624
+ }
625
+ offset = dataStart + chunkSize + chunkSize % 2;
626
+ }
627
+ return -1;
628
+ }
629
+ function getExifOrientation(bytes) {
630
+ let tiffOffset = -1;
631
+ if (bytes.length >= 2 && byte(bytes, 0) === 255 && byte(bytes, 1) === 216) {
632
+ tiffOffset = findJpegTiffOffset(bytes);
633
+ } else if (bytes.length >= 12 && byte(bytes, 0) === 82 && byte(bytes, 1) === 73 && byte(bytes, 2) === 70 && byte(bytes, 3) === 70 && byte(bytes, 8) === 87 && byte(bytes, 9) === 69 && byte(bytes, 10) === 66 && byte(bytes, 11) === 80) {
634
+ tiffOffset = findWebpTiffOffset(bytes);
635
+ }
636
+ if (tiffOffset === -1) return 1;
637
+ return readOrientationFromTiff(bytes, tiffOffset);
638
+ }
639
+ function rotate90(photon, image, dstIndex) {
640
+ const w = image.get_width();
641
+ const h = image.get_height();
642
+ const src = image.get_raw_pixels();
643
+ const dst = new Uint8Array(src.length);
644
+ for (let y = 0; y < h; y++) {
645
+ for (let x = 0; x < w; x++) {
646
+ const srcIdx = (y * w + x) * 4;
647
+ const dstIdx = dstIndex(x, y, w, h) * 4;
648
+ dst[dstIdx] = src[srcIdx] ?? 0;
649
+ dst[dstIdx + 1] = src[srcIdx + 1] ?? 0;
650
+ dst[dstIdx + 2] = src[srcIdx + 2] ?? 0;
651
+ dst[dstIdx + 3] = src[srcIdx + 3] ?? 0;
652
+ }
653
+ }
654
+ return new photon.PhotonImage(dst, h, w);
655
+ }
656
+ function applyExifOrientation(photon, image, originalBytes) {
657
+ const orientation = getExifOrientation(originalBytes);
658
+ if (orientation === 1) return image;
659
+ switch (orientation) {
660
+ case 2:
661
+ photon.fliph(image);
662
+ return image;
663
+ case 3:
664
+ photon.fliph(image);
665
+ photon.flipv(image);
666
+ return image;
667
+ case 4:
668
+ photon.flipv(image);
669
+ return image;
670
+ case 5: {
671
+ const rotated = rotate90(photon, image, (x, y, _w, h) => x * h + (h - 1 - y));
672
+ photon.fliph(rotated);
673
+ return rotated;
674
+ }
675
+ case 6:
676
+ return rotate90(photon, image, (x, y, _w, h) => x * h + (h - 1 - y));
677
+ case 7: {
678
+ const rotated = rotate90(photon, image, (x, y, w, h) => (w - 1 - x) * h + y);
679
+ photon.fliph(rotated);
680
+ return rotated;
681
+ }
682
+ case 8:
683
+ return rotate90(photon, image, (x, y, w, h) => (w - 1 - x) * h + y);
684
+ default:
685
+ return image;
686
+ }
687
+ }
688
+
689
+ // src/utils/photon.ts
690
+ init_esm_shims();
691
+ import { createRequire } from "node:module";
692
+ import path from "node:path";
693
+ import { fileURLToPath } from "node:url";
694
+ var require2 = createRequire(import.meta.url);
695
+ var fs2 = require2("node:fs");
696
+ var WASM_FILENAME = "photon_rs_bg.wasm";
697
+ var photonModule = null;
698
+ var loadPromise = null;
699
+ function pathOrNull(file) {
700
+ if (typeof file === "string") return file;
701
+ if (file instanceof URL) return fileURLToPath(file);
702
+ return null;
703
+ }
704
+ function getFallbackWasmPaths() {
705
+ const execDir = path.dirname(process.execPath);
706
+ return [
707
+ path.join(execDir, WASM_FILENAME),
708
+ path.join(execDir, "photon", WASM_FILENAME),
709
+ path.join(process.cwd(), WASM_FILENAME)
710
+ ];
711
+ }
712
+ function patchPhotonWasmRead() {
713
+ const originalReadFileSync = fs2.readFileSync.bind(fs2);
714
+ const fallbackPaths = getFallbackWasmPaths();
715
+ const mutableFs = fs2;
716
+ const patchedReadFileSync = ((...args) => {
717
+ const [file, options] = args;
718
+ const resolvedPath = pathOrNull(file);
719
+ if (resolvedPath?.endsWith(WASM_FILENAME)) {
720
+ try {
721
+ return originalReadFileSync(...args);
722
+ } catch (error) {
723
+ const err = error;
724
+ if (err?.code && err.code !== "ENOENT") throw error;
725
+ for (const fallbackPath of fallbackPaths) {
726
+ if (!fs2.existsSync(fallbackPath)) continue;
727
+ if (options === void 0) return originalReadFileSync(fallbackPath);
728
+ return originalReadFileSync(fallbackPath, options);
729
+ }
730
+ throw error;
731
+ }
732
+ }
733
+ return originalReadFileSync(...args);
734
+ });
735
+ try {
736
+ mutableFs.readFileSync = patchedReadFileSync;
737
+ } catch {
738
+ Object.defineProperty(fs2, "readFileSync", {
739
+ value: patchedReadFileSync,
740
+ writable: true,
741
+ configurable: true
742
+ });
743
+ }
744
+ return () => {
745
+ try {
746
+ mutableFs.readFileSync = originalReadFileSync;
747
+ } catch {
748
+ Object.defineProperty(fs2, "readFileSync", {
749
+ value: originalReadFileSync,
750
+ writable: true,
751
+ configurable: true
752
+ });
753
+ }
754
+ };
755
+ }
756
+ async function loadPhoton() {
757
+ if (photonModule) return photonModule;
758
+ if (loadPromise) return loadPromise;
759
+ loadPromise = (async () => {
760
+ const restoreReadFileSync = patchPhotonWasmRead();
761
+ try {
762
+ photonModule = await import("@silvia-odwyer/photon-node");
763
+ return photonModule;
764
+ } catch {
765
+ photonModule = null;
766
+ return photonModule;
767
+ } finally {
768
+ restoreReadFileSync();
769
+ }
770
+ })();
771
+ return loadPromise;
772
+ }
773
+
774
+ // src/utils/image-resize.ts
775
+ var DEFAULT_MAX_BYTES = 4.5 * 1024 * 1024;
776
+ var DEFAULT_OPTIONS = {
777
+ maxWidth: 2e3,
778
+ maxHeight: 2e3,
779
+ maxBytes: DEFAULT_MAX_BYTES,
780
+ jpegQuality: 80
781
+ };
782
+ function encodeCandidate(buffer, mimeType) {
783
+ const data = Buffer.from(buffer).toString("base64");
784
+ return {
785
+ data,
786
+ encodedSize: Buffer.byteLength(data, "utf-8"),
787
+ mimeType
788
+ };
789
+ }
790
+ async function resizeImage(img, options) {
791
+ const opts = { ...DEFAULT_OPTIONS, ...options };
792
+ const inputBuffer = Buffer.from(img.data, "base64");
793
+ const inputBase64Size = Buffer.byteLength(img.data, "utf-8");
794
+ const photon = await loadPhoton();
795
+ if (!photon) return null;
796
+ const loadedPhoton = photon;
797
+ let image;
798
+ try {
799
+ let tryEncodings2 = function(width, height, jpegQualities) {
800
+ const resized = loadedPhoton.resize(loadedImage, width, height, loadedPhoton.SamplingFilter.Lanczos3);
801
+ try {
802
+ const candidates = [encodeCandidate(resized.get_bytes(), "image/png")];
803
+ for (const quality of jpegQualities) {
804
+ candidates.push(encodeCandidate(resized.get_bytes_jpeg(quality), "image/jpeg"));
805
+ }
806
+ return candidates;
807
+ } finally {
808
+ resized.free();
809
+ }
810
+ };
811
+ var tryEncodings = tryEncodings2;
812
+ const inputBytes = new Uint8Array(inputBuffer);
813
+ const rawImage = photon.PhotonImage.new_from_byteslice(inputBytes);
814
+ image = applyExifOrientation(photon, rawImage, inputBytes);
815
+ if (image !== rawImage) rawImage.free();
816
+ const originalWidth = image.get_width();
817
+ const originalHeight = image.get_height();
818
+ const format = img.mimeType?.split("/")[1] ?? "png";
819
+ if (originalWidth <= opts.maxWidth && originalHeight <= opts.maxHeight && inputBase64Size < opts.maxBytes) {
820
+ return {
821
+ data: img.data,
822
+ mimeType: img.mimeType ?? `image/${format}`,
823
+ originalWidth,
824
+ originalHeight,
825
+ width: originalWidth,
826
+ height: originalHeight,
827
+ wasResized: false
828
+ };
829
+ }
830
+ let targetWidth = originalWidth;
831
+ let targetHeight = originalHeight;
832
+ if (targetWidth > opts.maxWidth) {
833
+ targetHeight = Math.round(targetHeight * opts.maxWidth / targetWidth);
834
+ targetWidth = opts.maxWidth;
835
+ }
836
+ if (targetHeight > opts.maxHeight) {
837
+ targetWidth = Math.round(targetWidth * opts.maxHeight / targetHeight);
838
+ targetHeight = opts.maxHeight;
839
+ }
840
+ const loadedImage = image;
841
+ const qualitySteps = Array.from(/* @__PURE__ */ new Set([opts.jpegQuality, 85, 70, 55, 40]));
842
+ let currentWidth = targetWidth;
843
+ let currentHeight = targetHeight;
844
+ while (true) {
845
+ const candidates = tryEncodings2(currentWidth, currentHeight, qualitySteps);
846
+ for (const candidate of candidates) {
847
+ if (candidate.encodedSize < opts.maxBytes) {
848
+ return {
849
+ data: candidate.data,
850
+ mimeType: candidate.mimeType,
851
+ originalWidth,
852
+ originalHeight,
853
+ width: currentWidth,
854
+ height: currentHeight,
855
+ wasResized: true
856
+ };
857
+ }
858
+ }
859
+ if (currentWidth === 1 && currentHeight === 1) break;
860
+ const nextWidth = currentWidth === 1 ? 1 : Math.max(1, Math.floor(currentWidth * 0.75));
861
+ const nextHeight = currentHeight === 1 ? 1 : Math.max(1, Math.floor(currentHeight * 0.75));
862
+ if (nextWidth === currentWidth && nextHeight === currentHeight) break;
863
+ currentWidth = nextWidth;
864
+ currentHeight = nextHeight;
865
+ }
866
+ return null;
867
+ } catch {
868
+ return null;
869
+ } finally {
870
+ if (image) image.free();
871
+ }
872
+ }
873
+ function formatDimensionNote(result2) {
874
+ if (!result2.wasResized) return void 0;
875
+ const scale = result2.originalWidth / result2.width;
876
+ return `[Image: original ${result2.originalWidth}x${result2.originalHeight}, displayed at ${result2.width}x${result2.height}. Multiply coordinates by ${scale.toFixed(2)} to map to original image.]`;
877
+ }
878
+
879
+ // src/core/file-references.ts
880
+ var FILE_REF = /(^|\s)@(\S+)/g;
881
+ var DEFAULT_IMAGE_MAX_BASE64_BYTES = 4.5 * 1024 * 1024;
882
+ function renderTextFile(filePath, content) {
883
+ return `<file name="${filePath}">
884
+ ${content}
885
+ </file>
886
+ `;
887
+ }
888
+ function renderImageFile(filePath, content = "") {
889
+ return `<file name="${filePath}">${content}</file>
890
+ `;
891
+ }
892
+ function result(text, diagnostics = [], images = [], referencedPaths = []) {
893
+ return { text, diagnostics, images, referencedPaths };
894
+ }
895
+ function detectSupportedImageMimeType(bytes) {
896
+ if (bytes.length >= 8 && bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]))) {
897
+ return "image/png";
898
+ }
899
+ if (bytes.length >= 3 && bytes[0] === 255 && bytes[1] === 216 && bytes[2] === 255) {
900
+ return "image/jpeg";
901
+ }
902
+ const signature = bytes.subarray(0, 6).toString("ascii");
903
+ if (signature === "GIF87a" || signature === "GIF89a") return "image/gif";
904
+ if (bytes.length >= 12 && bytes.subarray(0, 4).toString("ascii") === "RIFF" && bytes.subarray(8, 12).toString("ascii") === "WEBP") {
905
+ return "image/webp";
906
+ }
907
+ return null;
908
+ }
909
+ async function readFileReferenceAsync(fileArg, options) {
910
+ const filePath = expandConfigPath(fileArg, options.cwd === void 0 ? void 0 : { cwd: options.cwd });
911
+ if (!existsSync(filePath)) {
912
+ if (options.missing === "leave") return result(`@${fileArg}`);
913
+ return result("", [{ type: "error", message: `file not found: ${filePath}`, path: filePath }]);
914
+ }
915
+ let stat;
916
+ try {
917
+ stat = statSync2(filePath);
918
+ } catch (err) {
919
+ const reason = err instanceof Error ? err.message : String(err);
920
+ return result("", [{ type: "error", message: `file could not be stat'ed: ${reason}`, path: filePath }]);
921
+ }
922
+ if (!stat.isFile()) {
923
+ return result("", [{ type: "error", message: `not a file: ${filePath}`, path: filePath }]);
924
+ }
925
+ if (stat.size === 0) return result("", [], [], [filePath]);
926
+ try {
927
+ const bytes = readFileSync(filePath);
928
+ const imageMimeType = detectSupportedImageMimeType(bytes);
929
+ if (imageMimeType) {
930
+ if (options.includeImages !== true) return result(`@${fileArg}`);
931
+ const originalImage = {
932
+ type: "image",
933
+ mimeType: imageMimeType,
934
+ data: bytes.toString("base64")
935
+ };
936
+ if (options.autoResizeImages === false) {
937
+ return result(renderImageFile(filePath), [], [originalImage], [filePath]);
938
+ }
939
+ const resized = await resizeImage(originalImage);
940
+ if (!resized) {
941
+ if (Buffer.byteLength(originalImage.data, "utf-8") < DEFAULT_IMAGE_MAX_BASE64_BYTES) {
942
+ return result(renderImageFile(filePath), [], [originalImage], [filePath]);
943
+ }
944
+ return result(
945
+ renderImageFile(filePath, "[Image omitted: could not be resized below the inline image size limit.]"),
946
+ [],
947
+ [],
948
+ [filePath]
949
+ );
950
+ }
951
+ return result(
952
+ renderImageFile(filePath, formatDimensionNote(resized)),
953
+ [],
954
+ [{ type: "image", mimeType: resized.mimeType, data: resized.data }],
955
+ [filePath]
956
+ );
957
+ }
958
+ return result(renderTextFile(filePath, bytes.toString("utf8")), [], [], [filePath]);
959
+ } catch (err) {
960
+ const reason = err instanceof Error ? err.message : String(err);
961
+ return result("", [{ type: "error", message: `file could not be read: ${reason}`, path: filePath }]);
962
+ }
963
+ }
964
+ async function readFileArgsAsync(fileArgs, options = {}) {
965
+ const diagnostics = [];
966
+ const images = [];
967
+ const referencedPaths = [];
968
+ let text = "";
969
+ for (const fileArg of fileArgs) {
970
+ const ref = await readFileReferenceAsync(fileArg, {
971
+ ...options,
972
+ missing: options.missing ?? "error",
973
+ includeImages: true
974
+ });
975
+ text += ref.text;
976
+ images.push(...ref.images);
977
+ diagnostics.push(...ref.diagnostics);
978
+ referencedPaths.push(...ref.referencedPaths);
979
+ }
980
+ return { text, images, diagnostics, referencedPaths };
981
+ }
982
+ function splitTrailingPunctuation(token) {
983
+ const match = token.match(/^(.+?)([),.;:!?]+)$/);
984
+ if (!match?.[1] || !match[2]) return { fileArg: token, suffix: "" };
985
+ const candidate = match[1];
986
+ const suffix = match[2];
987
+ const ext = path2.extname(candidate);
988
+ if (ext.length === 0 && suffix.startsWith(".")) return { fileArg: token, suffix: "" };
989
+ return { fileArg: candidate, suffix };
990
+ }
991
+ async function expandInlineFileReferencesAsync(input, options = {}) {
992
+ const diagnostics = [];
993
+ const images = [];
994
+ const referencedPaths = [];
995
+ let text = "";
996
+ let lastIndex = 0;
997
+ for (const match of input.matchAll(FILE_REF)) {
998
+ const index = match.index ?? 0;
999
+ const full = match[0] ?? "";
1000
+ const prefix = match[1] ?? "";
1001
+ const token = match[2] ?? "";
1002
+ text += input.slice(lastIndex, index);
1003
+ const direct = await readFileReferenceAsync(token, {
1004
+ ...options,
1005
+ missing: "leave",
1006
+ includeImages: options.includeImages === true
1007
+ });
1008
+ if (direct.text !== `@${token}`) {
1009
+ diagnostics.push(...direct.diagnostics);
1010
+ images.push(...direct.images);
1011
+ referencedPaths.push(...direct.referencedPaths);
1012
+ text += `${prefix}${direct.text}`;
1013
+ lastIndex = index + full.length;
1014
+ continue;
1015
+ }
1016
+ const { fileArg, suffix } = splitTrailingPunctuation(token);
1017
+ if (fileArg === token) {
1018
+ text += full;
1019
+ lastIndex = index + full.length;
1020
+ continue;
1021
+ }
1022
+ const stripped = await readFileReferenceAsync(fileArg, {
1023
+ ...options,
1024
+ missing: "leave",
1025
+ includeImages: options.includeImages === true
1026
+ });
1027
+ if (stripped.text === `@${fileArg}`) {
1028
+ text += full;
1029
+ lastIndex = index + full.length;
1030
+ continue;
1031
+ }
1032
+ diagnostics.push(...stripped.diagnostics);
1033
+ images.push(...stripped.images);
1034
+ referencedPaths.push(...stripped.referencedPaths);
1035
+ text += `${prefix}${stripped.text}${suffix}`;
1036
+ lastIndex = index + full.length;
1037
+ }
1038
+ text += input.slice(lastIndex);
1039
+ return { text, images, diagnostics, referencedPaths };
1040
+ }
1041
+
1042
+ export {
1043
+ toContextOverflowError,
1044
+ notConfiguredNotice,
1045
+ extractText,
1046
+ extractUserText,
1047
+ extractThinking,
1048
+ terminalFailureFromAssistantMessage,
1049
+ isSelfExplainingAbort,
1050
+ isLengthStopAssistantMessage,
1051
+ isEmptyAbortedAssistantMessage,
1052
+ hasStructuredToolCall,
1053
+ toolNamesFromAgentState,
1054
+ noticeMessage,
1055
+ pendingSkillRequestPreamble,
1056
+ toolSignatureFromState,
1057
+ fallbackIdentityPrompt,
1058
+ createPendingSkillToolPolicy,
1059
+ createAskUserToolPolicy,
1060
+ sumRunUsage,
1061
+ backendCacheVerdict,
1062
+ assistantSessionPayload,
1063
+ estimatedUsageForInterruptedTurn,
1064
+ hasPersistableAssistantContent,
1065
+ recordValue,
1066
+ toolResultSummary,
1067
+ runtimeSupportsTools,
1068
+ detectTerminalFailureFromState,
1069
+ pruneFailedAssistantFromContext,
1070
+ detectOverflowFromState,
1071
+ setupSteerChannel,
1072
+ projectHeadlessJsonEvent,
1073
+ projectDispatchJsonEvent,
1074
+ readFileArgsAsync,
1075
+ expandInlineFileReferencesAsync
1076
+ };
1077
+ //# sourceMappingURL=chunk-KJ5LWLOE.js.map