chainlesschain 0.166.105 → 0.166.107

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 (211) hide show
  1. package/README.md +182 -8
  2. package/package.json +2 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-CcD-AVDw.js → AIOps-DCx6L_HW.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-CYy-g36A.js → ActionButton-DYm1CN3Z.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DPFDNaBL.js → Analytics-D5ItUS_y.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-PVIuRdgN.js → AppLayout-Cb7XeRdH.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-BXGD3bM-.js → Artifacts-DDDeqCDQ.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-Bu5s_4tu.js → Audit-BRt3x13w.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BHmgpnzo.js → BackgroundAgents-C_oNALMd.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-C872jURx.js → Backup-PSU2p6CR.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-Bh7xO30H.js → BaseInput-G3oL4hcX.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-DaacK53T.js → Chat-C2cLI10b.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-PYrSKMM_.js → ChatBubbleRenderer-KX1OITf8.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-Cnt7_8I2.js → Checkbox-CHLnEgFD.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-AZRz6kmW.js → Codegen-DZm9g_Bc.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-BtOXzMFt.js → Col-D5Z4zSay.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-BFmFygS7.js → Community-DHw69NSk.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-2z5CfKpR.js → Compact-B-vjYNWz.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-B5hKrPVF.js → Compliance-DaIYVZQY.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-CxEyp2ww.js → Cowork-CoA9U-gF.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-B-8f9_qF.js → Cron-DXqmxlRC.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-XARMOcc4.js → Crosschain-Cdkc3ue1.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-DwLtEKAe.js → DID-oKfYyNSR.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-Cjw0L_iA.js → Dashboard-n_ycvgWu.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-BBGWIP7l.js → Dropdown-D38rZ8WY.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DG4kZFkm.js → EmailListRenderer-BjreeBQ1.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-D8vuNDde.js → EvolutionSettings-CTxA_SIq.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-COXCzDXI.js → FamilyGuardDashboard-DmECNwV5.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-Btb-aMhW.js → Federation-B2IaaDmQ.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-TO-E6l6e.js → FormItemContext-DgcgqUIk.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-BWXdJCT0.js → GenericCardRenderer-B1-du6Qm.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-B6icGhEv.js → Git-XceM21Il.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-C5Y__K6S.js → Governance-CV97iz3z.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-DZGEKnbN.js → Inference-CI7fj305.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph--Kga5yvm.js → KnowledgeGraph-B5mekWRy.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BXs3EPKj.js → Logs-BlxFA0xY.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-rDE-XyMY.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-JSEAu0su.js → Marketplace-DL1BVCiX.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-BUBifkKP.js → McpTools-BPtwrO3c.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-Cb7sE4a-.js → Memory-DuSNw4E-.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-BOzmmNV2.js → MobileBridge-DTgY9ywI.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-CTpVHJMa.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-DmMWErG1.js → Mtc-h4fCLjXw.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-DnGkRVXF.js → MtcAudit-fqMDY3-w.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-C3mzascL.js → Multisig-Do3FehBL.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-CrmMZZ1t.js → NLProgramming-CQVY0kQF.js} +1 -1
  49. package/src/assets/web-panel/assets/Notes-4c3oNvWh.js +7 -0
  50. package/src/assets/web-panel/assets/{NotificationSettings-gn3UrWwW.js → NotificationSettings-BKr2JD4k.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-Bq4jgzRt.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-fMlkdgpW.js → Organization-Dy3XidyA.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-DGwCUPU1.js → Overflow-DFF0qN5K.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-BDGcpPmf.js → P2P-DAgYYykd.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-CccRPAB9.js → PdhVaultBrowser-DgNHa8b1.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-C33dNECx.js → Permissions-Cev6uSBc.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BeqbCStc.js → PersonalDataHub-DJzbN06K.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-CTmasgbQ.js → Pipeline-CoJWvbQ5.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-ktd37BSp.js → Privacy-DZxV6etm.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-KOGvQtBX.js → ProjectInit-BFW87JnM.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-CUvH_hC6.js → ProjectSettings-LBrRT27p.js} +2 -2
  62. package/src/assets/web-panel/assets/Projects-O3uz76R1.js +1 -0
  63. package/src/assets/web-panel/assets/{Providers-C-hmLXlO.js → Providers-CnRbjOYk.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-DzG_rbSL.js → QrScannerModal-BVFnIS3r.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-ShwiATg4.js → QuickAsk-DrcHx5f1.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DkV8Ruep.js → Recommend-CbRgrSJm.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-Ca2dOx_G.js → RemoteSession-B2Uz_ElB.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-DYA5BJ6A.js → Reputation-DS0ljTxL.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-DvGDgxLS.js → Row-ClLobFht.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-DbwTBSPw.js → RssFeed-DxxcTD0x.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-C5XAMQ9T.js → Search-BbHN0Fik.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-CKWT60Qt.js → Security-BAVU_EcY.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-CZvASlWL.js → Services-CtqRSVq_.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-DFkMVqws.js → Skeleton-IJ8ZKdSZ.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-hslZ_GyP.js → Skills-DXxcznnO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-BLW5rmZ5.js → Sla-fRkhnA3i.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-Cn4ffCi5.js → SpeechSettings-Bi8sYJ-I.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-D1K0nJuo.js → SyncSettings-CjeplUtS.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-CCRu0xoN.js → Tasks-D4KB2Hbx.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-L19GYuS4.js → Templates-BwVugi8n.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-CZ6HE3PF.js → Tenant-CsPuu5xK.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BiAwzaBT.js → Terminal-DuaeOPjY.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-DRHSWQT5.js → TimelineRenderer-D-PMrFxO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-Cm-XATgh.js → Tokens-BXZuiQPZ.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-BVXtx3kn.js → Trigger-DgpTaHL3.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-Bb0TmkLJ.js → Trust-Bn7lEGRY.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-Dbt9R7l0.js → UkeySign-zz-8JAAQ.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-z0-Ti8eJ.js → VideoEditing-DCzfQGTc.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-BZh31tI-.js → Wallet-BiRHM_zB.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DQ0yIr5K.js → WebAuthn-QmPo2JwU.js} +5 -5
  91. package/src/assets/web-panel/assets/{WorkflowEditor-DCt_yuWG.js → WorkflowEditor-gL7SsPnY.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-BLgtmFeS.js → chat-BysvK4hk.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-xU4UH8M1.js → colors-CQq20vqN.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-C4w4v16T.js → compact-item-CAHlOf1X.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-CZM9hAaj.js → createContext-BeF3ESj_.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-D-Iugqxv.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-DvHqEpE7.js → hasIn-CiqnRf-U.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BkTKWAgq.js → index-4a0Lmz_y.js} +1 -1
  99. package/src/assets/web-panel/assets/index-B0Oz2_rQ.js +1 -0
  100. package/src/assets/web-panel/assets/{index-B0IvKEVO.js → index-B2AOvjgR.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BaQZvM4m.js → index-B2xbtl_c.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BRhD9RMV.js → index-B5941vyo.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CqDiY-jl.js → index-BHpHGGmB.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CQEzxnYS.js → index-BOiyW31p.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BTxhDCtg.js → index-BcVmt6u_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CPDw21XY.js → index-BfJabF_8.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CExiTobS.js → index-Br5tGVbC.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-QHmhwgfc.js → index-BsnLkZjz.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BlN5KPq6.js → index-BtWchYfW.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-SNV95Zen.js → index-Bvkbj3x-.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BHK3CQHq.js → index-CCX0daFQ.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CPC7OGCe.js → index-CImCEo8S.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CKugxsw3.js → index-CTp89vmg.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-55Rkd1KA.js → index-CcccefJc.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Ds6wKTMh.js → index-CeIL3-nY.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DifMvnMQ.js → index-CgkUkmEJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bf8Wm4ks.js → index-CowbNBJs.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Cm00787d.js → index-Cp3IRTDK.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C9YnZFv2.js → index-D7q5VH2n.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BHg9NoJ5.js → index-DBmGQHEz.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-B6AQ2b5U.js → index-DHGtFwwR.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CYrQnkqA.js → index-DKYbru3i.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CyV8fNBg.js → index-DTPUVm71.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-B4jIcYSv.js → index-DXT7MKkD.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-B64Vf-8H.js → index-DXsXhR7p.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CpiuuIww.js → index-Dqkls2_6.js} +1 -1
  127. package/src/assets/web-panel/assets/index-DwoycEQa.js +1 -0
  128. package/src/assets/web-panel/assets/{index-DGdLkss8.js → index-QALafVsT.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Ds1tM734.js → index-TdVEaJfk.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Bh14b1k0.js → index-ZBuJ6O6g.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-C6ZrTSw5.js → index-i9aJV9qk.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CF9ebAIB.js → index-jJhemX1R.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BIWumeQl.js → index-qjaCk1Mj.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-n6SAUmmI.js → index-xwtRrgVY.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CRLP56-W.js → index-yFQWSRoW.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-wYRjvvbl.js → index-zNkw0IY7.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-C44ZER6c.js → initDefaultProps-BQR2HnKb.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-DbNzzScd.js → motion-gAz6l-nZ.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-BrRrDH2u.js → move-Cy5TN856.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-DZ_T_Pw8.js → mtc-parser-BeT7VrGi.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-5QHHk_V3.js → omit-BLN3mlgK.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-BdxEl0G2.js → pickAttrs-DtwZ8u2d.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-CGyD615D.js → placementArrow-ViMwQSa-.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-QqcWAQmN.js → responsiveObserve-dEL3u4E7.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-BumQrJ5R.js → slide-l05us-Gz.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-Pf64olM7.js → statusUtils-Bk-Qn2Og.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-DNwm5SQZ.js → styleChecker-Bn186qeY.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-c3gLKs6e.js → useFlexGapSupport-WP-ugR3H.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-TzTd6NDM.js → useFs-1SvoeSCL.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BP5E_0Fe.js → usePersonalDataHub-CfNU8N3z.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-CVEkRfZU.js → vnode-Bd2Ya101.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-C18X_8TJ.js → zoom-Def_MeZv.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +2 -2
  155. package/src/commands/agent.js +20 -20
  156. package/src/commands/goal.js +299 -1
  157. package/src/commands/plugin.js +129 -68
  158. package/src/constants.js +2 -2
  159. package/src/data/changelog.json +26 -0
  160. package/src/lib/cli-goal-catalog.js +129 -0
  161. package/src/lib/cli-goal-source.js +119 -0
  162. package/src/lib/coding-task-guidance.js +3 -1
  163. package/src/lib/config-schema.js +1 -1
  164. package/src/lib/eval/stream-terminal.js +27 -2
  165. package/src/lib/evolution/evolution-artifact-ports.js +22 -11
  166. package/src/lib/evolution/evolution-file-witness.js +86 -63
  167. package/src/lib/evolution/evolution-ledger-file-backend.js +22 -0
  168. package/src/lib/evolution/evolution-ledger-file-manifest-catalog.js +34 -35
  169. package/src/lib/evolution/evolution-ledger-file-manifest-head-store.js +32 -39
  170. package/src/lib/evolution/evolution-ledger.js +367 -169
  171. package/src/lib/evolution/evolution-manifest-state-reader.js +58 -0
  172. package/src/lib/evolution/evolution-physical-state-reader.js +308 -0
  173. package/src/lib/evolution/evolution-witness-segments.js +12 -13
  174. package/src/lib/evolution/governed-wiki-pruning-ledger-adapter.js +82 -56
  175. package/src/lib/evolution/rrsi-observed-text-index.js +17 -1
  176. package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +5 -0
  177. package/src/lib/execution-location-failure-site.js +20 -3
  178. package/src/lib/goal-store.js +8 -1
  179. package/src/lib/image-input.js +43 -14
  180. package/src/lib/llm-providers.js +1 -0
  181. package/src/lib/plugin-runtime/capabilities.js +10 -0
  182. package/src/lib/plugin-runtime/cli-goal-draft-request.js +138 -0
  183. package/src/lib/plugin-runtime/cli-goal-drafts.js +413 -0
  184. package/src/lib/plugin-runtime/cli-goal-extension-host.js +234 -0
  185. package/src/lib/plugin-runtime/examples/goal-description-drafter/plugin.json +17 -0
  186. package/src/lib/plugin-runtime/examples/goal-evidence-viewer/plugin.json +25 -0
  187. package/src/lib/plugin-runtime/examples/goal-progress-viewer/plugin.json +21 -0
  188. package/src/lib/plugin-runtime/examples/project-delivery-assistant/plugin.json +38 -0
  189. package/src/lib/plugin-runtime/goal-extension-contract.js +190 -0
  190. package/src/lib/plugin-runtime/goal-extensions.js +277 -0
  191. package/src/lib/plugin-runtime/install.js +40 -40
  192. package/src/lib/plugin-runtime/manifest.js +12 -0
  193. package/src/lib/plugin-runtime/policy.js +1 -0
  194. package/src/lib/project-goal-connection.js +225 -0
  195. package/src/lib/project-goal-draft-connection.js +217 -0
  196. package/src/lib/provider-http-error.js +4 -5
  197. package/src/lib/task-model-selector.js +1 -1
  198. package/src/repl/agent-repl.js +14 -7
  199. package/src/repl/config-summary.js +1 -1
  200. package/src/runtime/agent-core.js +1 -1
  201. package/src/runtime/coding-agent-contract-shared.cjs +3 -2
  202. package/src/runtime/headless-stream.js +4 -6
  203. package/src/runtime/policies/agent-policy.js +1 -0
  204. package/src/assets/web-panel/assets/MarkdownRenderer-BsSiyE-A.js +0 -1
  205. package/src/assets/web-panel/assets/MobileProjects-ClRlavdF.js +0 -1
  206. package/src/assets/web-panel/assets/Notes-4S6uts9Q.js +0 -7
  207. package/src/assets/web-panel/assets/OrderTableRenderer-CDVAlBUf.js +0 -1
  208. package/src/assets/web-panel/assets/Projects-BvP_Os-1.js +0 -1
  209. package/src/assets/web-panel/assets/devWarning-BZUZgMkO.js +0 -1
  210. package/src/assets/web-panel/assets/index--_-pNhk0.js +0 -1
  211. package/src/assets/web-panel/assets/index-ftwO31cp.js +0 -1
@@ -133,6 +133,10 @@ export function verifyRrsiTenantIndexAnchorHistory(input) {
133
133
  snapshot.artifactStoreDirectoryBoundaryDigest,
134
134
  artifactStoreDirectoryBoundaryRechecked: true,
135
135
  artifactStoreBoundaryScope: "root-and-files-directories",
136
+ sourceJournalDirectoryBoundaryDigest:
137
+ snapshot.sourceJournalDirectoryBoundaryDigest,
138
+ sourceJournalDirectoryBoundaryRechecked: true,
139
+ sourceJournalBoundaryScope: "source-journal-four-directories",
136
140
  previous: snapshot.prefixes[0],
137
141
  current: snapshot.current,
138
142
  signaturesVerifiedRelativeToExplicitKey: true,
@@ -141,6 +145,7 @@ export function verifyRrsiTenantIndexAnchorHistory(input) {
141
145
  localRetainedHistoryReplayed: true,
142
146
  selectedContextOnly: true,
143
147
  storageGraphDigestVerified: false,
148
+ fullPhysicalStorageGraphVerified: false,
144
149
  rootAuthorityVerified: false,
145
150
  installationBindingSignatureVerified: false,
146
151
  routingPinVerified: false,
@@ -22,7 +22,7 @@ export function readExecutionLocationStorageFailure(stderr) {
22
22
  const match = String(stderr || "")
23
23
  .slice(0, MAX_DIAGNOSTIC_CHARS)
24
24
  .match(
25
- /\[windows-acl:(initialize|traversal|lookup|repair-lock|repair-inspect|repair-write|verify|timeout(?:-(?:startup|initialize|traversal|lookup|repair-lock|repair-inspect|repair-write|verify))?|spawn|output)(:0x[0-9a-f]{8})?\]/u,
25
+ /\[windows-acl:(initialize|traversal|lookup|repair-lock|repair-inspect|repair-write|verify|verify-read|verify-rules|serialize|output-complete|timeout(?:-(?:startup|initialize|traversal|lookup|repair-lock|repair-inspect|repair-write|verify|verify-read|verify-rules|serialize|output-complete))?|spawn|output)(:0x[0-9a-f]{8})?\]/u,
26
26
  );
27
27
  return match ? `${match[1]}${match[2] || ""}` : null;
28
28
  }
@@ -31,7 +31,7 @@ export function readExecutionLocationStorageLaunchFailure(stderr) {
31
31
  const match = String(stderr || "")
32
32
  .slice(0, MAX_DIAGNOSTIC_CHARS)
33
33
  .match(
34
- /\[windows-acl-launch:(inspect|repair|preflight):(spawn|timeout):(startup|initialize|traversal|lookup|repair-lock|repair-inspect|repair-write|verify):(EACCES|EPERM|ENOENT|ETIMEDOUT|EINVAL|ENOSYS|ENOMEM|EMFILE|ENFILE|ENOBUFS|EBUSY|UNKNOWN):(unknown|-?(?:0|[1-9][0-9]{0,4})):(spawnSync|spawn|unknown)\]/u,
34
+ /\[windows-acl-launch:(inspect|repair|preflight):(spawn|timeout):(startup|initialize|traversal|lookup|repair-lock|repair-inspect|repair-write|verify|verify-read|verify-rules|serialize|output-complete):(EACCES|EPERM|ENOENT|ETIMEDOUT|EINVAL|ENOSYS|ENOMEM|EMFILE|ENFILE|ENOBUFS|EBUSY|UNKNOWN):(unknown|-?(?:0|[1-9][0-9]{0,4})):(spawnSync|spawn|unknown)\]/u,
35
35
  );
36
36
  if (!match) return null;
37
37
  const [, operation, failureStage, progressStage, code, rawErrno, syscall] =
@@ -42,7 +42,24 @@ export function readExecutionLocationStorageLaunchFailure(stderr) {
42
42
  (failureStage === "timeout") !== (code === "ETIMEDOUT")
43
43
  )
44
44
  return null;
45
- return { operation, failureStage, progressStage, code, errno, syscall };
45
+ const timing = String(stderr || "")
46
+ .slice(0, MAX_DIAGNOSTIC_CHARS)
47
+ .match(
48
+ /\[windows-acl-elapsed:(initialize|traversal|lookup|repair-lock|repair-inspect|repair-write|verify|verify-read|verify-rules|serialize|output-complete):(0|[1-9][0-9]{0,5})\]/u,
49
+ );
50
+ const elapsedMs =
51
+ timing?.[1] === progressStage && Number(timing[2]) <= 300000
52
+ ? Number(timing[2])
53
+ : null;
54
+ return {
55
+ operation,
56
+ failureStage,
57
+ progressStage,
58
+ code,
59
+ errno,
60
+ syscall,
61
+ ...(elapsedMs === null ? {} : { elapsedMs }),
62
+ };
46
63
  }
47
64
 
48
65
  export function executionLocationFailureSite(error) {
@@ -51,6 +51,8 @@ export function goalFileStoreId(root = defaultRoot()) {
51
51
  }
52
52
 
53
53
  function fileRecord(value, root) {
54
+ if (value?.ownerRef != null || value?.projectRef != null)
55
+ throw goalError("GOAL_PROJECT_STORE_REQUIRED");
54
56
  const record = upgradeLegacyGoal(value, goalFileStoreId(root));
55
57
  if (record.storeId !== goalFileStoreId(root))
56
58
  throw goalError("GOAL_STORE_MISMATCH");
@@ -537,13 +539,18 @@ export function resolveActiveGoal(sel = {}, opts = {}) {
537
539
  export function createGoalFileAdapter(opts = {}) {
538
540
  const root = opts.root || defaultRoot();
539
541
  const storeId = goalFileStoreId(root);
542
+ const readJson =
543
+ opts.readJson === undefined
544
+ ? (file) => JSON.parse(fs.readFileSync(file, "utf8"))
545
+ : opts.readJson;
546
+ if (typeof readJson !== "function") throw goalError("GOAL_INVALID_ADAPTER");
540
547
  function read(id) {
541
548
  if (isUnsafeGoalId(id)) throw goalError("GOAL_INVALID_ID");
542
549
  const file = goalFile(root, id);
543
550
  if (!fs.existsSync(file)) return null;
544
551
  let value;
545
552
  try {
546
- value = JSON.parse(fs.readFileSync(file, "utf8"));
553
+ value = readJson(file);
547
554
  } catch {
548
555
  throw goalError("GOAL_RECORD_CORRUPT");
549
556
  }
@@ -174,14 +174,15 @@ export function detectImagePaths(text, deps = {}) {
174
174
  * (the REPL itself forces a terminal and can't be driven headlessly).
175
175
  *
176
176
  * @param {string} text the user's typed message
177
- * @param {object} llm { provider, baseUrl, apiKey, visionModel } current LLM
177
+ * @param {object} llm { provider, model, baseUrl, apiKey, visionModel } current LLM
178
178
  * @param {object} deps { existsSync, fs } injected for tests
179
+ * @param {object} flags explicit per-run model overrides
179
180
  * @returns {{ content, images: string[], visionLlm: object|null, text: string }}
180
181
  * content is a plain string when no image is detected, else a multimodal
181
182
  * array; visionLlm is the per-turn provider/model/baseUrl/apiKey override
182
183
  * (null when there are no images); text is the path-stripped prompt.
183
184
  */
184
- export function prepareVisionTurn(text, llm = {}, deps = {}) {
185
+ export function prepareVisionTurn(text, llm = {}, deps = {}, flags = {}) {
185
186
  const detected = detectImagePaths(text, deps);
186
187
  if (!detected.images.length) {
187
188
  return { content: text, images: [], visionLlm: null, text };
@@ -191,7 +192,7 @@ export function prepareVisionTurn(text, llm = {}, deps = {}) {
191
192
  return {
192
193
  content: buildUserContent(finalText, resolved),
193
194
  images: detected.images,
194
- visionLlm: resolveVisionLlm({ hasImage: true, flags: {}, llm }),
195
+ visionLlm: resolveVisionLlm({ hasImage: true, flags, llm }),
195
196
  text: finalText,
196
197
  };
197
198
  }
@@ -276,13 +277,38 @@ export function imageUrlBlockToAnthropic(block) {
276
277
  */
277
278
  export const DEFAULT_VISION_MODEL = "doubao-seed-2-0-lite-260215";
278
279
 
280
+ // Recognize image-input families, including dated snapshots and local tags.
281
+ // Unknown models keep using the configured vision fallback. Do not infer
282
+ // vision from the provider alone or from text-only siblings (e.g. o1-mini,
283
+ // DeepSeek V3/V4, MiniMax-Text, Qwen Coder, or GPT audio/transcription SKUs).
284
+ const VISION_MODEL_PATTERNS = [
285
+ /^deepseek-v4[.-]1-(?:flash|pro)(?:-\d{6})?$/i,
286
+ /^gpt-(?:4o(?:-mini)?|4\.1(?:-mini|-nano)?|[56](?:\.\d+)?(?:-(?:sol|astra|luna|mini|nano|pro|chat|codex)(?:-(?:mini|max))?)*)(?:-(?:\d{4}-\d{2}-\d{2}|latest))?$/i,
287
+ /^gpt-4-(?:turbo(?:-\d{4}-\d{2}-\d{2})?|vision-preview)$/i,
288
+ /^(?:o1|o3(?:-pro)?|o4-mini)(?:-\d{4}-\d{2}-\d{2})?$/i,
289
+ /^claude-(?:3(?:[.-][57])?-(?:opus|sonnet|haiku)|(?:opus|sonnet|haiku)-[345](?:[.-]\d+)?)(?:-\d{8}|-latest)?$/i,
290
+ /^gemini-(?:(?:1\.5|[23](?:\.\d+)?)-(?:pro|flash)(?!.*(?:tts|audio))[\w.-]*|pro-vision)$/i,
291
+ /^doubao-(?:seed-(?:1[.-][68]|2[.-][01])(?:-(?:pro|lite|flash|thinking))?(?:-\d{6})?|(?:1[.-]5-)?vision[\w.-]*)$/i,
292
+ /^(?:qwen-vl-(?:max|plus)|qwen(?:2(?:[.-]5)?|3)[.-]?vl|qwen[23](?:[.-]5)?-omni|qvq)(?:[-:.][\w.-]+)?$/i,
293
+ /^qwen3[.-]5(?:[-:.][\w.-]+)?$/i,
294
+ /^glm-4(?:[.-]\d+)?v(?:-[\w.-]+)?$/i,
295
+ /^(?:kimi-k2[.-]5|moonshot-v1-(?:8k|32k|128k)-vision)(?:-[\w.-]+)?$/i,
296
+ /^(?:pixtral-(?:12b|large)|mistral-small-(?:3[.-][12]|250[36])|minimax-vl-01)(?:[-:.][\w.-]+)?$/i,
297
+ /^(?:llava|bakllava|llama3\.2-vision|minicpm-v|moondream)(?:[-:.][\w.-]+)?$/i,
298
+ /^gemma3(?::(?:4b|12b|27b)(?:-[\w.-]+)?)?$/i,
299
+ ];
300
+
301
+ export function supportsVisionModel(model) {
302
+ if (typeof model !== "string") return false;
303
+ const id = model.trim().split("/").at(-1);
304
+ return VISION_MODEL_PATTERNS.some((pattern) => pattern.test(id));
305
+ }
306
+
279
307
  /**
280
- * Resolve the effective LLM config for a run. When an image is attached, default
281
- * the provider/model/baseUrl/apiKey to the configured vision LLM so
282
- * `cc agent --image foo.png` works without extra flags — using `llm.visionModel`
283
- * (a separate, configurable vision model) and falling back to DEFAULT_VISION_MODEL.
284
- * Explicit flags always win; with no image, behaviour is unchanged (vision config
285
- * is ignored). `--vision-model` overrides the configured/default vision model.
308
+ * Resolve image input using the main model when it supports vision. Only
309
+ * text-only/unknown main models use llm.visionModel or DEFAULT_VISION_MODEL.
310
+ * Explicit --model/--vision-model choices take precedence over saved settings.
311
+ * Without an image, no override is applied.
286
312
  *
287
313
  * @param {object} p
288
314
  * @param {boolean} p.hasImage true when the run carries an attached image
@@ -301,13 +327,16 @@ export function resolveVisionLlm({ hasImage, flags = {}, llm = {} } = {}) {
301
327
  apiKey: undefined,
302
328
  };
303
329
  }
304
- const visionModel =
305
- flags.visionModel || llm.visionModel || DEFAULT_VISION_MODEL;
306
- // `flags.model` must be the EXPLICIT `--model` (not a settings/default), so an
307
- // attached image uses the vision model unless the user deliberately picked one.
330
+ const mainModel =
331
+ !flags.provider || !llm.provider || flags.provider === llm.provider
332
+ ? llm.model
333
+ : undefined;
334
+ const visionModel = supportsVisionModel(mainModel)
335
+ ? mainModel
336
+ : llm.visionModel || DEFAULT_VISION_MODEL;
308
337
  return {
309
338
  provider: flags.provider || llm.provider,
310
- model: flags.model || visionModel,
339
+ model: flags.model || flags.visionModel || visionModel,
311
340
  baseUrl: flags.baseUrl || llm.baseUrl,
312
341
  apiKey: flags.apiKey || llm.apiKey,
313
342
  };
@@ -86,6 +86,7 @@ export const BUILT_IN_PROVIDERS = {
86
86
  baseUrl: "https://ark.cn-beijing.volces.com/api/v3",
87
87
  apiKeyEnv: "VOLCENGINE_API_KEY",
88
88
  models: [
89
+ "deepseek-v4-1-flash-260910",
89
90
  "deepseek-v4-flash-ga-260731",
90
91
  "deepseek-v4-flash-260425",
91
92
  "doubao-seed-2-1-pro-260628",
@@ -32,6 +32,7 @@ export const CAPABILITY_KINDS = Object.freeze([
32
32
  "mcp",
33
33
  "monitor",
34
34
  "credential",
35
+ "goalExtension",
35
36
  ]);
36
37
 
37
38
  function toBool(v) {
@@ -92,6 +93,10 @@ export function normalizeCapabilities(raw) {
92
93
  mcp: toBool(r.mcp),
93
94
  monitor: toBool(r.monitor ?? r.monitors),
94
95
  credential: { names: toList(r.credential ?? r.credentials) },
96
+ // Keep old normalized records unchanged; missing goal grants are deny-all.
97
+ ...(Object.hasOwn(r, "goalExtension")
98
+ ? { goalExtension: toList(r.goalExtension) }
99
+ : {}),
95
100
  };
96
101
  }
97
102
 
@@ -137,6 +142,7 @@ export function diffCapabilities(prev, next) {
137
142
  };
138
143
  listCap("filesystem", "filesystem", (c) => c.filesystem.roots);
139
144
  listCap("credential", "credential", (c) => c.credential.names);
145
+ listCap("goalExtension", "goalExtension", (c) => c.goalExtension || []);
140
146
 
141
147
  return { added, removed, widened: added.length > 0 };
142
148
  }
@@ -168,6 +174,10 @@ export function describeCapabilities(caps) {
168
174
  if (c.monitor) lines.push("monitor: may run background monitors");
169
175
  if (c.credential.names.length)
170
176
  lines.push(`credential: ${c.credential.names.join(", ")}`);
177
+ if (c.goalExtension?.length)
178
+ lines.push(
179
+ `goalExtension: ${c.goalExtension.join(", ")} (host authorization required)`,
180
+ );
171
181
  return lines;
172
182
  }
173
183
 
@@ -0,0 +1,138 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { VERSION } from "../../constants.js";
4
+ import { createProjectGoalConnection } from "../project-goal-connection.js";
5
+ import { collectGoalExtensions } from "./goal-extensions.js";
6
+ import { createGoalDraftRequest } from "@chainlesschain/session-core/goal-draft-request-contract";
7
+ import { digestBusinessObjectContent as digest } from "@chainlesschain/session-core/business-object-contract";
8
+ const HOST = Object.freeze({
9
+ id: "cli",
10
+ version: VERSION,
11
+ capabilities: Object.freeze(["proposal:task.description.update"]),
12
+ });
13
+ function fail(code) {
14
+ throw new Error(code);
15
+ }
16
+ export function readGoalDraftDescription(file) {
17
+ const target = path.resolve(file),
18
+ before = fs.lstatSync(target);
19
+ if (
20
+ !before.isFile() ||
21
+ before.isSymbolicLink() ||
22
+ before.size > 8192 ||
23
+ before.nlink !== 1
24
+ )
25
+ fail("GOAL_DRAFT_DESCRIPTION_INVALID");
26
+ const fd = fs.openSync(
27
+ target,
28
+ fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0),
29
+ );
30
+ try {
31
+ const opened = fs.fstatSync(fd),
32
+ raw = Buffer.alloc(8193),
33
+ length = fs.readSync(fd, raw, 0, raw.length, 0),
34
+ after = fs.fstatSync(fd),
35
+ current = fs.lstatSync(target);
36
+ if (
37
+ length > 8192 ||
38
+ [opened, after, current].some(
39
+ (stat) =>
40
+ stat.dev !== before.dev ||
41
+ stat.ino !== before.ino ||
42
+ stat.size !== before.size ||
43
+ stat.mtimeMs !== before.mtimeMs ||
44
+ stat.ctimeMs !== before.ctimeMs,
45
+ )
46
+ )
47
+ fail("GOAL_DRAFT_DESCRIPTION_INVALID");
48
+ return new TextDecoder("utf-8", { fatal: true }).decode(
49
+ raw.subarray(0, length),
50
+ );
51
+ } finally {
52
+ fs.closeSync(fd);
53
+ }
54
+ }
55
+ export async function exportCliGoalDraftRequest(id, options = {}) {
56
+ options = Object.freeze({
57
+ ...options,
58
+ env: Object.freeze({ ...(options.env || process.env) }),
59
+ });
60
+ const cwd = path.resolve(options.cwd || process.cwd()),
61
+ env = Object.freeze({ ...(options.env || process.env) });
62
+ if (
63
+ !options.connection ||
64
+ !options.plugin ||
65
+ !["user", "project", "local"].includes(options.scope) ||
66
+ !options.descriptionFile ||
67
+ !options.out
68
+ )
69
+ fail("GOAL_DRAFT_EXPORT_ARGUMENTS_REQUIRED");
70
+ const connection = createProjectGoalConnection(options.connection),
71
+ snapshot = await connection.read(id);
72
+ if (
73
+ options.expectedStore !== undefined &&
74
+ options.expectedStore !== snapshot.goalRef.storeId
75
+ )
76
+ fail("CLI_GOAL_STORE_MISMATCH");
77
+ const hostOptions = {
78
+ cwd,
79
+ env,
80
+ host: HOST,
81
+ managedSettingsFile: options.managedSettingsFile,
82
+ };
83
+ const admitted = () =>
84
+ collectGoalExtensions(hostOptions).extensions.find(
85
+ (entry) => entry.name === options.plugin && entry.scope === options.scope,
86
+ );
87
+ const plugin = admitted();
88
+ if (
89
+ !plugin ||
90
+ !plugin.declaration.proposals.includes("task.description.update")
91
+ )
92
+ fail("GOAL_DRAFT_PLUGIN_NOT_ADMITTED");
93
+ const request = createGoalDraftRequest({
94
+ declaredPlugin: {
95
+ name: plugin.name,
96
+ scope: plugin.scope,
97
+ version: plugin.version,
98
+ },
99
+ declarationDigest: digest(plugin.declaration),
100
+ proposal: {
101
+ type: "task.description.update",
102
+ goalRef: snapshot.goalRef,
103
+ sourceRef: options.source,
104
+ requestId: options.requestId,
105
+ title: options.title,
106
+ description: readGoalDraftDescription(
107
+ path.resolve(cwd, options.descriptionFile),
108
+ ),
109
+ },
110
+ });
111
+ const latest = await connection.read(id),
112
+ current = admitted();
113
+ if (
114
+ !current ||
115
+ digest(current) !== digest(plugin) ||
116
+ latest.objective !== snapshot.objective ||
117
+ latest.status !== snapshot.status ||
118
+ digest(latest.goalRef) !== digest(snapshot.goalRef)
119
+ )
120
+ fail("GOAL_DRAFT_EXPORT_SOURCE_CHANGED");
121
+ const file = path.resolve(cwd, options.out),
122
+ fd = fs.openSync(file, "wx", 0o600);
123
+ try {
124
+ fs.writeFileSync(fd, JSON.stringify(request));
125
+ fs.fsyncSync(fd);
126
+ } finally {
127
+ fs.closeSync(fd);
128
+ }
129
+ return {
130
+ schema: "chainlesschain.goal-draft-export/v1",
131
+ state: "request-exported",
132
+ goalRef: request.proposal.goalRef,
133
+ declaredPlugin: request.declaredPlugin,
134
+ requestId: request.proposal.requestId,
135
+ contentDigest: request.contentDigest,
136
+ file,
137
+ };
138
+ }