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
@@ -169,10 +169,12 @@ async function fetchRegistryRemoteArtifacts(
169
169
  : null;
170
170
  if (!signature && !sbom) return null;
171
171
  const config = await loadOptionalPluginConfig();
172
- const { resolveRegistryToken } =
173
- await import("../lib/plugin-runtime/remote-source.js");
174
- const { fetchPluginMarketplaceRemoteArtifacts } =
175
- await import("../lib/plugin-runtime/marketplace-remote-artifacts.js");
172
+ const { resolveRegistryToken } = await import(
173
+ "../lib/plugin-runtime/remote-source.js"
174
+ );
175
+ const { fetchPluginMarketplaceRemoteArtifacts } = await import(
176
+ "../lib/plugin-runtime/marketplace-remote-artifacts.js"
177
+ );
176
178
  return fetchPluginMarketplaceRemoteArtifacts({
177
179
  registryUrl,
178
180
  token: resolveRegistryToken(registryUrl, { token, config }),
@@ -432,8 +434,9 @@ async function materializeRegistrySelection(
432
434
 
433
435
  async function buildRegistryInstallPreflight(url, resolved, cwd) {
434
436
  const { VERSION } = await import("../constants.js");
435
- const { buildPluginMarketplaceInstallPreflight } =
436
- await import("../lib/plugin-runtime/marketplace-catalog.js");
437
+ const { buildPluginMarketplaceInstallPreflight } = await import(
438
+ "../lib/plugin-runtime/marketplace-catalog.js"
439
+ );
437
440
  const installed = await discoverInstalledPluginVersions(cwd);
438
441
  return buildPluginMarketplaceInstallPreflight({
439
442
  registryUrl: url,
@@ -582,8 +585,9 @@ async function installedCatalogAuthorityMatches(
582
585
  }
583
586
 
584
587
  async function buildInstalledMarketplaceSnapshot(name, scope, cwd) {
585
- const { listInstalled, readSourceMetadataStrict } =
586
- await import("../lib/plugin-runtime/install.js");
588
+ const { listInstalled, readSourceMetadataStrict } = await import(
589
+ "../lib/plugin-runtime/install.js"
590
+ );
587
591
  const { discoverPlugins } = await import("../lib/plugin-runtime/scopes.js");
588
592
  const row = listInstalled({ cwd, scopes: [scope] }).find(
589
593
  (candidate) => candidate.name === name && candidate.scope === scope,
@@ -708,10 +712,12 @@ async function buildInstalledMarketplaceSnapshot(name, scope, cwd) {
708
712
  }
709
713
 
710
714
  async function buildRegistryUpdateImpact(preflight, name, scope, cwd) {
711
- const { buildPluginMarketplaceUpdateImpact } =
712
- await import("../lib/plugin-runtime/marketplace-impact.js");
713
- const { listInstalledAllScopes } =
714
- await import("../lib/plugin-runtime/install.js");
715
+ const { buildPluginMarketplaceUpdateImpact } = await import(
716
+ "../lib/plugin-runtime/marketplace-impact.js"
717
+ );
718
+ const { listInstalledAllScopes } = await import(
719
+ "../lib/plugin-runtime/install.js"
720
+ );
715
721
  const inventory = listInstalledAllScopes({ cwd }).filter(
716
722
  (entry) => entry.name === name,
717
723
  );
@@ -752,8 +758,9 @@ async function resolvePluginCapabilityNotice(
752
758
  ) {
753
759
  try {
754
760
  const { discoverPlugins } = await import("../lib/plugin-runtime/scopes.js");
755
- const { describeCapabilities } =
756
- await import("../lib/plugin-runtime/capabilities.js");
761
+ const { describeCapabilities } = await import(
762
+ "../lib/plugin-runtime/capabilities.js"
763
+ );
757
764
  const consent = await import("../lib/plugin-runtime/capability-consent.js");
758
765
  const installed = discoverPlugins({
759
766
  cwd,
@@ -1140,8 +1147,9 @@ export function registerPluginCommand(program) {
1140
1147
  .action(async (name, options) => {
1141
1148
  try {
1142
1149
  if (options.scope) {
1143
- const { setPluginEnabled } =
1144
- await import("../lib/plugin-runtime/install.js");
1150
+ const { setPluginEnabled } = await import(
1151
+ "../lib/plugin-runtime/install.js"
1152
+ );
1145
1153
  const result = setPluginEnabled(name, true, {
1146
1154
  scope: options.scope,
1147
1155
  cwd: process.cwd(),
@@ -1197,8 +1205,9 @@ export function registerPluginCommand(program) {
1197
1205
  .action(async (name, options) => {
1198
1206
  try {
1199
1207
  if (options.scope) {
1200
- const { setPluginEnabled } =
1201
- await import("../lib/plugin-runtime/install.js");
1208
+ const { setPluginEnabled } = await import(
1209
+ "../lib/plugin-runtime/install.js"
1210
+ );
1202
1211
  const result = setPluginEnabled(name, false, {
1203
1212
  scope: options.scope,
1204
1213
  cwd: process.cwd(),
@@ -1603,9 +1612,14 @@ export function registerPluginCommand(program) {
1603
1612
  .option("--public-key <path>", "Public key for signature verification")
1604
1613
  .option("--json", "Output as JSON")
1605
1614
  .action(async (dir, options) => {
1606
- const { parsePluginManifest, summarizeComponents } =
1607
- await import("../lib/plugin-runtime/manifest.js");
1615
+ const { parsePluginManifest, summarizeComponents } = await import(
1616
+ "../lib/plugin-runtime/manifest.js"
1617
+ );
1608
1618
  const manifest = parsePluginManifest(dir);
1619
+ const { summarizeGoalExtension } = await import(
1620
+ "../lib/plugin-runtime/goal-extension-contract.js"
1621
+ );
1622
+ const goalExtensionSummary = summarizeGoalExtension(manifest);
1609
1623
 
1610
1624
  // Optional integrity/signature check on the manifest file itself.
1611
1625
  // verifyPluginManifest THROWS on any mismatch/failure and returns a
@@ -1651,8 +1665,9 @@ export function registerPluginCommand(program) {
1651
1665
  if (rawManifest && rawManifest.dependencies) {
1652
1666
  const { checkPluginDependencies, formatDependencyIssues } =
1653
1667
  await import("../lib/plugin-runtime/governance.js");
1654
- const { discoverPlugins } =
1655
- await import("../lib/plugin-runtime/scopes.js");
1668
+ const { discoverPlugins } = await import(
1669
+ "../lib/plugin-runtime/scopes.js"
1670
+ );
1656
1671
  const { VERSION } = await import("../constants.js");
1657
1672
  const installed = {};
1658
1673
  try {
@@ -1685,6 +1700,7 @@ export function registerPluginCommand(program) {
1685
1700
  {
1686
1701
  ...manifest,
1687
1702
  componentCounts: counts,
1703
+ goalExtensionSummary,
1688
1704
  verification,
1689
1705
  dependencyCheck,
1690
1706
  },
@@ -1731,13 +1747,29 @@ export function registerPluginCommand(program) {
1731
1747
  // so a user can compare against the components it ships (the audit findings
1732
1748
  // for an under-declared manifest already surface in manifest.warnings).
1733
1749
  if (manifest.capabilitiesDeclared) {
1734
- const { describeCapabilities } =
1735
- await import("../lib/plugin-runtime/capabilities.js");
1750
+ const { describeCapabilities } = await import(
1751
+ "../lib/plugin-runtime/capabilities.js"
1752
+ );
1736
1753
  const capLines = describeCapabilities(manifest.capabilities);
1737
1754
  logger.log(chalk.bold("\nCapabilities (declared):"));
1738
1755
  if (capLines.length === 0) logger.log(chalk.gray(" (none)"));
1739
1756
  for (const l of capLines) logger.log(` ${chalk.magenta(l)}`);
1740
1757
  }
1758
+ if (manifest.goalExtensionDeclared) {
1759
+ logger.log(chalk.bold("\nGoal extension (declaration only):"));
1760
+ logger.log(
1761
+ ` API: ${goalExtensionSummary.apiVersion || "invalid"}; runtime: unavailable`,
1762
+ );
1763
+ if (goalExtensionSummary.hosts) {
1764
+ for (const [host, range] of Object.entries(
1765
+ goalExtensionSummary.hosts,
1766
+ )) {
1767
+ logger.log(` ${host}: ${range}`);
1768
+ }
1769
+ }
1770
+ if (goalExtensionSummary.apiCompatible === false)
1771
+ logger.log(chalk.yellow(" unsupported goal extension API version"));
1772
+ }
1741
1773
  for (const w of manifest.warnings) logger.log(chalk.yellow(` ⚠ ${w}`));
1742
1774
  for (const e of manifest.errors) logger.log(chalk.red(` ✖ ${e}`));
1743
1775
  if (manifest.ok) {
@@ -1839,8 +1871,9 @@ export function registerPluginCommand(program) {
1839
1871
  let commandSourceAuthority = null;
1840
1872
  let registryResolutionAuthority = null;
1841
1873
  const registryUrls = normalizeRegistryUrls(options.registry);
1842
- const { isRemoteSource, resolveRemoteSource } =
1843
- await import("../lib/plugin-runtime/remote-source.js");
1874
+ const { isRemoteSource, resolveRemoteSource } = await import(
1875
+ "../lib/plugin-runtime/remote-source.js"
1876
+ );
1844
1877
  if (
1845
1878
  options.offline === true &&
1846
1879
  registryUrls.length === 0 &&
@@ -2407,8 +2440,9 @@ export function registerPluginCommand(program) {
2407
2440
  return;
2408
2441
  }
2409
2442
 
2410
- const { fetchRegistry, resolveRegistryToken } =
2411
- await import("../lib/plugin-runtime/remote-source.js");
2443
+ const { fetchRegistry, resolveRegistryToken } = await import(
2444
+ "../lib/plugin-runtime/remote-source.js"
2445
+ );
2412
2446
  const { buildPluginMarketplaceCatalog, MAX_MARKETPLACE_CATALOG_SOURCES } =
2413
2447
  await import("../lib/plugin-runtime/marketplace-catalog.js");
2414
2448
  if (registryUrls.length > MAX_MARKETPLACE_CATALOG_SOURCES) {
@@ -2429,8 +2463,9 @@ export function registerPluginCommand(program) {
2429
2463
  process.exitCode = 1;
2430
2464
  return;
2431
2465
  }
2432
- const { discoverPlugins } =
2433
- await import("../lib/plugin-runtime/scopes.js");
2466
+ const { discoverPlugins } = await import(
2467
+ "../lib/plugin-runtime/scopes.js"
2468
+ );
2434
2469
  const { VERSION } = await import("../constants.js");
2435
2470
  let config = null;
2436
2471
  try {
@@ -2795,8 +2830,9 @@ export function registerPluginCommand(program) {
2795
2830
  )
2796
2831
  .option("--json", "Output as JSON")
2797
2832
  .action(async (options) => {
2798
- const { listInstalled, listInstalledAllScopes } =
2799
- await import("../lib/plugin-runtime/install.js");
2833
+ const { listInstalled, listInstalledAllScopes } = await import(
2834
+ "../lib/plugin-runtime/install.js"
2835
+ );
2800
2836
  const rows = options.allScopes
2801
2837
  ? listInstalledAllScopes({ cwd: process.cwd() })
2802
2838
  : listInstalled({ cwd: process.cwd() });
@@ -2808,8 +2844,9 @@ export function registerPluginCommand(program) {
2808
2844
  logger.info("No plugins installed. Add one with: cc plugin add <dir>");
2809
2845
  return;
2810
2846
  }
2811
- const { isPluginTrusted } =
2812
- await import("../lib/plugin-runtime/trust.js");
2847
+ const { isPluginTrusted } = await import(
2848
+ "../lib/plugin-runtime/trust.js"
2849
+ );
2813
2850
  logger.log(chalk.bold(`Installed plugins (${rows.length}):`));
2814
2851
  for (const r of rows) {
2815
2852
  if (r.runtimeBlocked === true) {
@@ -2843,6 +2880,13 @@ export function registerPluginCommand(program) {
2843
2880
  logger.log(
2844
2881
  ` ${ok} ${chalk.cyan(r.name)} v${r.version} ${chalk.gray(`[${r.scope}]`)} ${state} ${trust} ${signed}${policy ? ` ${policy}` : ""}`,
2845
2882
  );
2883
+ if (r.goalExtension?.status === "declaration-only") {
2884
+ logger.log(
2885
+ chalk.gray(
2886
+ ` goal SDK ${r.goalExtension.apiVersion}: declaration only; runtime unavailable`,
2887
+ ),
2888
+ );
2889
+ }
2846
2890
  }
2847
2891
  });
2848
2892
 
@@ -2855,8 +2899,9 @@ export function registerPluginCommand(program) {
2855
2899
  .option("--json", "Output the redacted transaction authority as JSON")
2856
2900
  .action(async (name, options) => {
2857
2901
  try {
2858
- const { inspectPluginTransaction } =
2859
- await import("../lib/plugin-runtime/install.js");
2902
+ const { inspectPluginTransaction } = await import(
2903
+ "../lib/plugin-runtime/install.js"
2904
+ );
2860
2905
  const transaction = inspectPluginTransaction(name, {
2861
2906
  scope: options.scope,
2862
2907
  cwd: process.cwd(),
@@ -2899,8 +2944,9 @@ export function registerPluginCommand(program) {
2899
2944
  .option("--json", "Output the recovery result as JSON")
2900
2945
  .action(async (name, options) => {
2901
2946
  try {
2902
- const { recoverPluginTransaction } =
2903
- await import("../lib/plugin-runtime/install.js");
2947
+ const { recoverPluginTransaction } = await import(
2948
+ "../lib/plugin-runtime/install.js"
2949
+ );
2904
2950
  const recovery = recoverPluginTransaction(name, {
2905
2951
  scope: options.scope,
2906
2952
  cwd: process.cwd(),
@@ -2940,8 +2986,9 @@ export function registerPluginCommand(program) {
2940
2986
  )
2941
2987
  .action(async (name, options) => {
2942
2988
  try {
2943
- const { planPluginProvenanceMigration } =
2944
- await import("../lib/plugin-runtime/install.js");
2989
+ const { planPluginProvenanceMigration } = await import(
2990
+ "../lib/plugin-runtime/install.js"
2991
+ );
2945
2992
  const plan = planPluginProvenanceMigration(name, {
2946
2993
  scope: options.scope,
2947
2994
  cwd: process.cwd(),
@@ -2983,8 +3030,9 @@ export function registerPluginCommand(program) {
2983
3030
  "refusing provenance mutation without --yes after reviewing the signed plan",
2984
3031
  );
2985
3032
  }
2986
- const { migratePluginProvenance } =
2987
- await import("../lib/plugin-runtime/install.js");
3033
+ const { migratePluginProvenance } = await import(
3034
+ "../lib/plugin-runtime/install.js"
3035
+ );
2988
3036
  const result = migratePluginProvenance(name, {
2989
3037
  scope: options.scope,
2990
3038
  cwd: process.cwd(),
@@ -3028,8 +3076,9 @@ export function registerPluginCommand(program) {
3028
3076
  .option("--json", "Output the versioned artifact readback as JSON")
3029
3077
  .action(async (name, options) => {
3030
3078
  try {
3031
- const { listInstalled, readSourceMetadataStrict } =
3032
- await import("../lib/plugin-runtime/install.js");
3079
+ const { listInstalled, readSourceMetadataStrict } = await import(
3080
+ "../lib/plugin-runtime/install.js"
3081
+ );
3033
3082
  const installed = listInstalled({
3034
3083
  cwd: process.cwd(),
3035
3084
  scopes: [options.scope],
@@ -3049,8 +3098,9 @@ export function registerPluginCommand(program) {
3049
3098
  required: true,
3050
3099
  requireRegistryAuthority: true,
3051
3100
  });
3052
- const { buildPluginMarketplaceArtifactReadback } =
3053
- await import("../lib/plugin-runtime/marketplace-artifact-readback.js");
3101
+ const { buildPluginMarketplaceArtifactReadback } = await import(
3102
+ "../lib/plugin-runtime/marketplace-artifact-readback.js"
3103
+ );
3054
3104
  const evidence = buildPluginMarketplaceArtifactReadback({
3055
3105
  root: installed.dir,
3056
3106
  scope: installed.scope,
@@ -3123,10 +3173,12 @@ export function registerPluginCommand(program) {
3123
3173
  .option("--scope <scope>", "Scope of the plugin", "project")
3124
3174
  .option("--list", "List all trusted plugins instead")
3125
3175
  .action(async (name, options) => {
3126
- const { trustPlugin, listTrust } =
3127
- await import("../lib/plugin-runtime/trust.js");
3128
- const { getActiveVersion } =
3129
- await import("../lib/plugin-runtime/install.js");
3176
+ const { trustPlugin, listTrust } = await import(
3177
+ "../lib/plugin-runtime/trust.js"
3178
+ );
3179
+ const { getActiveVersion } = await import(
3180
+ "../lib/plugin-runtime/install.js"
3181
+ );
3130
3182
  if (options.list) {
3131
3183
  for (const t of listTrust()) {
3132
3184
  logger.log(` ${chalk.cyan(t.name)} v${t.version} [${t.scope}]`);
@@ -3181,10 +3233,12 @@ export function registerPluginCommand(program) {
3181
3233
  .option("--list", "List all capability consent entries")
3182
3234
  .option("--json", "Output as JSON")
3183
3235
  .action(async (name, options) => {
3184
- const consent =
3185
- await import("../lib/plugin-runtime/capability-consent.js");
3186
- const { describeCapabilities } =
3187
- await import("../lib/plugin-runtime/capabilities.js");
3236
+ const consent = await import(
3237
+ "../lib/plugin-runtime/capability-consent.js"
3238
+ );
3239
+ const { describeCapabilities } = await import(
3240
+ "../lib/plugin-runtime/capabilities.js"
3241
+ );
3188
3242
 
3189
3243
  if (!name || options.list) {
3190
3244
  const rows = consent.listCapabilityConsent();
@@ -3221,8 +3275,9 @@ export function registerPluginCommand(program) {
3221
3275
  }
3222
3276
 
3223
3277
  // Resolve the installed plugin + its declared capabilities.
3224
- const { discoverPlugins } =
3225
- await import("../lib/plugin-runtime/scopes.js");
3278
+ const { discoverPlugins } = await import(
3279
+ "../lib/plugin-runtime/scopes.js"
3280
+ );
3226
3281
  let installed = null;
3227
3282
  try {
3228
3283
  installed = discoverPlugins({
@@ -3339,8 +3394,9 @@ export function registerPluginCommand(program) {
3339
3394
  )
3340
3395
  .option("--json", "Output as JSON")
3341
3396
  .action(async (name, options) => {
3342
- const { discoverPlugins } =
3343
- await import("../lib/plugin-runtime/scopes.js");
3397
+ const { discoverPlugins } = await import(
3398
+ "../lib/plugin-runtime/scopes.js"
3399
+ );
3344
3400
  const optsMod = await import("../lib/plugin-runtime/plugin-options.js");
3345
3401
 
3346
3402
  let installed = null;
@@ -3442,8 +3498,9 @@ export function registerPluginCommand(program) {
3442
3498
  .option("--run", "Actually run the monitors for a few seconds, then reap")
3443
3499
  .option("--seconds <n>", "With --run: how long to run", "3")
3444
3500
  .action(async (options) => {
3445
- const { collectPluginMonitors } =
3446
- await import("../lib/plugin-runtime/monitors.js");
3501
+ const { collectPluginMonitors } = await import(
3502
+ "../lib/plugin-runtime/monitors.js"
3503
+ );
3447
3504
  const monitors = collectPluginMonitors({ cwd: process.cwd() });
3448
3505
  if (options.json && !options.run) {
3449
3506
  console.log(JSON.stringify(monitors, null, 2));
@@ -3467,8 +3524,9 @@ export function registerPluginCommand(program) {
3467
3524
  }
3468
3525
  if (!options.run) return;
3469
3526
 
3470
- const { PluginMonitorSupervisor } =
3471
- await import("../lib/plugin-monitor-supervisor.js");
3527
+ const { PluginMonitorSupervisor } = await import(
3528
+ "../lib/plugin-monitor-supervisor.js"
3529
+ );
3472
3530
  const secs = Math.max(1, parseInt(options.seconds, 10) || 3);
3473
3531
  const sup = new PluginMonitorSupervisor();
3474
3532
  const started = sup.start(monitors);
@@ -3498,8 +3556,9 @@ export function registerPluginCommand(program) {
3498
3556
  "Approve a different-source fallback when removing the active version",
3499
3557
  )
3500
3558
  .action(async (name, options) => {
3501
- const { listInstalled, uninstall } =
3502
- await import("../lib/plugin-runtime/install.js");
3559
+ const { listInstalled, uninstall } = await import(
3560
+ "../lib/plugin-runtime/install.js"
3561
+ );
3503
3562
  try {
3504
3563
  const blockedRow = listInstalled({
3505
3564
  cwd: process.cwd(),
@@ -3607,8 +3666,9 @@ export function registerPluginCommand(program) {
3607
3666
  let commandSourceAuthority = null;
3608
3667
  let registryResolutionAuthority = null;
3609
3668
  const registryUrls = normalizeRegistryUrls(options.registry);
3610
- const { isRemoteSource, resolveRemoteSource } =
3611
- await import("../lib/plugin-runtime/remote-source.js");
3669
+ const { isRemoteSource, resolveRemoteSource } = await import(
3670
+ "../lib/plugin-runtime/remote-source.js"
3671
+ );
3612
3672
  if (
3613
3673
  options.offline === true &&
3614
3674
  registryUrls.length === 0 &&
@@ -4090,8 +4150,9 @@ export function registerPluginCommand(program) {
4090
4150
  "Approve activating an installed version from a different source",
4091
4151
  )
4092
4152
  .action(async (name, version, options) => {
4093
- const { setActiveVersion } =
4094
- await import("../lib/plugin-runtime/install.js");
4153
+ const { setActiveVersion } = await import(
4154
+ "../lib/plugin-runtime/install.js"
4155
+ );
4095
4156
  try {
4096
4157
  setActiveVersion(name, version, {
4097
4158
  scope: options.scope,
package/src/constants.js CHANGED
@@ -30,7 +30,7 @@ export const LLM_PROVIDERS = {
30
30
  volcengine: {
31
31
  name: "Volcengine (火山引擎/豆包)",
32
32
  defaultBaseUrl: "https://ark.cn-beijing.volces.com/api/v3",
33
- defaultModel: "deepseek-v4-flash-ga-260731",
33
+ defaultModel: "deepseek-v4-1-flash-260910",
34
34
  requiresApiKey: true,
35
35
  },
36
36
  openai: {
@@ -144,7 +144,7 @@ export const DEFAULT_CONFIG = {
144
144
  provider: "volcengine",
145
145
  apiKey: null,
146
146
  baseUrl: "https://ark.cn-beijing.volces.com/api/v3",
147
- model: "deepseek-v4-flash-ga-260731",
147
+ model: "deepseek-v4-1-flash-260910",
148
148
  // When true, `cc ask` (provider=ollama only) overrides baseUrl to point at
149
149
  // the Android LocalLlmServer (127.0.0.1:18484). User opt-in toggle:
150
150
  // cc config set llm.preferAndroidLocal true
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.107",
7
+ "cliVersions": ["0.166.107"],
8
+ "date": "2026-10-20",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added, improved and fixed - cc CLI 0.166.107: governed goals, ledger recovery and safe diagnostics (candidate, 2026-10-20)",
13
+ "body": "- Add bounded `goal catalog` and `goal panels` commands to browse goals and read text snapshots from trusted, consented plugins, including explicitly connected desktop project goals.\n- Add `goal draft-request`, `goal draft-access`, `goal draft-sources`, `goal draft-send`, and `goal draft-receipt` for native-reviewed description requests and separately authorized pending drafts. Submission records support receipt reconciliation without automatic duplicate sends; task changes still require native desktop preview and confirmation.\n- Use `deepseek-v4-1-flash-260910` as the default Volcengine model for new CLI, agent, and task-model configurations.\n- Reuse an authenticated parent-directory boundary while validating cached immutable ledger files, preserving per-file bounded reads, identity, fingerprints, digests, and boundary checks. Resolve Wiki pruning journal artifacts in batches of four; six cross-process recovery scenarios complete in 49–55 seconds on Windows.\n- Reject formal-budget-scoped calls to the native campaign and public VS Code diagnostic before reading options or credentials, touching files, downloading packages, launching hosts, or sending provider requests."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.166.106",
20
+ "cliVersions": ["0.166.105", "0.166.106"],
21
+ "date": "2026-10-18",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Fixed - cc CLI 0.166.106: task delivery follow-up (candidate, 2026-10-18)",
26
+ "body": "- Guide coding tasks toward brief action statements and complete file writes split into bounded segments.\n- Ground regression expectations and defaults in the source contract, exercise actual boundaries with valid fault-injection fixtures, and use independent expected values or authoritative state.\n- Preserve the explicit provider reason for HTTP 403 responses that are not authentication or billing errors.\n- Keep JetBrains asynchronous draft-save receipts in a separate status update so they do not interrupt the assistant reply.\n- Wait up to two seconds for final JetBrains stdout callbacks on the background process waiter and schedule exit alongside result rendering on the IDE event queue.\n- Close unused Windows ACL subprocess input, require complete output before success, and share one bounded drain/cleanup deadline; native ACL startup timeouts remain under investigation.\n- Pair candidate VS Code 0.37.151 and JetBrains 0.4.168 with CLI 0.166.106; retain the existing published child-package versions.\n- Current public versions remain CLI 0.166.105, Open VSX 0.37.150 and JetBrains 0.4.167. Publish this candidate only after complete exact-commit gates, npm OIDC and public artifact readback, then retest unfinished samples.\n- Public .105 retesting completed generation 20/20 and acceptance 20/20, adding 6 candidate acceptances and 6 full-flow passes. Cumulative acceptance is 31/45 (ordinary 26/36, first-use 5/9), with 14 remaining. The original 25 accepted artifacts were reused byte-for-byte; cross-version cumulative acceptance is not a single-round 45/45 success. Candidates .106/.151/.168 remain unpublished and have not been retested."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": null,
6
32
  "cliVersion": "0.166.105",
@@ -0,0 +1,129 @@
1
+ /** Bounded, explicit metadata discovery for native IDE goal pickers. */
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { resolveConfigDataRoot } from "./paths.js";
5
+ import { goalFileStoreId } from "./goal-store.js";
6
+ import { createCliGoalSnapshotReader } from "./cli-goal-source.js";
7
+
8
+ export const CLI_GOAL_CATALOG_SCHEMA = "chainlesschain.goal-catalog.v1";
9
+ const MAX_DIRECTORY_ENTRIES = 2048;
10
+ const safeId = (id) =>
11
+ typeof id === "string" &&
12
+ /^[A-Za-z0-9][A-Za-z0-9._-]{0,255}$/u.test(id) &&
13
+ !id.includes("..");
14
+ function fail(code) {
15
+ throw new Error(code);
16
+ }
17
+ function cursor(storeId, afterId) {
18
+ return Buffer.from(JSON.stringify({ v: 1, storeId, afterId })).toString(
19
+ "base64url",
20
+ );
21
+ }
22
+ function decodeCursor(value, storeId) {
23
+ if (value === undefined) return "";
24
+ try {
25
+ if (
26
+ typeof value !== "string" ||
27
+ value.length > 1024 ||
28
+ !/^[A-Za-z0-9_-]+$/u.test(value)
29
+ )
30
+ throw 0;
31
+ const raw = JSON.parse(Buffer.from(value, "base64url").toString("utf8"));
32
+ if (
33
+ Object.keys(raw).sort().join(",") !== "afterId,storeId,v" ||
34
+ raw.v !== 1 ||
35
+ raw.storeId !== storeId ||
36
+ !safeId(raw.afterId) ||
37
+ cursor(storeId, raw.afterId) !== value
38
+ )
39
+ throw 0;
40
+ return raw.afterId;
41
+ } catch {
42
+ fail("CLI_GOAL_CATALOG_INVALID_CURSOR");
43
+ }
44
+ }
45
+
46
+ /** Each page visits at most limit candidates, including invalid sources.
47
+ * Pages are fresh reads; this does not promise a frozen cross-page snapshot. */
48
+ export function readCliGoalCatalog(options = {}) {
49
+ const cwd = path.resolve(options.cwd || process.cwd());
50
+ const env = Object.freeze({ ...(options.env || process.env) });
51
+ const root = path.resolve(
52
+ options.root ||
53
+ path.join(resolveConfigDataRoot({ cwd, env }).path, "goals"),
54
+ );
55
+ const storeId = goalFileStoreId(root);
56
+ const limit = options.limit ?? 20;
57
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 20)
58
+ fail("CLI_GOAL_CATALOG_INVALID_LIMIT");
59
+ const afterId = decodeCursor(options.after, storeId);
60
+ const result = {
61
+ schema: CLI_GOAL_CATALOG_SCHEMA,
62
+ storeId,
63
+ snapshot: true,
64
+ observedAt: new Date().toISOString(),
65
+ entries: [],
66
+ scannedCount: 0,
67
+ skippedCount: 0,
68
+ invalidNameCount: 0,
69
+ nextCursor: null,
70
+ };
71
+ try {
72
+ fs.lstatSync(root);
73
+ } catch (error) {
74
+ if (error.code === "ENOENT") return result;
75
+ throw error;
76
+ }
77
+ const source = createCliGoalSnapshotReader(root);
78
+ const directory = fs.opendirSync(root);
79
+ const ids = [];
80
+ try {
81
+ let count = 0;
82
+ for (let entry; (entry = directory.readSync()); ) {
83
+ if (++count > MAX_DIRECTORY_ENTRIES)
84
+ fail("CLI_GOAL_CATALOG_DIRECTORY_LIMIT");
85
+ if (!entry.name.endsWith(".json")) continue;
86
+ const id = entry.name.slice(0, -5);
87
+ if (!safeId(id)) {
88
+ result.invalidNameCount++;
89
+ continue;
90
+ }
91
+ if (safeId(id) && id > afterId) ids.push(id);
92
+ }
93
+ } finally {
94
+ directory.closeSync();
95
+ }
96
+ source.checkRoot();
97
+ ids.sort();
98
+ const snapshots = [];
99
+ const page = ids.slice(0, limit);
100
+ result.scannedCount = page.length;
101
+ for (const id of page) {
102
+ try {
103
+ const snapshot = source.read(id);
104
+ const goal = snapshot.goal;
105
+ const title = (goal.title || goal.objective)
106
+ .replace(
107
+ /[\u0000-\u001f\u007f-\u009f\u200e\u200f\u202a-\u202e\u2066-\u2069]/gu,
108
+ " ",
109
+ )
110
+ .slice(0, 160);
111
+ result.entries.push({
112
+ id: goal.id,
113
+ title,
114
+ status: goal.status,
115
+ revision: goal.revision,
116
+ controlGeneration: goal.controlGeneration,
117
+ });
118
+ snapshots.push(snapshot);
119
+ } catch {
120
+ result.skippedCount++;
121
+ }
122
+ }
123
+ // A changed valid source aborts the page instead of returning stale metadata.
124
+ for (const snapshot of snapshots) source.revalidate(snapshot);
125
+ source.checkRoot();
126
+ if (ids.length > page.length)
127
+ result.nextCursor = cursor(storeId, page.at(-1));
128
+ return result;
129
+ }