chainlesschain 0.162.170 → 0.162.172

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 (186) hide show
  1. package/bin/chainlesschain.js +8 -0
  2. package/package.json +6 -1
  3. package/src/assets/web-panel/assets/{AIOps-BTXN24I3.js → AIOps-oKCWU-LK.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-BBB1VF4j.js → ActionButton-4CBfc5E4.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-BVCXq0k6.js → Analytics-BEmR-k_b.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-C3EOo2s5.js → AppLayout-D6a4ZnrC.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-CsJTZSMv.js → Artifacts-BRWIHCPl.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-CP0AllJ_.js → Audit-CzGKlkTc.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-BCAjs08m.js → BackgroundAgents-CmMYN10o.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-BxQI5XH4.js → Backup-CJ6e0ukD.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-Bu-PNzC5.js → BaseInput-BpEvDrNt.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DjPQynup.js → Chat-wWuwwjKu.js} +4 -4
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CygkRopu.js → ChatBubbleRenderer-CJLyGo_u.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-BxL6xm7Z.js → Checkbox-C6pW60Br.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CcyB7h_6.js → Codegen-DF-nP22Y.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-8NQiKJJx.js → Col-BuueEwZW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-B31qy5OS.js → Community-DuE0Yzwr.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-C-5fAsZ4.js → Compact-BrHim8EB.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BTSccvF0.js → Compliance-DgAet8f_.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-BXctU9IK.js → Cowork-B9wY05lx.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-CxVFX9NG.js → Cron-CvNBxfJX.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-DEF3dq8M.js → Crosschain-BnZRENa0.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BmKcE9he.js → DID-DiqYLHTI.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-CECBq_wG.js → Dashboard-t3SsRzZL.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-U-iuPB0n.js → Dropdown-BCjMLam9.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-D8BIlSPL.js → EmailListRenderer-D2v9-IHJ.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BzQGfUH-.js → FamilyGuardDashboard-_iQu35qa.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-4_WlOqLZ.js → Federation-Bkty8VqB.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-gtrW-DdF.js → FormItemContext-DdPW81BY.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BLcvJJB6.js → GenericCardRenderer-DrNYM4Zj.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-Bk0janGD.js → Git-BjF-B2h0.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CcfyMlV8.js → Governance-DPhGdJ1v.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-CBLrAf4M.js → Inference--PPksOVj.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-ClguhteZ.js → KnowledgeGraph-y5WdV_JV.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-Dp_oeKfJ.js → Logs-B6_x7zba.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-Bg8zSyF8.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-BHk50smM.js → Marketplace-CHpfMu1A.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-BAY3CV6J.js → McpTools-qqjtX3Cf.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-w0pG2AKx.js → Memory-hASSgxbw.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-C0VkDUE3.js → MobileBridge-Dwh7Bhcf.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-BCvQ80I9.js → MobileProjects-D09voh7W.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-DSIl41Tt.js → Mtc-9G1dXeId.js} +5 -5
  43. package/src/assets/web-panel/assets/{MtcAudit-D1mzUlIr.js → MtcAudit-CWtYXj6f.js} +2 -2
  44. package/src/assets/web-panel/assets/{Multisig-CeJz4VSS.js → Multisig-bDI0EnDk.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-_O3aweu8.js → NLProgramming-CTanRaBP.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-Dt7_pO86.js → Notes-BdQENJFv.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-Dhg3Nktv.js → NotificationSettings-JvnQdStO.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-QsAPcTb2.js → OrderTableRenderer-BMGL9RPJ.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-BuiaUPkv.js → Organization-sBZnIb2D.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-C3jb6knl.js → Overflow-CzOhNGE6.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-BOMyrLkb.js → P2P-D_D2yqda.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-UvLStCgS.js → PdhVaultBrowser-D5lKd_Kx.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-B9cN0dJH.js → Permissions-L5s-wENg.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-DNjW5qro.js → PersonalDataHub-iI49x6cH.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-CFLyZ6Sh.js → Pipeline-DPHqyk09.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-D3w6vOxf.js → Privacy-B-ZL9360.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-cwcVsn8K.js → ProjectInit-f05YzsN2.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-aUoAroc-.js → ProjectSettings-DZLKS6ex.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-CrzQv7Zv.js → Projects-ButF3DyM.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-jZaPizKR.js → Providers-CFDSXnkR.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DNzmwcfg.js → QrScannerModal-1N6Sdxdm.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-m-5Gwt70.js → QuickAsk-tEqRwRSR.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-CrrAjNxP.js → Recommend-D4ZVHIwz.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BDCMjRFe.js → RemoteSession-Cqm32lhm.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-CPCt1Jc8.js → Reputation-BnjVsU_a.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-C-RorxHs.js → Row-DzpHyTuz.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CnQs4TuY.js → RssFeed-Du5-ouwx.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-B1jkeFZY.js → Search-CYztyf2o.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-CGKI3vvd.js → Security-C1hVxy8Z.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-DQjesYF8.js → Services-BscEbAZ2.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-C9Ipj0A6.js → Skeleton-B2sMLqKQ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-D2j54i9O.js → Skills-CoHKax06.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-xhrVjTeb.js → Sla-Bpie5KO6.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-C6KMOUCa.js → SpeechSettings-BX63ijn5.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-CmIPU5wR.js → SyncSettings-Bf72so5A.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-B-T1J42r.js → Tasks-CVB2PZk4.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-Aq669sjw.js → Templates-q0qyclJx.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BKWUWNXB.js → Tenant-CW-W-i0k.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DEeAvA8L.js → Terminal-D7QoPiXQ.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-C465ySdn.js → TimelineRenderer-BaRDAbyA.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-BgVqF-bX.js → Tokens-D6U4PRW8.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-BMNHmxwH.js → Trigger-ClBDWdLo.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-B_adk89L.js → Trust-C_M6rWPq.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Biw38mog.js → UkeySign-bXHx8s4C.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-AC-eaw5k.js → VideoEditing-BcIt_ieI.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-8lQ5_t0X.js → Wallet-Dd-4jcLs.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-JDmH_-DF.js → WebAuthn-B4F6yxQK.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-DHQAdITG.js → WorkflowEditor-BEHkpfJq.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-C3qauUVv.js → chat-D7hhRpIO.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DLP70JGe.js → colors-AMRhrRzS.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-DjsoqA5t.js → compact-item-BYpsOET5.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-CfEdl1in.js → createContext-CoUkR4LQ.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-BRylvxzY.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DWwHHlBG.js → hasIn-CJKJMKki.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-Dfka-vzJ.js → index-8pmZHnQU.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DgQ92xdO.js → index-BBJFiZ9Y.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-VtCz3A64.js → index-BP69Ul3S.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-C8wrUFzY.js → index-BTFHYauX.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D5VL0NYy.js → index-BUJt2ar4.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-B-rD2rhi.js → index-Bj30Aq6h.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-gu8zBhtp.js → index-BlpuqGt5.js} +1 -1
  102. package/src/assets/web-panel/assets/index-Bzvxvzlk.js +1 -0
  103. package/src/assets/web-panel/assets/{index-CgruUvB3.js → index-C19xZKIP.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DTEcPJGf.js → index-C6bg22vc.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C4k6JGm_.js → index-CH6XEWdj.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C0xMzvk8.js → index-CK1Kknpl.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-UEbYl2pu.js → index-CNyLbBGj.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-Dmt1HDWZ.js → index-COg__P6M.js} +19 -19
  109. package/src/assets/web-panel/assets/{index-ArZCi1rK.js → index-CRlJOWsf.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BqPuyN4p.js → index-CScG8TAY.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-B4gCFHtB.js → index-CdL9cQIE.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C47EiQ7d.js → index-Ck35u_0v.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Dn2rNMmv.js → index-CkLZQtsh.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-T5emAyFT.js → index-DFoujkWD.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DbFnfyKh.js → index-DFwh0R9h.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CsEk9s04.js → index-DStN9E7o.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DTDpF8MS.js → index-DcozYrXV.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-_g5q2hF3.js → index-De5mYp86.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bp_WNm2_.js → index-DfEVOzNb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-OfMwkFIo.js → index-Dfna8sKa.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BcDeMCUK.js → index-DjbMaBLf.js} +1 -1
  122. package/src/assets/web-panel/assets/index-Dl6H3dxS.js +1 -0
  123. package/src/assets/web-panel/assets/{index-D-te-S9f.js → index-Dpl_SJuk.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DKsWujXP.js → index-DyF9uYzB.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BydBh7oT.js → index-HF3GvATm.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DAcBi6F-.js → index-OJmXGn8n.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CNeLedtU.js → index-ZPdNPhUq.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Ds1BfT_C.js → index-djikyGz3.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CbF27GqZ.js → index-gQWWnP3_.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CnhJbWsl.js → index-owVbLJnH.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Lh0e2afo.js → index-tWEDZHzj.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DbjUePgq.js → index-ttTl376q.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-nuZaMsMy.js → index-z5rYvstM.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-C_pMmi75.js → initDefaultProps-B_Uk-wzg.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BvKgS96o.js → motion-ez7H8y8b.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-C-1U4R1I.js → move-CKWUhhhX.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-D6BC968-.js → mtc-parser-DkNl7ocj.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-DxOZvcGQ.js → omit-C0uA2ytw.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-LpzmHdkw.js → pickAttrs-CySaWMPl.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-Bm--qom1.js → placementArrow-BWL3-3xo.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-CVZZlhJf.js → responsiveObserve-BRy_wJog.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-DD1xINGx.js → slide-DmmvSaBD.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-LrjHAy63.js → statusUtils-C_7SYY0K.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-BqknYxTe.js → styleChecker-DYgBJGDh.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-Dljy3diT.js → useFlexGapSupport-nPkoZkT6.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-OedUtPLc.js → useFs-CzpsfP4_.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-Cz-kxbP_.js → usePersonalDataHub-Bo2vvMWl.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-C8ZuTk8W.js → vnode-D-hXAnHb.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-CjbgJYXQ.js → zoom-DW7seTGG.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/commands/agent.js +39 -14
  152. package/src/commands/background-session.js +12 -1
  153. package/src/commands/permissions.js +24 -1
  154. package/src/gateways/ws/ws-agent-handler.js +26 -1
  155. package/src/gateways/ws/ws-approval-gate.js +131 -0
  156. package/src/index.js +63 -845
  157. package/src/lib/agent-ipc-bus.js +331 -0
  158. package/src/lib/agent-worktree.js +173 -5
  159. package/src/lib/background-agent-supervisor.js +193 -4
  160. package/src/lib/context-source-ledger.js +164 -0
  161. package/src/lib/execution-trace/index.js +10 -0
  162. package/src/lib/execution-trace/metrics-collector.js +218 -0
  163. package/src/lib/execution-trace/trace-context.js +182 -0
  164. package/src/lib/hook-manager.js +17 -0
  165. package/src/lib/hooks-v2-runtime.js +278 -0
  166. package/src/lib/interaction-adapter.js +26 -5
  167. package/src/lib/metrics-collector.js +127 -0
  168. package/src/lib/observability/index.js +33 -0
  169. package/src/lib/observability/otlp-exporter.js +260 -0
  170. package/src/lib/otlp-exporter.js +45 -0
  171. package/src/lib/process-execution-broker/SPAWN_AUDIT_REPORT.md +117 -0
  172. package/src/lib/process-execution-broker/index.js +450 -0
  173. package/src/lib/process-execution-broker/patch-child-process.js +50 -0
  174. package/src/lib/process-execution-broker/spawn-audit.json +3814 -0
  175. package/src/lib/repl-rewind.js +62 -14
  176. package/src/lib/runtime-provenance-ledger.js +190 -0
  177. package/src/lib/session-hooks.js +41 -0
  178. package/src/lib/turn-binding.js +134 -0
  179. package/src/program-base.js +4 -1
  180. package/src/repl/agent-repl.js +77 -3
  181. package/src/repl/repl-turn-binding.js +91 -0
  182. package/src/runtime/headless-runner.js +59 -0
  183. package/src/assets/web-panel/assets/MarkdownRenderer-RQ1HbTY5.js +0 -1
  184. package/src/assets/web-panel/assets/devWarning-Cwuuqc_f.js +0 -1
  185. package/src/assets/web-panel/assets/index-BkTk-zJK.js +0 -1
  186. package/src/assets/web-panel/assets/index-C-BSTEhe.js +0 -1
@@ -0,0 +1,260 @@
1
+ /**
2
+ * OTLP Exporter — M8 Observability
3
+ * OpenTelemetry Protocol exporter for spans and metrics
4
+ * Sends to localhost:4318 by default, with batching and retry
5
+ */
6
+
7
+ import http from "node:http";
8
+ import https from "node:https";
9
+ import { URL } from "node:url";
10
+
11
+ class OtlpExporter {
12
+ constructor(options = {}) {
13
+ this.endpoint =
14
+ options.endpoint ||
15
+ process.env.OTEL_EXPORTER_OTLP_ENDPOINT ||
16
+ "http://localhost:4318";
17
+ this.headers = options.headers || {};
18
+ this.serviceName =
19
+ options.serviceName ||
20
+ process.env.OTEL_SERVICE_NAME ||
21
+ "chainlesschain-cli";
22
+ this.batchSize = options.batchSize || 512;
23
+ this.flushIntervalMs = options.flushIntervalMs || 5000;
24
+ this._spanBuffer = [];
25
+ this._metricBuffer = [];
26
+ this._timer = null;
27
+ this._droppedSpans = 0;
28
+ this._droppedMetrics = 0;
29
+ this._failedExports = 0;
30
+ this._successfulExports = 0;
31
+ this._enabled = options.enabled !== false;
32
+ if (this._enabled) {
33
+ this._startFlushTimer();
34
+ }
35
+ }
36
+
37
+ _startFlushTimer() {
38
+ if (this._timer) clearInterval(this._timer);
39
+ this._timer = setInterval(() => this.flush(), this.flushIntervalMs);
40
+ this._timer.unref?.();
41
+ }
42
+
43
+ _getHttpModule(urlStr) {
44
+ return urlStr.startsWith("https:") ? https : http;
45
+ }
46
+
47
+ _post(path, data, contentType) {
48
+ if (!this._enabled) return Promise.resolve();
49
+ return new Promise((resolve) => {
50
+ try {
51
+ const url = new URL(path, this.endpoint);
52
+ const mod = this._getHttpModule(url.protocol);
53
+ const payload = JSON.stringify(data);
54
+ const req = mod.request(
55
+ {
56
+ hostname: url.hostname,
57
+ port: url.port,
58
+ path: url.pathname + url.search,
59
+ method: "POST",
60
+ headers: {
61
+ "Content-Type": contentType,
62
+ "Content-Length": Buffer.byteLength(payload),
63
+ ...this.headers,
64
+ },
65
+ timeout: 10000,
66
+ },
67
+ (res) => {
68
+ res.resume();
69
+ if (res.statusCode >= 200 && res.statusCode < 300) {
70
+ this._successfulExports++;
71
+ } else {
72
+ this._failedExports++;
73
+ }
74
+ resolve();
75
+ },
76
+ );
77
+ req.on("error", () => {
78
+ this._failedExports++;
79
+ resolve();
80
+ });
81
+ req.on("timeout", () => {
82
+ req.destroy();
83
+ this._failedExports++;
84
+ resolve();
85
+ });
86
+ req.write(payload);
87
+ req.end();
88
+ } catch {
89
+ resolve();
90
+ }
91
+ });
92
+ }
93
+
94
+ exportSpans(spans) {
95
+ if (!this._enabled) return;
96
+ for (const span of spans) {
97
+ if (this._spanBuffer.length >= this.batchSize) {
98
+ this._spanBuffer.shift();
99
+ this._droppedSpans++;
100
+ }
101
+ this._spanBuffer.push({
102
+ resourceSpans: [
103
+ {
104
+ resource: {
105
+ attributes: [
106
+ {
107
+ key: "service.name",
108
+ value: { stringValue: this.serviceName },
109
+ },
110
+ ],
111
+ },
112
+ scopeSpans: [
113
+ {
114
+ scope: { name: span.component || "chainlesschain" },
115
+ spans: [this._toOtlpSpan(span)],
116
+ },
117
+ ],
118
+ },
119
+ ],
120
+ });
121
+ }
122
+ }
123
+
124
+ _toOtlpSpan(span) {
125
+ return {
126
+ traceId: span.traceId || "",
127
+ spanId: span.spanId || "",
128
+ parentSpanId: span.parentSpanId || "",
129
+ name: span.name || "unknown",
130
+ kind: this._toSpanKind(span.kind),
131
+ startTimeUnixNano: (span.startTime || Date.now()) * 1_000_000,
132
+ endTimeUnixNano: (span.endTime || Date.now()) * 1_000_000,
133
+ attributes: Object.entries(span.attributes || {}).map(([k, v]) => ({
134
+ key: k,
135
+ value: this._toAttrValue(v),
136
+ })),
137
+ status: { code: span.error ? 2 : 1, message: span.error?.message || "" },
138
+ events: (span.events || []).map((e) => ({
139
+ timeUnixNano: (e.time || Date.now()) * 1_000_000,
140
+ name: e.name,
141
+ attributes: Object.entries(e.attributes || {}).map(([k, v]) => ({
142
+ key: k,
143
+ value: this._toAttrValue(v),
144
+ })),
145
+ })),
146
+ };
147
+ }
148
+
149
+ _toSpanKind(kind) {
150
+ const map = { internal: 0, server: 1, client: 2, producer: 3, consumer: 4 };
151
+ return map[kind] ?? 0;
152
+ }
153
+
154
+ _toAttrValue(v) {
155
+ if (typeof v === "string") return { stringValue: v };
156
+ if (typeof v === "number")
157
+ return Number.isInteger(v) ? { intValue: String(v) } : { doubleValue: v };
158
+ if (typeof v === "boolean") return { boolValue: v };
159
+ return { stringValue: String(v) };
160
+ }
161
+
162
+ exportMetrics(metrics) {
163
+ if (!this._enabled) return;
164
+ for (const metric of metrics) {
165
+ if (this._metricBuffer.length >= this.batchSize) {
166
+ this._metricBuffer.shift();
167
+ this._droppedMetrics++;
168
+ }
169
+ this._metricBuffer.push({
170
+ resourceMetrics: [
171
+ {
172
+ resource: {
173
+ attributes: [
174
+ {
175
+ key: "service.name",
176
+ value: { stringValue: this.serviceName },
177
+ },
178
+ ],
179
+ },
180
+ scopeMetrics: [
181
+ {
182
+ scope: { name: metric.component || "chainlesschain" },
183
+ metrics: [this._toOtlpMetric(metric)],
184
+ },
185
+ ],
186
+ },
187
+ ],
188
+ });
189
+ }
190
+ }
191
+
192
+ _toOtlpMetric(metric) {
193
+ return {
194
+ name: metric.name,
195
+ description: metric.description || "",
196
+ unit: metric.unit || "1",
197
+ [metric.type === "histogram"
198
+ ? "histogram"
199
+ : metric.type === "sum"
200
+ ? "sum"
201
+ : "gauge"]: {
202
+ dataPoints: [
203
+ {
204
+ attributes: Object.entries(metric.attributes || {}).map(
205
+ ([k, v]) => ({ key: k, value: this._toAttrValue(v) }),
206
+ ),
207
+ timeUnixNano: Date.now() * 1_000_000,
208
+ ...(metric.type === "histogram"
209
+ ? {
210
+ count: metric.value?.count || 0,
211
+ sum: metric.value?.sum || 0,
212
+ bucketCounts: metric.value?.bucketCounts || [],
213
+ explicitBounds: metric.value?.explicitBounds || [],
214
+ }
215
+ : { asDouble: metric.value || 0 }),
216
+ },
217
+ ],
218
+ aggregationTemporality: 1,
219
+ isMonotonic: metric.type === "sum",
220
+ },
221
+ };
222
+ }
223
+
224
+ async flush() {
225
+ if (!this._enabled) return;
226
+ const spans = this._spanBuffer.splice(0);
227
+ const metrics = this._metricBuffer.splice(0);
228
+ const promises = [];
229
+ for (const span of spans)
230
+ promises.push(this._post("/v1/traces", span, "application/json"));
231
+ for (const metric of metrics)
232
+ promises.push(this._post("/v1/metrics", metric, "application/json"));
233
+ await Promise.allSettled(promises);
234
+ }
235
+
236
+ shutdown() {
237
+ if (this._timer) clearInterval(this._timer);
238
+ return this.flush();
239
+ }
240
+
241
+ getStats() {
242
+ return {
243
+ enabled: this._enabled,
244
+ bufferedSpans: this._spanBuffer.length,
245
+ bufferedMetrics: this._metricBuffer.length,
246
+ droppedSpans: this._droppedSpans,
247
+ droppedMetrics: this._droppedMetrics,
248
+ failedExports: this._failedExports,
249
+ successfulExports: this._successfulExports,
250
+ };
251
+ }
252
+ }
253
+
254
+ let _defaultExporter = null;
255
+ export function getDefaultOtlpExporter() {
256
+ if (!_defaultExporter) _defaultExporter = new OtlpExporter();
257
+ return _defaultExporter;
258
+ }
259
+ export { OtlpExporter };
260
+ export default OtlpExporter;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * OTLP Exporter - Minimal OTLP/HTTP trace exporter for M6 observability
3
+ * Strictly bounded to observability layer only, no cross-layer calls
4
+ */
5
+ export class OTLPTraceExporter {
6
+ constructor(options = {}) {
7
+ this.endpoint = options.endpoint || "http://localhost:4318/v1/traces";
8
+ this._queue = [];
9
+ }
10
+
11
+ export(span) {
12
+ const payload = {
13
+ resourceSpans: [{
14
+ resource: { attributes: [{ key: "service.name", value: { stringValue: "cc-cli" } }] },
15
+ scopeSpans: [{
16
+ spans: [{
17
+ traceId: span.traceId,
18
+ spanId: span.spanId,
19
+ name: span.name || "span",
20
+ kind: 1,
21
+ startTimeUnixNano: span.startTime ? BigInt(span.startTime * 1e6).toString() : BigInt(Date.now() * 1e6).toString(),
22
+ endTimeUnixNano: span.endTime ? BigInt(span.endTime * 1e6).toString() : undefined,
23
+ attributes: (span.metadata ? Object.entries(span.metadata).map(([k, v]) => ({ key: k, value: { stringValue: String(v) } })) : []),
24
+ }]
25
+ }]
26
+ }]
27
+ };
28
+ // Fire and forget, no blocking
29
+ fetch(this.endpoint, {
30
+ method: "POST",
31
+ headers: { "Content-Type": "application/json" },
32
+ body: JSON.stringify(payload),
33
+ }).catch(() => {});
34
+ return true;
35
+ }
36
+ }
37
+
38
+ let defaultExporter = null;
39
+ export function initOTLPExporter(endpoint) {
40
+ if (!defaultExporter && endpoint) {
41
+ defaultExporter = new OTLPTraceExporter({ endpoint: endpoint.endsWith("/v1/traces") ? endpoint : endpoint.replace(/\/?$/, "/v1/traces") });
42
+ globalThis.ccRuntime?.traceContext.onEnd((span) => defaultExporter.export(span));
43
+ }
44
+ return defaultExporter;
45
+ }
@@ -0,0 +1,117 @@
1
+ # Process Execution Broker - Spawn/Exec Call Site Audit Report
2
+
3
+ > Audit Date: 2026-07-18
4
+ > Auditor: Agent
5
+ > Scope: `packages/cli/src`
6
+
7
+ ## Executive Summary
8
+
9
+ Total direct `child_process` call sites identified: **~85+**
10
+ - `spawn`: ~40 call sites
11
+ - `spawnSync`: ~25 call sites
12
+ - `execSync`: ~15 call sites
13
+ - `execFileSync`: ~8 call sites
14
+ - `execFile`: ~2 call sites
15
+ - `fork`: ~1 call site
16
+
17
+ ## Classification by Risk Category
18
+
19
+ ### A. Agent Self-Spawn (HIGH PRIORITY - must route through Broker)
20
+ These are the primary surfaces where the agent spawns sub-agents or child cc processes:
21
+
22
+ | File | Function | Type | Purpose |
23
+ |------|----------|------|---------|
24
+ | `commands/agenda.js` | `defaultSpawnAgent()` | spawn | Wakeup/cron scheduled agent execution |
25
+ | `commands/background-session.js` | - | spawn | Background session agent |
26
+ | `commands/batch.js` | `spawnAgent()` | spawn + execFileSync | Batch agent execution |
27
+ | `commands/eval.js` | - | spawn + spawnSync | Eval child processes |
28
+ | `commands/loop.js` | `spawnIteration()` | spawn | Loop mode iteration self-spawn |
29
+ | `commands/routine.js` | - | spawn + execFile | Routine execution |
30
+ | `commands/team.js` | `spawnAgent()` | spawn | Team/cowork multi-agent |
31
+ | `gateways/ws/ws-server.js` | - | spawn | WebSocket gateway spawned CLI commands |
32
+ | `harness/background-task-manager.js` | - | fork | Background task forked workers |
33
+ | `lib/background-agent-supervisor.js` | - | spawn + spawnSync | Background agent supervision |
34
+ | `lib/agent-team/team-worktree.js` | - | spawn + execFileSync | Team worktree agent |
35
+ | `lib/claude-code-bridge.js` | - | spawn + execSync | Claude Code bridge execution |
36
+ | `lib/agent-sandbox.js` | - | spawnSync | Sandbox (docker/bwrap) execution |
37
+
38
+ ### B. MCP Server Process (MEDIUM PRIORITY)
39
+ | File | Function | Type | Purpose |
40
+ |------|----------|------|---------|
41
+ | `harness/mcp-client.js` | - | spawn | MCP stdio server processes |
42
+ | `lib/lsp/lsp-client.js` | - | spawn | LSP server processes |
43
+
44
+ ### C. Git Operations (SAFE - can keep direct)
45
+ | File | Type | Count |
46
+ |------|------|-------|
47
+ | `commands/review.js` | spawnSync | 2 |
48
+ | `commands/session.js` | execFileSync | 1 |
49
+ | `harness/worktree-isolator.js` | execSync | 3 |
50
+ | `lib/agent-worktree.js` | execFileSync/execSync | multiple |
51
+ | `lib/checkpoint-store.js` | spawnSync | multiple |
52
+ | `lib/cloud/bundle.js` | execFileSync | multiple |
53
+ | `lib/git-integration.js` | execSync/spawnSync | multiple |
54
+
55
+ ### D. Package/System Management (SAFE - can keep direct)
56
+ | File | Type | Purpose |
57
+ |------|------|---------|
58
+ | `auth/npm-auth.js` | execSync | npm login/whoami |
59
+ | `commands/config.js` | execSync | Open editor |
60
+ | `commands/init.js` | execSync/spawnSync | Init tool probing |
61
+ | `commands/memory.js` | execSync | Open editor |
62
+ | `commands/update.js` | execSync | npm install -g |
63
+ | `lib/api-key-helper.js` | execSync | Credential helper |
64
+ | `lib/chrome-connector.js` | spawn | Chrome debugger |
65
+ | `lib/doctor-checkup.js` | execSync/spawnSync | Doctor checks |
66
+ | `lib/downloader.js` | execFileSync | Binary downloads |
67
+ | `lib/ensure-utf8.js` | execSync | Windows codepage |
68
+ | `lib/host-adb-bridge.js` | execFile | ADB bridge |
69
+
70
+ ### E. Hook Execution (BROKER-AWARE already)
71
+ | File | Type | Purpose |
72
+ |------|------|---------|
73
+ | `lib/async-hook-supervisor.cjs` | spawn/spawnSync | Async hooks |
74
+ | `lib/hook-manager.js` | execSync | Legacy hook manager |
75
+ | `lib/hook-runner.cjs` | spawn/spawnSync | Hook runner |
76
+
77
+ ### F. Evaluation/Benchmark (TEST only)
78
+ | File | Type | Purpose |
79
+ |------|------|---------|
80
+ | `lib/eval/tasks.js` | execFileSync | Eval task fixtures |
81
+ | `lib/lsp/benchmark.js` | execFileSync | LSP benchmarks |
82
+ | `lib/computer-use/control-backend.js` | spawnSync | Computer use |
83
+
84
+ ### G. Execution Backend
85
+ | File | Type | Purpose |
86
+ |------|------|---------|
87
+ | `lib/execution-backend.js` | execSync | Shell/Docker/SSH backend |
88
+
89
+ ### H. Background Task Worker
90
+ | File | Type | Purpose |
91
+ |------|------|---------|
92
+ | `harness/background-task-worker.js` | execSync | Worker task execution |
93
+
94
+ ## Migration Plan
95
+
96
+ ### Phase 1 (M1 Deliverable)
97
+ Create ProcessExecutionBroker with core interface, then migrate:
98
+ 1. Category A (Agent Self-Spawn) - all HIGH priority sites
99
+ 2. Instrument with audit events + logging
100
+
101
+ ### Phase 2 (Post-M1)
102
+ 1. Category B (MCP/LSP) - register server processes as supervised children
103
+ 2. Keep Categories C/D as `bypassBroker: true` approved calls (with explicit allowlist)
104
+
105
+ ### Phase 3 (M3 deliverable)
106
+ 3. Route Category E hooks through Broker for unified supervision
107
+
108
+ ## Bypass Allowlist (Initial)
109
+ The following patterns will be initially marked as `bypassBroker: true` with reason:
110
+ - All `git` command executions (known safe, no agent control over args)
111
+ - Editor opening (`$EDITOR`, `vim`, `nano`, etc.)
112
+ - Package manager operations (`npm`, `pip`)
113
+ - Chrome/ADB debug bridge connections
114
+ - Doctor/diagnostic probes
115
+ - Windows codepage setup (`chcp`)
116
+ - File downloads/extraction (unzip)
117
+ - Test fixtures and benchmarks (test-only code)