chainlesschain 0.162.197 → 0.162.200

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 (233) hide show
  1. package/bin/chainlesschain.js +14 -6
  2. package/package.json +4 -1
  3. package/scripts/command-lifecycle-report.mjs +94 -0
  4. package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-FZIQOdln.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
  40. package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
  54. package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
  56. package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-DYyuwPCs.js} +1 -1
  61. package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
  62. package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-MFk58XB0.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-CbiTJkZf.js} +1 -1
  111. package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
  112. package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-DWzyTev7.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
  123. package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
  132. package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +4 -4
  153. package/src/commands/agent.js +3 -3
  154. package/src/commands/background-session.js +145 -0
  155. package/src/commands/mcp.js +244 -7
  156. package/src/commands/serve.js +1 -1
  157. package/src/commands/session-show.js +129 -0
  158. package/src/commands/session.js +97 -145
  159. package/src/commands/skill.js +87 -50
  160. package/src/data/changelog.json +40 -1
  161. package/src/gateways/ws/session-protocol.js +14 -4
  162. package/src/gateways/ws/ws-agent-handler.js +39 -1
  163. package/src/harness/jsonl-session-store.js +1547 -127
  164. package/src/harness/mcp-client.js +2690 -409
  165. package/src/harness/session-index.js +80 -80
  166. package/src/harness/session-list-index.js +210 -7
  167. package/src/lazy-dispatch.js +76 -8
  168. package/src/lib/abort-utils.js +68 -0
  169. package/src/lib/agent-core.js +1 -59
  170. package/src/lib/background-interaction-journal.js +2 -2
  171. package/src/lib/chat-core.js +24 -6
  172. package/src/lib/command-lifecycle-report.js +516 -0
  173. package/src/lib/cowork-mcp-tools.js +47 -2
  174. package/src/lib/cowork-task-runner.js +11 -3
  175. package/src/lib/doctor-checkup.js +9 -7
  176. package/src/lib/learning/skill-improver.js +21 -2
  177. package/src/lib/mcp-call-ledger-store.js +116 -3
  178. package/src/lib/mcp-call-ledger.js +59 -14
  179. package/src/lib/mcp-client.js +1 -0
  180. package/src/lib/mcp-stdio-environment.js +48 -0
  181. package/src/lib/mcp-stdio-executable-identity.js +1133 -0
  182. package/src/lib/mcp-stdio-execution-authority.js +363 -0
  183. package/src/lib/mcp-stdio-package-materialization.js +1424 -0
  184. package/src/lib/mcp-tool-metadata.js +436 -0
  185. package/src/lib/mcp-tool-result.js +367 -0
  186. package/src/lib/observability/index.js +71 -0
  187. package/src/lib/packer/native-update-state.js +979 -1
  188. package/src/lib/packer/pack-update-applier.js +1050 -125
  189. package/src/lib/packer/pkg-config-generator.js +1 -0
  190. package/src/lib/paths.js +53 -0
  191. package/src/lib/pr-link-ledger.js +8 -27
  192. package/src/lib/pr-link-store.js +26 -0
  193. package/src/lib/process-execution-broker/index.js +192 -35
  194. package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
  195. package/src/lib/process-tree-termination.js +253 -0
  196. package/src/lib/recent-session.js +17 -17
  197. package/src/lib/secure-file-identity.js +47 -0
  198. package/src/lib/secure-fs.js +21 -2
  199. package/src/lib/session-anti-rollback-anchor.js +766 -0
  200. package/src/lib/session-host-lease.js +492 -0
  201. package/src/lib/session-host-snapshot.js +9 -5
  202. package/src/lib/session-persistence-failure.js +109 -0
  203. package/src/lib/session-picker.js +26 -3
  204. package/src/lib/session-projection.js +5 -1
  205. package/src/lib/session-search.js +25 -11
  206. package/src/lib/session-tail.js +31 -1
  207. package/src/lib/side-effect-ledger-store.js +2 -2
  208. package/src/lib/skill-budget.js +222 -0
  209. package/src/lib/skill-execution-authority.js +385 -0
  210. package/src/lib/skill-execution-identity.js +39 -2
  211. package/src/lib/skill-loader.js +322 -86
  212. package/src/lib/skill-mcp.js +43 -1
  213. package/src/lib/turn-binding-store.js +2 -2
  214. package/src/repl/agent-repl.js +483 -77
  215. package/src/repl/bg-dashboard.js +81 -28
  216. package/src/repl/chat-repl.js +77 -12
  217. package/src/runtime/agent-core.js +428 -113
  218. package/src/runtime/agent-runtime.js +26 -3
  219. package/src/runtime/cleanup-deadline.js +143 -0
  220. package/src/runtime/headless-runner.js +494 -149
  221. package/src/runtime/headless-stream.js +504 -75
  222. package/src/runtime/mcp-config.js +157 -10
  223. package/src/runtime/mcp-tool-search.js +0 -0
  224. package/src/runtime/output-backpressure.js +419 -0
  225. package/src/runtime/pipe-safety.js +56 -21
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
  227. package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
  228. package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
  229. package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
  230. package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
  231. package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
  232. package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
  233. package/src/lib/skill-process-broker.js +0 -85
@@ -14,6 +14,7 @@
14
14
  import fs from "fs";
15
15
  import { firstBalancedJson } from "../json-schema-output.js";
16
16
  import path from "path";
17
+ import { assertSkillFileSize, resolveSkillLimits } from "../skill-budget.js";
17
18
 
18
19
  // ── _deps for test injection ────────────────────────────
19
20
  const _deps = { fs, path };
@@ -187,13 +188,14 @@ export class SkillImprover {
187
188
  * @param {import("better-sqlite3").Database} db
188
189
  * @param {function} llmChat — async (messages) => string
189
190
  * @param {import("./trajectory-store.js").TrajectoryStore} trajectoryStore
190
- * @param {{skillsDir?:string}} [config]
191
+ * @param {{skillsDir?:string, limits?:object}} [config]
191
192
  */
192
193
  constructor(db, llmChat, trajectoryStore, config = {}) {
193
194
  this.db = db;
194
195
  this.llmChat = llmChat;
195
196
  this.trajectoryStore = trajectoryStore;
196
197
  this.skillsDir = config.skillsDir || null;
198
+ this.skillLimits = resolveSkillLimits(config.limits);
197
199
  }
198
200
 
199
201
  /**
@@ -392,7 +394,19 @@ export class SkillImprover {
392
394
  if (!this.skillsDir) return null;
393
395
  const skillFile = _deps.path.join(this.skillsDir, skillName, "SKILL.md");
394
396
  try {
395
- return await _deps.fs.promises.readFile(skillFile, "utf-8");
397
+ if (typeof _deps.fs.promises.lstat === "function") {
398
+ const stat = await _deps.fs.promises.lstat(skillFile);
399
+ if (stat.isSymbolicLink() || !stat.isFile()) return null;
400
+ assertSkillFileSize("SKILL.md", stat.size, this.skillLimits);
401
+ }
402
+ const content = await _deps.fs.promises.readFile(skillFile, "utf-8");
403
+ if (typeof content !== "string") return null;
404
+ assertSkillFileSize(
405
+ "SKILL.md",
406
+ Buffer.byteLength(content, "utf8"),
407
+ this.skillLimits,
408
+ );
409
+ return content;
396
410
  } catch {
397
411
  return null;
398
412
  }
@@ -405,6 +419,11 @@ export class SkillImprover {
405
419
  */
406
420
  async _writeSkill(skillName, content) {
407
421
  if (!this.skillsDir) return;
422
+ assertSkillFileSize(
423
+ "SKILL.md",
424
+ Buffer.byteLength(String(content), "utf8"),
425
+ this.skillLimits,
426
+ );
408
427
  const skillDir = _deps.path.join(this.skillsDir, skillName);
409
428
  const skillFile = _deps.path.join(skillDir, "SKILL.md");
410
429
  await _deps.fs.promises.mkdir(skillDir, { recursive: true });
@@ -10,6 +10,7 @@
10
10
  import { isProxy } from "node:util/types";
11
11
  import {
12
12
  appendAuthorityEvent as storeAppendAuthorityEvent,
13
+ appendAuthorityEventWithVerifiedProjection as storeAppendAuthorityEventWithVerifiedProjection,
13
14
  readVerifiedEvents as storeReadVerifiedEvents,
14
15
  readVerifiedProjection as storeReadVerifiedProjection,
15
16
  } from "../harness/jsonl-session-store.js";
@@ -514,6 +515,53 @@ export function computeMcpRecoveryDigest(recovery = {}) {
514
515
  });
515
516
  }
516
517
 
518
+ /**
519
+ * Stable host generation fence. Ordinary transcript messages and this host's
520
+ * own started/settled records do not rotate it; adjudication, replay denies or
521
+ * integrity incidents do. A host must reload a newly verified projection to
522
+ * adopt a changed fence.
523
+ */
524
+ export function computeMcpRecoveryFenceDigest(recovery = {}) {
525
+ const incidents = Array.isArray(recovery.incidents) ? recovery.incidents : [];
526
+ const adjudications = Array.isArray(recovery.adjudications)
527
+ ? recovery.adjudications
528
+ : [];
529
+ const replayDenied = Array.isArray(recovery.replayDenied)
530
+ ? recovery.replayDenied
531
+ : [];
532
+ return sha256PayloadDigest({
533
+ schemaVersion: 1,
534
+ sessionId: recovery.sessionId || null,
535
+ incidents: stableSorted(
536
+ incidents.map((entry) => ({
537
+ code: entry?.code || null,
538
+ ledgerId: entry?.ledgerId || null,
539
+ })),
540
+ ),
541
+ adjudications: stableSorted(
542
+ adjudications.map((entry) => ({
543
+ requestId: entry?.requestId || null,
544
+ ledgerId: entry?.ledgerId || null,
545
+ decision: entry?.decision || null,
546
+ authority: entry?.authority || null,
547
+ confirmation: entry?.confirmation || null,
548
+ reasonDigest: entry?.reasonDigest || null,
549
+ })),
550
+ ),
551
+ replayDenied: stableSorted(
552
+ replayDenied.map((entry) => ({
553
+ ledgerId: entry?.ledgerId || null,
554
+ serverName: entry?.serverName || null,
555
+ toolName: entry?.toolName || null,
556
+ inputBytes: Number.isSafeInteger(entry?.inputBytes)
557
+ ? entry.inputBytes
558
+ : null,
559
+ replayDigest: entry?.replayDigest || null,
560
+ })),
561
+ ),
562
+ });
563
+ }
564
+
517
565
  function immutableRecordMatches(started, settled) {
518
566
  return IMMUTABLE_RECORD_FIELDS.every(
519
567
  (field) =>
@@ -634,6 +682,18 @@ export function snapshotMcpLedgerRecoveryProjection(sessionId, recovery) {
634
682
  /** Create the async sink accepted by `McpCallLedger`. */
635
683
  export function createSessionMcpLedgerSink(sessionId, options = {}) {
636
684
  const appendEvent = options.appendEvent || storeAppendAuthorityEvent;
685
+ const appendFencedEvent =
686
+ options.appendFencedEvent ||
687
+ storeAppendAuthorityEventWithVerifiedProjection;
688
+ let recoveryFenceDigest = Object.prototype.hasOwnProperty.call(
689
+ options,
690
+ "recovery",
691
+ )
692
+ ? computeMcpRecoveryFenceDigest({
693
+ ...(options.recovery || {}),
694
+ sessionId,
695
+ })
696
+ : null;
637
697
  if (
638
698
  !isCanonicalProtocolText(
639
699
  sessionId,
@@ -645,8 +705,11 @@ export function createSessionMcpLedgerSink(sessionId, options = {}) {
645
705
  if (typeof appendEvent !== "function") {
646
706
  throw new TypeError("MCP ledger session sink requires appendEvent");
647
707
  }
708
+ if (typeof appendFencedEvent !== "function") {
709
+ throw new TypeError("MCP ledger session sink requires appendFencedEvent");
710
+ }
648
711
 
649
- return async (record, metadata = {}) => {
712
+ const sink = async (record, metadata = {}) => {
650
713
  const canonical = canonicalRecord(record);
651
714
  if (!canonical) {
652
715
  throw new McpCallLedgerStoreError(
@@ -678,16 +741,57 @@ export function createSessionMcpLedgerSink(sessionId, options = {}) {
678
741
  );
679
742
  }
680
743
  try {
681
- const written = await appendEvent(sessionId, MCP_CALL_LEDGER_EVENT, {
744
+ const eventData = {
682
745
  schemaVersion: MCP_CALL_LEDGER_EVENT_SCHEMA_VERSION,
683
746
  phase,
684
747
  record: canonical,
685
- });
748
+ };
749
+ const written = recoveryFenceDigest
750
+ ? await appendFencedEvent(sessionId, MCP_CALL_LEDGER_EVENT, eventData, {
751
+ createProjection: () => {
752
+ const reducer = createMcpLedgerEventReducer({
753
+ sessionId,
754
+ verified: true,
755
+ });
756
+ let acceptedCount = 0;
757
+ return Object.freeze({
758
+ accept: (event) => {
759
+ acceptedCount += 1;
760
+ return reducer.accept(event);
761
+ },
762
+ finish: (authority) => {
763
+ const recovery = reducer.finish();
764
+ assertMcpVerifiedProjectionAuthority(authority, {
765
+ acceptedCount,
766
+ headHash: recovery.headHash,
767
+ });
768
+ return recovery;
769
+ },
770
+ });
771
+ },
772
+ validateProjection: (recovery) => {
773
+ const currentFence = computeMcpRecoveryFenceDigest(recovery);
774
+ if (currentFence !== recoveryFenceDigest) {
775
+ throw new McpCallLedgerStoreError(
776
+ "CC_MCP_LEDGER_HOST_FENCE_STALE",
777
+ "MCP host recovery authority changed; restart or resume before executing MCP calls",
778
+ { sessionId, ledgerId: canonical.ledgerId },
779
+ );
780
+ }
781
+ },
782
+ })
783
+ : await appendEvent(sessionId, MCP_CALL_LEDGER_EVENT, eventData);
686
784
  if (written === false) {
687
785
  throw new Error("canonical session store rejected the event");
688
786
  }
689
787
  return true;
690
788
  } catch (cause) {
789
+ if (
790
+ cause instanceof McpCallLedgerStoreError &&
791
+ cause.code === "CC_MCP_LEDGER_HOST_FENCE_STALE"
792
+ ) {
793
+ throw cause;
794
+ }
691
795
  throw new McpCallLedgerStoreError(
692
796
  "CC_MCP_LEDGER_EVENT_PERSIST_FAILED",
693
797
  `MCP ledger event persistence failed for ${sessionId}: ${cause.message}`,
@@ -695,6 +799,15 @@ export function createSessionMcpLedgerSink(sessionId, options = {}) {
695
799
  );
696
800
  }
697
801
  };
802
+ sink.replaceRecoveryFence = (recovery) => {
803
+ recoveryFenceDigest = computeMcpRecoveryFenceDigest({
804
+ ...(recovery || {}),
805
+ sessionId,
806
+ });
807
+ return recoveryFenceDigest;
808
+ };
809
+ sink.getRecoveryFenceDigest = () => recoveryFenceDigest;
810
+ return sink;
698
811
  }
699
812
 
700
813
  /**
@@ -1,5 +1,9 @@
1
1
  import { createHash, randomUUID as nodeRandomUUID } from "node:crypto";
2
2
  import { isProxy } from "node:util/types";
3
+ import {
4
+ admitMcpToolResult,
5
+ resolveMcpToolResultLimits,
6
+ } from "./mcp-tool-result.js";
3
7
 
4
8
  export const MCP_CALL_LEDGER_SCHEMA_VERSION = 1;
5
9
 
@@ -413,16 +417,41 @@ function frozenSnapshot(record) {
413
417
  return Object.freeze(snapshot);
414
418
  }
415
419
 
420
+ function safeOwnDataProperty(value, property) {
421
+ if (!value || (typeof value !== "object" && typeof value !== "function")) {
422
+ return undefined;
423
+ }
424
+ try {
425
+ if (isProxy(value)) return undefined;
426
+ const descriptor = Object.getOwnPropertyDescriptor(value, property);
427
+ return descriptor && Object.hasOwn(descriptor, "value")
428
+ ? descriptor.value
429
+ : undefined;
430
+ } catch {
431
+ return undefined;
432
+ }
433
+ }
434
+
416
435
  function summarizeError(error) {
417
- const message = String(error?.message || error || "unknown error");
436
+ const errorMessage = safeOwnDataProperty(error, "message");
437
+ const message =
438
+ typeof error === "string" && error
439
+ ? error
440
+ : typeof errorMessage === "string" && errorMessage
441
+ ? errorMessage
442
+ : "unknown error";
443
+ const errorName = safeOwnDataProperty(error, "name");
444
+ const errorCode = safeOwnDataProperty(error, "code");
418
445
  return Object.freeze({
419
446
  name: safeIdentifier(
420
- error?.name,
447
+ typeof errorName === "string" ? errorName : null,
421
448
  "Error",
422
449
  MCP_CALL_LEDGER_PROTOCOL_LIMITS.errorName,
423
450
  ),
424
451
  code: safeIdentifier(
425
- error?.code,
452
+ typeof errorCode === "string" || Number.isSafeInteger(errorCode)
453
+ ? errorCode
454
+ : null,
426
455
  null,
427
456
  MCP_CALL_LEDGER_PROTOCOL_LIMITS.errorCode,
428
457
  ),
@@ -431,19 +460,22 @@ function summarizeError(error) {
431
460
  }
432
461
 
433
462
  function normalizeStatus(outcome = {}) {
434
- if (outcome.status) {
435
- const status = String(outcome.status).toLowerCase();
463
+ const explicitStatus = safeOwnDataProperty(outcome, "status");
464
+ if (typeof explicitStatus === "string" && explicitStatus) {
465
+ const status = explicitStatus.toLowerCase();
436
466
  if (!TERMINAL_STATUSES.has(status)) {
437
- throw new TypeError(
438
- `Invalid MCP ledger terminal status "${outcome.status}"`,
439
- );
467
+ throw new TypeError(`Invalid MCP ledger terminal status "${status}"`);
440
468
  }
441
469
  return status;
442
470
  }
443
- if (outcome.cancelled === true || outcome.error?.name === "AbortError") {
471
+ const error = safeOwnDataProperty(outcome, "error");
472
+ if (
473
+ safeOwnDataProperty(outcome, "cancelled") === true ||
474
+ safeOwnDataProperty(error, "name") === "AbortError"
475
+ ) {
444
476
  return McpCallStatus.CANCELLED;
445
477
  }
446
- return outcome.error ? McpCallStatus.FAILED : McpCallStatus.COMPLETED;
478
+ return error ? McpCallStatus.FAILED : McpCallStatus.COMPLETED;
447
479
  }
448
480
 
449
481
  function resolveSinkWriter(sink) {
@@ -492,6 +524,14 @@ export class McpCallLedger {
492
524
  this._randomUUID = options.randomUUID || nodeRandomUUID;
493
525
  this._sequence = 0;
494
526
  this._records = new Map();
527
+ const toolResultLimits = resolveMcpToolResultLimits(
528
+ options.toolResultConfig,
529
+ );
530
+ this._toolResultConfig = Object.freeze({
531
+ maxToolResultBytes: toolResultLimits.maxBytes,
532
+ maxToolResultDepth: toolResultLimits.maxDepth,
533
+ maxToolResultNodes: toolResultLimits.maxNodes,
534
+ });
495
535
 
496
536
  const requested = options.prewriteFailurePolicy || {};
497
537
  for (const [effect, action] of Object.entries(requested)) {
@@ -670,12 +710,17 @@ export class McpCallLedger {
670
710
  Object.prototype.hasOwnProperty.call(outcome, "result");
671
711
  const output = hasOutput
672
712
  ? summarizeMcpPayload(
673
- Object.prototype.hasOwnProperty.call(outcome, "output")
674
- ? outcome.output
675
- : outcome.result,
713
+ admitMcpToolResult(
714
+ null,
715
+ Object.prototype.hasOwnProperty.call(outcome, "output")
716
+ ? outcome.output
717
+ : outcome.result,
718
+ this._toolResultConfig,
719
+ ).result,
676
720
  )
677
721
  : null;
678
- const errorSummary = outcome.error ? summarizeError(outcome.error) : null;
722
+ const outcomeError = safeOwnDataProperty(outcome, "error");
723
+ const errorSummary = outcomeError ? summarizeError(outcomeError) : null;
679
724
  const settlementPersistence =
680
725
  current.prewritePersistence === "failed-open"
681
726
  ? "skipped-no-prewrite"
@@ -21,6 +21,7 @@ export {
21
21
  redactMcpUrl,
22
22
  isLikelyConnectionError,
23
23
  isMcpAuthenticationError,
24
+ isMcpRpcError,
24
25
  isTransientMcpError,
25
26
  _deps,
26
27
  } from "../harness/mcp-client.js";
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Environment policy shared by MCP stdio materialization and runtime launch.
3
+ * These variables can cause a language runtime or native loader to execute
4
+ * bytes that are outside the approved executable/package identity.
5
+ */
6
+
7
+ const CODE_INJECTION_ENV_KEYS = new Set([
8
+ "CLASSPATH",
9
+ "DOTNET_ADDITIONAL_DEPS",
10
+ "DOTNET_ROOT",
11
+ "JAVA_TOOL_OPTIONS",
12
+ "LD_AUDIT",
13
+ "LD_LIBRARY_PATH",
14
+ "LD_PRELOAD",
15
+ "NODE_OPTIONS",
16
+ "NODE_PATH",
17
+ "NPM_CONFIG_NODE_OPTIONS",
18
+ "PERL5LIB",
19
+ "PERL5OPT",
20
+ "PYTHONHOME",
21
+ "PYTHONPATH",
22
+ "RUBYLIB",
23
+ "RUBYOPT",
24
+ "_JAVA_OPTIONS",
25
+ ]);
26
+
27
+ export function isMcpStdioCodeInjectionEnvironmentKey(key) {
28
+ const normalized = String(key || "").toUpperCase();
29
+ return (
30
+ CODE_INJECTION_ENV_KEYS.has(normalized) ||
31
+ normalized.startsWith("DYLD_") ||
32
+ normalized.startsWith("COMPLUS_") ||
33
+ normalized.startsWith("CORECLR_")
34
+ );
35
+ }
36
+
37
+ export function sanitizeMcpStdioHostEnvironment(env) {
38
+ const safe = {};
39
+ for (const [key, value] of Object.entries(env || {})) {
40
+ if (
41
+ !isMcpStdioCodeInjectionEnvironmentKey(key) &&
42
+ typeof value === "string"
43
+ ) {
44
+ safe[key] = value;
45
+ }
46
+ }
47
+ return safe;
48
+ }