chainlesschain 0.162.188 → 0.162.193

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 (337) hide show
  1. package/README.md +61 -11
  2. package/bin/chainlesschain.js +7 -52
  3. package/completions/_cc +209 -0
  4. package/completions/cc.bash +18 -0
  5. package/completions/cc.fish +13 -0
  6. package/completions/cc.ps1 +226 -0
  7. package/package.json +10 -2
  8. package/src/assets/web-panel/assets/{AIOps-Brr1LVcE.js → AIOps-DBLkaTje.js} +1 -1
  9. package/src/assets/web-panel/assets/{ActionButton-DQU74DKG.js → ActionButton-BAy-Qebo.js} +1 -1
  10. package/src/assets/web-panel/assets/{Analytics-CYp9178y.js → Analytics-Dfb1Mlau.js} +3 -3
  11. package/src/assets/web-panel/assets/{AppLayout-DW4SCYsW.js → AppLayout-BbFkN8m0.js} +5 -5
  12. package/src/assets/web-panel/assets/{Artifacts-CYlD_ed1.js → Artifacts-kM4-cEEH.js} +1 -1
  13. package/src/assets/web-panel/assets/{Audit-CWl1rZOi.js → Audit-BSQfYWf3.js} +1 -1
  14. package/src/assets/web-panel/assets/{BackgroundAgents-BOR-LPsa.js → BackgroundAgents-CWDbI_fG.js} +1 -1
  15. package/src/assets/web-panel/assets/{Backup-DLpG7j1X.js → Backup-BxLPbq_Q.js} +1 -1
  16. package/src/assets/web-panel/assets/{BaseInput-B35K9wdr.js → BaseInput-DuIbdrp6.js} +1 -1
  17. package/src/assets/web-panel/assets/{Chat-CwUJb9gB.js → Chat-NEmjGahU.js} +5 -5
  18. package/src/assets/web-panel/assets/{ChatBubbleRenderer-1v6aMS1m.js → ChatBubbleRenderer-DfJEo-5_.js} +1 -1
  19. package/src/assets/web-panel/assets/{Checkbox-pi3-tPNW.js → Checkbox-CaoeG3Ns.js} +1 -1
  20. package/src/assets/web-panel/assets/{Codegen-FyNF35eL.js → Codegen-BFf_g3xY.js} +1 -1
  21. package/src/assets/web-panel/assets/{Col-tGt_JDEr.js → Col-CNOd8mdQ.js} +1 -1
  22. package/src/assets/web-panel/assets/{Community-CC7LonQX.js → Community-BhpDqz-i.js} +1 -1
  23. package/src/assets/web-panel/assets/{Compact-BGXrHHjE.js → Compact-CQ42T7Z6.js} +1 -1
  24. package/src/assets/web-panel/assets/{Compliance-DSW0TBZ8.js → Compliance-DI5PcLMN.js} +1 -1
  25. package/src/assets/web-panel/assets/{Cowork-Bhk7rbvE.js → Cowork-wYYZe0wR.js} +3 -3
  26. package/src/assets/web-panel/assets/{Cron-DxyiQ2NZ.js → Cron-Dlq03DD_.js} +2 -2
  27. package/src/assets/web-panel/assets/{Crosschain-B2ZkxHok.js → Crosschain-BzqS8PP3.js} +1 -1
  28. package/src/assets/web-panel/assets/{DID-yOJV99eJ.js → DID-It55Yem7.js} +2 -2
  29. package/src/assets/web-panel/assets/{Dashboard-CKsttz7D.js → Dashboard-9HkH6oxn.js} +2 -2
  30. package/src/assets/web-panel/assets/{Dropdown-CVFldXSL.js → Dropdown-00e2YWRB.js} +1 -1
  31. package/src/assets/web-panel/assets/{EmailListRenderer-Bufv638J.js → EmailListRenderer-By-ugRDL.js} +1 -1
  32. package/src/assets/web-panel/assets/{FamilyGuardDashboard-4ncjoIjL.js → FamilyGuardDashboard-C396yu5m.js} +1 -1
  33. package/src/assets/web-panel/assets/{Federation-DsknEDoX.js → Federation-BME5sbZY.js} +1 -1
  34. package/src/assets/web-panel/assets/{FormItemContext-Cqe5jWXA.js → FormItemContext-B4TEZCr-.js} +1 -1
  35. package/src/assets/web-panel/assets/{GenericCardRenderer-NAJaFKxc.js → GenericCardRenderer-_9CX9ieY.js} +1 -1
  36. package/src/assets/web-panel/assets/{Git-CszKQpnl.js → Git-BrS6WVSr.js} +2 -2
  37. package/src/assets/web-panel/assets/{Governance-BXGodXi6.js → Governance-BMdCWnKF.js} +1 -1
  38. package/src/assets/web-panel/assets/{Inference-CkoYuG2c.js → Inference-Bcp3vzcA.js} +1 -1
  39. package/src/assets/web-panel/assets/{KnowledgeGraph-DFlEr_T0.js → KnowledgeGraph-DlLuqGY5.js} +1 -1
  40. package/src/assets/web-panel/assets/{Logs-CVaENddA.js → Logs-D-W_6x09.js} +2 -2
  41. package/src/assets/web-panel/assets/MarkdownRenderer-DElGPxCZ.js +1 -0
  42. package/src/assets/web-panel/assets/{Marketplace-CDlLT0fw.js → Marketplace-Dzn2guvI.js} +1 -1
  43. package/src/assets/web-panel/assets/{McpTools-DdwOyszN.js → McpTools-uPict-KL.js} +6 -6
  44. package/src/assets/web-panel/assets/{Memory-DKQnkKuG.js → Memory-BCw43kOb.js} +2 -2
  45. package/src/assets/web-panel/assets/{MobileBridge-DGseqlzJ.js → MobileBridge-DmV8Wv7F.js} +1 -1
  46. package/src/assets/web-panel/assets/{MobileProjects-COBbEOlj.js → MobileProjects-C-HaCmSM.js} +1 -1
  47. package/src/assets/web-panel/assets/{Mtc-O61Vwyli.js → Mtc-C6jxJ34Y.js} +5 -5
  48. package/src/assets/web-panel/assets/{MtcAudit-Dw2SyasS.js → MtcAudit-Za8ExwhQ.js} +5 -5
  49. package/src/assets/web-panel/assets/{Multisig-hSu_l8kf.js → Multisig-KKDbuEgb.js} +3 -3
  50. package/src/assets/web-panel/assets/{NLProgramming-CX1Epurr.js → NLProgramming-Dj97zbCk.js} +1 -1
  51. package/src/assets/web-panel/assets/{Notes-R9xX8o8_.js → Notes-DBXvMraU.js} +4 -4
  52. package/src/assets/web-panel/assets/{NotificationSettings-jtSNLCuK.js → NotificationSettings-DOxITLYl.js} +1 -1
  53. package/src/assets/web-panel/assets/OrderTableRenderer-7DVjZwMM.js +1 -0
  54. package/src/assets/web-panel/assets/{Organization-Pu2WO-U3.js → Organization-D1i73mjb.js} +4 -4
  55. package/src/assets/web-panel/assets/{Overflow-BjnqUyFp.js → Overflow-kW6Q3rvg.js} +1 -1
  56. package/src/assets/web-panel/assets/{P2P-jjkvz44c.js → P2P-C-v_8p2v.js} +2 -2
  57. package/src/assets/web-panel/assets/PdhVaultBrowser-tUbbY64W.js +7 -0
  58. package/src/assets/web-panel/assets/{Permissions-D4yDpivd.js → Permissions-DkHxEZ58.js} +4 -4
  59. package/src/assets/web-panel/assets/{PersonalDataHub-0qsL6iH1.js → PersonalDataHub-DWuMPGrK.js} +5 -5
  60. package/src/assets/web-panel/assets/{Pipeline-Cx7Ybrk2.js → Pipeline-30IYXWWm.js} +1 -1
  61. package/src/assets/web-panel/assets/{Privacy-PbfR_M_V.js → Privacy-DZNQ4RrH.js} +1 -1
  62. package/src/assets/web-panel/assets/{ProjectInit-CyV6Gsub.js → ProjectInit-De2MCElf.js} +2 -2
  63. package/src/assets/web-panel/assets/{ProjectSettings-C7KZ2Wdk.js → ProjectSettings-5uHk9wsC.js} +2 -2
  64. package/src/assets/web-panel/assets/{Projects-DQDjO-yK.js → Projects-XjDfrFLb.js} +1 -1
  65. package/src/assets/web-panel/assets/{Providers-DyFVBBMX.js → Providers-Bgwj6gcE.js} +1 -1
  66. package/src/assets/web-panel/assets/{QrScannerModal-CzB1BC9_.js → QrScannerModal-gKql9umv.js} +1 -1
  67. package/src/assets/web-panel/assets/{QuickAsk-Bk636mC1.js → QuickAsk-BWvmwkh7.js} +1 -1
  68. package/src/assets/web-panel/assets/{Recommend-DoWxHIT3.js → Recommend-Uok4hZPd.js} +1 -1
  69. package/src/assets/web-panel/assets/{RemoteSession-oOVIv9wq.js → RemoteSession-DLJzTk9a.js} +3 -3
  70. package/src/assets/web-panel/assets/{Reputation-BucoReGG.js → Reputation-ZVwIPMSO.js} +1 -1
  71. package/src/assets/web-panel/assets/{Row-DzmOdJU7.js → Row-CN04HxWR.js} +1 -1
  72. package/src/assets/web-panel/assets/{RssFeed-C1tK7KGU.js → RssFeed-BdSrEG4g.js} +3 -3
  73. package/src/assets/web-panel/assets/{Search-CSnInOqk.js → Search-5PwVd0IR.js} +1 -1
  74. package/src/assets/web-panel/assets/{Security-dlejr15l.js → Security-DdBo4zjN.js} +3 -3
  75. package/src/assets/web-panel/assets/{Services-BioPZuNh.js → Services-D3letU7M.js} +2 -2
  76. package/src/assets/web-panel/assets/{Skeleton-DWMibwpC.js → Skeleton--Jb83f1v.js} +1 -1
  77. package/src/assets/web-panel/assets/{Skills-BAAnx1B2.js → Skills-Bg-CulHX.js} +1 -1
  78. package/src/assets/web-panel/assets/{Sla-jWNp4hNO.js → Sla-7QOa7S-X.js} +1 -1
  79. package/src/assets/web-panel/assets/{SpeechSettings-y5kqKha-.js → SpeechSettings-DQwppjRw.js} +1 -1
  80. package/src/assets/web-panel/assets/{SyncSettings-B9GNsc3e.js → SyncSettings-dNPQGL-s.js} +2 -2
  81. package/src/assets/web-panel/assets/{Tasks-BDBYKRen.js → Tasks-Ggs-Z48q.js} +1 -1
  82. package/src/assets/web-panel/assets/{Templates-DRiE5eaN.js → Templates-78TYHgRO.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tenant-BGlAvExF.js → Tenant-xHwwv9vO.js} +1 -1
  84. package/src/assets/web-panel/assets/{Terminal-B8uzrbNY.js → Terminal-BJXSJfm4.js} +2 -2
  85. package/src/assets/web-panel/assets/{TimelineRenderer-Df48iveY.js → TimelineRenderer-fLbjRhJw.js} +1 -1
  86. package/src/assets/web-panel/assets/{Tokens-CcmHndN6.js → Tokens-oMSBSBmB.js} +1 -1
  87. package/src/assets/web-panel/assets/{Trigger-DPkWxmQ2.js → Trigger-CfnY_wX_.js} +1 -1
  88. package/src/assets/web-panel/assets/{Trust-DTb5a5AV.js → Trust-AdyTgYKO.js} +1 -1
  89. package/src/assets/web-panel/assets/{UkeySign-CBmg5vch.js → UkeySign-C5K_81dS.js} +1 -1
  90. package/src/assets/web-panel/assets/{VideoEditing-B0mZrz4O.js → VideoEditing-vcGVDqki.js} +1 -1
  91. package/src/assets/web-panel/assets/{Wallet-Bxs7_mpd.js → Wallet-hhOc3hlY.js} +4 -4
  92. package/src/assets/web-panel/assets/{WebAuthn-C8x3cMxU.js → WebAuthn-CVloC11s.js} +3 -3
  93. package/src/assets/web-panel/assets/{WorkflowEditor-DPrNznrP.js → WorkflowEditor-CYeE32R5.js} +1 -1
  94. package/src/assets/web-panel/assets/{chat-D3bYWu7S.js → chat-CNROR5bN.js} +1 -1
  95. package/src/assets/web-panel/assets/{colors-DY-PwMu4.js → colors-Cjx-cnwU.js} +1 -1
  96. package/src/assets/web-panel/assets/{compact-item-LDk10Kw6.js → compact-item-DOIfelvD.js} +1 -1
  97. package/src/assets/web-panel/assets/{createContext-C-2MZnFq.js → createContext-DfA7UZ8u.js} +1 -1
  98. package/src/assets/web-panel/assets/devWarning-ChcCBGs7.js +1 -0
  99. package/src/assets/web-panel/assets/{hasIn-BQIBjcnB.js → hasIn-BMSCzcfM.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CQVb2dWp.js → index-5-HXgOX5.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BdXnYMCZ.js → index-AWg-0M1S.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cx6D_dx2.js → index-B4iYzpkL.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-_HRO_cIu.js → index-B5Udeb_6.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DlRYqt3S.js → index-B7gf77CJ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BrnRO9yE.js → index-BEMwBBHk.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-VCh5zNJo.js → index-BM1y_9hM.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BRI3ngNg.js → index-BUonmKSE.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C3GNvExG.js → index-BbQ2eQ8H.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DSvo_bp0.js → index-BemJ2u_E.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-L6qixyLc.js → index-BolaOQxx.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BI4KgcYC.js → index-BxOk9vkG.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CY4KnaO9.js → index-By61ojUx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-L3smcoQX.js → index-C2K9SNVX.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BX2b9Orc.js → index-C3L5gdiD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Cz4b6Z_7.js → index-C7xn0Nub.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-COG61sRv.js → index-CAnvhwg6.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C7FC8cP2.js → index-CEKMcOyU.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BN-xdSWZ.js → index-CNC5onm4.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DY2FIrmz.js → index-CVL27kXC.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CiTvBAr-.js → index-CVm1_i3t.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DhRt9cYJ.js → index-CdYBye8B.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B5pgtZnY.js → index-ClNMrqEY.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-7xKu7Fns.js → index-Cs6l7uRu.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-D4K1weKc.js → index-CshQbilz.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-k7C_oDCO.js → index-Cyweh0Hy.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D3Oq-DLL.js → index-DBpWXFed.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-DYyLJPlF.js → index-DHtpHZAQ.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Dh-tkpKQ.js → index-DLmn0BoK.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-8JC9BJa1.js → index-DPAWBrMf.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dd2Km97U.js → index-DjEsxO5h.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-KFZO_lcx.js → index-FBc_CJBd.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DTIZpPtG.js → index-Icdoqmzt.js} +1 -1
  133. package/src/assets/web-panel/assets/index-Q2IajL54.js +1 -0
  134. package/src/assets/web-panel/assets/index-bRkHgOMc.js +1 -0
  135. package/src/assets/web-panel/assets/{index-lmm9p-jm.js → index-dCd8cSUq.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-HasPt4-h.js → index-m2vG9gG_.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-CaslYch6.js → index-mTpHoEzr.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-CbR6ROOa.js → index-ti_lnTWl.js} +1 -1
  139. package/src/assets/web-panel/assets/{initDefaultProps-zQPSHf2C.js → initDefaultProps-Bu8k7H1Y.js} +1 -1
  140. package/src/assets/web-panel/assets/{motion-CKCStGVk.js → motion-s3iVK41k.js} +1 -1
  141. package/src/assets/web-panel/assets/{move-BufVDGYF.js → move-B6B-E5Jz.js} +1 -1
  142. package/src/assets/web-panel/assets/{mtc-parser-DcaFxy5D.js → mtc-parser-BiYgTidA.js} +1 -1
  143. package/src/assets/web-panel/assets/{omit-EScpkGdo.js → omit-pU1RdUDA.js} +1 -1
  144. package/src/assets/web-panel/assets/{pickAttrs-72hG_qfT.js → pickAttrs-Cdoq_SeM.js} +1 -1
  145. package/src/assets/web-panel/assets/{placementArrow-CMFWiH20.js → placementArrow-DIuvAn2K.js} +1 -1
  146. package/src/assets/web-panel/assets/{responsiveObserve-DKQHS41p.js → responsiveObserve-8w16YR2D.js} +1 -1
  147. package/src/assets/web-panel/assets/{slide-QVAFHTIQ.js → slide-VZ01cZe3.js} +1 -1
  148. package/src/assets/web-panel/assets/{statusUtils-DIz38e2G.js → statusUtils-lh8YMN8Z.js} +1 -1
  149. package/src/assets/web-panel/assets/{styleChecker-zK5cyLby.js → styleChecker-CmDyreec.js} +1 -1
  150. package/src/assets/web-panel/assets/{useFlexGapSupport-DhZngk62.js → useFlexGapSupport-hiJWMU5y.js} +1 -1
  151. package/src/assets/web-panel/assets/{useFs-BvV2cvkg.js → useFs-Thnu-Iaj.js} +1 -1
  152. package/src/assets/web-panel/assets/{usePersonalDataHub-CRmxb9l3.js → usePersonalDataHub-LBdOxjwY.js} +1 -1
  153. package/src/assets/web-panel/assets/{vnode-CgQIbobP.js → vnode-Cg6lFY_X.js} +1 -1
  154. package/src/assets/web-panel/assets/{zoom-D4XrrO0R.js → zoom-DVfsR1YO.js} +1 -1
  155. package/src/assets/web-panel/index.html +1 -1
  156. package/src/cli-help.js +181 -0
  157. package/src/command-help-index.json +181 -0
  158. package/src/command-manifest.json +1107 -175
  159. package/src/command-surface-policy.js +197 -0
  160. package/src/commands/agent.js +98 -33
  161. package/src/commands/artifacts.js +400 -2
  162. package/src/commands/background-session.js +41 -3
  163. package/src/commands/checkpoint-managed.js +1059 -0
  164. package/src/commands/checkpoint-restore-recovery.js +1476 -0
  165. package/src/commands/checkpoint.js +950 -22
  166. package/src/commands/compact.js +101 -25
  167. package/src/commands/config.js +506 -20
  168. package/src/commands/doctor.js +4 -1
  169. package/src/commands/hub.js +1 -1
  170. package/src/commands/mcp.js +688 -24
  171. package/src/commands/pack.js +16 -2
  172. package/src/commands/plugin.js +20 -12
  173. package/src/commands/session-mcp-recovery.js +218 -0
  174. package/src/commands/session.js +470 -110
  175. package/src/commands/setup.js +36 -10
  176. package/src/commands/skill.js +181 -110
  177. package/src/commands/status.js +21 -5
  178. package/src/commands/team-distributed.js +3324 -0
  179. package/src/commands/team.js +1130 -74
  180. package/src/commands/update.js +68 -6
  181. package/src/constants.js +11 -0
  182. package/src/data/changelog.json +26 -0
  183. package/src/gateways/ws/action-protocol.js +10 -0
  184. package/src/gateways/ws/session-protocol.js +555 -27
  185. package/src/gateways/ws/ws-agent-handler.js +541 -14
  186. package/src/gateways/ws/ws-session-gateway.js +129 -22
  187. package/src/gateways/ws/ws-session-state.js +431 -0
  188. package/src/harness/background-task-manager.js +233 -36
  189. package/src/harness/jsonl-session-store.js +2551 -167
  190. package/src/harness/mcp-client.js +802 -61
  191. package/src/harness/prompt-compressor.js +227 -27
  192. package/src/harness/session-index.js +89 -38
  193. package/src/harness/session-list-index.js +254 -0
  194. package/src/harness/structured-handoff.js +410 -0
  195. package/src/lazy-dispatch.js +747 -84
  196. package/src/lib/__tests__/logger.test.js +50 -2
  197. package/src/lib/advisor-runtime.js +1047 -0
  198. package/src/lib/agent-core.js +2 -0
  199. package/src/lib/agent-sandbox.js +120 -26
  200. package/src/lib/agent-session-export.js +20 -0
  201. package/src/lib/agent-team/task-lease.js +271 -3
  202. package/src/lib/agent-team/team-adjudication.js +1501 -0
  203. package/src/lib/agent-team/team-budget.js +4 -1
  204. package/src/lib/agent-team/team-control-store.js +582 -0
  205. package/src/lib/agent-team/team-distributed-queue.js +5246 -0
  206. package/src/lib/agent-team/team-process-checkpoint.js +211 -0
  207. package/src/lib/agent-team/team-runner.js +543 -24
  208. package/src/lib/agent-team/team-worktree.js +1403 -95
  209. package/src/lib/artifact-store.js +131 -8
  210. package/src/lib/background-agent-supervisor.js +185 -13
  211. package/src/lib/background-interaction-journal.js +37 -9
  212. package/src/lib/background-launch-profile.js +1058 -0
  213. package/src/lib/checkpoint-restore-already-completed-controller.js +902 -0
  214. package/src/lib/checkpoint-restore-orchestrator.js +987 -0
  215. package/src/lib/checkpoint-restore-partial-rollback-controller.js +1953 -0
  216. package/src/lib/checkpoint-restore-recovery-controller.js +689 -0
  217. package/src/lib/checkpoint-restore-recovery.js +884 -0
  218. package/src/lib/checkpoint-restore-retention.js +126 -0
  219. package/src/lib/checkpoint-restore-saga.js +5079 -0
  220. package/src/lib/checkpoint-restore-session-recovery.js +1178 -0
  221. package/src/lib/checkpoint-restore-workspace-target-verifier.js +270 -0
  222. package/src/lib/checkpoint-store.js +1688 -97
  223. package/src/lib/checkpoint-timeline-authority.js +522 -0
  224. package/src/lib/checkpoint-timeline.js +642 -0
  225. package/src/lib/config-keys.js +18 -119
  226. package/src/lib/config-manager.js +446 -27
  227. package/src/lib/config-redaction.js +57 -0
  228. package/src/lib/config-schema.js +853 -0
  229. package/src/lib/cowork-mcp-tools.js +5 -0
  230. package/src/lib/cowork-task-runner.js +458 -63
  231. package/src/lib/delivery-coordinator.js +1234 -0
  232. package/src/lib/delivery-evidence.js +450 -0
  233. package/src/lib/doctor-checkup.js +199 -14
  234. package/src/lib/executable-path.js +34 -0
  235. package/src/lib/fatal-handler.js +16 -0
  236. package/src/lib/file-checkpoint.js +4909 -186
  237. package/src/lib/file-lines.js +125 -0
  238. package/src/lib/headless-config-command.js +16 -5
  239. package/src/lib/hook-runner.cjs +139 -38
  240. package/src/lib/hooks-v2-workspace-context.js +10 -0
  241. package/src/lib/impacted-gate-selector.js +424 -0
  242. package/src/lib/interaction-adapter.js +62 -0
  243. package/src/lib/jsonl-session-store.js +1 -35
  244. package/src/lib/logger.js +66 -14
  245. package/src/lib/managed-checkpoint-render.js +60 -0
  246. package/src/lib/managed-tool-checkpoint.js +194 -0
  247. package/src/lib/mcp-call-ledger-store.js +1069 -0
  248. package/src/lib/mcp-call-ledger.js +747 -0
  249. package/src/lib/mcp-client.js +5 -0
  250. package/src/lib/mcp-conflict-scheduler.js +468 -0
  251. package/src/lib/mcp-effect-contract.js +102 -0
  252. package/src/lib/mcp-headers-helper-trust.js +145 -0
  253. package/src/lib/mcp-headers-helper.js +616 -0
  254. package/src/lib/mcp-host-recovery-runtime.js +131 -0
  255. package/src/lib/mcp-ledger-recovery-admission.js +1065 -0
  256. package/src/lib/mcp-recovery-adjudication.js +443 -0
  257. package/src/lib/output-context.js +86 -0
  258. package/src/lib/packer/file-identity.js +170 -0
  259. package/src/lib/packer/index.js +3 -0
  260. package/src/lib/packer/native-update-state.js +277 -0
  261. package/src/lib/packer/pack-update-applier.js +1983 -136
  262. package/src/lib/packer/pack-update-checker.js +34 -0
  263. package/src/lib/packer/pack-update-downloader.js +875 -86
  264. package/src/lib/packer/pack-update-signature.js +86 -0
  265. package/src/lib/packer/pkg-config-generator.js +6 -0
  266. package/src/lib/paths.js +65 -10
  267. package/src/lib/plan-mode.js +831 -14
  268. package/src/lib/plan-persistence.js +540 -0
  269. package/src/lib/plugin-runtime/hooks.js +227 -69
  270. package/src/lib/plugin-runtime/plugin-options.js +189 -44
  271. package/src/lib/pr-automation-policy.js +146 -8
  272. package/src/lib/process-execution-broker/credential-agent.js +7 -0
  273. package/src/lib/process-execution-broker/index.js +491 -13
  274. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +28 -1
  275. package/src/lib/process-execution-broker/linux-generic-bwrap.js +28 -4
  276. package/src/lib/process-execution-broker/platform-sandbox.js +92 -70
  277. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  278. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  279. package/src/lib/process-execution-broker/windows-sandbox.cs +284 -19
  280. package/src/lib/process-execution-broker/workspace-transaction.js +4459 -0
  281. package/src/lib/project-instructions.js +165 -29
  282. package/src/lib/project-mcp-trust.js +67 -0
  283. package/src/lib/public-ide-capability-manifest.js +272 -0
  284. package/src/lib/public-ide-capability-validation.js +351 -0
  285. package/src/lib/secret-store.js +267 -43
  286. package/src/lib/secure-file-identity.js +433 -0
  287. package/src/lib/secure-fs.js +1089 -0
  288. package/src/lib/security-audit.js +58 -0
  289. package/src/lib/service-manager.js +34 -13
  290. package/src/lib/session-budget-runtime.js +1452 -0
  291. package/src/lib/session-host-snapshot.js +388 -0
  292. package/src/lib/session-message-provenance.js +429 -0
  293. package/src/lib/session-projection.js +804 -0
  294. package/src/lib/session-resource-budget.js +1495 -0
  295. package/src/lib/settings-hooks.cjs +138 -22
  296. package/src/lib/settings-loader.cjs +25 -2
  297. package/src/lib/side-effect-ledger-store.js +45 -23
  298. package/src/lib/skill-execution-identity.js +217 -0
  299. package/src/lib/skill-loader.js +299 -18
  300. package/src/lib/sub-agent-context.js +236 -28
  301. package/src/lib/sub-agent-registry.js +5 -0
  302. package/src/lib/subagent-contract.js +94 -0
  303. package/src/lib/todo-manager.js +185 -18
  304. package/src/lib/todo-persistence.js +417 -0
  305. package/src/lib/turn-binding-store.js +41 -23
  306. package/src/lib/turn-binding.js +160 -2
  307. package/src/lib/with-file-lock.js +165 -24
  308. package/src/lib/ws-chat-handler.js +21 -0
  309. package/src/program-base.js +18 -0
  310. package/src/repl/advisor-command.js +103 -0
  311. package/src/repl/agent-repl.js +2175 -146
  312. package/src/repl/btw-command.js +93 -10
  313. package/src/repl/clipboard-image.js +119 -0
  314. package/src/repl/config-summary.js +64 -108
  315. package/src/repl/prompt-editor.js +233 -0
  316. package/src/repl/prompt-interactions.js +344 -0
  317. package/src/repl/prompt-stash.js +354 -0
  318. package/src/repl/prompt-suggestions.js +312 -0
  319. package/src/repl/repl-keybindings.js +227 -0
  320. package/src/repl/session-recap.js +217 -0
  321. package/src/repl/slash-command-registry.js +22 -0
  322. package/src/repl/terminal-layout.js +88 -0
  323. package/src/runtime/agent-core.js +1630 -447
  324. package/src/runtime/coding-agent-contract-shared.cjs +13 -1
  325. package/src/runtime/coding-agent-managed-tool-policy.cjs +7 -2
  326. package/src/runtime/diagnostics.js +32 -13
  327. package/src/runtime/headless-runner.js +310 -118
  328. package/src/runtime/headless-stream.js +356 -95
  329. package/src/runtime/mcp-config.js +148 -14
  330. package/src/runtime/policies/agent-policy.js +14 -0
  331. package/src/runtime/status-diagnostics-lite.js +137 -0
  332. package/src/assets/web-panel/assets/MarkdownRenderer-7iWGwZ-r.js +0 -1
  333. package/src/assets/web-panel/assets/OrderTableRenderer-BU2Yqq5H.js +0 -1
  334. package/src/assets/web-panel/assets/PdhVaultBrowser-69ca_WeR.js +0 -7
  335. package/src/assets/web-panel/assets/devWarning-B4dXIJqD.js +0 -1
  336. package/src/assets/web-panel/assets/index-C-C7DaG6.js +0 -1
  337. package/src/assets/web-panel/assets/index-DkfWzWtd.js +0 -1
@@ -0,0 +1,125 @@
1
+ import { closeSync, fstatSync, openSync, readSync } from "node:fs";
2
+ import { StringDecoder } from "node:string_decoder";
3
+
4
+ const DEFAULT_CHUNK_SIZE = 64 * 1024;
5
+
6
+ function recordRead(ioMetrics, bytes) {
7
+ if (!ioMetrics || typeof ioMetrics !== "object") return;
8
+ ioMetrics.readCalls = Math.max(0, Number(ioMetrics.readCalls) || 0) + 1;
9
+ ioMetrics.bytesRead =
10
+ Math.max(0, Number(ioMetrics.bytesRead) || 0) + Math.max(0, bytes || 0);
11
+ }
12
+
13
+ /**
14
+ * Stream UTF-8 lines from a file without loading the whole file. The final
15
+ * unterminated fragment is yielded with `terminated:false`, which lets callers
16
+ * distinguish a crash tail from a normal record.
17
+ */
18
+ export function* iterateFileLinesSync(
19
+ filePath,
20
+ {
21
+ chunkSize = DEFAULT_CHUNK_SIZE,
22
+ includeEmpty = false,
23
+ ioMetrics = null,
24
+ } = {},
25
+ ) {
26
+ const fd = openSync(filePath, "r");
27
+ const decoder = new StringDecoder("utf8");
28
+ const buffer = Buffer.allocUnsafe(Math.max(1024, chunkSize));
29
+ let pending = "";
30
+ let lineNo = 0;
31
+ try {
32
+ for (;;) {
33
+ const bytes = readSync(fd, buffer, 0, buffer.length, null);
34
+ if (bytes === 0) break;
35
+ recordRead(ioMetrics, bytes);
36
+ pending += decoder.write(buffer.subarray(0, bytes));
37
+ let newline;
38
+ while ((newline = pending.indexOf("\n")) >= 0) {
39
+ let line = pending.slice(0, newline);
40
+ if (line.endsWith("\r")) line = line.slice(0, -1);
41
+ pending = pending.slice(newline + 1);
42
+ lineNo += 1;
43
+ if (includeEmpty || line.length > 0) {
44
+ yield { line, lineNo, terminated: true };
45
+ }
46
+ }
47
+ }
48
+ pending += decoder.end();
49
+ if (pending.length > 0 || includeEmpty) {
50
+ lineNo += 1;
51
+ if (includeEmpty || pending.length > 0) {
52
+ yield { line: pending, lineNo, terminated: false };
53
+ }
54
+ }
55
+ } finally {
56
+ closeSync(fd);
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Read UTF-8 lines newest-first using bounded memory. Lines are assembled as
62
+ * bytes before decoding so a multibyte character split across chunks remains
63
+ * intact. `terminated:false` marks only the physical tail fragment.
64
+ */
65
+ export function* iterateFileLinesReverseSync(
66
+ filePath,
67
+ {
68
+ chunkSize = DEFAULT_CHUNK_SIZE,
69
+ includeEmpty = false,
70
+ ioMetrics = null,
71
+ } = {},
72
+ ) {
73
+ const fd = openSync(filePath, "r");
74
+ const size = fstatSync(fd).size;
75
+ let endsWithNewline = false;
76
+ if (size > 0) {
77
+ const last = Buffer.allocUnsafe(1);
78
+ const bytes = readSync(fd, last, 0, 1, size - 1);
79
+ recordRead(ioMetrics, bytes);
80
+ endsWithNewline = last[0] === 0x0a;
81
+ }
82
+ let position = size;
83
+ let carry = Buffer.alloc(0);
84
+ let isPhysicalTail = true;
85
+ try {
86
+ while (position > 0) {
87
+ const length = Math.min(Math.max(1024, chunkSize), position);
88
+ position -= length;
89
+ const chunk = Buffer.allocUnsafe(length);
90
+ const bytes = readSync(fd, chunk, 0, length, position);
91
+ recordRead(ioMetrics, bytes);
92
+ const combined = Buffer.concat([chunk, carry]);
93
+ let end = combined.length;
94
+ for (let index = combined.length - 1; index >= 0; index -= 1) {
95
+ if (combined[index] !== 0x0a) continue;
96
+ let bytes = combined.subarray(index + 1, end);
97
+ if (bytes.length > 0 && bytes[bytes.length - 1] === 0x0d) {
98
+ bytes = bytes.subarray(0, bytes.length - 1);
99
+ }
100
+ const line = bytes.toString("utf8");
101
+ const terminated = isPhysicalTail ? endsWithNewline : true;
102
+ // A file ending in "\n" produces one empty physical-tail slice. Skip
103
+ // it without changing the termination status of the real last line.
104
+ if (includeEmpty || line.length > 0) {
105
+ yield { line, terminated };
106
+ isPhysicalTail = false;
107
+ }
108
+ end = index;
109
+ }
110
+ carry = combined.subarray(0, end);
111
+ }
112
+ if (carry.length > 0 || includeEmpty) {
113
+ let bytes = carry;
114
+ if (bytes.length > 0 && bytes[bytes.length - 1] === 0x0d) {
115
+ bytes = bytes.subarray(0, bytes.length - 1);
116
+ }
117
+ const line = bytes.toString("utf8");
118
+ if (includeEmpty || line.length > 0) {
119
+ yield { line, terminated: !isPhysicalTail };
120
+ }
121
+ }
122
+ } finally {
123
+ closeSync(fd);
124
+ }
125
+ }
@@ -16,6 +16,7 @@ import {
16
16
  renderConfigGet,
17
17
  renderConfigSet,
18
18
  renderConfigSummary,
19
+ isSecretConfigKey,
19
20
  } from "../repl/config-summary.js";
20
21
 
21
22
  /** Does this headless prompt start with the `/config` slash command? */
@@ -48,11 +49,21 @@ export function runConfigDirective(prompt, deps = {}) {
48
49
  };
49
50
  }
50
51
  if (cmd.action === "set") {
51
- cm.setConfigValue(cmd.key, cmd.value);
52
- return {
53
- text: renderConfigSet(cmd.key, cm.getConfigValue(cmd.key)),
54
- isError: false,
55
- };
52
+ if (isSecretConfigKey(cmd.key)) {
53
+ return {
54
+ text: `/config: ${cmd.key} is secret; use cc config set-secret ${cmd.key}`,
55
+ isError: true,
56
+ };
57
+ }
58
+ try {
59
+ cm.setConfigValue(cmd.key, cmd.value);
60
+ return {
61
+ text: renderConfigSet(cmd.key, cm.getConfigValue(cmd.key)),
62
+ isError: false,
63
+ };
64
+ } catch (error) {
65
+ return { text: `/config: ${error.message}`, isError: true };
66
+ }
56
67
  }
57
68
  // show
58
69
  return {
@@ -164,9 +164,20 @@ function tryParseDecision(stdout) {
164
164
  if (firstLine && firstLine[0] === "{") obj = tryJson(firstLine);
165
165
  }
166
166
  if (obj === undefined || obj === null || typeof obj !== "object") return null;
167
+ if (Array.isArray(obj)) {
168
+ return {
169
+ decision: HOOK_DECISIONS.CONTINUE,
170
+ reason: "hook decision payload must be a JSON object",
171
+ unsupportedDecision: true,
172
+ };
173
+ }
167
174
  // PreToolUse-specific permission decision
168
175
  const hso = obj.hookSpecificOutput;
169
- if (hso && hso.permissionDecision) {
176
+ if (
177
+ hso &&
178
+ typeof hso === "object" &&
179
+ Object.prototype.hasOwnProperty.call(hso, "permissionDecision")
180
+ ) {
170
181
  const pd = String(hso.permissionDecision).toLowerCase();
171
182
  const decision =
172
183
  pd === "deny"
@@ -176,10 +187,17 @@ function tryParseDecision(stdout) {
176
187
  : pd === "allow"
177
188
  ? HOOK_DECISIONS.ALLOW
178
189
  : HOOK_DECISIONS.CONTINUE;
179
- return { decision, reason: hso.permissionDecisionReason || null };
190
+ const supported = pd === "deny" || pd === "ask" || pd === "allow";
191
+ return {
192
+ decision,
193
+ reason: supported
194
+ ? hso.permissionDecisionReason || null
195
+ : `unsupported hook permissionDecision: ${pd || "<empty>"}`,
196
+ ...(supported ? {} : { unsupportedDecision: true }),
197
+ };
180
198
  }
181
199
  // Generic decision field
182
- if (obj.decision) {
200
+ if (Object.prototype.hasOwnProperty.call(obj, "decision")) {
183
201
  const d = String(obj.decision).toLowerCase();
184
202
  const decision =
185
203
  d === "block" || d === "deny"
@@ -189,15 +207,37 @@ function tryParseDecision(stdout) {
189
207
  : d === "ask"
190
208
  ? HOOK_DECISIONS.ASK
191
209
  : HOOK_DECISIONS.CONTINUE;
192
- return { decision, reason: obj.reason || null };
193
- }
194
- // continue:false → stop/block
195
- if (obj.continue === false) {
210
+ const supported =
211
+ d === "block" ||
212
+ d === "deny" ||
213
+ d === "approve" ||
214
+ d === "allow" ||
215
+ d === "ask" ||
216
+ d === "continue";
196
217
  return {
197
- decision: HOOK_DECISIONS.BLOCK,
198
- reason: obj.stopReason || obj.reason || "hook requested stop",
218
+ decision,
219
+ reason: supported
220
+ ? obj.reason || null
221
+ : `unsupported hook decision: ${d || "<empty>"}`,
222
+ ...(supported ? {} : { unsupportedDecision: true }),
199
223
  };
200
224
  }
225
+ // continue:false → stop/block
226
+ if (Object.prototype.hasOwnProperty.call(obj, "continue")) {
227
+ if (obj.continue === false) {
228
+ return {
229
+ decision: HOOK_DECISIONS.BLOCK,
230
+ reason: obj.stopReason || obj.reason || "hook requested stop",
231
+ };
232
+ }
233
+ if (obj.continue !== true) {
234
+ return {
235
+ decision: HOOK_DECISIONS.CONTINUE,
236
+ reason: "hook continue field must be boolean",
237
+ unsupportedDecision: true,
238
+ };
239
+ }
240
+ }
201
241
  return {
202
242
  decision: HOOK_DECISIONS.CONTINUE,
203
243
  reason: null,
@@ -205,6 +245,42 @@ function tryParseDecision(stdout) {
205
245
  };
206
246
  }
207
247
 
248
+ /**
249
+ * Upgrade an execution/protocol failure to a blocking authority decision.
250
+ * Direct command-hook calls and observe/Post aggregation retain their historic
251
+ * fail-open behavior; runHooks callers opt in with `{ failClosed: true }`.
252
+ * Keeping this conversion at the aggregation boundary also preserves the
253
+ * underlying nonBlockingError/breaker/protocol flags for audit telemetry.
254
+ */
255
+ function failClosedAuthorityResult(result) {
256
+ const supportedDecision =
257
+ result && Object.values(HOOK_DECISIONS).includes(result.decision);
258
+ const authorityFailure =
259
+ !supportedDecision ||
260
+ result.nonBlockingError === true ||
261
+ result.breakerOpen === true ||
262
+ result.malformedDecision === true ||
263
+ result.unsupportedDecision === true;
264
+
265
+ if (!authorityFailure || result?.decision === HOOK_DECISIONS.BLOCK) {
266
+ return result;
267
+ }
268
+
269
+ const detail =
270
+ result?.reason ||
271
+ result?.error ||
272
+ (!supportedDecision
273
+ ? "hook returned an invalid decision result"
274
+ : "hook authority evaluation failed");
275
+ return {
276
+ ...(result || {}),
277
+ decision: HOOK_DECISIONS.BLOCK,
278
+ reason: `authority-bearing hook failed closed: ${detail}`,
279
+ authorityFailure: true,
280
+ originalDecision: supportedDecision ? result.decision : null,
281
+ };
282
+ }
283
+
208
284
  /**
209
285
  * Run one command hook. `input` is JSON-serialized to the hook's stdin.
210
286
  *
@@ -676,6 +752,12 @@ async function _runCommandHookInnerAsync(command, input = {}, opts = {}) {
676
752
  * This closes the safety gap where an earlier hook's `ask` masks a LATER hook's
677
753
  * `block` (the short-circuit path returns `ask` and never runs the blocker).
678
754
  * Claude-Code parity: all matching hooks contribute to the merged decision.
755
+ *
756
+ * `opts.failClosed: true` (or its semantic alias `authorityBearing: true`)
757
+ * marks an authority-bearing decision path. It implies strict merge and
758
+ * upgrades spawn/timeout/breaker/protocol failures to BLOCK. The default
759
+ * remains fail-open for observe/Post hooks.
760
+ *
679
761
  * spawnSync is synchronous so execution is sequential — but the MERGE is
680
762
  * order-independent, so the outcome matches a parallel run.
681
763
  *
@@ -684,25 +766,32 @@ async function _runCommandHookInnerAsync(command, input = {}, opts = {}) {
684
766
  function runHooks(commandHooks, input = {}, opts = {}) {
685
767
  const results = [];
686
768
  const hooks = commandHooks || [];
769
+ const failClosed = opts.failClosed === true || opts.authorityBearing === true;
687
770
  const runOne = (h) => {
688
- const sandboxPolicy = resolveHookSandboxPolicy(h, opts);
689
- return runCommandHook(h.command, input, {
690
- ...opts,
691
- ...(sandboxPolicy ? { sandboxPolicy } : {}),
692
- broker: opts.broker,
693
- origin: h.origin,
694
- pluginId: h.pluginId,
695
- pluginVersion: h.pluginVersion,
696
- pluginSource: h.pluginSource,
697
- timeout: h.timeout != null ? h.timeout * 1000 : opts.timeout,
698
- environmentAllowlist: h.environmentAllowlist || h.envAllowlist,
699
- // per-hook shell selection (P1 #8): `{ "type":"command", "command":…,
700
- // "shell":"powershell" }` in the settings hook entry
701
- shell: h.shell != null ? h.shell : opts.shell,
702
- });
771
+ try {
772
+ const sandboxPolicy = resolveHookSandboxPolicy(h, opts);
773
+ const result = runCommandHook(h.command, input, {
774
+ ...opts,
775
+ ...(sandboxPolicy ? { sandboxPolicy } : {}),
776
+ broker: opts.broker,
777
+ origin: h.origin,
778
+ pluginId: h.pluginId,
779
+ pluginVersion: h.pluginVersion,
780
+ pluginSource: h.pluginSource,
781
+ timeout: h.timeout != null ? h.timeout * 1000 : opts.timeout,
782
+ environmentAllowlist: h.environmentAllowlist || h.envAllowlist,
783
+ // per-hook shell selection (P1 #8): `{ "type":"command", "command":…,
784
+ // "shell":"powershell" }` in the settings hook entry
785
+ shell: h.shell != null ? h.shell : opts.shell,
786
+ });
787
+ return failClosed ? failClosedAuthorityResult(result) : result;
788
+ } catch (error) {
789
+ if (!failClosed) throw error;
790
+ return failClosedAuthorityResult(hookSpawnFailure(error));
791
+ }
703
792
  };
704
793
 
705
- if (opts.mergeStrict) {
794
+ if (opts.mergeStrict || failClosed) {
706
795
  const decisions = [];
707
796
  for (const h of hooks) {
708
797
  const r = runOne(h);
@@ -752,21 +841,33 @@ function runHooks(commandHooks, input = {}, opts = {}) {
752
841
  */
753
842
  async function runHooksParallel(commandHooks, input = {}, opts = {}) {
754
843
  const hooks = commandHooks || [];
844
+ const failClosed = opts.failClosed === true || opts.authorityBearing === true;
755
845
  const settled = await Promise.all(
756
846
  hooks.map((h) => {
757
- const sandboxPolicy = resolveHookSandboxPolicy(h, opts);
758
- return runCommandHookAsync(h.command, input, {
759
- ...opts,
760
- ...(sandboxPolicy ? { sandboxPolicy } : {}),
761
- broker: opts.broker,
762
- origin: h.origin,
763
- pluginId: h.pluginId,
764
- pluginVersion: h.pluginVersion,
765
- pluginSource: h.pluginSource,
766
- timeout: h.timeout != null ? h.timeout * 1000 : opts.timeout,
767
- environmentAllowlist: h.environmentAllowlist || h.envAllowlist,
768
- shell: h.shell != null ? h.shell : opts.shell,
769
- }).then((r) => ({ h, r }));
847
+ try {
848
+ const sandboxPolicy = resolveHookSandboxPolicy(h, opts);
849
+ return runCommandHookAsync(h.command, input, {
850
+ ...opts,
851
+ ...(sandboxPolicy ? { sandboxPolicy } : {}),
852
+ broker: opts.broker,
853
+ origin: h.origin,
854
+ pluginId: h.pluginId,
855
+ pluginVersion: h.pluginVersion,
856
+ pluginSource: h.pluginSource,
857
+ timeout: h.timeout != null ? h.timeout * 1000 : opts.timeout,
858
+ environmentAllowlist: h.environmentAllowlist || h.envAllowlist,
859
+ shell: h.shell != null ? h.shell : opts.shell,
860
+ }).then((r) => ({
861
+ h,
862
+ r: failClosed ? failClosedAuthorityResult(r) : r,
863
+ }));
864
+ } catch (error) {
865
+ if (!failClosed) throw error;
866
+ return Promise.resolve({
867
+ h,
868
+ r: failClosedAuthorityResult(hookSpawnFailure(error)),
869
+ });
870
+ }
770
871
  }),
771
872
  );
772
873
  const results = settled.map(({ h, r }) => ({ command: h.command, ...r }));
@@ -232,6 +232,16 @@ export function currentHostHooksV2WorkspaceBinding() {
232
232
  return verifyWorkspaceRecord(trustedWorkspaceStorage.getStore());
233
233
  }
234
234
 
235
+ /** Resolve only the exact opaque binding object issued by this host process. */
236
+ export function resolveHostHooksV2WorkspaceBinding(binding) {
237
+ if (!binding || typeof binding !== "object") return null;
238
+ const bindingId = binding.bindingId;
239
+ if (typeof bindingId !== "string") return null;
240
+ const record = registeredHostWorkspaces.get(bindingId);
241
+ if (!record || record.binding !== binding) return null;
242
+ return verifyWorkspaceRecord(record);
243
+ }
244
+
235
245
  /**
236
246
  * Resolve an opaque durable binding only against roots registered by the
237
247
  * current host process. No persisted or event-supplied path is accepted.