@iowarp/clio-coder 0.4.0 → 0.4.1

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 (581) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -16
  3. package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
  4. package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
  7. package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
  8. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  9. package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
  10. package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
  11. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  12. package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
  13. package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
  14. package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
  15. package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
  16. package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
  17. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  18. package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
  19. package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
  20. package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
  21. package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
  22. package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
  23. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  24. package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
  25. package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
  26. package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
  27. package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
  28. package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
  29. package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
  30. package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
  33. package/dist/chunk-AP73CFDC.js +308 -0
  34. package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
  35. package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
  36. package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
  37. package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
  38. package/dist/chunk-BTK3SSSK.js +67 -0
  39. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  40. package/dist/chunk-BWW4HLO4.js +301 -0
  41. package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
  42. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  43. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  44. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  45. package/dist/chunk-D7E7WCDF.js +27 -0
  46. package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
  47. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  48. package/dist/chunk-EIMVLWB3.js +1842 -0
  49. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  50. package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
  51. package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
  52. package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
  53. package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
  54. package/dist/chunk-HJWWJ6IL.js +184 -0
  55. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  56. package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
  57. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  58. package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
  59. package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
  60. package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
  61. package/dist/chunk-J5LZHVIT.js +284 -0
  62. package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
  63. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  64. package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
  65. package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
  66. package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
  67. package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
  68. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  69. package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
  70. package/dist/chunk-NDDGJUXD.js +81 -0
  71. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  72. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  73. package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
  74. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  75. package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
  76. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  77. package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
  78. package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
  79. package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
  80. package/dist/chunk-QTFGO774.js +644 -0
  81. package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
  82. package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
  83. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  84. package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
  85. package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
  86. package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
  87. package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
  88. package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
  89. package/dist/chunk-U2WB7TZS.js +271 -0
  90. package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
  91. package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
  92. package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
  93. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  94. package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
  95. package/dist/chunk-VKFQTNDV.js +66 -0
  96. package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
  97. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  98. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  99. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  100. package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
  101. package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
  102. package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
  103. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  104. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  105. package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
  106. package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
  107. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  108. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  109. package/dist/cli/index.js +36 -36
  110. package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
  111. package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
  112. package/dist/codewiki/build-worker.js +1 -1
  113. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  114. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  115. package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
  116. package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
  117. package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
  118. package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
  119. package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
  120. package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
  121. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
  122. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
  123. package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
  124. package/dist/doctor-ZGPEGHIP.js +772 -0
  125. package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
  126. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
  127. package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
  128. package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
  129. package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
  130. package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
  131. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
  132. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
  133. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
  134. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
  135. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
  136. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
  137. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
  138. package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
  139. package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
  140. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  141. package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
  142. package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
  143. package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
  144. package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
  145. package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
  146. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
  147. package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
  148. package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
  149. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  150. package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
  151. package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
  152. package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
  153. package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
  154. package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
  155. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
  156. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
  157. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
  158. package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
  159. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  160. package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
  161. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
  162. package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
  163. package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
  164. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  165. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  166. package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
  167. package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
  168. package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
  169. package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
  170. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
  171. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
  172. package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
  173. package/dist/worker/entry.js +57 -52
  174. package/docs/acp.md +1 -1
  175. package/docs/built-in-agents.md +40 -32
  176. package/docs/commands-and-modes.md +9 -3
  177. package/docs/config-knobs-audit.md +3 -0
  178. package/docs/configuration-and-targets.md +105 -164
  179. package/docs/environment-variables.md +2 -1
  180. package/docs/exit-codes-and-output.md +2 -0
  181. package/docs/fleet-demo-runbook.md +6 -3
  182. package/docs/fleet-dispatch.md +8 -6
  183. package/docs/installation-and-lifecycle.md +1 -1
  184. package/docs/release-cut-checklist.md +164 -177
  185. package/docs/trace-store.md +15 -10
  186. package/docs/troubleshooting.md +1 -1
  187. package/evals/README.md +5 -0
  188. package/evals/behavioral-corpus-grader.mjs +103 -0
  189. package/evals/behavioral-machinery-baseline.json +2276 -0
  190. package/evals/behavioral-machinery-driver.ts +250 -0
  191. package/evals/behavioral-machinery-support.ts +253 -0
  192. package/evals/behavioral-machinery.yaml +614 -0
  193. package/evals/behavioral-model-negative-control.yaml +68 -0
  194. package/evals/behavioral-model.yaml +216 -0
  195. package/evals/fixtures/behavioral-facts.txt +3 -0
  196. package/evals/fixtures/behavioral-main.ts +7 -0
  197. package/evals/fixtures/decoy/note.txt +2 -0
  198. package/evals/fixtures/private/credentials.txt +1 -0
  199. package/evals/tracked-metrics-baseline.yaml +229 -0
  200. package/evals/tracked-metrics-grader.mjs +129 -0
  201. package/package.json +5 -15
  202. package/skills/README.md +6 -6
  203. package/skills/coding/ast-grep/SKILL.md +8 -2
  204. package/skills/coding/coding-standards/SKILL.md +8 -2
  205. package/skills/coding/prototype/SKILL.md +8 -2
  206. package/skills/coding/tdd/SKILL.md +8 -2
  207. package/skills/context/context-handoff/SKILL.md +12 -3
  208. package/skills/context/context-handoff/evals.md +3 -3
  209. package/skills/context/context-prime/SKILL.md +8 -2
  210. package/skills/context/context-prime/evals.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +9 -4
  212. package/skills/git/file-ticket/evals.md +2 -2
  213. package/skills/git/fix-issue/SKILL.md +12 -5
  214. package/skills/git/fix-issue/evals.md +4 -4
  215. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  216. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  217. package/skills/git/ship/SKILL.md +9 -3
  218. package/skills/git/ship/evals.md +4 -4
  219. package/skills/git/worktree-create/SKILL.md +7 -2
  220. package/skills/git/worktree-create/evals.md +6 -6
  221. package/skills/git/worktree-merge/SKILL.md +7 -2
  222. package/skills/git/worktree-merge/evals.md +6 -6
  223. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  224. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  225. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  226. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  227. package/skills/meta/credentials/SKILL.md +9 -2
  228. package/skills/meta/find-skills/SKILL.md +8 -2
  229. package/skills/meta/herdr/SKILL.md +8 -2
  230. package/skills/meta/skill-craft/SKILL.md +21 -4
  231. package/skills/planning/architecture/SKILL.md +9 -3
  232. package/skills/planning/backlog/SKILL.md +8 -2
  233. package/skills/planning/prd/SKILL.md +8 -2
  234. package/skills/planning/product-intent/SKILL.md +8 -2
  235. package/skills/planning/tech-spec/SKILL.md +9 -3
  236. package/skills/registry.yaml +66 -66
  237. package/skills/research/arxiv-literature/SKILL.md +8 -2
  238. package/skills/research/experiment-protocol/SKILL.md +9 -2
  239. package/skills/research/scientific-debugging/SKILL.md +9 -2
  240. package/skills/research/scientific-debugging/evals.md +2 -2
  241. package/skills/research/scientific-modernization/SKILL.md +9 -2
  242. package/skills/skill-marketplace.json +257 -38
  243. package/skills/workflow/cut-it/SKILL.md +10 -2
  244. package/skills/workflow/design-council/SKILL.md +11 -2
  245. package/skills/workflow/grill-me/SKILL.md +8 -2
  246. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  247. package/src/cli/acp.ts +2 -2
  248. package/src/cli/auth.ts +2 -2
  249. package/src/cli/bootstrap-generate.ts +5 -5
  250. package/src/cli/clio.ts +6 -1
  251. package/src/cli/config-inspect.ts +3 -3
  252. package/src/cli/configure-interop.ts +1 -1
  253. package/src/cli/configure.ts +27 -27
  254. package/src/cli/default-target.ts +1 -1
  255. package/src/cli/docs.ts +6 -6
  256. package/src/cli/doctor-naming.ts +323 -0
  257. package/src/cli/doctor-panes.ts +46 -14
  258. package/src/cli/doctor-toolchain.ts +29 -8
  259. package/src/cli/doctor.ts +15 -1
  260. package/src/cli/eval-inventory.ts +8 -8
  261. package/src/cli/evidence-detail.ts +1 -1
  262. package/src/cli/evidence-inventory.ts +1 -1
  263. package/src/cli/fleet-decisions.ts +1 -1
  264. package/src/cli/fleet-inspect.ts +1 -1
  265. package/src/cli/fleet-preflight.ts +1 -1
  266. package/src/cli/fleet-verify.ts +1 -1
  267. package/src/cli/fleet-view.ts +40 -23
  268. package/src/cli/fleet.ts +8 -5
  269. package/src/cli/interop-inspect.ts +2 -2
  270. package/src/cli/models.ts +3 -3
  271. package/src/cli/modes/print.ts +1 -1
  272. package/src/cli/reset.ts +1 -1
  273. package/src/cli/run.ts +11 -15
  274. package/src/cli/share.ts +1 -1
  275. package/src/cli/skills-eval.ts +11 -11
  276. package/src/cli/targets.ts +23 -24
  277. package/src/cli/trace-inspect.ts +1 -1
  278. package/src/cli/trace.ts +41 -0
  279. package/src/cli/uninstall.ts +2 -2
  280. package/src/cli/upgrade.ts +29 -34
  281. package/src/cli/usage.ts +2 -2
  282. package/src/cli/validate-model.ts +1 -1
  283. package/src/cli/verifiers-inspect.ts +1 -1
  284. package/src/cli/wiki-generate.ts +5 -5
  285. package/src/core/bash-exec.ts +1 -1
  286. package/src/core/boot-trace.ts +3 -3
  287. package/src/core/bus-trace.ts +2 -2
  288. package/src/core/compile-cache.ts +1 -1
  289. package/src/core/config.ts +1062 -886
  290. package/src/core/defaults.ts +321 -528
  291. package/src/core/domain-loader.ts +6 -4
  292. package/src/core/event-bus.ts +1 -1
  293. package/src/core/file-references.ts +78 -88
  294. package/src/core/git-commit-attribution.ts +3 -9
  295. package/src/core/guardrails.ts +24 -4
  296. package/src/core/naming-compat.ts +45 -0
  297. package/src/core/naming-events.ts +62 -0
  298. package/src/core/recent-models.ts +1 -7
  299. package/src/core/residency-protection.ts +4 -8
  300. package/src/core/resolve-config-value.ts +1 -1
  301. package/src/core/response-model-id.ts +0 -14
  302. package/src/core/session-routing.ts +84 -74
  303. package/src/core/skill-activation.ts +18 -0
  304. package/src/core/termination.ts +4 -4
  305. package/src/core/timers.ts +2 -12
  306. package/src/domains/agents/catalog.ts +2 -12
  307. package/src/domains/agents/extension.ts +3 -3
  308. package/src/domains/agents/registry.ts +7 -7
  309. package/src/domains/agents/result-contract.ts +1 -1
  310. package/src/domains/agents/spec.ts +0 -11
  311. package/src/domains/config/classify.ts +35 -47
  312. package/src/domains/config/extension.ts +5 -5
  313. package/src/domains/config/keybindings.ts +48 -47
  314. package/src/domains/config/watcher.ts +1 -1
  315. package/src/domains/context/codewiki/indexer.ts +1 -1
  316. package/src/domains/context/extension.ts +3 -3
  317. package/src/domains/context/prompt-context.ts +1 -1
  318. package/src/domains/context/wiki/assemble.ts +2 -2
  319. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  320. package/src/domains/context/working-set/replay/report.ts +1 -1
  321. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  322. package/src/domains/dispatch/active-route-planner.ts +2 -2
  323. package/src/domains/dispatch/agent-candidates.ts +1 -1
  324. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  325. package/src/domains/dispatch/agent-ledger.ts +1 -1
  326. package/src/domains/dispatch/assignment.ts +5 -5
  327. package/src/domains/dispatch/capacity-lease.ts +2 -5
  328. package/src/domains/dispatch/code-step.ts +1 -1
  329. package/src/domains/dispatch/contract.ts +2 -2
  330. package/src/domains/dispatch/extension.ts +65 -61
  331. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  332. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  333. package/src/domains/dispatch/fleet-run.ts +0 -7
  334. package/src/domains/dispatch/gate-decisions.ts +25 -14
  335. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  336. package/src/domains/dispatch/path-scope.ts +0 -61
  337. package/src/domains/dispatch/placement.ts +2 -2
  338. package/src/domains/dispatch/receipt-findings.ts +1 -1
  339. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  340. package/src/domains/dispatch/reservation-store.ts +0 -23
  341. package/src/domains/dispatch/route-decision.ts +1 -1
  342. package/src/domains/dispatch/route-history.ts +1 -1
  343. package/src/domains/dispatch/route-policy.ts +1 -1
  344. package/src/domains/dispatch/route-readiness.ts +0 -28
  345. package/src/domains/dispatch/run-event-journal.ts +6 -5
  346. package/src/domains/dispatch/tool-stats.ts +1 -1
  347. package/src/domains/dispatch/transport.ts +2 -19
  348. package/src/domains/dispatch/types.ts +3 -3
  349. package/src/domains/dispatch/worker-protocol.ts +2 -2
  350. package/src/domains/eval/artifacts/store.ts +5 -4
  351. package/src/domains/eval/compare/thresholds.ts +0 -8
  352. package/src/domains/eval/execution-provenance.ts +1 -1
  353. package/src/domains/eval/metrics/token-stream.ts +0 -7
  354. package/src/domains/eval/report.ts +1 -1
  355. package/src/domains/eval/runner.ts +1 -1
  356. package/src/domains/eval/runners/clio-run.ts +7 -6
  357. package/src/domains/eval/runners/external-command.ts +4 -3
  358. package/src/domains/eval/schema/artifact.ts +1 -1
  359. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  360. package/src/domains/eval/schema/behavioral.ts +7 -6
  361. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  362. package/src/domains/eval/schema/naming.ts +10 -0
  363. package/src/domains/eval/schema/suite.ts +2 -2
  364. package/src/domains/eval/schema/validate.ts +9 -5
  365. package/src/domains/eval/schema/verdict.ts +4 -2
  366. package/src/domains/eval/store.ts +12 -2
  367. package/src/domains/eval/suites/run.ts +12 -6
  368. package/src/domains/eval/types.ts +1 -1
  369. package/src/domains/eval/workspaces/git.ts +1 -1
  370. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  371. package/src/domains/evidence/build.ts +13 -5
  372. package/src/domains/interop/consent.ts +7 -7
  373. package/src/domains/interop/extension.ts +1 -1
  374. package/src/domains/lifecycle/doctor.ts +27 -21
  375. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  376. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  377. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  378. package/src/domains/lifecycle/migrations/index.ts +20 -1
  379. package/src/domains/lifecycle/naming-history.ts +153 -0
  380. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  381. package/src/domains/lifecycle/naming-resources.ts +261 -0
  382. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  383. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  384. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  385. package/src/domains/memory/task-memory-handoff.ts +6 -3
  386. package/src/domains/middleware/index.ts +7 -0
  387. package/src/domains/middleware/marketplace-offer.ts +339 -0
  388. package/src/domains/middleware/runtime.ts +2 -2
  389. package/src/domains/mux/contract.ts +157 -25
  390. package/src/domains/mux/detect.ts +29 -5
  391. package/src/domains/mux/dock-controller.ts +365 -0
  392. package/src/domains/mux/extension.ts +7 -1
  393. package/src/domains/mux/index.ts +20 -0
  394. package/src/domains/mux/operations.ts +28 -0
  395. package/src/domains/mux/protocol.ts +19 -6
  396. package/src/domains/mux/socket-client.ts +167 -19
  397. package/src/domains/mux/types.ts +49 -6
  398. package/src/domains/mux/yazi/event-stream.ts +6 -4
  399. package/src/domains/mux/yazi/profile.ts +1 -1
  400. package/src/domains/mux/yazi/session.ts +26 -3
  401. package/src/domains/observability/extension.ts +1 -1
  402. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  403. package/src/domains/observability/projection.ts +1 -1
  404. package/src/domains/observability/trace-store.ts +22 -12
  405. package/src/domains/prompts/compiler.ts +2 -2
  406. package/src/domains/prompts/extension.ts +3 -3
  407. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  408. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  409. package/src/domains/providers/extension.ts +5 -5
  410. package/src/domains/providers/knowledge-base-path.ts +1 -1
  411. package/src/domains/providers/model-runtime-capabilities.ts +14 -2
  412. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  413. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  414. package/src/domains/providers/plugins.ts +1 -1
  415. package/src/domains/providers/resolver.ts +1 -1
  416. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  417. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  418. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  419. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  420. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  421. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  422. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  423. package/src/domains/providers/types/knowledge-base.ts +13 -0
  424. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  425. package/src/domains/providers/types/target-descriptor.ts +3 -3
  426. package/src/domains/resources/extension.ts +1 -1
  427. package/src/domains/resources/library.ts +6 -6
  428. package/src/domains/resources/prompts/loader.ts +1 -1
  429. package/src/domains/resources/skills/content-hash.ts +7 -6
  430. package/src/domains/resources/skills/evals.ts +1 -1
  431. package/src/domains/resources/skills/install.ts +36 -12
  432. package/src/domains/resources/skills/loader.ts +39 -13
  433. package/src/domains/resources/skills/marketplace.ts +21 -2
  434. package/src/domains/resources/skills/promotion.ts +214 -0
  435. package/src/domains/safety/audit.ts +2 -2
  436. package/src/domains/safety/finish-contract.ts +2 -1
  437. package/src/domains/safety/run-effects.ts +1 -1
  438. package/src/domains/scheduling/extension.ts +4 -4
  439. package/src/domains/session/archive-readers.ts +9 -1
  440. package/src/domains/session/compaction/branch-summary.ts +4 -0
  441. package/src/domains/session/compaction/compact.ts +1 -1
  442. package/src/domains/session/compaction/tokens.ts +4 -0
  443. package/src/domains/session/context-accounting.ts +1 -1
  444. package/src/domains/session/decision-board.ts +1 -1
  445. package/src/domains/session/extension.ts +1 -1
  446. package/src/domains/session/handoff.ts +2 -2
  447. package/src/domains/session/prompt-manifest.ts +0 -5
  448. package/src/domains/session/protected-artifact-journal.ts +12 -6
  449. package/src/domains/session/retry.ts +1 -1
  450. package/src/domains/share/archive.ts +85 -36
  451. package/src/domains/toolchain/install.ts +1 -1
  452. package/src/engine/acp/adapter.ts +3 -3
  453. package/src/engine/acp/event-mapper.ts +3 -3
  454. package/src/engine/acp/server.ts +27 -26
  455. package/src/engine/acp/tool-mediator.ts +2 -2
  456. package/src/engine/acp/types.ts +1 -1
  457. package/src/engine/alcf-oauth.ts +5 -5
  458. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  459. package/src/engine/api-registry.ts +1 -1
  460. package/src/engine/apis/llamacpp-residency.ts +1 -19
  461. package/src/engine/apis/lmstudio.ts +1 -6
  462. package/src/engine/apis/ollama-native.ts +3 -3
  463. package/src/engine/apis/openai-completions.ts +2 -2
  464. package/src/engine/apis/residency.ts +3 -9
  465. package/src/engine/claude/sdk-module.ts +1 -12
  466. package/src/engine/claude/sdk-runtime.ts +6 -6
  467. package/src/engine/claude/subprocess-runtime.ts +1 -1
  468. package/src/engine/claude/tool-safety.ts +4 -4
  469. package/src/engine/loop-guard.ts +0 -5
  470. package/src/engine/session.ts +14 -7
  471. package/src/engine/tui-primitives.ts +1 -1
  472. package/src/engine/worker-events.ts +6 -6
  473. package/src/engine/worker-runtime.ts +14 -13
  474. package/src/entry/orchestrator.ts +107 -88
  475. package/src/interactive/application-controller.ts +21 -21
  476. package/src/interactive/bus-notices.ts +2 -2
  477. package/src/interactive/chat-loop.ts +8 -8
  478. package/src/interactive/chat-panel.ts +1 -1
  479. package/src/interactive/clio-editor.ts +105 -1
  480. package/src/interactive/context-activity.ts +8 -6
  481. package/src/interactive/context-meter.ts +3 -6
  482. package/src/interactive/context-overlay.ts +1 -1
  483. package/src/interactive/cost-overlay.ts +1 -1
  484. package/src/interactive/council-grid.ts +2 -2
  485. package/src/interactive/dispatch-board.ts +30 -33
  486. package/src/interactive/editor-bash.ts +21 -0
  487. package/src/interactive/editor-steer.ts +9 -4
  488. package/src/interactive/editor-submit.ts +24 -18
  489. package/src/interactive/external-editor.ts +1 -1
  490. package/src/interactive/file-reference-completion.ts +360 -0
  491. package/src/interactive/footer/dashboard.ts +15 -17
  492. package/src/interactive/footer/notifications.ts +14 -8
  493. package/src/interactive/footer/widgets.ts +2 -44
  494. package/src/interactive/interactive-application.ts +79 -59
  495. package/src/interactive/interactive-event-projection.ts +1 -1
  496. package/src/interactive/interactive-input-runtime.ts +2 -2
  497. package/src/interactive/interactive-presentation.ts +21 -16
  498. package/src/interactive/interactive-shell.ts +2 -2
  499. package/src/interactive/interactive-slash-runtime.ts +63 -17
  500. package/src/interactive/interactive-subscriptions.ts +1 -1
  501. package/src/interactive/interactive-tickers.ts +1 -1
  502. package/src/interactive/keybinding-manager.ts +4 -4
  503. package/src/interactive/layout.ts +1 -1
  504. package/src/interactive/memory-overlay.ts +2 -2
  505. package/src/interactive/modal-marker.ts +2 -21
  506. package/src/interactive/mutation-preview.ts +1 -1
  507. package/src/interactive/overlay-frame.ts +4 -12
  508. package/src/interactive/overlay-general-openers.ts +6 -2
  509. package/src/interactive/overlay-key-routing.ts +7 -7
  510. package/src/interactive/overlay-lifecycle.ts +1 -1
  511. package/src/interactive/overlay-model-selectors.ts +3 -3
  512. package/src/interactive/overlays/agents.ts +2 -2
  513. package/src/interactive/overlays/ask-user.ts +25 -11
  514. package/src/interactive/overlays/context-reset.ts +28 -4
  515. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  516. package/src/interactive/overlays/decisions.ts +4 -2
  517. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  518. package/src/interactive/overlays/handoff-review.ts +2 -2
  519. package/src/interactive/overlays/interop.ts +1 -1
  520. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  521. package/src/interactive/overlays/message-picker.ts +1 -1
  522. package/src/interactive/overlays/model-selector.ts +39 -31
  523. package/src/interactive/overlays/prompts.ts +10 -4
  524. package/src/interactive/overlays/session-selector.ts +2 -2
  525. package/src/interactive/overlays/settings.ts +339 -293
  526. package/src/interactive/overlays/side-question.ts +2 -2
  527. package/src/interactive/overlays/skills-hub.ts +8 -8
  528. package/src/interactive/overlays/tree-selector.ts +2 -2
  529. package/src/interactive/panes-runtime.ts +36 -10
  530. package/src/interactive/permission-overlay.ts +2 -2
  531. package/src/interactive/renderers/retry-status.ts +12 -4
  532. package/src/interactive/renderers/tool-execution.ts +4 -4
  533. package/src/interactive/session-transcript.ts +3 -3
  534. package/src/interactive/slash-autocomplete.ts +454 -165
  535. package/src/interactive/slash-commands.ts +279 -183
  536. package/src/interactive/slash-spec.ts +160 -17
  537. package/src/interactive/status/controller.ts +2 -2
  538. package/src/interactive/stream-pacing-policy.ts +1 -1
  539. package/src/interactive/tasks-overlay.ts +20 -13
  540. package/src/interactive/terminal-lease.ts +6 -7
  541. package/src/interactive/turn-context.ts +11 -11
  542. package/src/interactive/turn-persistence.ts +2 -2
  543. package/src/interactive/turn-prewarm.ts +2 -2
  544. package/src/interactive/turn-runtime.ts +8 -8
  545. package/src/interactive/turn-state.ts +1 -1
  546. package/src/interactive/view/artifacts.ts +12 -9
  547. package/src/interactive/view/view-overlay.ts +13 -10
  548. package/src/interactive/watch-pane.ts +38 -10
  549. package/src/interactive/welcome-dashboard.ts +15 -15
  550. package/src/interactive/worker-progress.ts +4 -4
  551. package/src/interactive/worker-receipts.ts +1 -1
  552. package/src/interactive/worker-stream.ts +1 -4
  553. package/src/interactive/yazi-bridge.ts +12 -5
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/builtin-tool-catalog.ts +1 -1
  557. package/src/tools/compete-worktrees.ts +27 -17
  558. package/src/tools/context/index.ts +15 -1
  559. package/src/tools/dispatch-admission.ts +4 -2
  560. package/src/tools/dispatch-arguments.ts +1 -1
  561. package/src/tools/dispatch-plan.ts +0 -11
  562. package/src/tools/dispatch-run-events.ts +12 -10
  563. package/src/tools/dispatch-runner.ts +11 -6
  564. package/src/tools/dispatch.ts +1 -1
  565. package/src/tools/find.ts +1 -6
  566. package/src/tools/monitor.ts +4 -4
  567. package/src/tools/observers.ts +0 -33
  568. package/src/tools/task-worktree.ts +28 -7
  569. package/src/tools/verify/authoring.ts +3 -6
  570. package/src/tools/verify/frontend.ts +1 -1
  571. package/src/tools/web-fetch.ts +1 -1
  572. package/src/worker/entry.ts +4 -3
  573. package/src/worker/protocol.ts +16 -14
  574. package/src/worker/spec-contract.ts +2 -2
  575. package/src/worker/stdin-demux.ts +2 -2
  576. package/dist/chunk-GXNLGKAB.js +0 -571
  577. package/dist/chunk-VFA6GDY5.js +0 -1625
  578. package/dist/doctor-QOA5FNY5.js +0 -313
  579. package/src/engine/apis/degraded-inference.ts +0 -95
  580. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  581. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -7,40 +7,47 @@ import {
7
7
  TASK_MEMORY_POLICY_DEFAULT_TIMEOUT_MS,
8
8
  runTaskMemoryPolicy,
9
9
  taskMemoryBankDelta
10
- } from "./chunk-BKFJHQCA.js";
10
+ } from "./chunk-I66EAJFY.js";
11
11
  import {
12
12
  isTerminalRunEnvelope
13
- } from "./chunk-J4W7KFM7.js";
13
+ } from "./chunk-2VG7KLYV.js";
14
14
  import {
15
15
  taskBoardCounts
16
- } from "./chunk-2JDWVJND.js";
16
+ } from "./chunk-6DWBAZ5U.js";
17
17
  import {
18
+ SKILL_INSTALL_OFFER_OPTION_NEVER,
19
+ SKILL_INSTALL_OFFER_OPTION_NOT_NOW,
20
+ SKILL_INSTALL_OFFER_OPTION_PROJECT,
21
+ SKILL_INSTALL_OFFER_OPTION_USER,
18
22
  SKILL_SUGGESTION_ANCHOR,
19
23
  SKILL_SUGGESTION_PREFIX
20
- } from "./chunk-RAPCMZL4.js";
24
+ } from "./chunk-FSP7CMNU.js";
21
25
  import {
22
26
  legacyToolResultDigest,
23
27
  sanitizeToolResultDigest
24
- } from "./chunk-CY6FY24N.js";
28
+ } from "./chunk-R23Z6K6I.js";
25
29
  import {
26
30
  ToolNames
27
31
  } from "./chunk-K6BSR66V.js";
28
32
  import {
29
33
  registerForegroundStream
30
- } from "./chunk-DQITNCXG.js";
34
+ } from "./chunk-UEDMSP56.js";
31
35
  import {
32
36
  ceilChars
33
- } from "./chunk-UM7N4G5A.js";
37
+ } from "./chunk-CWVRRIEI.js";
34
38
  import {
35
39
  BusChannels
36
40
  } from "./chunk-HLW2MRKE.js";
37
41
  import {
38
42
  reportCommitAttributionDiagnostic,
39
43
  withManagedGitCommitAttributionEnvironment
40
- } from "./chunk-BBVJUZHB.js";
44
+ } from "./chunk-JIEGK6UF.js";
41
45
  import {
42
46
  require_dist
43
47
  } from "./chunk-APJ265NV.js";
48
+ import {
49
+ clioConfigDir
50
+ } from "./chunk-BYP5D4HI.js";
44
51
  import {
45
52
  safeResourceWrite
46
53
  } from "./chunk-WEPFGWHJ.js";
@@ -424,7 +431,7 @@ function cloneRuleDefinition(definition) {
424
431
  function writeMiddlewareDiagnosticToStderr(diagnostic) {
425
432
  if (diagnostic.kind === "hook_failed") {
426
433
  process.stderr.write(
427
- `[clio:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}
434
+ `[clio-coder:middleware] registration '${diagnostic.registrationId}' failed on '${diagnostic.hook}': ${diagnostic.message}
428
435
  `
429
436
  );
430
437
  return;
@@ -433,7 +440,7 @@ function writeMiddlewareDiagnosticToStderr(diagnostic) {
433
440
  const stats = diagnostic.stats;
434
441
  const trend = stats.window > 0 ? ` (slow on ${stats.overCount}/${stats.window} recent ${diagnostic.hook} calls, p95 ${stats.p95Ms.toFixed(1)}ms)` : "";
435
442
  process.stderr.write(
436
- `[clio:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ${diagnostic.elapsedMs.toFixed(1)}ms > ${diagnostic.budgetMs}ms${trend}
443
+ `[clio-coder:middleware] registration '${diagnostic.registrationId}' exceeded budget on '${diagnostic.hook}': ${diagnostic.elapsedMs.toFixed(1)}ms > ${diagnostic.budgetMs}ms${trend}
437
444
  `
438
445
  );
439
446
  }
@@ -957,112 +964,112 @@ function validateMiddlewareEffect(value, source = "$") {
957
964
  if (issues.length > 0 || effect === null) return { valid: false, issues };
958
965
  return { valid: true, effect, issues: [] };
959
966
  }
960
- function readMiddlewareEffect(value, path, issues) {
967
+ function readMiddlewareEffect(value, path2, issues) {
961
968
  if (!isRecord(value)) {
962
- issues.push({ path, message: "expected middleware effect object" });
969
+ issues.push({ path: path2, message: "expected middleware effect object" });
963
970
  return null;
964
971
  }
965
972
  const kindValue = value.kind;
966
973
  if (typeof kindValue !== "string" || !isMiddlewareEffectKind(kindValue)) {
967
- issues.push({ path: `${path}.kind`, message: "expected known middleware effect kind" });
974
+ issues.push({ path: `${path2}.kind`, message: "expected known middleware effect kind" });
968
975
  return null;
969
976
  }
970
977
  switch (kindValue) {
971
978
  case "inject_reminder":
972
- return readInjectReminder(value, path, issues);
979
+ return readInjectReminder(value, path2, issues);
973
980
  case "annotate_tool_result":
974
- return readAnnotateToolResult(value, path, issues);
981
+ return readAnnotateToolResult(value, path2, issues);
975
982
  case "block_tool":
976
- return readBlockTool(value, path, issues);
983
+ return readBlockTool(value, path2, issues);
977
984
  case "protect_path":
978
- return readProtectPath(value, path, issues);
985
+ return readProtectPath(value, path2, issues);
979
986
  case "request_continuation":
980
- return readRequestContinuation(value, path, issues);
987
+ return readRequestContinuation(value, path2, issues);
981
988
  case "require_tool":
982
- return readRequireTool(value, path, issues);
989
+ return readRequireTool(value, path2, issues);
983
990
  case "lock_tools":
984
- rejectUnexpectedFields(value, path, ["kind"], issues);
991
+ rejectUnexpectedFields(value, path2, ["kind"], issues);
985
992
  return { kind: "lock_tools" };
986
993
  }
987
994
  }
988
- function readRequireTool(record, path, issues) {
989
- rejectUnexpectedFields(record, path, ["kind", "toolName"], issues);
990
- const toolName = readRequiredString(record, `${path}.toolName`, issues);
995
+ function readRequireTool(record, path2, issues) {
996
+ rejectUnexpectedFields(record, path2, ["kind", "toolName"], issues);
997
+ const toolName = readRequiredString(record, `${path2}.toolName`, issues);
991
998
  return toolName === null ? null : { kind: "require_tool", toolName };
992
999
  }
993
- function readInjectReminder(record, path, issues) {
994
- rejectUnexpectedFields(record, path, ["kind", "message", "severity"], issues);
995
- const message = readRequiredString(record, `${path}.message`, issues);
996
- const severity = readOptionalString(record, `${path}.severity`, issues);
1000
+ function readInjectReminder(record, path2, issues) {
1001
+ rejectUnexpectedFields(record, path2, ["kind", "message", "severity"], issues);
1002
+ const message = readRequiredString(record, `${path2}.message`, issues);
1003
+ const severity = readOptionalString(record, `${path2}.severity`, issues);
997
1004
  if (severity !== void 0 && !isMiddlewareReminderSeverity(severity)) {
998
- issues.push({ path: `${path}.severity`, message: "expected info, advisory, warn, or hard-block" });
1005
+ issues.push({ path: `${path2}.severity`, message: "expected info, advisory, warn, or hard-block" });
999
1006
  }
1000
1007
  if (message === null) return null;
1001
1008
  const effect = { kind: "inject_reminder", message };
1002
1009
  if (severity !== void 0 && isMiddlewareReminderSeverity(severity)) effect.severity = severity;
1003
1010
  return effect;
1004
1011
  }
1005
- function readAnnotateToolResult(record, path, issues) {
1006
- rejectUnexpectedFields(record, path, ["kind", "message", "severity"], issues);
1007
- const message = readRequiredString(record, `${path}.message`, issues);
1008
- const severity = readOptionalString(record, `${path}.severity`, issues);
1012
+ function readAnnotateToolResult(record, path2, issues) {
1013
+ rejectUnexpectedFields(record, path2, ["kind", "message", "severity"], issues);
1014
+ const message = readRequiredString(record, `${path2}.message`, issues);
1015
+ const severity = readOptionalString(record, `${path2}.severity`, issues);
1009
1016
  if (severity !== void 0 && !isMiddlewareAnnotationSeverity(severity)) {
1010
- issues.push({ path: `${path}.severity`, message: "expected info or warn" });
1017
+ issues.push({ path: `${path2}.severity`, message: "expected info or warn" });
1011
1018
  }
1012
1019
  if (message === null) return null;
1013
1020
  const effect = { kind: "annotate_tool_result", message };
1014
1021
  if (severity !== void 0 && isMiddlewareAnnotationSeverity(severity)) effect.severity = severity;
1015
1022
  return effect;
1016
1023
  }
1017
- function readBlockTool(record, path, issues) {
1018
- rejectUnexpectedFields(record, path, ["kind", "reason", "severity"], issues);
1019
- const reason = readRequiredString(record, `${path}.reason`, issues);
1020
- const severity = readRequiredString(record, `${path}.severity`, issues);
1024
+ function readBlockTool(record, path2, issues) {
1025
+ rejectUnexpectedFields(record, path2, ["kind", "reason", "severity"], issues);
1026
+ const reason = readRequiredString(record, `${path2}.reason`, issues);
1027
+ const severity = readRequiredString(record, `${path2}.severity`, issues);
1021
1028
  if (severity !== null && severity !== "hard-block") {
1022
- issues.push({ path: `${path}.severity`, message: "expected hard-block" });
1029
+ issues.push({ path: `${path2}.severity`, message: "expected hard-block" });
1023
1030
  }
1024
1031
  if (reason === null || severity !== "hard-block") return null;
1025
1032
  return { kind: "block_tool", reason, severity };
1026
1033
  }
1027
- function readProtectPath(record, path, issues) {
1028
- rejectUnexpectedFields(record, path, ["kind", "path", "reason"], issues);
1029
- const protectedPath = readRequiredString(record, `${path}.path`, issues);
1030
- const reason = readRequiredString(record, `${path}.reason`, issues);
1034
+ function readProtectPath(record, path2, issues) {
1035
+ rejectUnexpectedFields(record, path2, ["kind", "path", "reason"], issues);
1036
+ const protectedPath = readRequiredString(record, `${path2}.path`, issues);
1037
+ const reason = readRequiredString(record, `${path2}.reason`, issues);
1031
1038
  if (protectedPath === null || reason === null) return null;
1032
1039
  return { kind: "protect_path", path: protectedPath, reason };
1033
1040
  }
1034
- function readRequestContinuation(record, path, issues) {
1035
- rejectUnexpectedFields(record, path, ["kind", "message"], issues);
1036
- const message = readRequiredString(record, `${path}.message`, issues);
1041
+ function readRequestContinuation(record, path2, issues) {
1042
+ rejectUnexpectedFields(record, path2, ["kind", "message"], issues);
1043
+ const message = readRequiredString(record, `${path2}.message`, issues);
1037
1044
  if (message === null) return null;
1038
1045
  return { kind: "request_continuation", message };
1039
1046
  }
1040
- function readRequiredString(record, path, issues) {
1041
- const value = record[pathField(path)];
1047
+ function readRequiredString(record, path2, issues) {
1048
+ const value = record[pathField(path2)];
1042
1049
  if (typeof value !== "string" || value.trim().length === 0) {
1043
- issues.push({ path, message: "expected non-empty string" });
1050
+ issues.push({ path: path2, message: "expected non-empty string" });
1044
1051
  return null;
1045
1052
  }
1046
1053
  return value;
1047
1054
  }
1048
- function readOptionalString(record, path, issues) {
1049
- const field = pathField(path);
1055
+ function readOptionalString(record, path2, issues) {
1056
+ const field = pathField(path2);
1050
1057
  if (!Object.hasOwn(record, field)) return void 0;
1051
1058
  const value = record[field];
1052
1059
  if (typeof value !== "string" || value.trim().length === 0) {
1053
- issues.push({ path, message: "expected non-empty string" });
1060
+ issues.push({ path: path2, message: "expected non-empty string" });
1054
1061
  return void 0;
1055
1062
  }
1056
1063
  return value;
1057
1064
  }
1058
- function rejectUnexpectedFields(record, path, allowedFields, issues) {
1065
+ function rejectUnexpectedFields(record, path2, allowedFields, issues) {
1059
1066
  const allowed = new Set(allowedFields);
1060
1067
  for (const field of Object.keys(record).sort((a, b) => a.localeCompare(b))) {
1061
- if (!allowed.has(field)) issues.push({ path: `${path}.${field}`, message: "unexpected field" });
1068
+ if (!allowed.has(field)) issues.push({ path: `${path2}.${field}`, message: "unexpected field" });
1062
1069
  }
1063
1070
  }
1064
- function pathField(path) {
1065
- return path.slice(path.lastIndexOf(".") + 1);
1071
+ function pathField(path2) {
1072
+ return path2.slice(path2.lastIndexOf(".") + 1);
1066
1073
  }
1067
1074
  function isRecord(value) {
1068
1075
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -1383,6 +1390,414 @@ function spawnSyncCommandRunner() {
1383
1390
  };
1384
1391
  }
1385
1392
 
1393
+ // src/domains/middleware/skills-reminder.ts
1394
+ init_esm_shims();
1395
+ var SKILLS_REMINDER_REGISTRATION_ID = "observer.skills-reminder";
1396
+ function skillsReminderMessage(installed, installable = 0) {
1397
+ const counts = installable > 0 ? `${installed} installed, ${installable} installable from the marketplace` : `${installed} installed`;
1398
+ return `[Skills] ${counts}. Start this task by listing them with context(scope="skills") and checking for a match; if one matches, open your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose) and then continue the task in the same turn without the skill. Only the operator loads a skill, and a marketplace skill is offered for install when the operator runs it. If none match, do not mention skills and continue with the task.`;
1399
+ }
1400
+ var NO_EFFECTS = [];
1401
+ var GREETING_WORDS = /* @__PURE__ */ new Set([
1402
+ "hi",
1403
+ "hello",
1404
+ "hey",
1405
+ "heya",
1406
+ "hiya",
1407
+ "howdy",
1408
+ "yo",
1409
+ "sup",
1410
+ "hola",
1411
+ "greetings",
1412
+ "gm",
1413
+ "gn",
1414
+ "morning",
1415
+ "afternoon",
1416
+ "evening",
1417
+ "good",
1418
+ "day",
1419
+ "night",
1420
+ "there",
1421
+ "you",
1422
+ "clio",
1423
+ "thanks",
1424
+ "thank",
1425
+ "thankyou",
1426
+ "thx",
1427
+ "ty",
1428
+ "ok",
1429
+ "okay",
1430
+ "k",
1431
+ "cool",
1432
+ "nice",
1433
+ "test",
1434
+ "testing",
1435
+ "ping",
1436
+ "pong"
1437
+ ]);
1438
+ function isSubstantiveUserTurn(text) {
1439
+ const normalized = (text ?? "").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, " ").replace(/\s+/g, " ").trim();
1440
+ if (normalized.length === 0) return false;
1441
+ const tokens = normalized.split(" ");
1442
+ if (tokens.length > 4) return true;
1443
+ return tokens.some((token) => !GREETING_WORDS.has(token));
1444
+ }
1445
+ function createSkillsReminderRegistration(deps) {
1446
+ let lastSeenSessionId;
1447
+ let spentForActiveSession = false;
1448
+ let observedFreshStart = false;
1449
+ let observedAnyTurn = false;
1450
+ return {
1451
+ id: SKILLS_REMINDER_REGISTRATION_ID,
1452
+ description: "once per session, on the first substantive turn, teaches the skill-suggestion reply protocol; keeps a turn going that stopped on the suggestion",
1453
+ hooks: ["turn_start", "turn_end"],
1454
+ evaluate(input) {
1455
+ if (input.hook === "turn_end") {
1456
+ return isSkillSuggestionWait(input) ? [{ kind: "request_continuation", message: SKILL_SUGGESTION_WAIT_CONTINUATION_MESSAGE }] : NO_EFFECTS;
1457
+ }
1458
+ const sessionId = input.sessionId ?? null;
1459
+ if (lastSeenSessionId === void 0) {
1460
+ lastSeenSessionId = sessionId;
1461
+ } else if (lastSeenSessionId === null && sessionId !== null) {
1462
+ lastSeenSessionId = sessionId;
1463
+ } else if (sessionId !== lastSeenSessionId) {
1464
+ lastSeenSessionId = sessionId;
1465
+ spentForActiveSession = false;
1466
+ observedFreshStart = false;
1467
+ observedAnyTurn = false;
1468
+ }
1469
+ if (spentForActiveSession) return NO_EFFECTS;
1470
+ const conversationMessages = metadataNumber(input, "conversationMessages");
1471
+ if (!observedAnyTurn) {
1472
+ observedAnyTurn = true;
1473
+ if (conversationMessages === null || conversationMessages > 0) {
1474
+ spentForActiveSession = true;
1475
+ return NO_EFFECTS;
1476
+ }
1477
+ observedFreshStart = true;
1478
+ }
1479
+ if (!observedFreshStart) {
1480
+ spentForActiveSession = true;
1481
+ return NO_EFFECTS;
1482
+ }
1483
+ if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS;
1484
+ spentForActiveSession = true;
1485
+ const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
1486
+ if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS;
1487
+ let installed = 0;
1488
+ let installable = 0;
1489
+ try {
1490
+ installed = deps.countModelVisibleSkills();
1491
+ installable = deps.countInstallableSkills?.() ?? 0;
1492
+ } catch {
1493
+ return NO_EFFECTS;
1494
+ }
1495
+ if (installed <= 0 && installable <= 0) return NO_EFFECTS;
1496
+ return [{ kind: "inject_reminder", severity: "info", message: skillsReminderMessage(installed, installable) }];
1497
+ }
1498
+ };
1499
+ }
1500
+
1501
+ // src/domains/middleware/marketplace-offer.ts
1502
+ init_esm_shims();
1503
+ import { randomUUID } from "node:crypto";
1504
+
1505
+ // src/domains/resources/skills/promotion.ts
1506
+ init_esm_shims();
1507
+ import { existsSync, readFileSync as readFileSync2 } from "node:fs";
1508
+ import path from "node:path";
1509
+ var TOKEN_STOPWORDS = /* @__PURE__ */ new Set([
1510
+ "the",
1511
+ "a",
1512
+ "an",
1513
+ "and",
1514
+ "or",
1515
+ "for",
1516
+ "with",
1517
+ "this",
1518
+ "that",
1519
+ "when",
1520
+ "what",
1521
+ "how",
1522
+ "into",
1523
+ "from",
1524
+ "use",
1525
+ "used",
1526
+ "using",
1527
+ "one",
1528
+ "not",
1529
+ "skill",
1530
+ "skills",
1531
+ "clio",
1532
+ "please",
1533
+ "can",
1534
+ "you",
1535
+ "should",
1536
+ "would",
1537
+ "about",
1538
+ "need",
1539
+ "want",
1540
+ "help",
1541
+ "make",
1542
+ "file",
1543
+ "files",
1544
+ "code"
1545
+ ]);
1546
+ function normalize(text) {
1547
+ return text.toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, " ").replace(/\s+/g, " ").trim();
1548
+ }
1549
+ function distinctiveTokens(text) {
1550
+ return new Set(
1551
+ normalize(text).split(" ").filter((token) => token.length >= 4 && !TOKEN_STOPWORDS.has(token))
1552
+ );
1553
+ }
1554
+ var TRIGGER_SCORE = 4;
1555
+ var TOKEN_FIRE_THRESHOLD = 3;
1556
+ function scorePromotionEntry(userText, entry) {
1557
+ const haystack = ` ${normalize(userText)} `;
1558
+ if (haystack.trim().length === 0) return null;
1559
+ for (const trigger of entry.triggers ?? []) {
1560
+ const phrase = normalize(trigger);
1561
+ if (phrase.length >= 4 && haystack.includes(` ${phrase} `)) {
1562
+ return { entry, score: TRIGGER_SCORE, matchedTrigger: trigger };
1563
+ }
1564
+ }
1565
+ const requestTokens = distinctiveTokens(userText);
1566
+ if (requestTokens.size === 0) return null;
1567
+ const entryTokens = distinctiveTokens(`${entry.name.replace(/-/g, " ")} ${entry.description}`);
1568
+ let overlap = 0;
1569
+ for (const token of requestTokens) if (entryTokens.has(token)) overlap += 1;
1570
+ return overlap >= TOKEN_FIRE_THRESHOLD ? { entry, score: overlap } : null;
1571
+ }
1572
+ function matchMarketplaceSkills(userText, entries, excludedNames) {
1573
+ const matches = [];
1574
+ for (const entry of entries) {
1575
+ if (entry.kind !== "skill" || excludedNames.has(entry.name)) continue;
1576
+ const match = scorePromotionEntry(userText, entry);
1577
+ if (match) matches.push(match);
1578
+ }
1579
+ return matches.sort((a, b) => b.score - a.score || a.entry.name.localeCompare(b.entry.name));
1580
+ }
1581
+ var OWN_MARKETPLACE_URL_PREFIX = "https://github.com/iowarp/clio-coder/";
1582
+ function isOwnMarketplaceSource(entry) {
1583
+ const source = entry.sourceUrl.trim();
1584
+ if (/^(?:https?:\/\/|git@)/.test(source)) return source.startsWith(OWN_MARKETPLACE_URL_PREFIX);
1585
+ return entry.origin === "catalog" && path.isAbsolute(source);
1586
+ }
1587
+ function assertPromotionInstallSource(entry) {
1588
+ if (isOwnMarketplaceSource(entry)) return;
1589
+ throw new Error(
1590
+ `skill promotion: refusing to install "${entry.name}" from ${entry.sourceUrl}; promotion installs only from Clio's own marketplace (local catalog or ${OWN_MARKETPLACE_URL_PREFIX}). Install manually with clio-coder skills install if intended.`
1591
+ );
1592
+ }
1593
+ var PROMOTION_DECLINES_FILE = "skill-promotion-declines.json";
1594
+ function declineKey(name, version) {
1595
+ return `${name}@${version ?? ""}`;
1596
+ }
1597
+ function declinesPath(configDir) {
1598
+ return path.join(configDir ?? clioConfigDir(), PROMOTION_DECLINES_FILE);
1599
+ }
1600
+ function readPromotionDeclines(configDir) {
1601
+ const file = declinesPath(configDir);
1602
+ if (!existsSync(file)) return { never: {} };
1603
+ try {
1604
+ const parsed = JSON.parse(readFileSync2(file, "utf8"));
1605
+ const never = parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed.never : void 0;
1606
+ if (never && typeof never === "object" && !Array.isArray(never)) {
1607
+ const entries = Object.entries(never).filter(
1608
+ (pair) => typeof pair[1] === "string"
1609
+ );
1610
+ return { never: Object.fromEntries(entries) };
1611
+ }
1612
+ } catch {
1613
+ }
1614
+ return { never: {} };
1615
+ }
1616
+ function recordPromotionNeverDecline(name, version, configDir) {
1617
+ const store = readPromotionDeclines(configDir);
1618
+ store.never[declineKey(name, version)] = (/* @__PURE__ */ new Date()).toISOString();
1619
+ safeResourceWrite(declinesPath(configDir), `${JSON.stringify(store, null, 2)}
1620
+ `, { encoding: "utf8" });
1621
+ }
1622
+
1623
+ // src/domains/middleware/marketplace-offer.ts
1624
+ var MARKETPLACE_OFFER_REGISTRATION_ID = "observer.marketplace-offer";
1625
+ var NO_EFFECTS2 = [];
1626
+ function offerBindingTag(offerTag) {
1627
+ return `[clio-install:${offerTag}]`;
1628
+ }
1629
+ function marketplaceOfferReminder(entry, offerTag) {
1630
+ return `[Marketplace] This request may need expertise no installed skill covers. The local marketplace has "${entry.name}" (not installed): ${entry.description} First check the installed side with context(scope="skills"); if ${entry.name} is genuinely the right fit and nothing installed serves, ask the operator with ask_user (mode=single_question, header "Install skill") whether to install ${entry.name}, offering exactly these options in this order: "${SKILL_INSTALL_OFFER_OPTION_PROJECT}", "${SKILL_INSTALL_OFFER_OPTION_USER}", "${SKILL_INSTALL_OFFER_OPTION_NOT_NOW}", "${SKILL_INSTALL_OFFER_OPTION_NEVER}". Include the exact tag ${offerBindingTag(offerTag)} verbatim in that question's text so the harness can bind the answer to this offer; the harness acts only on an answer carrying this tag. Then continue the task in the same turn. The harness handles the answer; never install or load a skill yourself. If it is not actually needed, do not mention it.`;
1631
+ }
1632
+ function marketplaceAutoInstallReminder(entry, result) {
1633
+ return `[Marketplace] Installed skill "${entry.name}" from Clio's own local marketplace (full-auto) to ${result.path}. Source ${result.sourceUrl}, sha256 ${result.installedHash}. ${entry.description} It is installed but not active \u2014 activation stays operator-gated. If it fits this task, suggest /skill ${entry.name} to the operator; never load it yourself.`;
1634
+ }
1635
+ function answersFromDetails(details) {
1636
+ const raw = details?.answers;
1637
+ if (!Array.isArray(raw)) return [];
1638
+ return raw.filter(
1639
+ (entry) => typeof entry === "object" && entry !== null && typeof entry.question === "string" && typeof entry.answer === "string"
1640
+ );
1641
+ }
1642
+ function chosenOfferOption(answer) {
1643
+ const labels = [
1644
+ SKILL_INSTALL_OFFER_OPTION_PROJECT,
1645
+ SKILL_INSTALL_OFFER_OPTION_USER,
1646
+ SKILL_INSTALL_OFFER_OPTION_NOT_NOW,
1647
+ SKILL_INSTALL_OFFER_OPTION_NEVER
1648
+ ];
1649
+ for (const label of labels) {
1650
+ if (answer.options?.includes(label)) return label;
1651
+ }
1652
+ for (const label of labels) {
1653
+ if (answer.answer.includes(label)) return label;
1654
+ }
1655
+ return null;
1656
+ }
1657
+ function createMarketplaceOfferRegistration(deps) {
1658
+ const declines = deps.declines ?? {
1659
+ readNever: () => readPromotionDeclines().never,
1660
+ recordNever: (name, version) => recordPromotionNeverDecline(name, version)
1661
+ };
1662
+ const newOfferTag = deps.newOfferTag ?? (() => randomUUID());
1663
+ let lastSeenSessionId;
1664
+ let offeredNames = /* @__PURE__ */ new Set();
1665
+ let sessionDeclines = /* @__PURE__ */ new Set();
1666
+ let installedNamesCache = null;
1667
+ let marketplaceEntriesCache = null;
1668
+ let pendingOffer = null;
1669
+ const trackSession = (input) => {
1670
+ const sessionId = input.sessionId ?? null;
1671
+ if (lastSeenSessionId === void 0 || lastSeenSessionId === null && sessionId !== null) {
1672
+ lastSeenSessionId = sessionId;
1673
+ return;
1674
+ }
1675
+ if (sessionId !== lastSeenSessionId) {
1676
+ lastSeenSessionId = sessionId;
1677
+ offeredNames = /* @__PURE__ */ new Set();
1678
+ sessionDeclines = /* @__PURE__ */ new Set();
1679
+ pendingOffer = null;
1680
+ installedNamesCache = null;
1681
+ marketplaceEntriesCache = null;
1682
+ }
1683
+ };
1684
+ const bestMatch = (text) => {
1685
+ const installedWasCached = installedNamesCache !== null;
1686
+ let never;
1687
+ try {
1688
+ installedNamesCache ??= new Set(deps.listInstalledSkillNames());
1689
+ marketplaceEntriesCache ??= deps.listMarketplaceEntries();
1690
+ never = declines.readNever();
1691
+ } catch {
1692
+ return null;
1693
+ }
1694
+ const declinedKeys = /* @__PURE__ */ new Set([...Object.keys(never), ...sessionDeclines]);
1695
+ const findMatch = () => matchMarketplaceSkills(
1696
+ text,
1697
+ marketplaceEntriesCache ?? [],
1698
+ /* @__PURE__ */ new Set([...installedNamesCache ?? [], ...offeredNames])
1699
+ ).find((candidate) => !declinedKeys.has(declineKey(candidate.entry.name, candidate.entry.version))) ?? null;
1700
+ let match = findMatch();
1701
+ if (match && installedWasCached) {
1702
+ try {
1703
+ installedNamesCache = new Set(deps.listInstalledSkillNames());
1704
+ } catch {
1705
+ return null;
1706
+ }
1707
+ match = findMatch();
1708
+ }
1709
+ return match;
1710
+ };
1711
+ const installGated = (entry, scope) => {
1712
+ assertPromotionInstallSource(entry);
1713
+ const result = deps.installEntry(entry, scope);
1714
+ installedNamesCache?.add(entry.name);
1715
+ return result;
1716
+ };
1717
+ const evaluateAskUserAnswers = (input) => {
1718
+ const offer = pendingOffer;
1719
+ if (!offer) return NO_EFFECTS2;
1720
+ const marker = offerBindingTag(offer.tag);
1721
+ if (input.toolResultDetails?.cancelled === true) {
1722
+ return NO_EFFECTS2;
1723
+ }
1724
+ for (const answer of answersFromDetails(input.toolResultDetails)) {
1725
+ if (!answer.question.includes(marker)) continue;
1726
+ const option = chosenOfferOption(answer);
1727
+ if (option === null) continue;
1728
+ pendingOffer = null;
1729
+ const offerKey = declineKey(offer.entry.name, offer.entry.version);
1730
+ if (option === SKILL_INSTALL_OFFER_OPTION_NOT_NOW) {
1731
+ sessionDeclines.add(offerKey);
1732
+ return NO_EFFECTS2;
1733
+ }
1734
+ if (option === SKILL_INSTALL_OFFER_OPTION_NEVER) {
1735
+ sessionDeclines.add(offerKey);
1736
+ try {
1737
+ declines.recordNever(offer.entry.name, offer.entry.version);
1738
+ } catch {
1739
+ }
1740
+ return NO_EFFECTS2;
1741
+ }
1742
+ const scope = option === SKILL_INSTALL_OFFER_OPTION_USER ? "user" : "project";
1743
+ try {
1744
+ const result = installGated(offer.entry, scope);
1745
+ return [
1746
+ {
1747
+ kind: "annotate_tool_result",
1748
+ severity: "info",
1749
+ message: `[Marketplace] Installed skill "${offer.entry.name}" (${scope} scope) to ${result.path}. It is installed but not active; the operator activates it with /skill ${offer.entry.name}.`
1750
+ }
1751
+ ];
1752
+ } catch (error) {
1753
+ sessionDeclines.add(offerKey);
1754
+ return [
1755
+ {
1756
+ kind: "annotate_tool_result",
1757
+ severity: "warn",
1758
+ message: `[Marketplace] Install of "${offer.entry.name}" failed: ${error instanceof Error ? error.message : String(error)}. Continue the task without it.`
1759
+ }
1760
+ ];
1761
+ }
1762
+ }
1763
+ return NO_EFFECTS2;
1764
+ };
1765
+ return {
1766
+ id: MARKETPLACE_OFFER_REGISTRATION_ID,
1767
+ description: "offers an uninstalled marketplace skill via ask_user when the request matches it; consented installs run gated to Clio's own marketplace, declines are remembered",
1768
+ hooks: ["turn_start", "after_tool"],
1769
+ evaluate(input) {
1770
+ trackSession(input);
1771
+ if (input.hook === "after_tool") {
1772
+ return input.toolName === ToolNames.AskUser ? evaluateAskUserAnswers(input) : NO_EFFECTS2;
1773
+ }
1774
+ if (input.hook !== "turn_start") return NO_EFFECTS2;
1775
+ if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS2;
1776
+ const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
1777
+ if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS2;
1778
+ const match = bestMatch(input.text ?? "");
1779
+ if (!match) return NO_EFFECTS2;
1780
+ offeredNames.add(match.entry.name);
1781
+ if (deps.getAutonomy() === "full-auto") {
1782
+ try {
1783
+ const result = installGated(match.entry, "project");
1784
+ return [
1785
+ {
1786
+ kind: "inject_reminder",
1787
+ severity: "info",
1788
+ message: marketplaceAutoInstallReminder(match.entry, result)
1789
+ }
1790
+ ];
1791
+ } catch {
1792
+ }
1793
+ }
1794
+ const tag = newOfferTag();
1795
+ pendingOffer = { entry: match.entry, tag };
1796
+ return [{ kind: "inject_reminder", severity: "info", message: marketplaceOfferReminder(match.entry, tag) }];
1797
+ }
1798
+ };
1799
+ }
1800
+
1386
1801
  // src/domains/middleware/memory-intervention.ts
1387
1802
  init_esm_shims();
1388
1803
  import { createHash as createHash2 } from "node:crypto";
@@ -1393,7 +1808,7 @@ var MEMORY_INTERVENTION_DEFAULT_EVERY_N_TOOLS = 10;
1393
1808
  var MEMORY_INTERVENTION_TIMEOUT_BACKOFF_THRESHOLD = 2;
1394
1809
  var MEMORY_INTERVENTION_ACTIVITY_LIMIT = 20;
1395
1810
  var CALL_DESCRIPTION_MAX_CHARS = 180;
1396
- var NO_EFFECTS = [];
1811
+ var NO_EFFECTS3 = [];
1397
1812
  function createMemoryInterventionRegistration(deps) {
1398
1813
  const pending = /* @__PURE__ */ new Map();
1399
1814
  const trajectory = [];
@@ -1423,16 +1838,16 @@ function createMemoryInterventionRegistration(deps) {
1423
1838
  description: "maintain bounded task execution memory and selectively remind after repeated failures or compaction",
1424
1839
  hooks: ["before_tool", "after_tool", "turn_start", "turn_end", "on_compaction"],
1425
1840
  evaluate(input) {
1426
- if (!settings().enabled) return NO_EFFECTS;
1841
+ if (!settings().enabled) return NO_EFFECTS3;
1427
1842
  try {
1428
1843
  switch (input.hook) {
1429
1844
  case "before_tool":
1430
1845
  observeBeforeTool(input);
1431
- return NO_EFFECTS;
1846
+ return NO_EFFECTS3;
1432
1847
  case "after_tool":
1433
1848
  return observeAfterTool(input);
1434
1849
  case "turn_end": {
1435
- if (toolStep <= lastTurnEndStep) return NO_EFFECTS;
1850
+ if (toolStep <= lastTurnEndStep) return NO_EFFECTS3;
1436
1851
  const alreadyReported = annotatedSinceTurnEnd;
1437
1852
  annotatedSinceTurnEnd = false;
1438
1853
  const started = process.hrtime.bigint();
@@ -1451,9 +1866,9 @@ function createMemoryInterventionRegistration(deps) {
1451
1866
  return effects;
1452
1867
  }
1453
1868
  case "on_compaction":
1454
- if (input.metadata?.stage === "working_set_recall") return NO_EFFECTS;
1869
+ if (input.metadata?.stage === "working_set_recall") return NO_EFFECTS3;
1455
1870
  reactivateAfterCompaction = true;
1456
- return NO_EFFECTS;
1871
+ return NO_EFFECTS3;
1457
1872
  case "turn_start": {
1458
1873
  if (input.text?.trim()) currentTask = shortText(input.text, 2e3);
1459
1874
  annotatedThisTurn.clear();
@@ -1476,7 +1891,7 @@ function createMemoryInterventionRegistration(deps) {
1476
1891
  }
1477
1892
  }
1478
1893
  } catch {
1479
- return NO_EFFECTS;
1894
+ return NO_EFFECTS3;
1480
1895
  }
1481
1896
  },
1482
1897
  /**
@@ -1490,13 +1905,13 @@ function createMemoryInterventionRegistration(deps) {
1490
1905
  * would have been buffered anyway.
1491
1906
  */
1492
1907
  async evaluateAsync(input, context) {
1493
- if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS;
1908
+ if (!settings().enabled || input.hook !== "turn_end" || pendingTriggers.size === 0) return NO_EFFECTS3;
1494
1909
  const boundary = input.turnId ?? input.metadata?.userTurnId?.toString() ?? `tool-step:${toolStep}`;
1495
- if (boundary === lastPromptedBoundary) return NO_EFFECTS;
1910
+ if (boundary === lastPromptedBoundary) return NO_EFFECTS3;
1496
1911
  if (deps.deliversDeferredReminders === false) {
1497
1912
  emitTelemetry([...pendingTriggers], "rules", "silent", "no_consumer", 0, 0, 0, process.hrtime.bigint());
1498
1913
  pendingTriggers.clear();
1499
- return NO_EFFECTS;
1914
+ return NO_EFFECTS3;
1500
1915
  }
1501
1916
  if (promptedStepInFlight) {
1502
1917
  emitTelemetry(
@@ -1509,7 +1924,7 @@ function createMemoryInterventionRegistration(deps) {
1509
1924
  0,
1510
1925
  process.hrtime.bigint()
1511
1926
  );
1512
- return NO_EFFECTS;
1927
+ return NO_EFFECTS3;
1513
1928
  }
1514
1929
  lastPromptedBoundary = boundary;
1515
1930
  const triggers = [...pendingTriggers];
@@ -1534,7 +1949,7 @@ function createMemoryInterventionRegistration(deps) {
1534
1949
  }).finally(() => {
1535
1950
  promptedStepInFlight = false;
1536
1951
  });
1537
- return NO_EFFECTS;
1952
+ return NO_EFFECTS3;
1538
1953
  },
1539
1954
  runPromptedStep,
1540
1955
  signalLoop() {
@@ -1568,7 +1983,7 @@ function createMemoryInterventionRegistration(deps) {
1568
1983
  inputTokens: 0,
1569
1984
  outputTokens: 0,
1570
1985
  usage: null,
1571
- effects: NO_EFFECTS
1986
+ effects: NO_EFFECTS3
1572
1987
  });
1573
1988
  const live = settings();
1574
1989
  if (!live.enabled) {
@@ -1647,7 +2062,7 @@ function createMemoryInterventionRegistration(deps) {
1647
2062
  );
1648
2063
  return {
1649
2064
  ...promptedResult,
1650
- effects: promptedResult.reminder === null ? NO_EFFECTS : [{ kind: "inject_reminder", message: promptedResult.reminder, severity: "advisory" }]
2065
+ effects: promptedResult.reminder === null ? NO_EFFECTS3 : [{ kind: "inject_reminder", message: promptedResult.reminder, severity: "advisory" }]
1651
2066
  };
1652
2067
  }
1653
2068
  function emitTelemetry(triggerReasons, tier, decision, reason, citedEntries2, inputTokens, outputTokens, started, operations = { bankOperations: 0, droppedOperations: 0 }) {
@@ -1708,7 +2123,7 @@ function createMemoryInterventionRegistration(deps) {
1708
2123
  }
1709
2124
  function observeAfterTool(input) {
1710
2125
  const fallback = prepareToolStep(input);
1711
- if (fallback === null) return NO_EFFECTS;
2126
+ if (fallback === null) return NO_EFFECTS3;
1712
2127
  const key = pendingKey(input, fallback.operationFingerprint);
1713
2128
  const prepared = pending.get(key) ?? fallback;
1714
2129
  pending.delete(key);
@@ -1733,22 +2148,22 @@ function createMemoryInterventionRegistration(deps) {
1733
2148
  };
1734
2149
  trajectory.push(step);
1735
2150
  if (trajectory.length > live.windowSteps) trajectory.splice(0, trajectory.length - live.windowSteps);
1736
- if (outcome !== "error") return NO_EFFECTS;
2151
+ if (outcome !== "error") return NO_EFFECTS3;
1737
2152
  rememberFailure(step);
1738
2153
  return annotateRepeatedFailure(step);
1739
2154
  }
1740
2155
  function annotateRepeatedFailure(step) {
1741
- if (annotatedThisTurn.has(step.operationFingerprint)) return NO_EFFECTS;
2156
+ if (annotatedThisTurn.has(step.operationFingerprint)) return NO_EFFECTS3;
1742
2157
  const occurrences = trajectory.filter(
1743
2158
  (candidate) => candidate.outcome === "error" && candidate.operationFingerprint === step.operationFingerprint
1744
2159
  ).length;
1745
2160
  const failure = failures.get(step.operationFingerprint);
1746
- if (occurrences < 2 || failure === void 0) return NO_EFFECTS;
2161
+ if (occurrences < 2 || failure === void 0) return NO_EFFECTS3;
1747
2162
  const message = boundedReminder(
1748
2163
  `Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}. Change the approach rather than repeating it.`,
1749
2164
  settings().maxTokens
1750
2165
  );
1751
- if (message.length === 0) return NO_EFFECTS;
2166
+ if (message.length === 0) return NO_EFFECTS3;
1752
2167
  annotatedThisTurn.add(step.operationFingerprint);
1753
2168
  lastInjectedOperationFingerprint = step.operationFingerprint;
1754
2169
  lastDecision = "injected";
@@ -1802,7 +2217,7 @@ function createMemoryInterventionRegistration(deps) {
1802
2217
  `Memory: [${failure.entryId}] you already tried ${failure.callDescription} at step ${failure.firstStep} and it failed with ${failure.errorDigest}.`,
1803
2218
  settings().maxTokens
1804
2219
  );
1805
- if (message.length === 0) return NO_EFFECTS;
2220
+ if (message.length === 0) return NO_EFFECTS3;
1806
2221
  lastInjectedOperationFingerprint = step.operationFingerprint;
1807
2222
  lastInjectedMessage = message;
1808
2223
  lastDecision = "injected";
@@ -1811,13 +2226,13 @@ function createMemoryInterventionRegistration(deps) {
1811
2226
  return [{ kind: "inject_reminder", message, severity: "advisory" }];
1812
2227
  }
1813
2228
  lastDecision = "silent";
1814
- return NO_EFFECTS;
2229
+ return NO_EFFECTS3;
1815
2230
  } finally {
1816
2231
  lastTurnEndStep = toolStep;
1817
2232
  }
1818
2233
  }
1819
2234
  function reactivateKnowledge() {
1820
- if (!reactivateAfterCompaction) return NO_EFFECTS;
2235
+ if (!reactivateAfterCompaction) return NO_EFFECTS3;
1821
2236
  reactivateAfterCompaction = false;
1822
2237
  const prefix = "Memory: execution state restored after compaction:\n";
1823
2238
  const maxTokens = settings().maxTokens;
@@ -1825,12 +2240,12 @@ function createMemoryInterventionRegistration(deps) {
1825
2240
  const rendered = deps.bank.renderRestoredState(Math.max(0, maxTokens - prefixTokens));
1826
2241
  if (rendered.length === 0) {
1827
2242
  lastDecision = "silent";
1828
- return NO_EFFECTS;
2243
+ return NO_EFFECTS3;
1829
2244
  }
1830
2245
  const message = boundedReminder(`${prefix}${rendered}`, maxTokens);
1831
2246
  if (message.length === 0) {
1832
2247
  lastDecision = "silent";
1833
- return NO_EFFECTS;
2248
+ return NO_EFFECTS3;
1834
2249
  }
1835
2250
  const citedIds = [...message.matchAll(/\[([^\]]+)\]/gu)].map((match) => match[1]).filter((id) => id !== void 0);
1836
2251
  deps.bank.recordInjection(citedIds);
@@ -1929,114 +2344,6 @@ function announceMemoryStepEndpoint(deps, complete) {
1929
2344
  };
1930
2345
  }
1931
2346
 
1932
- // src/domains/middleware/skills-reminder.ts
1933
- init_esm_shims();
1934
- var SKILLS_REMINDER_REGISTRATION_ID = "observer.skills-reminder";
1935
- function skillsReminderMessage(installed, installable = 0) {
1936
- const counts = installable > 0 ? `${installed} installed, ${installable} installable from the marketplace` : `${installed} installed`;
1937
- return `[Skills] ${counts}. Start this task by listing them with context(scope="skills") and checking for a match; if one matches, open your reply with the line \`${SKILL_SUGGESTION_ANCHOR}\` (a comma-separated sequence, in order, when several compose) and then continue the task in the same turn without the skill. Only the operator loads a skill, and a marketplace skill is offered for install when the operator runs it. If none match, do not mention skills and continue with the task.`;
1938
- }
1939
- var NO_EFFECTS2 = [];
1940
- var GREETING_WORDS = /* @__PURE__ */ new Set([
1941
- "hi",
1942
- "hello",
1943
- "hey",
1944
- "heya",
1945
- "hiya",
1946
- "howdy",
1947
- "yo",
1948
- "sup",
1949
- "hola",
1950
- "greetings",
1951
- "gm",
1952
- "gn",
1953
- "morning",
1954
- "afternoon",
1955
- "evening",
1956
- "good",
1957
- "day",
1958
- "night",
1959
- "there",
1960
- "you",
1961
- "clio",
1962
- "thanks",
1963
- "thank",
1964
- "thankyou",
1965
- "thx",
1966
- "ty",
1967
- "ok",
1968
- "okay",
1969
- "k",
1970
- "cool",
1971
- "nice",
1972
- "test",
1973
- "testing",
1974
- "ping",
1975
- "pong"
1976
- ]);
1977
- function isSubstantiveUserTurn(text) {
1978
- const normalized = (text ?? "").toLowerCase().replace(/[^\p{L}\p{N}\s]/gu, " ").replace(/\s+/g, " ").trim();
1979
- if (normalized.length === 0) return false;
1980
- const tokens = normalized.split(" ");
1981
- if (tokens.length > 4) return true;
1982
- return tokens.some((token) => !GREETING_WORDS.has(token));
1983
- }
1984
- function createSkillsReminderRegistration(deps) {
1985
- let lastSeenSessionId;
1986
- let spentForActiveSession = false;
1987
- let observedFreshStart = false;
1988
- let observedAnyTurn = false;
1989
- return {
1990
- id: SKILLS_REMINDER_REGISTRATION_ID,
1991
- description: "once per session, on the first substantive turn, teaches the skill-suggestion reply protocol; keeps a turn going that stopped on the suggestion",
1992
- hooks: ["turn_start", "turn_end"],
1993
- evaluate(input) {
1994
- if (input.hook === "turn_end") {
1995
- return isSkillSuggestionWait(input) ? [{ kind: "request_continuation", message: SKILL_SUGGESTION_WAIT_CONTINUATION_MESSAGE }] : NO_EFFECTS2;
1996
- }
1997
- const sessionId = input.sessionId ?? null;
1998
- if (lastSeenSessionId === void 0) {
1999
- lastSeenSessionId = sessionId;
2000
- } else if (lastSeenSessionId === null && sessionId !== null) {
2001
- lastSeenSessionId = sessionId;
2002
- } else if (sessionId !== lastSeenSessionId) {
2003
- lastSeenSessionId = sessionId;
2004
- spentForActiveSession = false;
2005
- observedFreshStart = false;
2006
- observedAnyTurn = false;
2007
- }
2008
- if (spentForActiveSession) return NO_EFFECTS2;
2009
- const conversationMessages = metadataNumber(input, "conversationMessages");
2010
- if (!observedAnyTurn) {
2011
- observedAnyTurn = true;
2012
- if (conversationMessages === null || conversationMessages > 0) {
2013
- spentForActiveSession = true;
2014
- return NO_EFFECTS2;
2015
- }
2016
- observedFreshStart = true;
2017
- }
2018
- if (!observedFreshStart) {
2019
- spentForActiveSession = true;
2020
- return NO_EFFECTS2;
2021
- }
2022
- if (!isSubstantiveUserTurn(input.text)) return NO_EFFECTS2;
2023
- spentForActiveSession = true;
2024
- const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
2025
- if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS2;
2026
- let installed = 0;
2027
- let installable = 0;
2028
- try {
2029
- installed = deps.countModelVisibleSkills();
2030
- installable = deps.countInstallableSkills?.() ?? 0;
2031
- } catch {
2032
- return NO_EFFECTS2;
2033
- }
2034
- if (installed <= 0 && installable <= 0) return NO_EFFECTS2;
2035
- return [{ kind: "inject_reminder", severity: "info", message: skillsReminderMessage(installed, installable) }];
2036
- }
2037
- };
2038
- }
2039
-
2040
2347
  // src/domains/middleware/task-board-reminder.ts
2041
2348
  init_esm_shims();
2042
2349
  var TASK_BOARD_REMINDER_REGISTRATION_ID = "observer.task-board-reminder";
@@ -2063,7 +2370,7 @@ function countEnumeratedSteps(text) {
2063
2370
  const bulletLines = value.split(/\r?\n/).filter((line) => /^\s*[-*]\s+\S/.test(line)).length;
2064
2371
  return bulletLines >= 3 ? bulletLines : 0;
2065
2372
  }
2066
- var NO_EFFECTS3 = [];
2373
+ var NO_EFFECTS4 = [];
2067
2374
  function createTaskBoardReminderRegistration() {
2068
2375
  let lastSeenSessionId;
2069
2376
  let spentForActiveSession = false;
@@ -2079,12 +2386,12 @@ function createTaskBoardReminderRegistration() {
2079
2386
  lastSeenSessionId = sessionId;
2080
2387
  spentForActiveSession = false;
2081
2388
  }
2082
- if (spentForActiveSession) return NO_EFFECTS3;
2389
+ if (spentForActiveSession) return NO_EFFECTS4;
2083
2390
  const steps = countEnumeratedSteps(input.text);
2084
- if (steps < 3) return NO_EFFECTS3;
2391
+ if (steps < 3) return NO_EFFECTS4;
2085
2392
  spentForActiveSession = true;
2086
2393
  const pendingSkillRequests = metadataNumber(input, "pendingSkillRequests");
2087
- if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS3;
2394
+ if (pendingSkillRequests !== null && pendingSkillRequests > 0) return NO_EFFECTS4;
2088
2395
  return [{ kind: "inject_reminder", severity: "info", message: taskBoardReminderMessage(steps) }];
2089
2396
  }
2090
2397
  };
@@ -2166,7 +2473,7 @@ var WATCHDOG_DIFF_MAX_BYTES = 12 * 1024;
2166
2473
  var WATCHDOG_PATHS_MAX = 40;
2167
2474
  var WATCHDOG_TRUNCATION_MARKER = "\n[diff truncated]";
2168
2475
  var MUTATING_TOOL_NAMES = /* @__PURE__ */ new Set([ToolNames.Write, ToolNames.Edit, ToolNames.Artifact]);
2169
- var NO_EFFECTS4 = [];
2476
+ var NO_EFFECTS5 = [];
2170
2477
  function stringValue2(value) {
2171
2478
  return typeof value === "string" && value.length > 0 ? value : null;
2172
2479
  }
@@ -2174,20 +2481,20 @@ function firstPath(details) {
2174
2481
  const paths = details?.paths;
2175
2482
  if (!Array.isArray(paths)) return null;
2176
2483
  for (const entry of paths) {
2177
- const path = stringValue2(entry);
2178
- if (path !== null) return path;
2484
+ const path2 = stringValue2(entry);
2485
+ if (path2 !== null) return path2;
2179
2486
  }
2180
2487
  return null;
2181
2488
  }
2182
2489
  function coalesceTurnDiff(byPath, maxBytes = WATCHDOG_DIFF_MAX_BYTES) {
2183
2490
  const blocks = [];
2184
2491
  let index = 0;
2185
- for (const [path, diff] of byPath) {
2492
+ for (const [path2, diff] of byPath) {
2186
2493
  if (index >= WATCHDOG_PATHS_MAX) {
2187
2494
  blocks.push(`[${byPath.size - WATCHDOG_PATHS_MAX} more changed path(s) omitted]`);
2188
2495
  break;
2189
2496
  }
2190
- blocks.push(`--- ${path}
2497
+ blocks.push(`--- ${path2}
2191
2498
  ${diff}`);
2192
2499
  index += 1;
2193
2500
  }
@@ -2279,19 +2586,19 @@ function createWatchdogRegistration(deps) {
2279
2586
  const settings = active();
2280
2587
  if (settings === null) {
2281
2588
  if (input.hook === "turn_end") resetTurn();
2282
- return NO_EFFECTS4;
2589
+ return NO_EFFECTS5;
2283
2590
  }
2284
2591
  if (input.hook === "after_tool") {
2285
2592
  toolCalls += 1;
2286
2593
  recordMutation(input);
2287
2594
  const cadence = settings.cadenceToolCalls;
2288
2595
  if (cadence !== void 0 && cadence >= 1 && toolCalls % cadence === 0) fire("cadence");
2289
- return NO_EFFECTS4;
2596
+ return NO_EFFECTS5;
2290
2597
  }
2291
- if (input.hook !== "turn_end") return NO_EFFECTS4;
2598
+ if (input.hook !== "turn_end") return NO_EFFECTS5;
2292
2599
  fire("turn_end");
2293
2600
  resetTurn();
2294
- return NO_EFFECTS4;
2601
+ return NO_EFFECTS5;
2295
2602
  },
2296
2603
  droppedTriggers: () => dropped,
2297
2604
  runInFlight: () => inFlight,
@@ -2456,9 +2763,10 @@ export {
2456
2763
  loadUserHooks,
2457
2764
  readHookSources,
2458
2765
  installUserHooks,
2766
+ createSkillsReminderRegistration,
2767
+ createMarketplaceOfferRegistration,
2459
2768
  createMemoryInterventionRegistration,
2460
2769
  announceMemoryStepEndpoint,
2461
- createSkillsReminderRegistration,
2462
2770
  createTaskBoardReminderRegistration,
2463
2771
  createTaskNudgeRegistration,
2464
2772
  createMiddlewareToolChoiceControl,
@@ -2467,4 +2775,4 @@ export {
2467
2775
  createWatchdogRegistration,
2468
2776
  MiddlewareDomainModule
2469
2777
  };
2470
- //# sourceMappingURL=chunk-QLL7ILRG.js.map
2778
+ //# sourceMappingURL=chunk-JA5QWE4Z.js.map