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
@@ -9,12 +9,13 @@
9
9
  * tests and so callers can route it through ProcessExecutionBroker.
10
10
  */
11
11
 
12
- import crypto from "node:crypto";
13
12
  import fs from "node:fs";
14
- import os from "node:os";
15
13
  import path from "node:path";
14
+ import { randomUUID } from "node:crypto";
16
15
  import { getElectronUserDataDir } from "./paths.js";
17
16
  import { executionBroker } from "./process-execution-broker/index.js";
17
+ import { withFileLock } from "./with-file-lock.js";
18
+ import { ensurePrivateDirectory, ensurePrivateFile } from "./secure-fs.js";
18
19
 
19
20
  const DPAPI_SCRIPT = [
20
21
  "$ErrorActionPreference='Stop'",
@@ -34,27 +35,40 @@ const DPAPI_UNPROTECT_SCRIPT = [
34
35
  "[Console]::Write([Convert]::ToBase64String($p))",
35
36
  ].join("; ");
36
37
 
38
+ const SAFE_SECRET_IDENTIFIER = /^[A-Za-z0-9@][A-Za-z0-9._/@:+-]{0,511}$/;
39
+ const KEYCHAIN_VALUE_PREFIX = "ccv1:";
40
+
41
+ function normalizeSecretIdentifier(value, label) {
42
+ const normalized = String(value);
43
+ if (!SAFE_SECRET_IDENTIFIER.test(normalized)) {
44
+ throw new Error(`Invalid ${label} for OS secret storage`);
45
+ }
46
+ return normalized;
47
+ }
48
+
37
49
  function defaultRunner(file, args, input = undefined) {
38
50
  const result = executionBroker.spawnSync(file, args, {
39
51
  origin: "secret-store",
40
52
  policy: "allow",
41
- stdio: ["ignore", "pipe", "pipe"],
53
+ stdio: [input === undefined ? "ignore" : "pipe", "pipe", "pipe"],
42
54
  encoding: "utf8",
43
55
  windowsHide: true,
56
+ timeout: 15000,
44
57
  ...(input !== undefined ? { input } : {}),
45
58
  });
46
59
  if (result.status !== 0) {
47
- throw new Error(String(result.stderr || "secret store command failed").trim());
60
+ const error = new Error(
61
+ String(result.stderr || "secret store command failed").trim(),
62
+ );
63
+ error.exitCode = result.status;
64
+ error.stderr = String(result.stderr || "").trim();
65
+ throw error;
48
66
  }
49
- return String(result.stdout || "").trim();
67
+ return String(result.stdout || "");
50
68
  }
51
69
 
52
- function safeToken(value) {
53
- return crypto
54
- .createHash("sha256")
55
- .update(String(value || ""))
56
- .digest("hex")
57
- .slice(0, 32);
70
+ function stripCommandTerminator(value) {
71
+ return String(value || "").replace(/\r?\n$/, "");
58
72
  }
59
73
 
60
74
  function chooseBackend(platform = process.platform) {
@@ -65,77 +79,265 @@ function chooseBackend(platform = process.platform) {
65
79
  }
66
80
 
67
81
  function readJson(file, readFile = fs.readFileSync) {
82
+ let raw;
68
83
  try {
69
- const value = JSON.parse(readFile(file, "utf8"));
70
- return value && typeof value === "object" && !Array.isArray(value)
71
- ? value
72
- : {};
73
- } catch {
74
- return {};
84
+ raw = readFile(file, "utf8");
85
+ } catch (error) {
86
+ if (error?.code === "ENOENT") return Object.create(null);
87
+ throw new Error(`Could not read encrypted secret store: ${error.message}`, {
88
+ cause: error,
89
+ });
90
+ }
91
+ let value;
92
+ try {
93
+ value = JSON.parse(raw);
94
+ } catch (error) {
95
+ throw new Error(
96
+ `Encrypted secret store contains invalid JSON: ${error.message}`,
97
+ { cause: error },
98
+ );
99
+ }
100
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
101
+ throw new Error("Encrypted secret store root must be an object");
75
102
  }
103
+ const safe = Object.create(null);
104
+ for (const [key, encrypted] of Object.entries(value)) {
105
+ normalizeSecretIdentifier(key, "secret key");
106
+ if (typeof encrypted !== "string" || encrypted.length === 0) {
107
+ throw new Error(`Encrypted secret store entry is invalid: ${key}`);
108
+ }
109
+ safe[key] = encrypted;
110
+ }
111
+ return safe;
76
112
  }
77
113
 
78
114
  function writeJson(file, value, deps = {}) {
79
115
  const mkdirSync = deps.mkdirSync || fs.mkdirSync;
80
116
  const writeFileSync = deps.writeFileSync || fs.writeFileSync;
81
- mkdirSync(path.dirname(file), { recursive: true });
82
- writeFileSync(file, JSON.stringify(value, null, 2), { encoding: "utf8", mode: 0o600 });
83
- try { fs.chmodSync(file, 0o600); } catch {}
117
+ const renameSync = deps.renameSync || fs.renameSync;
118
+ const unlinkSync = deps.unlinkSync || fs.unlinkSync;
119
+ const existsSync = deps.existsSync || fs.existsSync;
120
+ const secureDirectory = deps.ensurePrivateDirectory || ensurePrivateDirectory;
121
+ const secureFile = deps.ensurePrivateFile || ensurePrivateFile;
122
+ const directory = path.dirname(file);
123
+ secureDirectory(directory, {
124
+ applyWindowsAcl: true,
125
+ failIfUnavailable: true,
126
+ });
127
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
128
+ const temporary = `${file}.${process.pid}.${
129
+ deps.randomId?.() || randomUUID()
130
+ }.tmp`;
131
+ try {
132
+ writeFileSync(temporary, JSON.stringify(value, null, 2), {
133
+ encoding: "utf8",
134
+ mode: 0o600,
135
+ flag: "wx",
136
+ });
137
+ secureFile(temporary);
138
+ renameSync(temporary, file);
139
+ secureFile(file);
140
+ } catch (error) {
141
+ try {
142
+ if (existsSync(temporary)) unlinkSync(temporary);
143
+ } catch {
144
+ // Preserve the original persistence error.
145
+ }
146
+ throw error;
147
+ }
84
148
  }
85
149
 
86
- function createDpapiBackend({ file, runner, readFile, writeFile, mkdirSync } = {}) {
87
- const storeFile = file || path.join(getElectronUserDataDir(), "plugin-secrets.dpapi.json");
150
+ function createDpapiBackend({
151
+ file,
152
+ runner,
153
+ readFile,
154
+ writeFile,
155
+ mkdirSync,
156
+ renameFile,
157
+ unlinkFile,
158
+ existsFile,
159
+ withLock = withFileLock,
160
+ secureDirectory = ensurePrivateDirectory,
161
+ secureFile = ensurePrivateFile,
162
+ randomId,
163
+ } = {}) {
164
+ const storeFile =
165
+ file || path.join(getElectronUserDataDir(), "plugin-secrets.dpapi.json");
88
166
  const load = () => readJson(storeFile, readFile);
89
- const save = (v) => writeJson(storeFile, v, { writeFileSync: writeFile, mkdirSync });
167
+ const save = (v) =>
168
+ writeJson(storeFile, v, {
169
+ writeFileSync: writeFile,
170
+ mkdirSync,
171
+ renameSync: renameFile,
172
+ unlinkSync: unlinkFile,
173
+ existsSync: existsFile,
174
+ ensurePrivateDirectory: secureDirectory,
175
+ ensurePrivateFile: secureFile,
176
+ randomId,
177
+ });
178
+ const mutate = (fn) => {
179
+ secureDirectory(path.dirname(storeFile), {
180
+ applyWindowsAcl: true,
181
+ failIfUnavailable: true,
182
+ });
183
+ return withLock(storeFile, fn, { failIfUnavailable: true });
184
+ };
90
185
  return {
91
186
  name: "dpapi",
92
187
  set(key, value) {
188
+ key = normalizeSecretIdentifier(key, "secret key");
93
189
  const payload = Buffer.from(String(value), "utf8").toString("base64");
94
- const encoded = runner("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", DPAPI_SCRIPT], payload);
95
- const data = load(); data[key] = encoded; save(data);
190
+ const encoded = runner(
191
+ "powershell.exe",
192
+ ["-NoProfile", "-NonInteractive", "-Command", DPAPI_SCRIPT],
193
+ payload,
194
+ ).trim();
195
+ return mutate(() => {
196
+ const data = load();
197
+ data[key] = encoded;
198
+ save(data);
199
+ });
96
200
  },
97
201
  get(key) {
202
+ key = normalizeSecretIdentifier(key, "secret key");
98
203
  const encoded = load()[key];
99
204
  if (!encoded) return null;
100
- const plain = runner("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", DPAPI_UNPROTECT_SCRIPT], encoded);
205
+ const plain = runner(
206
+ "powershell.exe",
207
+ ["-NoProfile", "-NonInteractive", "-Command", DPAPI_UNPROTECT_SCRIPT],
208
+ encoded,
209
+ ).trim();
101
210
  return Buffer.from(plain, "base64").toString("utf8");
102
211
  },
103
212
  delete(key) {
104
- const data = load();
105
- if (!Object.prototype.hasOwnProperty.call(data, key)) return false;
106
- delete data[key]; save(data); return true;
213
+ key = normalizeSecretIdentifier(key, "secret key");
214
+ return mutate(() => {
215
+ const data = load();
216
+ if (!Object.prototype.hasOwnProperty.call(data, key)) return false;
217
+ delete data[key];
218
+ save(data);
219
+ return true;
220
+ });
107
221
  },
108
222
  };
109
223
  }
110
224
 
111
225
  function createKeychainBackend({ service, runner } = {}) {
112
- const name = service || "com.chainlesschain.plugin";
226
+ const name = normalizeSecretIdentifier(
227
+ service || "com.chainlesschain.plugin",
228
+ "Keychain service",
229
+ );
113
230
  return {
114
231
  name: "keychain",
115
232
  set(key, value) {
116
- runner("security", ["add-generic-password", "-a", key, "-s", name, "-w", String(value), "-U"]);
233
+ const account = normalizeSecretIdentifier(key, "secret key");
234
+ // `security add-generic-password -w <value>` exposes the value in the
235
+ // process list. Interactive-command mode reads the command from stdin;
236
+ // base64 keeps arbitrary secret bytes out of its token grammar as well as
237
+ // argv. The fixed prefix distinguishes our encoding from legacy entries.
238
+ const encoded = `${KEYCHAIN_VALUE_PREFIX}${Buffer.from(
239
+ String(value),
240
+ "utf8",
241
+ ).toString("base64")}`;
242
+ const command = `add-generic-password -a ${account} -s ${name} -U -w ${encoded}\n`;
243
+ if (Buffer.byteLength(command, "utf8") >= 4096) {
244
+ throw new Error(
245
+ "Secret is too large for the macOS Keychain command protocol",
246
+ );
247
+ }
248
+ runner("security", ["-i"], command);
117
249
  },
118
250
  get(key) {
119
- try { return runner("security", ["find-generic-password", "-a", key, "-s", name, "-w"]) || null; } catch { return null; }
251
+ const account = normalizeSecretIdentifier(key, "secret key");
252
+ try {
253
+ const stored = stripCommandTerminator(
254
+ runner("security", [
255
+ "find-generic-password",
256
+ "-a",
257
+ account,
258
+ "-s",
259
+ name,
260
+ "-w",
261
+ ]),
262
+ );
263
+ if (!stored) return null;
264
+ if (!stored.startsWith(KEYCHAIN_VALUE_PREFIX)) return stored;
265
+ const payload = stored.slice(KEYCHAIN_VALUE_PREFIX.length);
266
+ if (
267
+ !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(
268
+ payload,
269
+ )
270
+ ) {
271
+ throw new Error("Keychain secret payload is malformed");
272
+ }
273
+ return Buffer.from(payload, "base64").toString("utf8");
274
+ } catch (error) {
275
+ if (
276
+ error?.exitCode === 44 ||
277
+ /could not be found|item not found|SecKeychainSearchCopyNext/i.test(
278
+ error?.message || "",
279
+ )
280
+ ) {
281
+ return null;
282
+ }
283
+ throw error;
284
+ }
120
285
  },
121
286
  delete(key) {
122
- try { runner("security", ["delete-generic-password", "-a", key, "-s", name]); return true; } catch { return false; }
287
+ const account = normalizeSecretIdentifier(key, "secret key");
288
+ try {
289
+ runner("security", [
290
+ "delete-generic-password",
291
+ "-a",
292
+ account,
293
+ "-s",
294
+ name,
295
+ ]);
296
+ return true;
297
+ } catch {
298
+ return false;
299
+ }
123
300
  },
124
301
  };
125
302
  }
126
303
 
127
304
  function createSecretServiceBackend({ service, runner } = {}) {
128
- const name = service || "chainlesschain-plugin";
305
+ const name = normalizeSecretIdentifier(
306
+ service || "chainlesschain-plugin",
307
+ "Secret Service name",
308
+ );
129
309
  return {
130
310
  name: "secret-service",
131
311
  set(key, value) {
132
- runner("secret-tool", ["store", "--label", `${name}:${key}`, "service", name, "account", key], String(value));
312
+ key = normalizeSecretIdentifier(key, "secret key");
313
+ runner(
314
+ "secret-tool",
315
+ ["store", "--label", `${name}:${key}`, "service", name, "account", key],
316
+ String(value),
317
+ );
133
318
  },
134
319
  get(key) {
135
- try { return runner("secret-tool", ["lookup", "service", name, "account", key]) || null; } catch { return null; }
320
+ key = normalizeSecretIdentifier(key, "secret key");
321
+ try {
322
+ return (
323
+ stripCommandTerminator(
324
+ runner("secret-tool", ["lookup", "service", name, "account", key]),
325
+ ) || null
326
+ );
327
+ } catch (error) {
328
+ if (error?.exitCode === 1 && !error?.stderr) return null;
329
+ if (/not found|no such/i.test(error?.message || "")) return null;
330
+ throw error;
331
+ }
136
332
  },
137
333
  delete(key) {
138
- try { runner("secret-tool", ["clear", "service", name, "account", key]); return true; } catch { return false; }
334
+ key = normalizeSecretIdentifier(key, "secret key");
335
+ try {
336
+ runner("secret-tool", ["clear", "service", name, "account", key]);
337
+ return true;
338
+ } catch {
339
+ return false;
340
+ }
139
341
  },
140
342
  };
141
343
  }
@@ -146,14 +348,36 @@ export function createSecretStore(options = {}) {
146
348
  const runner = options.runner || defaultRunner;
147
349
  if (backend === "memory") {
148
350
  const values = options.values || new Map();
149
- return { name: "memory", set: (k, v) => values.set(k, String(v)), get: (k) => values.get(k) ?? null, delete: (k) => values.delete(k) };
351
+ return {
352
+ name: "memory",
353
+ set: (k, v) =>
354
+ values.set(normalizeSecretIdentifier(k, "secret key"), String(v)),
355
+ get: (k) =>
356
+ values.get(normalizeSecretIdentifier(k, "secret key")) ?? null,
357
+ delete: (k) => values.delete(normalizeSecretIdentifier(k, "secret key")),
358
+ };
150
359
  }
151
360
  if (backend === "dpapi") return createDpapiBackend({ ...options, runner });
152
- if (backend === "keychain") return createKeychainBackend({ ...options, runner });
153
- if (backend === "secret-service") return createSecretServiceBackend({ ...options, runner });
154
- throw new Error(`No OS secret store available for platform ${options.platform || process.platform}`);
361
+ if (backend === "keychain")
362
+ return createKeychainBackend({ ...options, runner });
363
+ if (backend === "secret-service")
364
+ return createSecretServiceBackend({ ...options, runner });
365
+ throw new Error(
366
+ `No OS secret store available for platform ${options.platform || process.platform}`,
367
+ );
155
368
  }
156
369
 
157
- export function secretRef(key) { return { __cc_secret_ref: String(key) }; }
158
- export function isSecretRef(value) { return Boolean(value && typeof value === "object" && value.__cc_secret_ref); }
370
+ export function secretRef(key) {
371
+ return { __cc_secret_ref: String(key) };
372
+ }
373
+ export function isSecretRef(value) {
374
+ return Boolean(
375
+ value &&
376
+ typeof value === "object" &&
377
+ !Array.isArray(value) &&
378
+ Object.keys(value).length === 1 &&
379
+ typeof value.__cc_secret_ref === "string" &&
380
+ value.__cc_secret_ref.length > 0,
381
+ );
382
+ }
159
383
  export { chooseBackend };