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
@@ -32,6 +32,17 @@ import { normalizeSkillPaths } from "./skill-path-scope.js";
32
32
  import { discoverPluginSkillLayers } from "./plugin-runtime/skills.js";
33
33
  import settingsLoader from "./settings-loader.cjs";
34
34
  import contextSourceLedger from "./context-source-ledger.js";
35
+ import {
36
+ assertControlledSkillExecution,
37
+ captureSkillExecutionSnapshot,
38
+ describeSkillExecutionAuthority,
39
+ executionIdentityMetadata,
40
+ isSkillExecutionContext,
41
+ skillDigestDriftError,
42
+ skillIdentityChangedError,
43
+ skillReauthorizationError,
44
+ skillTrustRequiredError,
45
+ } from "./skill-execution-identity.js";
35
46
 
36
47
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
37
48
 
@@ -235,7 +246,9 @@ function readSkillFrontmatter(skillMd, maxBytes = 256 * 1024) {
235
246
  if (read <= 0) break;
236
247
  chunks.push(chunk.subarray(0, read));
237
248
  total += read;
238
- const prefix = Buffer.concat(chunks).toString("utf-8").replace(/^\uFEFF/, "");
249
+ const prefix = Buffer.concat(chunks)
250
+ .toString("utf-8")
251
+ .replace(/^\uFEFF/, "");
239
252
  const firstLineEnd = prefix.search(/\r?\n/);
240
253
  if (firstLineEnd >= 0 && prefix.slice(0, firstLineEnd).trim() !== "---") {
241
254
  return {};
@@ -325,10 +338,24 @@ export function prepareSkillBody(skill, args) {
325
338
  * Multi-layer CLI skill loader
326
339
  */
327
340
  export class CLISkillLoader {
328
- constructor({ contextLedger = contextSourceLedger } = {}) {
341
+ constructor({
342
+ contextLedger = contextSourceLedger,
343
+ reauthorizeSkill = null,
344
+ // Only package-owned, immutable-at-install sources are trusted by
345
+ // default. The historical "managed" layer is actually the user-writable
346
+ // <userData>/skills directory (and `skill add --global` writes there), so
347
+ // treating it as enterprise-managed would bypass first-use digest consent.
348
+ trustedExecutionSources = ["bundled", "cli-bundled"],
349
+ } = {}) {
350
+ if (reauthorizeSkill !== null && typeof reauthorizeSkill !== "function") {
351
+ throw new TypeError("reauthorizeSkill must be a function or null");
352
+ }
329
353
  this._cache = null;
330
354
  this._bodyCache = new Map();
331
355
  this._contextLedger = contextLedger;
356
+ this._reauthorizeSkill = reauthorizeSkill;
357
+ this._trustedExecutionSources = new Set(trustedExecutionSources);
358
+ this._authorizedExecutionDigests = new Map();
332
359
  this._cacheStats = {
333
360
  descriptorScans: 0,
334
361
  descriptorCacheHits: 0,
@@ -339,6 +366,137 @@ export class CLISkillLoader {
339
366
  };
340
367
  }
341
368
 
369
+ _skillReauthorizationRequest(
370
+ skill,
371
+ snapshot,
372
+ context,
373
+ { firstUseAuthorization, contentChanged, previouslyAuthorizedDigest },
374
+ ) {
375
+ return Object.freeze({
376
+ skill: Object.freeze({
377
+ id: skill.id,
378
+ source: skill.source,
379
+ skillDir: skill.skillDir,
380
+ }),
381
+ identityDigest: snapshot.identityDigest,
382
+ reason:
383
+ firstUseAuthorization && !contentChanged
384
+ ? "first-use"
385
+ : firstUseAuthorization
386
+ ? "first-use-content-drift"
387
+ : "content-drift",
388
+ previousDigest:
389
+ previouslyAuthorizedDigest ||
390
+ (contentChanged
391
+ ? skill.executionIdentity?.contentDigest || null
392
+ : null),
393
+ discoveredDigest: skill.executionIdentity?.contentDigest || null,
394
+ currentDigest: snapshot.contentDigest,
395
+ componentDigests: Object.freeze({ ...snapshot.componentDigests }),
396
+ loadedBecause: context.loadedBecause || "explicit",
397
+ sessionId: context.sessionId || null,
398
+ turnId: context.turnId || null,
399
+ });
400
+ }
401
+
402
+ _throwSkillAuthorizationDenial(
403
+ skill,
404
+ snapshot,
405
+ { firstUseAuthorization, contentChanged },
406
+ ) {
407
+ if (firstUseAuthorization && !contentChanged) {
408
+ throw skillTrustRequiredError(skill);
409
+ }
410
+ throw skillDigestDriftError(
411
+ skill,
412
+ skill.executionIdentity?.contentDigest || null,
413
+ snapshot.contentDigest,
414
+ );
415
+ }
416
+
417
+ /**
418
+ * Await an execution-digest decision without weakening the synchronous
419
+ * loader API. IDE/CLI hosts may provide an async `reauthorizeSkill` callback;
420
+ * callers without one remain fail-closed. The digest is checked again by
421
+ * materializeSkillForExecution after the await, closing the prompt-time race.
422
+ */
423
+ async _authorizeSkillExecutionDigest(skill, context = {}) {
424
+ const snapshot = captureSkillExecutionSnapshot({
425
+ skillDir: skill.skillDir,
426
+ skillId: skill.id,
427
+ source: skill.source,
428
+ });
429
+ const discovered = skill.executionIdentity;
430
+ if (
431
+ !discovered ||
432
+ discovered.identityDigest !== snapshot.identityDigest ||
433
+ discovered.handlerPresent !== snapshot.handlerPresent
434
+ ) {
435
+ throw skillIdentityChangedError(skill);
436
+ }
437
+
438
+ if (
439
+ isSkillExecutionContext(context) &&
440
+ skill.hasHandler === true &&
441
+ (skill.isolation !== true || context.loadedBecause !== "run_skill")
442
+ ) {
443
+ assertControlledSkillExecution(skill, context);
444
+ }
445
+
446
+ const contentChanged = discovered.contentDigest !== snapshot.contentDigest;
447
+ const executionRequiresTrust =
448
+ isSkillExecutionContext(context) &&
449
+ skill.hasHandler === true &&
450
+ !this._trustedExecutionSources.has(String(skill.source || ""));
451
+ const previouslyAuthorizedDigest = this._authorizedExecutionDigests.get(
452
+ snapshot.identityDigest,
453
+ );
454
+ const digestAuthorized =
455
+ previouslyAuthorizedDigest === snapshot.contentDigest;
456
+ const firstUseAuthorization = executionRequiresTrust && !digestAuthorized;
457
+ if ((!contentChanged && !firstUseAuthorization) || digestAuthorized) {
458
+ return executionIdentityMetadata(snapshot);
459
+ }
460
+ if (!this._reauthorizeSkill) {
461
+ this._throwSkillAuthorizationDenial(skill, snapshot, {
462
+ firstUseAuthorization,
463
+ contentChanged,
464
+ });
465
+ }
466
+
467
+ let decision;
468
+ try {
469
+ decision = await this._reauthorizeSkill(
470
+ this._skillReauthorizationRequest(skill, snapshot, context, {
471
+ firstUseAuthorization,
472
+ contentChanged,
473
+ previouslyAuthorizedDigest,
474
+ }),
475
+ );
476
+ } catch (cause) {
477
+ throw skillReauthorizationError(skill, cause);
478
+ }
479
+ if (decision !== true && decision?.authorized !== true) {
480
+ this._throwSkillAuthorizationDenial(skill, snapshot, {
481
+ firstUseAuthorization,
482
+ contentChanged,
483
+ });
484
+ }
485
+ this._authorizedExecutionDigests.set(
486
+ snapshot.identityDigest,
487
+ snapshot.contentDigest,
488
+ );
489
+ return executionIdentityMetadata(snapshot);
490
+ }
491
+
492
+ async materializeSkillForExecution(skill, context = {}) {
493
+ const executionContext = { ...context, forExecution: true };
494
+ await this._authorizeSkillExecutionDigest(skill, executionContext);
495
+ // Re-capture and re-check after a potentially human-blocking async prompt.
496
+ // materializeSkill recognizes only the exact digest authorized above.
497
+ return this.materializeSkill(skill, executionContext);
498
+ }
499
+
342
500
  /**
343
501
  * Get paths for each layer
344
502
  * @returns {{ layer: string, path: string, exists: boolean }[]}
@@ -496,9 +654,17 @@ export class CLISkillLoader {
496
654
  try {
497
655
  const data = readSkillFrontmatter(skillMd);
498
656
  const stat = fs.statSync(skillMd);
657
+ const id = data.name || entry.name;
658
+ const isolation = data.isolation === true;
659
+ const snapshot = captureSkillExecutionSnapshot({
660
+ skillDir,
661
+ skillId: id,
662
+ source: layer,
663
+ });
664
+ const hasHandler = snapshot.handlerPresent;
499
665
 
500
666
  out.push({
501
- id: data.name || entry.name,
667
+ id,
502
668
  displayName: data.displayName || entry.name,
503
669
  description: data.description || "",
504
670
  version: data.version || "1.0.0",
@@ -518,17 +684,22 @@ export class CLISkillLoader {
518
684
  // context). null (the default) = applies everywhere.
519
685
  paths: normalizeSkillPaths(data),
520
686
  dirName: entry.name,
521
- hasHandler: fs.existsSync(path.join(skillDir, "handler.js")),
522
- isolation: data.isolation === true,
687
+ hasHandler,
688
+ isolation,
689
+ executionIdentity: executionIdentityMetadata(snapshot),
690
+ executionAuthority: describeSkillExecutionAuthority({
691
+ hasHandler,
692
+ isolation,
693
+ }),
523
694
  // Two-tier loading: discovery retains only the descriptor. The body
524
695
  // and embedded MCP declarations are populated on first use.
525
696
  body: null,
526
697
  bodyLoaded: false,
527
698
  mcpServers: [],
528
699
  source: layer,
529
- skillDir,
530
- skillMdPath: skillMd,
531
- skillFileBytes: stat.size,
700
+ skillDir: snapshot.rootRealPath,
701
+ skillMdPath: path.join(snapshot.rootRealPath, "SKILL.md"),
702
+ skillFileBytes: snapshot.skillFileBytes,
532
703
  skillFileMtimeMs: stat.mtimeMs,
533
704
  });
534
705
  } catch {
@@ -539,23 +710,134 @@ export class CLISkillLoader {
539
710
 
540
711
  /**
541
712
  * Materialize a descriptor's markdown body and embedded MCP declarations.
542
- * Cache entries are invalidated by file size/mtime and never include content
543
- * in provenance records.
713
+ * The exact SKILL.md + handler.js digest is re-read before every execution or
714
+ * prompt materialization. Cache entries are keyed by that digest, not mutable
715
+ * size/mtime metadata, and provenance records never include source content.
544
716
  */
545
717
  materializeSkill(skill, context = {}) {
546
718
  if (!skill || !skill.skillMdPath) {
547
719
  throw new TypeError("A discovered skill descriptor is required");
548
720
  }
549
- const stat = fs.statSync(skill.skillMdPath);
550
- const signature = `${stat.size}:${stat.mtimeMs}`;
721
+
722
+ const snapshot = captureSkillExecutionSnapshot({
723
+ skillDir: skill.skillDir,
724
+ skillId: skill.id,
725
+ source: skill.source,
726
+ });
727
+ const discovered = skill.executionIdentity;
728
+ if (
729
+ !discovered ||
730
+ discovered.identityDigest !== snapshot.identityDigest ||
731
+ discovered.handlerPresent !== snapshot.handlerPresent
732
+ ) {
733
+ throw skillIdentityChangedError(skill);
734
+ }
735
+ if (
736
+ isSkillExecutionContext(context) &&
737
+ skill.hasHandler === true &&
738
+ (skill.isolation !== true || context.loadedBecause !== "run_skill")
739
+ ) {
740
+ assertControlledSkillExecution(skill, context);
741
+ }
742
+
743
+ const contentChanged = discovered.contentDigest !== snapshot.contentDigest;
744
+ const executionRequiresTrust =
745
+ isSkillExecutionContext(context) &&
746
+ skill.hasHandler === true &&
747
+ !this._trustedExecutionSources.has(String(skill.source || ""));
748
+ const previouslyAuthorizedDigest = this._authorizedExecutionDigests.get(
749
+ snapshot.identityDigest,
750
+ );
751
+ const digestAuthorized =
752
+ previouslyAuthorizedDigest === snapshot.contentDigest;
753
+ const firstUseAuthorization = executionRequiresTrust && !digestAuthorized;
754
+ if ((contentChanged || firstUseAuthorization) && !digestAuthorized) {
755
+ if (!this._reauthorizeSkill) {
756
+ if (firstUseAuthorization && !contentChanged) {
757
+ throw skillTrustRequiredError(skill);
758
+ }
759
+ throw skillDigestDriftError(
760
+ skill,
761
+ discovered.contentDigest,
762
+ snapshot.contentDigest,
763
+ );
764
+ }
765
+ let decision;
766
+ try {
767
+ decision = this._reauthorizeSkill(
768
+ this._skillReauthorizationRequest(skill, snapshot, context, {
769
+ firstUseAuthorization,
770
+ contentChanged,
771
+ previouslyAuthorizedDigest,
772
+ }),
773
+ );
774
+ } catch (cause) {
775
+ throw skillReauthorizationError(skill, cause);
776
+ }
777
+ if (decision && typeof decision.then === "function") {
778
+ // The synchronous API cannot await an IDE/CLI decision. Observe a
779
+ // possible rejection so fail-closed use does not create an unhandled
780
+ // promise; execution callers must use materializeSkillForExecution().
781
+ Promise.resolve(decision).catch(() => {});
782
+ throw skillReauthorizationError(
783
+ skill,
784
+ new TypeError("reauthorizeSkill must return synchronously"),
785
+ );
786
+ }
787
+ if (decision !== true && decision?.authorized !== true) {
788
+ if (firstUseAuthorization && !contentChanged) {
789
+ throw skillTrustRequiredError(skill);
790
+ }
791
+ throw skillDigestDriftError(
792
+ skill,
793
+ discovered.contentDigest,
794
+ snapshot.contentDigest,
795
+ );
796
+ }
797
+ if (executionRequiresTrust) {
798
+ this._authorizedExecutionDigests.set(
799
+ snapshot.identityDigest,
800
+ snapshot.contentDigest,
801
+ );
802
+ }
803
+ } else if (
804
+ isSkillExecutionContext(context) &&
805
+ skill.hasHandler === true &&
806
+ this._trustedExecutionSources.has(String(skill.source || ""))
807
+ ) {
808
+ this._authorizedExecutionDigests.set(
809
+ snapshot.identityDigest,
810
+ snapshot.contentDigest,
811
+ );
812
+ }
813
+
814
+ const parsed = parseSkillMd(snapshot.skillMdContent);
815
+ const runtimeId = parsed.data.name || skill.dirName;
816
+ if (String(runtimeId) !== String(skill.id)) {
817
+ throw skillIdentityChangedError(skill);
818
+ }
819
+ const runtimeIsolation = parsed.data.isolation === true;
820
+ skill.handler = parsed.data.handler || null;
821
+ skill.capabilities = parsed.data.capabilities || [];
822
+ skill.isolation = runtimeIsolation;
823
+ skill.executionIdentity = executionIdentityMetadata(snapshot);
824
+ skill.executionAuthority = describeSkillExecutionAuthority({
825
+ hasHandler: skill.hasHandler,
826
+ isolation: runtimeIsolation,
827
+ });
828
+
829
+ // This is deliberately after fresh parsing/digest verification: a changed
830
+ // `isolation` field cannot reuse the descriptor's old authority decision.
831
+ assertControlledSkillExecution(skill, context);
832
+
833
+ const signature = snapshot.contentDigest;
551
834
  let cached = this._bodyCache.get(skill.skillMdPath);
552
835
  let cacheRead = false;
553
836
  if (cached?.signature === signature) {
554
837
  this._cacheStats.bodyCacheHits += 1;
555
838
  cacheRead = true;
556
839
  } else {
557
- const content = fs.readFileSync(skill.skillMdPath, "utf-8");
558
- const { body } = parseSkillMd(content);
840
+ const { body } = parsed;
559
841
  cached = {
560
842
  signature,
561
843
  body,
@@ -570,8 +852,8 @@ export class CLISkillLoader {
570
852
  skill.body = cached.body;
571
853
  skill.mcpServers = cached.mcpServers;
572
854
  skill.bodyLoaded = true;
573
- skill.skillFileBytes = stat.size;
574
- skill.skillFileMtimeMs = stat.mtimeMs;
855
+ skill.skillFileBytes = snapshot.skillFileBytes;
856
+ skill.skillFileMtimeMs = fs.statSync(skill.skillMdPath).mtimeMs;
575
857
 
576
858
  const prior = this._cacheStats.bodyLoads.get(skill.skillMdPath) || {
577
859
  id: skill.id,
@@ -604,8 +886,7 @@ export class CLISkillLoader {
604
886
  // Only text that actually entered a model prompt consumes context
605
887
  // tokens. Ordinary run_skill materialization is still recorded, but
606
888
  // as a content-size/cache observation rather than a false token charge.
607
- tokenCount:
608
- context.bodyIncluded === true ? cached.estimatedTokens : 0,
889
+ tokenCount: context.bodyIncluded === true ? cached.estimatedTokens : 0,
609
890
  metadata: {
610
891
  source: skill.source,
611
892
  loadedBecause: reason,