chainlesschain 0.163.2 → 0.163.4

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 (222) hide show
  1. package/package.json +3 -2
  2. package/scripts/command-lifecycle-report.mjs +330 -38
  3. package/src/assets/web-panel/assets/{AIOps-DnGsmsqJ.js → AIOps-DB5X7qqV.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-CrO6fcQ7.js → ActionButton-DxHRtKLk.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-DsBdOaP2.js → Analytics-DIH5QrxT.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DmQslKUB.js → AppLayout-uu0oxVz7.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-BvyrT_QQ.js → Artifacts-BNSMiW9Y.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-prndoLiC.js → Audit-DcAzB4_x.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DOTFyA55.js → BackgroundAgents-ClSsvjIc.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-9zOnPp_8.js → Backup-BMciY0js.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-C4PC6sAG.js → BaseInput-Hn3b57Sh.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-BBAF-W9v.js → Chat-CoSlC53V.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CWhvvloO.js → ChatBubbleRenderer-CFevJ3So.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-BI9iculd.js → Checkbox-B4L4Eu4w.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-3DP9BCKb.js → Codegen-C77FgRxF.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-df-2TnJX.js → Col-BrLtJLH3.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-CHs8gG_A.js → Community-Be7pXXhA.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-CDfF6q7V.js → Compact-DuGPecjo.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-CthrDnO7.js → Compliance-CzS66mjP.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-HjIqsWJw.js → Cowork-CEhjCoyK.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-BKc196fb.js → Cron-D7ir8Vja.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CJnjdc8W.js → Crosschain-BcXmuLxf.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-BHUy-8Q2.js → DID-Cto1dtBy.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-QDB7sKeY.js → Dashboard-B7KjgwOX.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-DStcVK11.js → Dropdown-COMqxijg.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-BwSUskMJ.js → EmailListRenderer-BZrya-nf.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DgF_kurT.js → FamilyGuardDashboard-AmVeMq0J.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-k8wvv-wN.js → Federation-kZU8c-27.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-C11qoq2r.js → FormItemContext-sOV22v2-.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-BIIpr9kg.js → GenericCardRenderer-BUuLtGCz.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BlA1exTe.js → Git-K-ZxsLsH.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-CYa1ZYM4.js → Governance-D3OEnawI.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-6_kKVIt6.js → Inference-Bll0gRmP.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-CB4AwxYy.js → KnowledgeGraph-DBXwjr53.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-xf7nHFAe.js → Logs-CEzPwEfP.js} +2 -2
  36. package/src/assets/web-panel/assets/{MarkdownRenderer-Bf3DEqP6.js → MarkdownRenderer-CLmCbHx6.js} +1 -1
  37. package/src/assets/web-panel/assets/{Marketplace-aPg8e4Jt.js → Marketplace-BYyRyOPz.js} +1 -1
  38. package/src/assets/web-panel/assets/{McpTools-C-TNlVUf.js → McpTools-DVu8w_rM.js} +5 -5
  39. package/src/assets/web-panel/assets/{Memory-DMTPIpGa.js → Memory-tenuZ_hO.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-BxyvveRq.js → MobileBridge-Bxgy4ozS.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-DyPCrAyQ.js → MobileProjects-Dgx1D6sc.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BdhqNXp6.js → Mtc-CRfJ8r8j.js} +5 -5
  43. package/src/assets/web-panel/assets/{MtcAudit-Cz-HFxzW.js → MtcAudit-BBJq4Aiz.js} +5 -5
  44. package/src/assets/web-panel/assets/{Multisig-CIUaFNsx.js → Multisig-B3ii9lai.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-CWe6-J17.js → NLProgramming-FIi-Cubv.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-vYAKeviU.js → Notes-DIq8MPf1.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-DQL9-2d7.js → NotificationSettings-BFOD9eGd.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-DnXj1jBn.js → OrderTableRenderer--41u7vre.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-B3spU8AN.js → Organization-B_0AWztW.js} +2 -2
  50. package/src/assets/web-panel/assets/{Overflow-DgEwo7vm.js → Overflow-B6I7TuXv.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-hujMRH8X.js → P2P-Cdf6qens.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-C_qhdg9h.js → PdhVaultBrowser-B_0FcQJY.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-vp7LMcSf.js → Permissions-6nFBjsQp.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-Dxr5Hgnq.js → PersonalDataHub-nQYV7xpn.js} +3 -3
  55. package/src/assets/web-panel/assets/{Pipeline-DEPZqqH4.js → Pipeline-CBVod5jm.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-DTpDiKPe.js → Privacy-D52jW1Nt.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-jDJsRWmF.js → ProjectInit-Bdx3BYhf.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-Dhor5RWH.js → ProjectSettings-b7xr4DUa.js} +2 -2
  59. package/src/assets/web-panel/assets/Projects-DhfifCKx.js +1 -0
  60. package/src/assets/web-panel/assets/Providers-Dy_PgDMr.js +1 -0
  61. package/src/assets/web-panel/assets/{QrScannerModal-CjIw-wIb.js → QrScannerModal-FQKSmc3e.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-DX6jcqoi.js → QuickAsk-CSTrhzcF.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-DopXkhar.js → Recommend-CxMABOUh.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-BLvqJE9c.js → RemoteSession-Cv2T8yRa.js} +2 -2
  65. package/src/assets/web-panel/assets/{Reputation-DhRj2Me7.js → Reputation-CE1k4Vvu.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-DQ53vuPq.js → Row-BNgNcAV_.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-BslvwiBD.js → RssFeed-5ZiBZ3ph.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DJKBDNKZ.js → Search-mDOIF1UV.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-COhpxHER.js → Security-CtuCTC-e.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-dbulD6cI.js → Services-DxFO2Zg7.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-ciIVNfhC.js → Skeleton-CKmKkH9y.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-AiRTkTCk.js → Skills-Bmzl9qkk.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-DDMcWYBc.js → Sla-9RqaWHOC.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BPxWbpXO.js → SpeechSettings-CGdzFIYw.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-BoEOXCyg.js → SyncSettings-CvNuCeBT.js} +2 -2
  76. package/src/assets/web-panel/assets/Tasks-B_sLdcnw.js +1 -0
  77. package/src/assets/web-panel/assets/{Templates-UowY8Ixe.js → Templates-D9_YijdK.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-DauSLQXN.js → Tenant-Cuc7BUSP.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-DBj7Jneq.js → Terminal-6VYRnJgd.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-UMrPwoZC.js → TimelineRenderer-GtK8xd8Y.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-4ea96-bn.js → Tokens-BZ94Lt5W.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger--ISCqt4b.js → Trigger-DEcZgDaX.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-D4GVimRJ.js → Trust-CC3z9THe.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-Ci-nXRQc.js → UkeySign-Cvtw8cV3.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-Cjk7mKPw.js → VideoEditing-CL4e6Bn3.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-BgOLOO3Z.js → Wallet-ycEemP27.js} +2 -2
  87. package/src/assets/web-panel/assets/{WebAuthn-CCX0K29i.js → WebAuthn-DgZ4X_aw.js} +5 -5
  88. package/src/assets/web-panel/assets/{WorkflowEditor-Ch3zgIsE.js → WorkflowEditor-D0qMhSv7.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DKOU_2Vb.js → chat-DsAg01Zn.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-6OVo4u3C.js → colors-B0oqAhrQ.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BH78Hlsq.js → compact-item-CmX0Rabz.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-CFRpSbbC.js → createContext-Be4cn1Ub.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-CP2qzG6D.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-DNQhgcVi.js → hasIn-D5v12kVq.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-BkN3iTTp.js → index-0eWLkQKT.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-CkNEMANR.js → index-301ogenv.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-D3RtTT4K.js → index-5LGY0JbG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-dDkoL4Pe.js → index-7VKDn-t1.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BHa4WyTZ.js → index-8WvYGnON.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CaYqY35Z.js → index-B1YGjOWC.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-bKm3TUDp.js → index-B3mUHuVc.js} +1 -1
  102. package/src/assets/web-panel/assets/{index--rq90rL9.js → index-BA4oulaP.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DaDgdJYj.js → index-BBREnn1V.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-B_Z-YoxX.js → index-BBvyHguy.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CkqHgG-b.js → index-BKmsS2jj.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CrcLHN2F.js → index-BRIqLy1m.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BaVE6E8y.js → index-BXGSbelg.js} +3 -3
  108. package/src/assets/web-panel/assets/{index-BYrnm5Ob.js → index-BaE0Ui07.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BDSR7ecX.js → index-BoAIAZ5C.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CNuCHHQT.js → index-BqltWojQ.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Eag8e_mA.js → index-CGiIyTZw.js} +1 -1
  112. package/src/assets/web-panel/assets/index-CKB0vbJU.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BepBTpa8.js → index-CZ2wUEgr.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-HNGGVF6o.js → index-CZpfzcuy.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-AuBhLqOm.js → index-Ckrk3pIV.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-7TC3S8SN.js → index-CqoCZ5vR.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CFPJ8yzF.js → index-CyWBir7N.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bb6kDrUx.js → index-CyyGTMKd.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DKN2noIF.js → index-D0BSkxYQ.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Du0rnksC.js → index-D5YVopyr.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BxRy5LPR.js → index-DKUBj36_.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-sm7W8AXy.js → index-DM724NgU.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BujsOZfc.js → index-DQRsQen0.js} +1 -1
  124. package/src/assets/web-panel/assets/index-DgoXmwqB.js +1 -0
  125. package/src/assets/web-panel/assets/{index-Y9MJv28e.js → index-DikJ0Qqe.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-caye7AOE.js → index-Dn2dSdXx.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-cdf7fd7d.js → index-DyUaFWEk.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BnnXQot_.js → index-Hfe_dEGx.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DvHGtNnF.js → index-_JjRLSD0.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-nbfHl1oV.js → index-frSojpHj.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Cu3L4r5l.js → index-jK3ax6Z6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D84id2Y4.js → index-qMuZ-NRR.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-hPY0fFrd.js → index-q_fQ94SE.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-BZ9w6jPL.js → initDefaultProps-D4VdhJ9_.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BnwUiOho.js → motion-CZJA0MQW.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-ByUKJnNm.js → move-BqEs7Sb1.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-V7yK1KEl.js → mtc-parser-BpHEtsu1.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-BEXBBt4j.js → omit-BW94tY9W.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-qDm_46Gi.js → pickAttrs-BnBjPWP9.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-BIbhEo_0.js → placementArrow-uUkjQ_hu.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-NbPbDgA_.js → responsiveObserve-B-klUqXK.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BnUWglZ0.js → slide-CvY1cNAs.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-BX8_wZI5.js → statusUtils-Ix5sEDT2.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-BV4OycQX.js → styleChecker-C8qcXOne.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-Od_H5llY.js → useFlexGapSupport-KNF6Kj8f.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-BWI-PyiX.js → useFs-DGJr345n.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-BqMuhG3g.js → usePersonalDataHub-BboN99rI.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-DNd23z6f.js → vnode-Bgt8Vgte.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-Cjaxnm7l.js → zoom-BhJtErgt.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +2 -2
  152. package/src/commands/agenda.js +6 -5
  153. package/src/commands/agent.js +237 -75
  154. package/src/commands/agents.js +6 -0
  155. package/src/commands/artifacts.js +98 -0
  156. package/src/commands/background-session.js +11 -1
  157. package/src/commands/mcp.js +218 -31
  158. package/src/commands/review.js +221 -22
  159. package/src/commands/session-mcp-recovery.js +5 -5
  160. package/src/data/changelog.json +27 -1
  161. package/src/gateways/ws/ws-agent-handler.js +492 -14
  162. package/src/harness/jsonl-session-store.js +39 -1
  163. package/src/harness/mcp-client.js +414 -71
  164. package/src/harness/prompt-compressor.js +24 -0
  165. package/src/harness/provider-backed-compaction.js +205 -0
  166. package/src/harness/worktree-isolator.js +26 -3
  167. package/src/lib/agent-worktree.js +41 -2
  168. package/src/lib/app-preview.js +3 -0
  169. package/src/lib/background-agent-supervisor.js +790 -186
  170. package/src/lib/background-command-argv.js +318 -0
  171. package/src/lib/background-launch-profile.js +1 -0
  172. package/src/lib/background-phase-reporter.js +22 -2
  173. package/src/lib/background-worktree-policy.js +109 -0
  174. package/src/lib/command-lifecycle-report.js +1340 -145
  175. package/src/lib/cowork-mcp-tools.js +51 -6
  176. package/src/lib/cowork-task-runner.js +1 -0
  177. package/src/lib/delivery-coordinator.js +30 -5
  178. package/src/lib/delivery-production-adapter.js +1777 -0
  179. package/src/lib/delivery-production-runner.js +240 -0
  180. package/src/lib/durable-security-store.js +29 -17
  181. package/src/lib/execution-trace/trace-context.cjs +179 -0
  182. package/src/lib/execution-trace/trace-context.js +8 -175
  183. package/src/lib/mcp-call-ledger-store.js +58 -6
  184. package/src/lib/mcp-headers-helper.js +76 -8
  185. package/src/lib/mcp-host-recovery-runtime.js +2 -0
  186. package/src/lib/mcp-ledger-recovery-admission.js +39 -3
  187. package/src/lib/mcp-recovery-adjudication.js +256 -19
  188. package/src/lib/mcp-sandbox-policy.js +184 -0
  189. package/src/lib/mcp-stdio-capsule-builder-worker.cjs +495 -0
  190. package/src/lib/mcp-stdio-executable-identity.js +33 -2
  191. package/src/lib/mcp-stdio-execution-authority.js +163 -0
  192. package/src/lib/mcp-stdio-immutable-vfs-resolver.cjs +830 -0
  193. package/src/lib/mcp-stdio-package-materialization.js +721 -333
  194. package/src/lib/mcp-stdio-workspace-authority.js +252 -0
  195. package/src/lib/observability/index.js +2 -0
  196. package/src/lib/observability/otlp-exporter.js +2 -2
  197. package/src/lib/packer/pack-update-applier.js +8 -1
  198. package/src/lib/packer/pkg-config-generator.js +34 -0
  199. package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
  200. package/src/lib/process-execution-broker/index.js +213 -109
  201. package/src/lib/process-execution-broker/platform-sandbox.js +1024 -169
  202. package/src/lib/process-tree-termination.js +17 -1
  203. package/src/lib/scheduler-kernel/contract.js +315 -0
  204. package/src/lib/scheduler-kernel/store.js +1345 -0
  205. package/src/lib/session-host-lease.js +403 -30
  206. package/src/lib/session-persistence-failure.js +4 -1
  207. package/src/lib/skill-mcp.js +65 -4
  208. package/src/lib/sub-agent-context.js +8 -0
  209. package/src/lib/web-fetch.js +4 -4
  210. package/src/repl/agent-repl.js +285 -38
  211. package/src/runtime/agent-core.js +1044 -90
  212. package/src/runtime/agent-runtime.js +61 -8
  213. package/src/runtime/headless-runner.js +260 -166
  214. package/src/runtime/headless-stream.js +254 -25
  215. package/src/runtime/mcp-config.js +235 -28
  216. package/src/workers/background-agent-worker.js +492 -71
  217. package/src/assets/web-panel/assets/Projects-08xUDZGt.js +0 -1
  218. package/src/assets/web-panel/assets/Providers-BGs47s1a.js +0 -1
  219. package/src/assets/web-panel/assets/Tasks-CEYFJwmr.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +0 -1
  221. package/src/assets/web-panel/assets/index-BTvq-36D.js +0 -1
  222. package/src/assets/web-panel/assets/index-hUpvk6Jl.js +0 -1
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Crash-safe driver for one production DeliveryCoordinator action.
3
+ *
4
+ * The provider call deliberately sits between two short, synchronous locked
5
+ * transactions:
6
+ *
7
+ * lock -> request + persist pending effect -> unlock
8
+ * -> invoke provider exactly once
9
+ * lock -> verify exact pending binding + settle + persist -> unlock
10
+ *
11
+ * A provider exception, process crash, or settlement write failure therefore
12
+ * leaves the durable snapshot pending. A later caller must reconcile that
13
+ * exact effect; this runner never replays a pending provider operation.
14
+ */
15
+
16
+ import fs from "node:fs";
17
+ import path from "node:path";
18
+ import { randomUUID } from "node:crypto";
19
+ import {
20
+ DELIVERY_ACTION,
21
+ projectDeliveryFlow,
22
+ requestDeliveryAction,
23
+ restoreDeliveryFlow,
24
+ settleDeliveryAction,
25
+ } from "./delivery-coordinator.js";
26
+ import { withFileLock } from "./with-file-lock.js";
27
+
28
+ const ACTION_TO_METHOD = Object.freeze({
29
+ [DELIVERY_ACTION.RUN_GATES]: "runGates",
30
+ [DELIVERY_ACTION.RUN_PREVIEW]: "runPreview",
31
+ [DELIVERY_ACTION.RUN_REVIEW]: "runReview",
32
+ [DELIVERY_ACTION.APPLY_FIX]: "applyFix",
33
+ [DELIVERY_ACTION.CREATE_PR]: "createPr",
34
+ [DELIVERY_ACTION.REFRESH_CI]: "refreshCi",
35
+ [DELIVERY_ACTION.PUBLISH_EVIDENCE]: "publishEvidence",
36
+ [DELIVERY_ACTION.MERGE]: "merge",
37
+ [DELIVERY_ACTION.ARCHIVE]: "archive",
38
+ });
39
+
40
+ function normalizeError(error) {
41
+ if (error instanceof Error) return error;
42
+ return new Error(String(error || "delivery provider failed"));
43
+ }
44
+
45
+ function attachPendingEffect(error, state, effect) {
46
+ const failure = normalizeError(error);
47
+ failure.deliveryState = state;
48
+ failure.pendingEffect = effect;
49
+ return failure;
50
+ }
51
+
52
+ function assertCallerExpectation(state, options) {
53
+ if (options.expectedRevision != null) {
54
+ const expected = Number(options.expectedRevision);
55
+ if (!Number.isInteger(expected) || expected < 0) {
56
+ throw new Error("expected revision must be a non-negative integer");
57
+ }
58
+ if (state.revision !== expected) {
59
+ throw new Error(
60
+ `stale delivery revision: expected ${expected}, found ${state.revision}`,
61
+ );
62
+ }
63
+ }
64
+ if (
65
+ options.expectedStateDigest != null &&
66
+ state.stateDigest !== String(options.expectedStateDigest)
67
+ ) {
68
+ throw new Error("stale delivery state digest");
69
+ }
70
+ }
71
+
72
+ function assertSettlementBinding(current, requested, effect) {
73
+ if (current.flowId !== requested.flowId) {
74
+ throw new Error("stale delivery flow id before settlement");
75
+ }
76
+ if (current.revision !== requested.revision) {
77
+ throw new Error(
78
+ `stale delivery revision before settlement: expected ${requested.revision}, found ${current.revision}`,
79
+ );
80
+ }
81
+ if (current.stateDigest !== requested.stateDigest) {
82
+ throw new Error("stale delivery state digest before settlement");
83
+ }
84
+ if (!current.pendingEffect || current.pendingEffect.id !== effect.id) {
85
+ throw new Error("stale delivery effect id before settlement");
86
+ }
87
+ }
88
+
89
+ /** Read and integrity-check one delivery snapshot. */
90
+ export function readDeliveryProductionState(statePath, deps = {}) {
91
+ const readFileSync = deps.readFileSync || fs.readFileSync;
92
+ return restoreDeliveryFlow(
93
+ JSON.parse(readFileSync(path.resolve(String(statePath)), "utf8")),
94
+ );
95
+ }
96
+
97
+ /**
98
+ * Durably and atomically replace a delivery snapshot with owner-only JSON
99
+ * bytes (file fsync before rename; parent-directory fsync on POSIX).
100
+ * The caller is responsible for holding the state lock.
101
+ */
102
+ export function writeDeliveryProductionState(statePath, state, deps = {}) {
103
+ const verified = restoreDeliveryFlow(state);
104
+ const openSync = deps.openSync || fs.openSync;
105
+ const writeFileSync = deps.writeFileSync || fs.writeFileSync;
106
+ const fsyncSync = deps.fsyncSync || fs.fsyncSync;
107
+ const closeSync = deps.closeSync || fs.closeSync;
108
+ const renameSync = deps.renameSync || fs.renameSync;
109
+ const rmSync = deps.rmSync || fs.rmSync;
110
+ const uuid = deps.randomUUID || randomUUID;
111
+ const platform = deps.platform || process.platform;
112
+ const target = path.resolve(String(statePath));
113
+ const temporary = `${target}.${process.pid}.${uuid()}.tmp`;
114
+ let temporaryDescriptor = null;
115
+ let directoryDescriptor = null;
116
+ let renamed = false;
117
+ try {
118
+ temporaryDescriptor = openSync(temporary, "wx", 0o600);
119
+ writeFileSync(
120
+ temporaryDescriptor,
121
+ `${JSON.stringify(verified, null, 2)}\n`,
122
+ "utf8",
123
+ );
124
+ fsyncSync(temporaryDescriptor);
125
+ closeSync(temporaryDescriptor);
126
+ temporaryDescriptor = null;
127
+ renameSync(temporary, target);
128
+ renamed = true;
129
+ // POSIX rename durability requires syncing the containing directory too.
130
+ // Windows does not support opening a directory with fs.openSync("r").
131
+ if (platform !== "win32") {
132
+ directoryDescriptor = openSync(path.dirname(target), "r");
133
+ fsyncSync(directoryDescriptor);
134
+ closeSync(directoryDescriptor);
135
+ directoryDescriptor = null;
136
+ }
137
+ } catch (error) {
138
+ for (const descriptor of [temporaryDescriptor, directoryDescriptor]) {
139
+ if (descriptor == null) continue;
140
+ try {
141
+ closeSync(descriptor);
142
+ } catch {
143
+ // Preserve the authoritative write error.
144
+ }
145
+ }
146
+ try {
147
+ if (!renamed) rmSync(temporary, { force: true });
148
+ } catch {
149
+ // Preserve the authoritative write error.
150
+ }
151
+ throw error;
152
+ }
153
+ return verified;
154
+ }
155
+
156
+ function lockedTransaction(statePath, operation, deps) {
157
+ const lock = deps.withFileLock || withFileLock;
158
+ return lock(statePath, operation, {
159
+ ...(deps.lockOptions || {}),
160
+ failIfUnavailable: true,
161
+ });
162
+ }
163
+
164
+ /**
165
+ * Execute one available action through a production adapter.
166
+ *
167
+ * The adapter surface matches DeliveryCoordinator.execute(): each method gets
168
+ * `(payload, { effect, state })`, where `state` is the requested projection.
169
+ * Throws retain `pendingEffect` and `deliveryState` for explicit reconciliation.
170
+ */
171
+ export async function runDeliveryProductionAction(options = {}, deps = {}) {
172
+ const statePath = path.resolve(String(options.statePath || ""));
173
+ if (!options.statePath) throw new Error("statePath is required");
174
+
175
+ const method = ACTION_TO_METHOD[options.action];
176
+ if (!method) {
177
+ throw new Error(`unsupported delivery action: ${options.action}`);
178
+ }
179
+ const provider = options.adapter?.[method];
180
+ if (typeof provider !== "function") {
181
+ throw new Error(`delivery adapter does not implement ${method}`);
182
+ }
183
+
184
+ const readState =
185
+ deps.readState || ((target) => readDeliveryProductionState(target, deps));
186
+ const writeState =
187
+ deps.writeState ||
188
+ ((target, state) => writeDeliveryProductionState(target, state, deps));
189
+
190
+ const requested = lockedTransaction(
191
+ statePath,
192
+ () => {
193
+ const current = readState(statePath);
194
+ assertCallerExpectation(current, options);
195
+ if (current.pendingEffect) {
196
+ throw new Error(
197
+ `delivery effect ${current.pendingEffect.id} is already pending; reconcile it before another provider call`,
198
+ );
199
+ }
200
+ const next = requestDeliveryAction(
201
+ current,
202
+ options.action,
203
+ options.payload || {},
204
+ { now: deps.now },
205
+ );
206
+ writeState(statePath, next);
207
+ return next;
208
+ },
209
+ deps,
210
+ );
211
+ const effect = requested.pendingEffect;
212
+
213
+ let result;
214
+ try {
215
+ result = await provider.call(options.adapter, effect.payload, {
216
+ effect,
217
+ state: projectDeliveryFlow(requested),
218
+ });
219
+ } catch (error) {
220
+ throw attachPendingEffect(error, requested, effect);
221
+ }
222
+
223
+ try {
224
+ return lockedTransaction(
225
+ statePath,
226
+ () => {
227
+ const current = readState(statePath);
228
+ assertSettlementBinding(current, requested, effect);
229
+ const settled = settleDeliveryAction(current, effect.id, result, {
230
+ now: deps.now,
231
+ });
232
+ writeState(statePath, settled);
233
+ return settled;
234
+ },
235
+ deps,
236
+ );
237
+ } catch (error) {
238
+ throw attachPendingEffect(error, requested, effect);
239
+ }
240
+ }
@@ -58,11 +58,7 @@ export function writeSecurityStore(filePath, label, store) {
58
58
 
59
59
  try {
60
60
  descriptor = fs.openSync(temporaryPath, "wx", 0o600);
61
- fs.writeFileSync(
62
- descriptor,
63
- `${JSON.stringify(store, null, 2)}\n`,
64
- "utf8",
65
- );
61
+ fs.writeFileSync(descriptor, `${JSON.stringify(store, null, 2)}\n`, "utf8");
66
62
  fs.fsyncSync(descriptor);
67
63
  fs.closeSync(descriptor);
68
64
  descriptor = null;
@@ -92,7 +88,12 @@ export function writeSecurityStore(filePath, label, store) {
92
88
  // Best-effort orphan cleanup.
93
89
  }
94
90
  }
95
- throw storeError(label, "write", filePath, cause);
91
+ const error = storeError(label, "write", filePath, cause);
92
+ // Before rename the authoritative path is unchanged. After rename, a
93
+ // directory-fsync failure leaves crash durability unknown even though an
94
+ // immediate read may observe the new generation.
95
+ error.commitState = renamed ? "unknown" : "not-committed";
96
+ throw error;
96
97
  }
97
98
  }
98
99
 
@@ -110,15 +111,26 @@ export function mutateSecurityStore(
110
111
  throw storeError(label, "prepare", filePath, cause);
111
112
  }
112
113
 
113
- return lock(
114
- filePath,
115
- () => {
116
- const current = readSecurityStore(filePath, label);
117
- const draft = structuredClone(current);
118
- const result = mutator(draft);
119
- writeSecurityStore(filePath, label, draft);
120
- return result;
121
- },
122
- { timeoutMs, staleMs, failIfUnavailable: true },
123
- );
114
+ let writeCommitted = false;
115
+ try {
116
+ return lock(
117
+ filePath,
118
+ () => {
119
+ const current = readSecurityStore(filePath, label);
120
+ const draft = structuredClone(current);
121
+ const result = mutator(draft);
122
+ writeSecurityStore(filePath, label, draft);
123
+ writeCommitted = true;
124
+ return result;
125
+ },
126
+ { timeoutMs, staleMs, failIfUnavailable: true },
127
+ );
128
+ } catch (cause) {
129
+ if (cause && !cause.commitState) {
130
+ // If the durable replace completed and only lock cleanup failed, the
131
+ // exact state is committed even though the caller lost its response.
132
+ cause.commitState = writeCommitted ? "committed" : "not-committed";
133
+ }
134
+ throw cause;
135
+ }
124
136
  }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Shared W3C trace-context implementation for CommonJS and ESM consumers.
3
+ *
4
+ * Keep the implementation and singleton in this CommonJS module. The sibling
5
+ * trace-context.js file is an ESM wrapper around these exact exports so the
6
+ * ProcessExecutionBroker and observability code share one AsyncLocalStorage.
7
+ */
8
+
9
+ const { AsyncLocalStorage } = require("node:async_hooks");
10
+ const { randomBytes } = require("node:crypto");
11
+
12
+ class TraceContext {
13
+ constructor() {
14
+ this._asyncLocalStorage = new AsyncLocalStorage();
15
+ this._spans = new Map();
16
+ this._listeners = new Set();
17
+ }
18
+
19
+ generateTraceId() {
20
+ return randomBytes(16).toString("hex");
21
+ }
22
+
23
+ generateSpanId() {
24
+ return randomBytes(8).toString("hex");
25
+ }
26
+
27
+ parseTraceparent(traceparent) {
28
+ if (!traceparent) return null;
29
+ const parts = traceparent.split("-");
30
+ if (parts.length !== 4) return null;
31
+ const [version, traceId, parentId, traceFlags] = parts;
32
+ if (
33
+ version.length !== 2 ||
34
+ traceId.length !== 32 ||
35
+ parentId.length !== 16 ||
36
+ traceFlags.length !== 2
37
+ ) {
38
+ return null;
39
+ }
40
+ return { version, traceId, parentId, traceFlags: parseInt(traceFlags, 16) };
41
+ }
42
+
43
+ formatTraceparent(traceId, spanId, traceFlags = 0x01) {
44
+ return `00-${traceId}-${spanId}-${traceFlags.toString(16).padStart(2, "0")}`;
45
+ }
46
+
47
+ getCurrentContext() {
48
+ return this._asyncLocalStorage.getStore();
49
+ }
50
+
51
+ startRootSpan(name, attributes = {}) {
52
+ const traceId = this.generateTraceId();
53
+ const spanId = this.generateSpanId();
54
+ const context = {
55
+ traceId,
56
+ spanId,
57
+ parentSpanId: null,
58
+ name,
59
+ attributes,
60
+ startTime: Date.now(),
61
+ tracestate: "",
62
+ baggage: {},
63
+ };
64
+ this._spans.set(spanId, context);
65
+ this._emit("span:start", context);
66
+ return context;
67
+ }
68
+
69
+ startSpan(name, attributes = {}) {
70
+ const parent = this.getCurrentContext();
71
+ if (!parent) {
72
+ return this.startRootSpan(name, attributes);
73
+ }
74
+ const spanId = this.generateSpanId();
75
+ const context = {
76
+ traceId: parent.traceId,
77
+ spanId,
78
+ parentSpanId: parent.spanId,
79
+ name,
80
+ attributes: { ...attributes },
81
+ startTime: Date.now(),
82
+ tracestate: parent.tracestate || "",
83
+ baggage: { ...(parent.baggage || {}) },
84
+ };
85
+ this._spans.set(spanId, context);
86
+ this._emit("span:start", context);
87
+ return context;
88
+ }
89
+
90
+ endSpan(span, status = { code: "OK" }) {
91
+ if (!span || !this._spans.has(span.spanId)) return;
92
+ span.endTime = Date.now();
93
+ span.duration = span.endTime - span.startTime;
94
+ span.status = status;
95
+ this._emit("span:end", span);
96
+ this._spans.delete(span.spanId);
97
+ }
98
+
99
+ async runInContext(context, fn) {
100
+ return this._asyncLocalStorage.run(context, fn);
101
+ }
102
+
103
+ getPropagationEnv() {
104
+ const ctx = this.getCurrentContext();
105
+ if (!ctx) return {};
106
+ const env = {
107
+ TRACEPARENT: this.formatTraceparent(ctx.traceId, ctx.spanId),
108
+ };
109
+ if (ctx.tracestate) {
110
+ env.TRACESTATE = ctx.tracestate;
111
+ }
112
+ if (ctx.baggage && Object.keys(ctx.baggage).length > 0) {
113
+ env.BAGGAGE = Object.entries(ctx.baggage)
114
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
115
+ .join(",");
116
+ }
117
+ return env;
118
+ }
119
+
120
+ extractFromEnv(env = process.env) {
121
+ const traceparent = env.TRACEPARENT || env.traceparent;
122
+ if (!traceparent) return null;
123
+ const parsed = this.parseTraceparent(traceparent);
124
+ if (!parsed) return null;
125
+ const context = {
126
+ traceId: parsed.traceId,
127
+ spanId: parsed.parentId,
128
+ parentSpanId: null,
129
+ name: "inherited",
130
+ attributes: {},
131
+ startTime: Date.now(),
132
+ tracestate: env.TRACESTATE || env.tracestate || "",
133
+ baggage: this._parseBaggage(env.BAGGAGE || env.baggage),
134
+ };
135
+ return context;
136
+ }
137
+
138
+ on(event, listener) {
139
+ this._listeners.add({ event, listener });
140
+ }
141
+
142
+ off(event, listener) {
143
+ for (const entry of this._listeners) {
144
+ if (entry.event === event && entry.listener === listener) {
145
+ this._listeners.delete(entry);
146
+ break;
147
+ }
148
+ }
149
+ }
150
+
151
+ _emit(event, data) {
152
+ for (const { event: ev, listener } of this._listeners) {
153
+ if (ev === event) {
154
+ try {
155
+ listener(data);
156
+ } catch {
157
+ // Listener failures must not break tracing or the caller.
158
+ }
159
+ }
160
+ }
161
+ }
162
+
163
+ _parseBaggage(baggage) {
164
+ if (!baggage) return {};
165
+ const result = {};
166
+ for (const pair of baggage.split(",")) {
167
+ const eqIdx = pair.indexOf("=");
168
+ if (eqIdx === -1) continue;
169
+ const key = decodeURIComponent(pair.slice(0, eqIdx).trim());
170
+ const value = decodeURIComponent(pair.slice(eqIdx + 1).trim());
171
+ result[key] = value;
172
+ }
173
+ return result;
174
+ }
175
+ }
176
+
177
+ const traceContext = new TraceContext();
178
+
179
+ module.exports = { TraceContext, traceContext };
@@ -1,182 +1,15 @@
1
1
  /**
2
- * TraceContext - W3C Trace Context 兼容的分布式追踪上下文
2
+ * ESM facade for the shared CommonJS trace-context implementation.
3
3
  *
4
- * 支持:
5
- * - traceparent 头格式: {version}-{traceId}-{parentId}-{traceFlags}
6
- * - tracestate 头传播
7
- * - AsyncLocalStorage 上下文传播
8
- * - Span 创建与管理
9
- * - Baggage 透传
4
+ * ProcessExecutionBroker is also consumed through CommonJS on supported Node
5
+ * versions. Keeping the singleton in trace-context.cjs avoids require(ESM)
6
+ * warnings while preserving one AsyncLocalStorage across both module systems.
10
7
  */
11
8
 
12
- import { AsyncLocalStorage } from "node:async_hooks";
13
- import { randomBytes } from "node:crypto";
9
+ import { createRequire } from "node:module";
14
10
 
15
- class TraceContext {
16
- constructor() {
17
- this._asyncLocalStorage = new AsyncLocalStorage();
18
- this._spans = new Map();
19
- this._listeners = new Set();
20
- }
11
+ const require = createRequire(import.meta.url);
12
+ const traceContextModule = require("./trace-context.cjs");
21
13
 
22
- generateTraceId() {
23
- return randomBytes(16).toString("hex");
24
- }
25
-
26
- generateSpanId() {
27
- return randomBytes(8).toString("hex");
28
- }
29
-
30
- parseTraceparent(traceparent) {
31
- if (!traceparent) return null;
32
- const parts = traceparent.split("-");
33
- if (parts.length !== 4) return null;
34
- const [version, traceId, parentId, traceFlags] = parts;
35
- if (
36
- version.length !== 2 ||
37
- traceId.length !== 32 ||
38
- parentId.length !== 16 ||
39
- traceFlags.length !== 2
40
- ) {
41
- return null;
42
- }
43
- return { version, traceId, parentId, traceFlags: parseInt(traceFlags, 16) };
44
- }
45
-
46
- formatTraceparent(traceId, spanId, traceFlags = 0x01) {
47
- return `00-${traceId}-${spanId}-${traceFlags.toString(16).padStart(2, "0")}`;
48
- }
49
-
50
- getCurrentContext() {
51
- return this._asyncLocalStorage.getStore();
52
- }
53
-
54
- startRootSpan(name, attributes = {}) {
55
- const traceId = this.generateTraceId();
56
- const spanId = this.generateSpanId();
57
- const context = {
58
- traceId,
59
- spanId,
60
- parentSpanId: null,
61
- name,
62
- attributes,
63
- startTime: Date.now(),
64
- tracestate: "",
65
- baggage: {},
66
- };
67
- this._spans.set(spanId, context);
68
- this._emit("span:start", context);
69
- return context;
70
- }
71
-
72
- startSpan(name, attributes = {}) {
73
- const parent = this.getCurrentContext();
74
- if (!parent) {
75
- return this.startRootSpan(name, attributes);
76
- }
77
- const spanId = this.generateSpanId();
78
- const context = {
79
- traceId: parent.traceId,
80
- spanId,
81
- parentSpanId: parent.spanId,
82
- name,
83
- attributes: { ...attributes },
84
- startTime: Date.now(),
85
- tracestate: parent.tracestate || "",
86
- baggage: { ...(parent.baggage || {}) },
87
- };
88
- this._spans.set(spanId, context);
89
- this._emit("span:start", context);
90
- return context;
91
- }
92
-
93
- endSpan(span, status = { code: "OK" }) {
94
- if (!span || !this._spans.has(span.spanId)) return;
95
- span.endTime = Date.now();
96
- span.duration = span.endTime - span.startTime;
97
- span.status = status;
98
- this._emit("span:end", span);
99
- this._spans.delete(span.spanId);
100
- }
101
-
102
- async runInContext(context, fn) {
103
- return this._asyncLocalStorage.run(context, fn);
104
- }
105
-
106
- getPropagationEnv() {
107
- const ctx = this.getCurrentContext();
108
- if (!ctx) return {};
109
- const env = {
110
- TRACEPARENT: this.formatTraceparent(ctx.traceId, ctx.spanId),
111
- };
112
- if (ctx.tracestate) {
113
- env.TRACESTATE = ctx.tracestate;
114
- }
115
- if (ctx.baggage && Object.keys(ctx.baggage).length > 0) {
116
- env.BAGGAGE = Object.entries(ctx.baggage)
117
- .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
118
- .join(",");
119
- }
120
- return env;
121
- }
122
-
123
- extractFromEnv(env = process.env) {
124
- const traceparent = env.TRACEPARENT || env.traceparent;
125
- if (!traceparent) return null;
126
- const parsed = this.parseTraceparent(traceparent);
127
- if (!parsed) return null;
128
- const context = {
129
- traceId: parsed.traceId,
130
- spanId: parsed.parentId,
131
- parentSpanId: null,
132
- name: "inherited",
133
- attributes: {},
134
- startTime: Date.now(),
135
- tracestate: env.TRACESTATE || env.tracestate || "",
136
- baggage: this._parseBaggage(env.BAGGAGE || env.baggage),
137
- };
138
- return context;
139
- }
140
-
141
- on(event, listener) {
142
- this._listeners.add({ event, listener });
143
- }
144
-
145
- off(event, listener) {
146
- for (const entry of this._listeners) {
147
- if (entry.event === event && entry.listener === listener) {
148
- this._listeners.delete(entry);
149
- break;
150
- }
151
- }
152
- }
153
-
154
- _emit(event, data) {
155
- for (const { event: ev, listener } of this._listeners) {
156
- if (ev === event) {
157
- try {
158
- listener(data);
159
- } catch (e) {
160
- // Silently ignore listener errors
161
- }
162
- }
163
- }
164
- }
165
-
166
- _parseBaggage(baggage) {
167
- if (!baggage) return {};
168
- const result = {};
169
- for (const pair of baggage.split(",")) {
170
- const eqIdx = pair.indexOf("=");
171
- if (eqIdx === -1) continue;
172
- const key = decodeURIComponent(pair.slice(0, eqIdx).trim());
173
- const value = decodeURIComponent(pair.slice(eqIdx + 1).trim());
174
- result[key] = value;
175
- }
176
- return result;
177
- }
178
- }
179
-
180
- export { TraceContext };
181
- export const traceContext = new TraceContext();
14
+ export const { TraceContext, traceContext } = traceContextModule;
182
15
  export default traceContext;