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
@@ -8,7 +8,10 @@ import {
8
8
  VERSION,
9
9
  } from "../constants.js";
10
10
  import { ensureHomeDir, getConfigPath } from "../lib/paths.js";
11
- import { loadConfig, saveConfig } from "../lib/config-manager.js";
11
+ import {
12
+ setSecretConfigValue,
13
+ updateConfigAtomically,
14
+ } from "../lib/config-manager.js";
12
15
  import {
13
16
  isDockerAvailable,
14
17
  isDockerComposeAvailable,
@@ -44,6 +47,14 @@ export function registerSetupCommand(program) {
44
47
  });
45
48
  }
46
49
 
50
+ export function assertRequiredProviderCredential(providerInfo, apiKey) {
51
+ if (providerInfo?.requiresApiKey && (apiKey === null || apiKey === "")) {
52
+ const error = new Error("An API key is required for the selected provider");
53
+ error.code = "SETUP_API_KEY_REQUIRED";
54
+ throw error;
55
+ }
56
+ }
57
+
47
58
  async function runSetup(options) {
48
59
  logger.log(chalk.bold("\n ChainlessChain Setup Wizard\n"));
49
60
  logger.log(` Version: ${VERSION}`);
@@ -102,6 +113,9 @@ async function runSetup(options) {
102
113
 
103
114
  if (providerInfo.requiresApiKey) {
104
115
  apiKey = await askPassword(`Enter ${providerInfo.name} API key:`);
116
+ // Abort before changing provider/baseUrl so an old provider's credential
117
+ // can never be paired with and sent to a newly selected endpoint.
118
+ assertRequiredProviderCredential(providerInfo, apiKey);
105
119
  }
106
120
 
107
121
  if (provider === "custom" || providerInfo.isProxy) {
@@ -143,15 +157,27 @@ async function runSetup(options) {
143
157
  }
144
158
 
145
159
  // Step 7: Save config
146
- const config = loadConfig();
147
- config.setupCompleted = true;
148
- config.completedAt = new Date().toISOString();
149
- config.edition = edition;
150
- config.llm.provider = provider;
151
- config.llm.apiKey = apiKey;
152
- config.llm.baseUrl = baseUrl;
153
- config.llm.model = model;
154
- saveConfig(config);
160
+ const applySetupValues = (config) => {
161
+ config.setupCompleted = true;
162
+ config.completedAt = new Date().toISOString();
163
+ config.edition = edition;
164
+ config.llm.provider = provider;
165
+ config.llm.baseUrl = baseUrl;
166
+ config.llm.model = model;
167
+ };
168
+ if (apiKey) {
169
+ // The provider settings, keychain write and config pointer switch form one
170
+ // locked transaction. A failed key write/save leaves the prior config and
171
+ // prior secret reference active.
172
+ setSecretConfigValue("llm.apiKey", apiKey, {
173
+ storage: "auto",
174
+ configMutator: applySetupValues,
175
+ });
176
+ } else {
177
+ // Preserve any existing secret reference when the selected provider needs
178
+ // no new key; never clear a usable credential before another write.
179
+ updateConfigAtomically(applySetupValues);
180
+ }
155
181
  logger.success("Configuration saved");
156
182
 
157
183
  // Step 8: Docker services
@@ -10,7 +10,6 @@ import chalk from "chalk";
10
10
  import ora from "ora";
11
11
  import fs from "fs";
12
12
  import path from "path";
13
- import { createSkillProcessBroker } from "../lib/skill-process-broker.js";
14
13
  import { logger } from "../lib/logger.js";
15
14
  import {
16
15
  CLISkillLoader,
@@ -49,6 +48,9 @@ import {
49
48
  } from "../lib/skill-loader.js";
50
49
  import { getElectronUserDataDir } from "../lib/paths.js";
51
50
  import { findProjectRoot } from "../lib/project-detector.js";
51
+ import { loadConfig } from "../lib/config-manager.js";
52
+ import { applyConfigLlmDefaults } from "../lib/llm-config-defaults.js";
53
+ import { BUILT_IN_PROVIDERS } from "../lib/llm-providers.js";
52
54
  import {
53
55
  generateCliPacks,
54
56
  checkForUpdates,
@@ -71,7 +73,7 @@ function canRunOnPlatform(skill) {
71
73
  return skill.os.includes(process.platform);
72
74
  }
73
75
 
74
- const SKILL_TEMPLATE_MD = (name) => `---
76
+ export const SKILL_TEMPLATE_MD = (name) => `---
75
77
  name: ${name}
76
78
  display-name: ${name}
77
79
  description: Custom skill — edit this description
@@ -80,11 +82,15 @@ category: custom
80
82
  tags: [custom]
81
83
  user-invocable: true
82
84
  handler: handler.js
85
+ isolation: true
83
86
  ---
84
87
 
85
88
  # ${name}
86
89
 
87
- Describe what this skill does and how to use it.
90
+ Describe the task this skill performs. These instructions are authoritative;
91
+ the CLI executes them in an isolated child agent with a host-owned tool
92
+ allow-list. The handler file is an identity marker and is never imported into
93
+ the CLI process.
88
94
 
89
95
  ## Usage
90
96
 
@@ -93,29 +99,151 @@ chainlesschain skill run ${name} "your input"
93
99
  \`\`\`
94
100
  `;
95
101
 
96
- const SKILL_TEMPLATE_HANDLER = (name) => `/**
97
- * Handler for ${name} skill
102
+ export const SKILL_TEMPLATE_HANDLER = (name) => `/**
103
+ * Execution identity marker for ${name}.
104
+ *
105
+ * ChainlessChain CLI deliberately never imports this module. Put executable
106
+ * behavior in SKILL.md instructions and use approved agent tools; a future
107
+ * restricted worker may consume this metadata without granting process-local
108
+ * authority.
98
109
  */
110
+ export default Object.freeze({
111
+ skill: "${name}",
112
+ executionMode: "controlled-agent-tools",
113
+ });
114
+ `;
115
+
116
+ export function createControlledSkillScaffold(name, targetDir, io = fs) {
117
+ io.mkdirSync(targetDir, { recursive: true });
118
+ io.writeFileSync(
119
+ path.join(targetDir, "SKILL.md"),
120
+ SKILL_TEMPLATE_MD(name),
121
+ "utf-8",
122
+ );
123
+ io.writeFileSync(
124
+ path.join(targetDir, "handler.js"),
125
+ SKILL_TEMPLATE_HANDLER(name),
126
+ "utf-8",
127
+ );
128
+ return { name, targetDir, isolation: true };
129
+ }
99
130
 
100
- const handler = {
101
- async init(skill) {
102
- // Optional initialization
103
- },
131
+ export function createCliSkillReauthorizer(options = {}) {
132
+ return async (request) => {
133
+ if (options.assumeYes === true) return { authorized: true };
134
+ const stdin = options.stdin || process.stdin;
135
+ const stdout = options.stdout || process.stdout;
136
+ if (stdin?.isTTY !== true || stdout?.isTTY !== true) return false;
137
+
138
+ const confirm =
139
+ options.confirm || (await import("@inquirer/prompts")).confirm;
140
+ const skillId = request?.skill?.id || "unknown";
141
+ const source = request?.skill?.source || "unknown";
142
+ const digest = String(request?.currentDigest || "").slice(0, 24);
143
+ const authorized = await confirm({
144
+ message:
145
+ `Authorize isolated skill "${skillId}" from ${source} ` +
146
+ `for this process (${digest || "digest unavailable"})?`,
147
+ default: false,
148
+ });
149
+ return { authorized: authorized === true };
150
+ };
151
+ }
104
152
 
105
- async execute(task, context, skill) {
106
- const input = task.input || task.params?.input || "";
153
+ export function resolveControlledSkillLlmOptions({
154
+ config = loadConfig(),
155
+ env = process.env,
156
+ } = {}) {
157
+ const resolved = {};
158
+ // Match the existing command/cowork precedence: an explicit provider from
159
+ // the environment wins as a complete provider selection; otherwise the
160
+ // configured llm block supplies provider/model/baseUrl/apiKey.
161
+ if (!env.LLM_PROVIDER) {
162
+ applyConfigLlmDefaults(resolved, config?.llm || {});
163
+ }
164
+ const provider = resolved.provider || env.LLM_PROVIDER || "ollama";
165
+ const providerDefinition = BUILT_IN_PROVIDERS[provider];
166
+ return {
167
+ ...resolved,
168
+ provider,
169
+ model: resolved.model || env.LLM_MODEL || providerDefinition?.models?.[0],
170
+ baseUrl: resolved.baseUrl || providerDefinition?.baseUrl,
171
+ };
172
+ }
107
173
 
108
- // TODO: Implement skill logic
174
+ export async function runControlledSkill(options = {}) {
175
+ const {
176
+ name,
177
+ input = "",
178
+ cwd = process.cwd(),
179
+ loader,
180
+ executeTool = null,
181
+ llmOptions = null,
182
+ } = options;
183
+ if (
184
+ !loader ||
185
+ (typeof loader.getResolvedSkills !== "function" &&
186
+ typeof loader.loadAll !== "function")
187
+ ) {
188
+ throw new TypeError("runControlledSkill requires a CLISkillLoader");
189
+ }
190
+ const skills =
191
+ typeof loader.getResolvedSkills === "function"
192
+ ? loader.getResolvedSkills()
193
+ : loader.loadAll();
194
+ let skill = skills.find(
195
+ (candidate) => candidate.id === name || candidate.dirName === name,
196
+ );
197
+ if (!skill) {
198
+ return { error: `Skill not found: ${name}`, code: "CC_SKILL_NOT_FOUND" };
199
+ }
200
+ const executionContext = {
201
+ loadedBecause: "run_skill",
202
+ bodyIncluded: false,
203
+ };
204
+ if (typeof loader.materializeSkillForExecution === "function") {
205
+ skill = await loader.materializeSkillForExecution(skill, executionContext);
206
+ } else if (typeof loader.materializeSkill === "function") {
207
+ skill = loader.materializeSkill(skill, executionContext);
208
+ }
209
+ if (skill.isolation !== true) {
109
210
  return {
110
- success: true,
111
- message: \`${name} executed successfully\`,
112
- result: { input },
211
+ error:
212
+ `Skill "${skill.id}" is not configured for controlled execution. ` +
213
+ "Add isolation: true before running it.",
214
+ code: "CC_SKILL_DIRECT_HANDLER_BLOCKED",
113
215
  };
114
- },
115
- };
116
-
117
- export default handler;
118
- `;
216
+ }
217
+ if (!canRunOnPlatform(skill)) {
218
+ return {
219
+ error: `Skill "${skill.id}" is not supported on ${process.platform}`,
220
+ code: "CC_SKILL_PLATFORM_UNSUPPORTED",
221
+ };
222
+ }
223
+ const dispatch =
224
+ executeTool || (await import("../runtime/agent-core.js")).executeTool;
225
+ const result = await dispatch(
226
+ "run_skill",
227
+ { skill_name: skill.id, input: String(input) },
228
+ {
229
+ cwd,
230
+ skillLoader: loader,
231
+ ...(llmOptions ? { llmOptions: { ...llmOptions } } : {}),
232
+ },
233
+ );
234
+ const nestedFailure = /^\s*Sub-agent failed:/i.test(
235
+ String(result?.summary || ""),
236
+ );
237
+ if (result?.error || nestedFailure) {
238
+ return {
239
+ ...result,
240
+ success: false,
241
+ code: result?.code || "CC_SKILL_CONTROLLED_RUN_FAILED",
242
+ error: result?.error || result.summary,
243
+ };
244
+ }
245
+ return result;
246
+ }
119
247
 
120
248
  export function registerSkillCommand(program) {
121
249
  const skill = program
@@ -321,95 +449,46 @@ export function registerSkillCommand(program) {
321
449
  // skill run
322
450
  skill
323
451
  .command("run")
324
- .description("Execute a skill")
452
+ .description("Execute a skill through a controlled agent/tool route")
325
453
  .argument("<name>", "Skill name")
326
454
  .argument("[input...]", "Input for the skill")
327
455
  .option("--json", "Output as JSON")
456
+ .option("-y, --yes", "Authorize the current isolated skill digest")
328
457
  .action(async (name, inputParts, options) => {
329
- const skills = loader.loadAll();
330
- let s = skills.find((sk) => sk.id === name || sk.dirName === name);
331
-
332
- if (!s) {
333
- logger.error(`Skill not found: ${name}`);
334
- process.exit(1);
335
- }
336
-
337
- if (!s.hasHandler) {
338
- logger.error(
339
- `Skill "${s.id}" has no handler (documentation only). Cannot execute.`,
340
- );
341
- process.exit(1);
342
- }
343
-
344
- if (!canRunOnPlatform(s)) {
345
- logger.error(`Skill "${s.id}" is not supported on ${process.platform}`);
346
- process.exit(1);
347
- }
348
-
458
+ const runLoader = new CLISkillLoader({
459
+ reauthorizeSkill: createCliSkillReauthorizer({
460
+ assumeYes: options.yes === true,
461
+ }),
462
+ });
463
+ const llmOptions = resolveControlledSkillLlmOptions();
464
+ let result;
349
465
  try {
350
- s = loader.materializeSkill(s, {
351
- loadedBecause: "cli_skill_run",
352
- bodyIncluded: false,
466
+ result = await runControlledSkill({
467
+ name,
468
+ input: inputParts.join(" "),
469
+ cwd: process.cwd(),
470
+ loader: runLoader,
471
+ llmOptions,
353
472
  });
354
473
  } catch (error) {
355
- logger.error(`Skill "${s.id}" body could not be loaded: ${error.message}`);
356
- process.exit(1);
357
- }
358
-
359
- const spinner = ora(`Running ${s.displayName}...`).start();
360
- const input = inputParts.join(" ");
361
-
362
- try {
363
- const handlerPath = path.join(s.skillDir, "handler.js");
364
- const imported = await import(
365
- `file://${handlerPath.replace(/\\/g, "/")}`
366
- );
367
- const handler = imported.default || imported;
368
-
369
- if (handler.init) {
370
- await handler.init(s);
371
- }
372
-
373
- const task = {
374
- params: { input },
375
- input,
376
- action: input,
377
- };
378
- const context = {
379
- projectRoot: process.cwd(),
380
- workspacePath: process.cwd(),
381
- workspaceRoot: process.cwd(),
382
- processBroker: createSkillProcessBroker(s),
474
+ result = {
475
+ success: false,
476
+ code: error.code || "CC_SKILL_CONTROLLED_RUN_FAILED",
477
+ error: error.message,
383
478
  };
479
+ }
384
480
 
385
- const result = await handler.execute(task, context, s);
386
- spinner.stop();
387
-
388
- if (options.json) {
389
- console.log(JSON.stringify(result, null, 2));
390
- } else if (result.success) {
391
- logger.success(result.message || "Done");
392
- if (result.result && typeof result.result === "object") {
393
- for (const [key, val] of Object.entries(result.result)) {
394
- if (typeof val === "string" && val.length > 200) {
395
- logger.log(` ${chalk.cyan(key)}: ${val.substring(0, 200)}...`);
396
- } else {
397
- logger.log(` ${chalk.cyan(key)}: ${JSON.stringify(val)}`);
398
- }
399
- }
400
- }
401
- } else {
402
- logger.error(
403
- result.message || result.error || "Skill execution failed",
404
- );
405
- }
406
- } catch (err) {
407
- spinner.fail(`Skill execution failed: ${err.message}`);
408
- if (program.opts().verbose) {
409
- console.error(err.stack);
481
+ if (options.json) {
482
+ console.log(JSON.stringify(result, null, 2));
483
+ } else if (result?.error) {
484
+ logger.error(result.error);
485
+ } else {
486
+ logger.success(result?.summary || "Skill completed");
487
+ if (Array.isArray(result?.toolsUsed) && result.toolsUsed.length > 0) {
488
+ logger.log(chalk.gray(` tools: ${result.toolsUsed.join(", ")}`));
410
489
  }
411
- process.exit(1);
412
490
  }
491
+ if (result?.error) process.exitCode = 1;
413
492
  });
414
493
 
415
494
  // skill add — create a custom skill scaffold
@@ -444,17 +523,7 @@ export function registerSkillCommand(program) {
444
523
  }
445
524
 
446
525
  try {
447
- fs.mkdirSync(targetDir, { recursive: true });
448
- fs.writeFileSync(
449
- path.join(targetDir, "SKILL.md"),
450
- SKILL_TEMPLATE_MD(name),
451
- "utf-8",
452
- );
453
- fs.writeFileSync(
454
- path.join(targetDir, "handler.js"),
455
- SKILL_TEMPLATE_HANDLER(name),
456
- "utf-8",
457
- );
526
+ createControlledSkillScaffold(name, targetDir);
458
527
 
459
528
  const scope = options.global ? "global" : "project";
460
529
  logger.success(`Created ${scope} skill: ${chalk.cyan(name)}`);
@@ -464,7 +533,9 @@ export function registerSkillCommand(program) {
464
533
  logger.log(
465
534
  ` ${chalk.gray("SKILL.md")} — Skill metadata and documentation`,
466
535
  );
467
- logger.log(` ${chalk.gray("handler.js")} — Skill execution logic`);
536
+ logger.log(
537
+ ` ${chalk.gray("handler.js")} — controlled execution identity marker`,
538
+ );
468
539
  logger.log("");
469
540
  logger.log(
470
541
  `Edit these files, then run: ${chalk.cyan(`chainlesschain skill run ${name} "test input"`)}`,
@@ -1,9 +1,7 @@
1
1
  import chalk from "chalk";
2
2
  import logger from "../lib/logger.js";
3
- import { collectStatusReport } from "../runtime/diagnostics.js";
4
- import { getObservabilityRuntime } from "../lib/observability/index.js";
5
3
 
6
- export function collectOtlpStatus(runtime = getObservabilityRuntime()) {
4
+ export function collectOtlpStatus(runtime = null) {
7
5
  return (
8
6
  runtime?.getStats?.() || {
9
7
  enabled: false,
@@ -31,11 +29,29 @@ export function registerStatusCommand(program) {
31
29
  .command("status")
32
30
  .description("Show status of ChainlessChain app and services")
33
31
  .option("--json", "Output as machine-readable JSON")
32
+ .option("--deep", "Include Docker Compose service inspection")
34
33
  .action(async (options) => {
35
34
  try {
36
- const report = await collectStatusReport();
35
+ const report = options.deep
36
+ ? await (
37
+ await import("../runtime/diagnostics.js")
38
+ ).collectStatusReport({ deep: true })
39
+ : await (
40
+ await import("../runtime/status-diagnostics-lite.js")
41
+ ).collectQuickStatusReport();
42
+ let observabilityRuntime = null;
43
+ if (
44
+ program.opts().otlpEndpoint ||
45
+ process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||
46
+ process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT ||
47
+ process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT
48
+ ) {
49
+ observabilityRuntime = (
50
+ await import("../lib/observability/index.js")
51
+ ).getObservabilityRuntime();
52
+ }
37
53
  report.observability = {
38
- otlp: collectOtlpStatus(),
54
+ otlp: collectOtlpStatus(observabilityRuntime),
39
55
  };
40
56
 
41
57
  if (options.json) {