chainlesschain 0.165.1 → 0.165.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +248 -2
  2. package/package.json +4 -1
  3. package/src/assets/web-panel/assets/{AIOps-CYxFDrcm.js → AIOps-lS1R0Cza.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CPBtdiU2.js → ActionButton-BmlgBPsj.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-Dayq7Dp7.js → Analytics-CNKczv1S.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-6U7bPb2s.js → AppLayout-BuZGJARQ.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-D2Iqg_3D.js → Artifacts-Dm73Sl-O.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-CdoOB7WV.js → Audit-BGMW7A5e.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DrnAVB8w.js → BackgroundAgents-BQ6M54JR.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-CesMi5cy.js → Backup-DBzGP0bR.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DaX9ptax.js → BaseInput-D1mLCoOV.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-OrwOPxDS.js → Chat-BUfcN7p8.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CvPZFRxM.js → ChatBubbleRenderer-CY5m8ZHg.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-DiHbcysC.js → Checkbox-Du0Yg5Pi.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CbgCkaBJ.js → Codegen-B2RXziHW.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-Du5hgrh4.js → Col-DWhekOrR.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-DsPOBW-p.js → Community-HQhrkon4.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BwHIFkNC.js → Compact-izHNb4uz.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BvrDQSgd.js → Compliance-BDwLy41-.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-gwAE6arx.js → Cowork-DFJhLa7K.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-DW-0l4uF.js → Cron-DYY9RG7-.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-j-NsLesB.js → Crosschain-rr7tJTtv.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-CibVEBOI.js → DID-D2sfHRLi.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-W4z9vSfe.js → Dashboard-q_eGdhha.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DAcrkKxG.js → Dropdown-Cufrh2Bz.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-6GXah-89.js → EmailListRenderer-B-kdv10f.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-TKDCq8Ku.js → FamilyGuardDashboard-D21XjgfG.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-BXBLlcNm.js → Federation-CAwRTLZH.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-BoJJBkG3.js → FormItemContext-vx3daNDF.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-okjsl46v.js → GenericCardRenderer-CRWY2wU4.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Rvs7i6nn.js → Git-Q6SwauyD.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CHSUxXXS.js → Governance-BJ1q4IQZ.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-V3BlfxsB.js → Inference-CSWjROgD.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-C_NlD4aR.js → KnowledgeGraph-fzuQsWuY.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-Nn4LNxhA.js → Logs-DVF8Mnns.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-DEmjFcg-.js → Marketplace-BQP7LOA4.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-DlopXipI.js → McpTools-BNlJCmNc.js} +4 -4
  39. package/src/assets/web-panel/assets/{Memory-BG3ynX60.js → Memory-DLLg5WQ4.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-DeRzWOfT.js → MobileBridge-CR2skNAF.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-Tyd3o2A0.js → MobileProjects-BxVavObl.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BoPbOv1C.js → Mtc-B17pgqMI.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-un-rTHp7.js → MtcAudit-4UmV5cIL.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-Ds0oveEB.js → Multisig-DoMEXEcU.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-D09JI-yY.js → NLProgramming-h9DMXFX4.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-DTRhiKJn.js → Notes-Cihn-xX8.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-BAnnNCim.js → NotificationSettings-BE6ZGa3R.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-Yr-1fSYi.js → OrderTableRenderer-CnwojoSI.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-S9EAolpj.js → Organization-B2vpwmjb.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-CqcLKqJ8.js → Overflow-C4z28R0-.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-Dw0F9EcU.js → P2P-BVlFkwhW.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-BDRwUevN.js → PdhVaultBrowser-BXbEdL5B.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-D3_c3nKB.js → Permissions-C28xs4lp.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-CxdMV98x.js → PersonalDataHub-Dgl_rBjM.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-CgjNQFLI.js → Pipeline-3QUIhrKI.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-BHghIIht.js → Privacy-8Gh33OZ5.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-De6pqaKM.js → ProjectInit-BNmg4tZi.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-Bg4ZkNYQ.js → ProjectSettings-vgMfeCf9.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-BhtAVilc.js +1 -0
  60. package/src/assets/web-panel/assets/{Providers-CUnHbNf-.js → Providers-CXoOa8eX.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DA2f3Wts.js → QrScannerModal-BhfTF0oS.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-C1FeHDqp.js → QuickAsk-C746HEAj.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-B5guaUMN.js → Recommend-BSej8Eo0.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-PDADSds3.js → RemoteSession-f3gmnlG3.js} +3 -3
  65. package/src/assets/web-panel/assets/{Reputation-eTlRhgvK.js → Reputation-CyvybpkN.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-D7AqSGY0.js → Row-DwV2PeYn.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-JiuLm4Ja.js → RssFeed-11GrzjZy.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-CwruahW3.js → Search-BjKXkrAY.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CdhqaR0b.js → Security-eWiFb9Yk.js} +4 -4
  70. package/src/assets/web-panel/assets/{Services-CU0ZIlcT.js → Services-CdCsMAtt.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-CtduPfAb.js → Skeleton-4Q2UTKQ5.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-CROXm6AY.js → Skills-v4rtYrRj.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-DiZiABFD.js → Sla-CRhsFvd_.js} +1 -1
  74. package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +1 -0
  75. package/src/assets/web-panel/assets/{SyncSettings-DBX6J1Oe.js → SyncSettings-D16zonl7.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-BLyRJd3-.js → Tasks-Xxozz0i_.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-BKa5qzmk.js → Templates-CXJpPtCT.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-DnD3a4M6.js → Tenant-XRV0L1ZF.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DEitQeTb.js → Terminal-CYuO1i_w.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-CjHggTDq.js → TimelineRenderer-BXqitWsu.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-CsGT7sfl.js → Tokens-BvPrDHIy.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-yr4rFDrW.js → Trigger-DhCrSTf5.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-CLvu1Sjp.js → Trust-DmsuZD6K.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-B0m7yUP8.js → UkeySign-D_yrts5C.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-C0VvP4lc.js → VideoEditing-B01ihPrm.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-kllBAG1M.js → Wallet-DpUjKa-N.js} +3 -3
  87. package/src/assets/web-panel/assets/{WebAuthn-C54UQNLx.js → WebAuthn-CL07yON6.js} +3 -3
  88. package/src/assets/web-panel/assets/{WorkflowEditor-B7y8qSvU.js → WorkflowEditor-CLMflnRr.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DRzTh8CJ.js → chat-DtUqe8h_.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-BSMwSnCx.js → colors-DPKrgVfy.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BTg602H5.js → compact-item-BTt2GtOm.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-B6EGsdvp.js → createContext-D_VeUc1J.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DDKqJ8RD.js → hasIn-1kndiylj.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-CUEU48o1.js → index-2eyAXE3d.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-rjzk9z1Q.js → index-4bna2_SR.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CmAubjDi.js → index-8nz_fmlj.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Co7oM1qr.js → index-B9KvcS7R.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BMuGd2--.js → index-BAXfRKfG.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BVTAl5N2.js → index-BHpBMWCh.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DpTHIRfZ.js → index-BaZAbw9A.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CWGax2QW.js → index-BepLZwgB.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DiW0sDkz.js → index-Bhudc_Ez.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CGNklbP6.js → index-BlDNVgBt.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-u2YVld9W.js → index-By5n8up9.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-pqfux8vZ.js → index-CHG-KcS4.js} +1 -1
  107. package/src/assets/web-panel/assets/index-CPcM-eqo.js +1 -0
  108. package/src/assets/web-panel/assets/{index-BRqt4fO-.js → index-CX81qSM4.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BsR7Y2NG.js → index-CauoBQkH.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C_JzIXUq.js → index-CcO04eDn.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CQlHFN_g.js → index-CtF7EN49.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CwPUZbMI.js → index-CzjkKUmR.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-th2ihDc0.js → index-D95OFht7.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CHfLYwcW.js → index-DFIZ_1Sf.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-C1GFfuqN.js → index-DG2MZQ3f.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-D1naNj4U.js → index-DJ8vXGOa.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DLdrHhML.js → index-Dbbymxpj.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DBT3YeQ9.js → index-DdkplL9R.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BICn3Qh1.js → index-DfGl8CqG.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DqFXGzzC.js → index-DfKBRdSS.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Bx044qDj.js → index-DsJCDUJG.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-XFe-1twF.js → index-Dwqmtk65.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C66NpWy5.js → index-DxdTdBix.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CmAInUkX.js → index-FzdwcSy2.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cf23wVMs.js → index-GsoUQ2M7.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D5CsBShd.js → index-brCInrzq.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-323Hhxxt.js → index-dVc-CXY4.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-p2HYn89m.js → index-fk2Rjacw.js} +3 -3
  129. package/src/assets/web-panel/assets/{index-Dfv2lKu3.js → index-l1BETrDb.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CNxg61YP.js → index-m31Ka8hZ.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CDTvsX8t.js → index-ocf06EVQ.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Dc77VR3H.js → index-sDoMHTNA.js} +1 -1
  133. package/src/assets/web-panel/assets/index-xeSyVoRe.js +1 -0
  134. package/src/assets/web-panel/assets/{initDefaultProps-C3Djh9fa.js → initDefaultProps-CvyYJd7z.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BzqFmbSe.js → motion-DYZkhUdz.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-DJo_FFaW.js → move-slnJRVT1.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-_tlTiBvk.js → mtc-parser-DVc0CKmy.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-CB2ZyxUg.js → omit-BCXAtHCq.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-DZwIFD4u.js → pickAttrs-DBsemz_K.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-DxZY0dgk.js → placementArrow-BRtkJ-nv.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-CzzGt7GL.js → responsiveObserve-Cebq7EZn.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BaIK52yz.js → slide-DT7qvId2.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-3-FHu9_M.js → statusUtils-pQiITLkG.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-BkRT68fK.js → styleChecker-c-19BVKQ.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DHYwKS-s.js → useFlexGapSupport-DsS5-0bE.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-DVVUhV8p.js → useFs-CxGiMe5n.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-CkrFKAzQ.js → usePersonalDataHub-D9btVID5.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-BuBLFz0c.js → vnode-CUYFsFEN.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-kpm6LtXU.js → zoom-CXmn_35j.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +1 -1
  152. package/src/commands/cowork.js +280 -5
  153. package/src/commands/plugin.js +819 -64
  154. package/src/commands/session-location.js +318 -7
  155. package/src/constants.js +2 -2
  156. package/src/data/changelog.json +14 -1
  157. package/src/gateways/ws/action-protocol.js +1 -1
  158. package/src/harness/jsonl-session-store.js +638 -2
  159. package/src/harness/prompt-compressor.js +4 -0
  160. package/src/lib/background-agent-keeper-client.js +29 -0
  161. package/src/lib/background-agent-keeper-protocol.js +4 -0
  162. package/src/lib/background-agent-supervisor.js +59 -29
  163. package/src/lib/cowork-task-runner.js +70 -0
  164. package/src/lib/cowork-workflow.js +42 -9
  165. package/src/lib/doctor-checkup.js +34 -10
  166. package/src/lib/dynamic-workflow-draft.js +535 -0
  167. package/src/lib/dynamic-workflow-facade.js +11 -11
  168. package/src/lib/dynamic-workflow-runtime.js +2974 -0
  169. package/src/lib/execution-location-contract.js +111 -7
  170. package/src/lib/execution-location-runtime.js +3 -1
  171. package/src/lib/execution-location-target.js +910 -0
  172. package/src/lib/llm-providers.js +1 -0
  173. package/src/lib/mcp-call-ledger-store.js +35 -0
  174. package/src/lib/mcp-call-ledger.js +30 -0
  175. package/src/lib/plugin-runtime/__tests__/remote-source.test.js +34 -16
  176. package/src/lib/plugin-runtime/install.js +4956 -657
  177. package/src/lib/plugin-runtime/manifest.js +3 -1
  178. package/src/lib/plugin-runtime/marketplace-artifact-readback.js +671 -31
  179. package/src/lib/plugin-runtime/marketplace-catalog.js +68 -2
  180. package/src/lib/plugin-runtime/marketplace-impact.js +208 -15
  181. package/src/lib/plugin-runtime/marketplace-network.js +317 -0
  182. package/src/lib/plugin-runtime/marketplace-pac-worker.js +15 -0
  183. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +25 -2
  184. package/src/lib/plugin-runtime/marketplace-source-cache.js +359 -0
  185. package/src/lib/plugin-runtime/policy.js +21 -6
  186. package/src/lib/plugin-runtime/publisher-trust.js +332 -0
  187. package/src/lib/plugin-runtime/remote-source.js +323 -27
  188. package/src/lib/plugin-runtime/scopes.js +317 -41
  189. package/src/lib/plugin-runtime/transaction-journal.js +806 -0
  190. package/src/lib/public-ide-capability-manifest.js +1 -1
  191. package/src/lib/remote-membership-coordinator.js +8 -6
  192. package/src/lib/sub-agent-context.js +268 -2
  193. package/src/lib/task-model-selector.js +1 -1
  194. package/src/lib/with-file-lock.js +95 -5
  195. package/src/runtime/agent-core.js +595 -41
  196. package/src/workers/background-agent-keeper.js +40 -10
  197. package/src/assets/web-panel/assets/MarkdownRenderer-SVAgNnkt.js +0 -1
  198. package/src/assets/web-panel/assets/Projects-CP8vPvzs.js +0 -1
  199. package/src/assets/web-panel/assets/SpeechSettings-B5pLcXUw.js +0 -1
  200. package/src/assets/web-panel/assets/devWarning-Dol8jLEP.js +0 -1
  201. package/src/assets/web-panel/assets/index-C3QX5tOl.js +0 -1
  202. package/src/assets/web-panel/assets/index-xYybvEic.js +0 -1
@@ -4,9 +4,24 @@ import { TextDecoder } from "node:util";
4
4
  import {
5
5
  buildExecutionLocationCatalog,
6
6
  buildExecutionLocationHandoffPreview,
7
+ computeExecutionLocationTargetFactsDigest,
7
8
  } from "../lib/execution-location-contract.js";
8
9
  import { captureAmbientExecutionLocation } from "../lib/execution-location-runtime.js";
9
- import { getVerifiedSessionExecutionLocationAuthority } from "../harness/jsonl-session-store.js";
10
+ import {
11
+ EXECUTION_LOCATION_TARGET_ATTESTATION_SCHEMA,
12
+ EXECUTION_LOCATION_TARGET_RESUME_SCHEMA,
13
+ attestExecutionLocationTarget,
14
+ readExecutionLocationProfile,
15
+ resumeExecutionLocationTarget,
16
+ } from "../lib/execution-location-target.js";
17
+ import {
18
+ MAX_SESSION_REPLICA_BYTES,
19
+ SESSION_EXECUTION_LOCATION_HANDOFF_INSTALL_SCHEMA,
20
+ getVerifiedSessionExecutionLocationAuthority,
21
+ installSessionReplica,
22
+ installSessionReplicaWithLocationHandoff,
23
+ readVerifiedTranscriptBytes,
24
+ } from "../harness/jsonl-session-store.js";
10
25
  import {
11
26
  sameFileStatIdentity,
12
27
  samePathHandleFileIdentity,
@@ -112,10 +127,13 @@ export function projectSessionExecutionLocation(sessionId, deps = {}) {
112
127
  )(sessionId);
113
128
  return {
114
129
  schema: SESSION_EXECUTION_LOCATION_AUTHORITY_SCHEMA,
115
- authority: "verified-session-start",
130
+ authority: authority.authority || "verified-session-start",
116
131
  sessionId: authority.sessionId,
117
132
  headHash: authority.headHash,
118
133
  eventCount: authority.eventCount,
134
+ bindingEventHash: authority.bindingEventHash ?? null,
135
+ bindingEventCount: authority.bindingEventCount ?? null,
136
+ locationHandoff: authority.locationHandoff ?? null,
119
137
  binding: authority.binding,
120
138
  };
121
139
  }
@@ -156,6 +174,146 @@ export function projectExecutionLocationHandoff(
156
174
  };
157
175
  }
158
176
 
177
+ export function projectExecutionLocationTargetAttestation(
178
+ sessionId,
179
+ target,
180
+ factsPath,
181
+ profilePath,
182
+ deps = {},
183
+ ) {
184
+ const handoff = projectExecutionLocationHandoff(
185
+ sessionId,
186
+ target,
187
+ factsPath,
188
+ deps,
189
+ );
190
+ const profile = (
191
+ deps.readExecutionLocationProfile || readExecutionLocationProfile
192
+ )(profilePath, deps);
193
+ return (deps.attestExecutionLocationTarget || attestExecutionLocationTarget)(
194
+ { handoff, profile },
195
+ deps,
196
+ );
197
+ }
198
+
199
+ export function resumeSessionAtExecutionLocation(
200
+ sessionId,
201
+ target,
202
+ factsPath,
203
+ profilePath,
204
+ expectedTargetFactsDigest,
205
+ deps = {},
206
+ ) {
207
+ const handoff = projectExecutionLocationHandoff(
208
+ sessionId,
209
+ target,
210
+ factsPath,
211
+ deps,
212
+ );
213
+ const profile = (
214
+ deps.readExecutionLocationProfile || readExecutionLocationProfile
215
+ )(profilePath, deps);
216
+ const transcriptBytes =
217
+ profile.sessionStore?.mode === "replicated"
218
+ ? (deps.readVerifiedTranscriptBytes || readVerifiedTranscriptBytes)(
219
+ sessionId,
220
+ )
221
+ : null;
222
+ const readSourceAuthority = () => {
223
+ const authority = (
224
+ deps.getVerifiedSessionExecutionLocationAuthority ||
225
+ getVerifiedSessionExecutionLocationAuthority
226
+ )(sessionId);
227
+ return {
228
+ sessionId: authority.sessionId,
229
+ headHash: authority.headHash,
230
+ eventCount: authority.eventCount,
231
+ };
232
+ };
233
+ return (deps.resumeExecutionLocationTarget || resumeExecutionLocationTarget)(
234
+ {
235
+ handoff,
236
+ profile,
237
+ expectedTargetFactsDigest,
238
+ transcriptBytes,
239
+ readSourceAuthority,
240
+ },
241
+ deps,
242
+ );
243
+ }
244
+
245
+ function readBoundedReplicaInput(deps = {}) {
246
+ if (process.stdin.isTTY) {
247
+ throw new Error("session replica bytes must be provided on stdin");
248
+ }
249
+ const runtimeFs = deps.fs || fs;
250
+ const chunks = [];
251
+ let total = 0;
252
+ while (true) {
253
+ const chunk = Buffer.allocUnsafe(
254
+ Math.min(64 * 1024, MAX_SESSION_REPLICA_BYTES + 1 - total),
255
+ );
256
+ const count = runtimeFs.readSync(0, chunk, 0, chunk.length, null);
257
+ if (count === 0) break;
258
+ total += count;
259
+ if (total > MAX_SESSION_REPLICA_BYTES) {
260
+ throw new Error(
261
+ `session replica exceeds ${MAX_SESSION_REPLICA_BYTES} bytes`,
262
+ );
263
+ }
264
+ chunks.push(chunk.subarray(0, count));
265
+ }
266
+ if (total === 0) throw new Error("session replica stdin is empty");
267
+ return Buffer.concat(chunks, total);
268
+ }
269
+
270
+ export function receiveSessionReplica(
271
+ sessionId,
272
+ expectedHeadHash,
273
+ expectedEventCount,
274
+ expectedTranscriptDigest,
275
+ deps = {},
276
+ ) {
277
+ const bytes = (deps.readSessionReplicaInput || readBoundedReplicaInput)(deps);
278
+ return (deps.installSessionReplica || installSessionReplica)(
279
+ sessionId,
280
+ bytes,
281
+ {
282
+ headHash: expectedHeadHash,
283
+ eventCount: Number(expectedEventCount),
284
+ transcriptDigest: expectedTranscriptDigest,
285
+ },
286
+ );
287
+ }
288
+
289
+ export function prepareSessionReplicaHandoff(sessionId, options, deps = {}) {
290
+ const bytes = (deps.readSessionReplicaInput || readBoundedReplicaInput)(deps);
291
+ const binding = projectCurrentExecutionLocation({}, deps).binding;
292
+ const targetFactsDigest = computeExecutionLocationTargetFactsDigest(binding);
293
+ if (targetFactsDigest !== String(options.expectedTargetFactsDigest || "")) {
294
+ throw new Error("target facts changed before location handoff append");
295
+ }
296
+ return (
297
+ deps.installSessionReplicaWithLocationHandoff ||
298
+ installSessionReplicaWithLocationHandoff
299
+ )(
300
+ sessionId,
301
+ bytes,
302
+ {
303
+ headHash: options.expectedHeadHash,
304
+ eventCount: Number(options.expectedEventCount),
305
+ transcriptDigest: options.expectedTranscriptDigest,
306
+ },
307
+ {
308
+ profileDigest: options.profileDigest,
309
+ targetEvidenceId: options.targetEvidenceId,
310
+ targetFactsDigest,
311
+ attestationDigest: options.attestationDigest,
312
+ binding,
313
+ },
314
+ );
315
+ }
316
+
159
317
  function renderBinding(binding) {
160
318
  const git = binding.source.git;
161
319
  return [
@@ -180,6 +338,30 @@ function writeProjection(projection, options = {}) {
180
338
  process.stdout.write(`${JSON.stringify(projection, null, 2)}\n`);
181
339
  return;
182
340
  }
341
+ if (projection.schema === EXECUTION_LOCATION_TARGET_ATTESTATION_SCHEMA) {
342
+ process.stdout.write(
343
+ `ATTESTED ${projection.binding.location}\nFacts: ${projection.targetFactsDigest}\nAttestation: ${projection.attestationDigest}\nGaps: ${projection.gaps.join(", ")}\n`,
344
+ );
345
+ return;
346
+ }
347
+ if (projection.schema === EXECUTION_LOCATION_TARGET_RESUME_SCHEMA) {
348
+ process.stdout.write(
349
+ `RESUME EXITED ${projection.target}\nReceipt: ${projection.receiptDigest}\nGaps: ${projection.gaps.join(", ")}\n`,
350
+ );
351
+ return;
352
+ }
353
+ if (projection.schema === "chainlesschain.session-replica-install/v1") {
354
+ process.stdout.write(
355
+ `${projection.installed ? "INSTALLED" : "ALREADY PRESENT"} ${projection.sessionId}\nReceipt: ${projection.receiptDigest}\n`,
356
+ );
357
+ return;
358
+ }
359
+ if (projection.schema === SESSION_EXECUTION_LOCATION_HANDOFF_INSTALL_SCHEMA) {
360
+ process.stdout.write(
361
+ `HANDOFF ANCHORED ${projection.sessionId}\nTarget head: ${projection.targetHeadHash}\nReceipt: ${projection.receiptDigest}\n`,
362
+ );
363
+ return;
364
+ }
183
365
  if (projection.binding) {
184
366
  process.stdout.write(`${renderBinding(projection.binding)}\n`);
185
367
  return;
@@ -217,7 +399,7 @@ function runAction(action, options = {}) {
217
399
  }
218
400
  }
219
401
 
220
- export function registerSessionLocationSubcommands(session) {
402
+ export function registerSessionLocationSubcommands(session, deps = {}) {
221
403
  const location = session
222
404
  .command("location")
223
405
  .description(
@@ -230,7 +412,7 @@ export function registerSessionLocationSubcommands(session) {
230
412
  .option("--json", "Machine-readable JSON output")
231
413
  .action((options) => {
232
414
  process.exitCode = runAction(
233
- () => projectCurrentExecutionLocation({}, {}),
415
+ () => projectCurrentExecutionLocation({}, deps),
234
416
  options,
235
417
  );
236
418
  });
@@ -241,7 +423,7 @@ export function registerSessionLocationSubcommands(session) {
241
423
  .option("--json", "Machine-readable JSON output")
242
424
  .action((id, options) => {
243
425
  process.exitCode = runAction(
244
- () => projectSessionExecutionLocation(id),
426
+ () => projectSessionExecutionLocation(id, deps),
245
427
  options,
246
428
  );
247
429
  });
@@ -254,7 +436,7 @@ export function registerSessionLocationSubcommands(session) {
254
436
  .option("--json", "Machine-readable JSON output")
255
437
  .action((options) => {
256
438
  process.exitCode = runAction(
257
- () => projectExecutionLocationComparison({}, {}),
439
+ () => projectExecutionLocationComparison({}, deps),
258
440
  options,
259
441
  );
260
442
  });
@@ -269,7 +451,136 @@ export function registerSessionLocationSubcommands(session) {
269
451
  .option("--json", "Machine-readable JSON output")
270
452
  .action((id, target, options) => {
271
453
  process.exitCode = runAction(
272
- () => projectExecutionLocationHandoff(id, target, options.facts),
454
+ () => projectExecutionLocationHandoff(id, target, options.facts, deps),
455
+ options,
456
+ );
457
+ });
458
+
459
+ location
460
+ .command("attest <id> <target>")
461
+ .description(
462
+ "Invoke a fixed target-side probe and bind observed host facts to a handoff",
463
+ )
464
+ .requiredOption(
465
+ "--facts <path>",
466
+ "Versioned Git/summary/artifact/permission/target evidence JSON",
467
+ )
468
+ .requiredOption(
469
+ "--profile <path>",
470
+ "Secret-free WSL/SSH/Container target profile JSON",
471
+ )
472
+ .option("--json", "Machine-readable JSON output")
473
+ .action((id, target, options) => {
474
+ process.exitCode = runAction(
475
+ () =>
476
+ projectExecutionLocationTargetAttestation(
477
+ id,
478
+ target,
479
+ options.facts,
480
+ options.profile,
481
+ deps,
482
+ ),
483
+ options,
484
+ );
485
+ });
486
+
487
+ location
488
+ .command("receive <id>")
489
+ .description("Install an exact verified session replica from bounded stdin")
490
+ .requiredOption(
491
+ "--expected-head-hash <sha256>",
492
+ "Exact unprefixed transcript head hash",
493
+ )
494
+ .requiredOption(
495
+ "--expected-event-count <count>",
496
+ "Exact transcript event count",
497
+ )
498
+ .requiredOption(
499
+ "--expected-transcript-digest <sha256>",
500
+ "Exact SHA-256 digest of stdin bytes",
501
+ )
502
+ .option("--json", "Machine-readable JSON receipt")
503
+ .action((id, options) => {
504
+ process.exitCode = runAction(
505
+ () =>
506
+ receiveSessionReplica(
507
+ id,
508
+ options.expectedHeadHash,
509
+ options.expectedEventCount,
510
+ options.expectedTranscriptDigest,
511
+ deps,
512
+ ),
513
+ options,
514
+ );
515
+ });
516
+
517
+ location
518
+ .command("prepare <id>")
519
+ .description(
520
+ "Install an exact replica and append a canonical target-location handoff",
521
+ )
522
+ .requiredOption(
523
+ "--expected-head-hash <sha256>",
524
+ "Exact unprefixed source transcript head hash",
525
+ )
526
+ .requiredOption(
527
+ "--expected-event-count <count>",
528
+ "Exact source transcript event count",
529
+ )
530
+ .requiredOption(
531
+ "--expected-transcript-digest <sha256>",
532
+ "Exact SHA-256 digest of stdin bytes",
533
+ )
534
+ .requiredOption(
535
+ "--expected-target-facts-digest <sha256>",
536
+ "Stable target facts digest from target attestation",
537
+ )
538
+ .requiredOption("--profile-digest <sha256>", "Exact target profile digest")
539
+ .requiredOption(
540
+ "--target-evidence-id <id>",
541
+ "Exact handoff target evidence id",
542
+ )
543
+ .requiredOption(
544
+ "--attestation-digest <sha256>",
545
+ "Exact target attestation digest",
546
+ )
547
+ .option("--json", "Machine-readable JSON receipt")
548
+ .action((id, options) => {
549
+ process.exitCode = runAction(
550
+ () => prepareSessionReplicaHandoff(id, options, deps),
551
+ options,
552
+ );
553
+ });
554
+
555
+ location
556
+ .command("resume <id> <target>")
557
+ .description(
558
+ "Re-attest a target, verify its canonical session replica, and resume there",
559
+ )
560
+ .requiredOption(
561
+ "--facts <path>",
562
+ "Versioned Git/summary/artifact/permission/target evidence JSON",
563
+ )
564
+ .requiredOption(
565
+ "--profile <path>",
566
+ "Secret-free WSL/SSH/Container target profile JSON",
567
+ )
568
+ .requiredOption(
569
+ "--expected-target-facts-digest <sha256>",
570
+ "Exact stable target facts digest from session location attest",
571
+ )
572
+ .option("--json", "Machine-readable JSON receipt after target exit")
573
+ .action((id, target, options) => {
574
+ process.exitCode = runAction(
575
+ () =>
576
+ resumeSessionAtExecutionLocation(
577
+ id,
578
+ target,
579
+ options.facts,
580
+ options.profile,
581
+ options.expectedTargetFactsDigest,
582
+ deps,
583
+ ),
273
584
  options,
274
585
  );
275
586
  });
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: "doubao-seed-2-1-pro-260628",
33
+ defaultModel: "deepseek-v4-flash-260425",
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: "doubao-seed-2-1-pro-260628",
147
+ model: "deepseek-v4-flash-260425",
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,19 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.165.2",
7
+ "cliVersions": ["0.165.1", "0.165.2"],
8
+ "date": "2026-08-18",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Fixed — cc CLI 0.165.2: governed plugins and keeper handoff reliability",
13
+ "body": "> `chainlesschain` **0.165.1 → 0.165.2** (candidate; not yet published,\n> 2026-08-18).\n> CLI-only candidate; `@chainlesschain/personal-data-hub` remains **0.4.58**\n> and `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Governed plugin transactions and provenance**: marketplace payload,\n activation, install, update, transaction recovery, and provenance decisions\n bind immutable source identities and digests. Registry cache entries are\n content-addressed, while corrupt, stale, or mismatched recovery evidence\n continues to fail closed.\n- **Strict plugin execution boundaries**: the remaining live plugin fixtures\n now execute in the strict Linux sandbox, MCP security soak provisions its\n required Bubblewrap boundary explicitly, and release fixtures exercise the\n production activation path instead of accepting inactive coverage.\n- **Durable workflow authority**: provider requests and settlements, nested and\n parallel tool effects, child and descendant calls, and timeout outcomes gain\n durable identity-bound receipts so retries cannot silently reuse ambiguous\n execution authority.\n- **Background keeper lock handoff**: an owner that durably publishes its exact\n release marker treats the marker as the logical handoff even when another\n contender wins physical cleanup. Wrong, corrupt, or active foreign claimants\n remain rejected, and POSIX/Windows process identity and cleanup races retain\n bounded fail-closed handling.\n- **Scheduler campaign continuity**: scheduled long-soak dispatches use a pinned\n campaign identity, refuse overlapping segments, and can auto-finalize only\n after the required cross-platform evidence window is complete.\n- **Cross-platform release stability**: generated command help stays in sync;\n POSIX fsync-failure fixtures match the actual read mode; registry cache tests\n follow immutable URL-plus-digest semantics; and macOS marketplace replay uses\n isolated local scope instead of leaking state through the runner user home.\n- **Release status**: immutable tag, final source SHA, workflow run IDs, npm\n provenance, package digests, and registry readback remain intentionally\n absent until the final `0.165.2` merge SHA passes complete `CLI CI` and\n `CLI Strict Sandbox` matrices on Linux, Windows, and macOS, followed by the\n dedicated npm release and independent public readback workflows. The active\n two-hour Keeper/reliability runs and the 72-hour scheduler campaign are not\n claimed as completed release evidence here."
14
+ }
15
+ ]
16
+ },
4
17
  {
5
18
  "productVersion": null,
6
19
  "cliVersion": "0.165.1",
@@ -10,7 +23,7 @@
10
23
  "sections": [
11
24
  {
12
25
  "heading": "Added — cc CLI 0.165.1: runtime admission, remote authority, and background containment",
13
- "body": "> `chainlesschain` **0.164.0 → 0.165.1** (candidate; not yet published,\n> 2026-08-17).\n> CLI candidate with `@chainlesschain/personal-data-hub` **0.4.58**;\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Dynamic workflow run admission**: Cowork workflow execution revalidates the\n immutable definition digest, execution-authority session, permissions,\n sandbox, scale, and cost gates when a run starts instead of treating an\n earlier preflight as continuing authority.\n- **Durable remote authority**: CLI-hosted approval, relay membership, and\n reconnect reconciliation bind responses and commits to durable membership\n epochs. Stale, revoked, mismatched, or unavailable authority fails closed.\n- **Canonical execution boundaries**: background `run_shell`, plugin-bin, and\n delivery paths validate canonical workspace and configured repository\n authority before executing or pushing. Linux child descriptors not declared\n by the execution contract are closed before launch.\n- **Background keeper containment**: supervisor state locks publish ownership\n atomically, distinguish zombies and reused PIDs, preserve POSIX process-group\n cleanup, contain released turns after Worker loss, and require durable cleanup\n evidence before retiring worktrees. POSIX socket namespaces and Windows exit\n settlement are bounded for hosted and local environments.\n- **Cross-platform release evidence**: CLI workflows install the candidate's\n dependency closure, bind reusable jobs to the exact source SHA, keep each\n platform's evidence isolated, and retain bounded diagnostics for transient\n process-identity and cleanup races.\n- **Dependency security closure**: the CLI requires the patched `js-yaml`\n 3.15.1 line, while Personal Data Hub 0.4.58 advances its bounded ZIP adapter\n to `adm-zip` 0.6.0 so a crafted archive cannot trigger the disclosed 4 GB\n allocation path before adapter-level entry validation.\n- **Release boundary**: the separate plugin marketplace activation hardening in\n PR #209 is intentionally excluded because its latest CLI and PR test runs are\n not green. This candidate does not claim that pending source as published.\n- **Release packaging recovery**: immutable tag `v-npm-0-165-0` stopped before\n any registry write because its SBOM resolver tried to fetch the coordinated\n PDH 0.4.58 candidate before that package could be published. The 0.165.1\n workflow resolves the SBOM from exact-SHA internal package tarballs instead.\n- **Release status**: immutable tag, final source SHA, workflow run IDs, npm\n provenance, package digests, and registry readback remain intentionally\n absent until the final merge SHA passes complete `CLI CI` and\n `CLI Strict Sandbox` matrices on Linux, Windows, and macOS, followed by the\n dedicated npm release and independent public readback workflows."
26
+ "body": "> `chainlesschain` **0.164.0 → 0.165.1** (published from exact SHA\n> `1a10ed7c8fd14d12f7760e948ff8efe36c766602`, 2026-08-17).\n> CLI release includes `@chainlesschain/personal-data-hub` **0.4.58**;\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Dynamic workflow run admission**: Cowork workflow execution revalidates the\n immutable definition digest, execution-authority session, permissions,\n sandbox, scale, and cost gates when a run starts instead of treating an\n earlier preflight as continuing authority.\n- **Durable remote authority**: CLI-hosted approval, relay membership, and\n reconnect reconciliation bind responses and commits to durable membership\n epochs. Stale, revoked, mismatched, or unavailable authority fails closed.\n- **Canonical execution boundaries**: background `run_shell`, plugin-bin, and\n delivery paths validate canonical workspace and configured repository\n authority before executing or pushing. Linux child descriptors not declared\n by the execution contract are closed before launch.\n- **Background keeper containment**: supervisor state locks publish ownership\n atomically, distinguish zombies and reused PIDs, preserve POSIX process-group\n cleanup, contain released turns after Worker loss, and require durable cleanup\n evidence before retiring worktrees. POSIX socket namespaces and Windows exit\n settlement are bounded for hosted and local environments.\n- **Cross-platform release evidence**: CLI workflows install the candidate's\n dependency closure, bind reusable jobs to the exact source SHA, keep each\n platform's evidence isolated, and retain bounded diagnostics for transient\n process-identity and cleanup races.\n- **Dependency security closure**: the CLI requires the patched `js-yaml`\n 3.15.1 line, while Personal Data Hub 0.4.58 advances its bounded ZIP adapter\n to `adm-zip` 0.6.0 so a crafted archive cannot trigger the disclosed 4 GB\n allocation path before adapter-level entry validation.\n- **Release boundary**: the separate plugin marketplace payload/activation\n hardening later passed its own exact-head gates at `89c498cc46` and merged\n through PR #215 (`089336992d`). It remains intentionally excluded from this\n immutable tarball and is tracked as a post-`0.165.1` source increment.\n- **Release packaging recovery**: immutable tag `v-npm-0-165-0` stopped before\n any registry write because its SBOM resolver tried to fetch the coordinated\n PDH 0.4.58 candidate before that package could be published. The 0.165.1\n workflow resolves the SBOM from exact-SHA internal package tarballs instead.\n- **Published release evidence**: immutable tag `v-npm-0-165-1` resolves to\n exact source commit `1a10ed7c8fd14d12f7760e948ff8efe36c766602`.\n Its Linux, Windows, and macOS `CLI CI` (`32038591204`) and\n `CLI Strict Sandbox` (`32038590960`) matrices passed; the dedicated npm\n release (`32038590940`) and independent public readback (`32039659372`)\n succeeded. npm reports `latest=0.165.1`; the public tarball SHA-1 is\n `51ce645bebbe63ae168386cb8b6122a67c7d0813` and SHA-256 is\n `5806d34b6659dcc632dad31db3acdc2f4fa07fb924b7d93de1d22637a3186241`."
14
27
  }
15
28
  ]
16
29
  },
@@ -417,7 +417,7 @@ async function _resolveWorkflowExecutionAuthority(server, sessionId) {
417
417
  }
418
418
  return Object.freeze({
419
419
  schema: WORKFLOW_EXECUTION_AUTHORITY_SCHEMA,
420
- authority: "verified-session-start",
420
+ authority: proof.authority || "verified-session-start",
421
421
  sessionId: proof.sessionId,
422
422
  headHash: proof.headHash,
423
423
  eventCount: proof.eventCount,