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
@@ -11,7 +11,7 @@
11
11
  */
12
12
 
13
13
  import {
14
- readEvents,
14
+ readVerifiedEvents,
15
15
  listJsonlSessions,
16
16
  } from "../harness/jsonl-session-store.js";
17
17
 
@@ -54,7 +54,7 @@ export class SessionSearchIndex {
54
54
  * @returns {Array<{role: string, content: string, timestamp: number}>}
55
55
  */
56
56
  extractMessages(sessionId) {
57
- const events = readEvents(sessionId);
57
+ const events = readVerifiedEvents(sessionId);
58
58
  const messages = [];
59
59
 
60
60
  for (const event of events) {
@@ -86,13 +86,22 @@ export class SessionSearchIndex {
86
86
  if (!this._db) return { indexed: 0 };
87
87
  if (!this._initialized) this.ensureTables();
88
88
 
89
- const messages = this.extractMessages(sessionId);
90
- if (messages.length === 0) return { indexed: 0 };
89
+ const deleteExisting = () =>
90
+ this._db.exec(
91
+ `DELETE FROM session_fts WHERE session_id = '${sessionId.replace(/'/g, "''")}'`,
92
+ );
93
+ let messages;
94
+ try {
95
+ messages = this.extractMessages(sessionId);
96
+ } catch (error) {
97
+ deleteExisting();
98
+ throw error;
99
+ }
91
100
 
92
- // Remove existing entries for this session (idempotent re-index)
93
- this._db.exec(
94
- `DELETE FROM session_fts WHERE session_id = '${sessionId.replace(/'/g, "''")}'`,
95
- );
101
+ // Remove existing entries before publishing the newly verified sample.
102
+ // Empty and damaged sessions must not leave older searchable content.
103
+ deleteExisting();
104
+ if (messages.length === 0) return { indexed: 0 };
96
105
 
97
106
  const insert = this._db.prepare(
98
107
  `INSERT INTO session_fts (session_id, role, content, timestamp) VALUES (?, ?, ?, ?)`,
@@ -164,13 +173,18 @@ export class SessionSearchIndex {
164
173
 
165
174
  const sessions = listJsonlSessions({ limit: 10000 });
166
175
  let totalMessages = 0;
176
+ let rejected = 0;
167
177
 
168
178
  for (const session of sessions) {
169
- const result = this.indexSession(session.id);
170
- totalMessages += result.indexed;
179
+ try {
180
+ const result = this.indexSession(session.id);
181
+ totalMessages += result.indexed;
182
+ } catch {
183
+ rejected += 1;
184
+ }
171
185
  }
172
186
 
173
- return { sessions: sessions.length, messages: totalMessages };
187
+ return { sessions: sessions.length, messages: totalMessages, rejected };
174
188
  }
175
189
 
176
190
  /**
@@ -10,7 +10,31 @@
10
10
 
11
11
  import { promises as fsp } from "node:fs";
12
12
  import { existsSync, statSync } from "node:fs";
13
- import { sessionPath } from "../harness/jsonl-session-store.js";
13
+ import {
14
+ getSessionPresence,
15
+ SESSION_PRESENCE,
16
+ sessionPath,
17
+ } from "../harness/jsonl-session-store.js";
18
+
19
+ function assertLiveTranscriptReadable(sessionId) {
20
+ const presence = getSessionPresence(sessionId);
21
+ if (
22
+ presence === SESSION_PRESENCE.PRESENT ||
23
+ presence === SESSION_PRESENCE.ABSENT
24
+ ) {
25
+ return;
26
+ }
27
+ const error = new Error(
28
+ presence === SESSION_PRESENCE.TOMBSTONED
29
+ ? `Session ${sessionId} has been deleted`
30
+ : `Session ${sessionId} transcript cannot be verified for live tailing`,
31
+ );
32
+ error.code =
33
+ presence === SESSION_PRESENCE.TOMBSTONED
34
+ ? "SESSION_DELETED"
35
+ : "SESSION_TRANSCRIPT_UNVERIFIED";
36
+ throw error;
37
+ }
14
38
 
15
39
  function parseLine(line) {
16
40
  const trimmed = line.trim();
@@ -53,6 +77,7 @@ function matchesFilter(event, { types, sinceMs }) {
53
77
  * - fromEnd (default): current EOF, so only new events are yielded
54
78
  */
55
79
  export function initialOffset(sessionId, { fromStart = false } = {}) {
80
+ assertLiveTranscriptReadable(sessionId);
56
81
  const p = sessionPath(sessionId);
57
82
  if (!existsSync(p)) return 0;
58
83
  if (fromStart) return 0;
@@ -98,6 +123,11 @@ export async function* followSession(sessionId, options = {}) {
98
123
  while (true) {
99
124
  if (signal?.aborted) return;
100
125
 
126
+ // A long-lived tail is a live canonical reader. Re-check the durable
127
+ // sidecar witness on every poll so external deletion or a tombstoned path
128
+ // restoration cannot silently turn into empty output or stale replay.
129
+ assertLiveTranscriptReadable(sessionId);
130
+
101
131
  if (existsSync(filePath)) {
102
132
  const stat = await fsp.stat(filePath);
103
133
  if (stat.size < offset) {
@@ -10,7 +10,7 @@
10
10
  */
11
11
 
12
12
  import {
13
- appendEvent as storeAppendEvent,
13
+ appendAuthorityEvent as storeAppendAuthorityEvent,
14
14
  readEvents as storeReadEvents,
15
15
  findLatestEvent as storeFindLatestEvent,
16
16
  } from "../harness/jsonl-session-store.js";
@@ -23,7 +23,7 @@ import {
23
23
  export const SIDE_EFFECT_LEDGER_EVENT = "side_effect_ledger";
24
24
 
25
25
  export const _deps = {
26
- appendEvent: storeAppendEvent,
26
+ appendEvent: storeAppendAuthorityEvent,
27
27
  readEvents: storeReadEvents,
28
28
  findLatestEvent: storeFindLatestEvent,
29
29
  };
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Host-owned admission limits for file-backed CLI skills.
3
+ *
4
+ * These are security ceilings, not defaults that callers may raise. Loader
5
+ * options can only tighten them through resolveSkillLimits().
6
+ */
7
+ export const HOST_SKILL_LIMITS = Object.freeze({
8
+ maxSkillFileBytes: 256 * 1024,
9
+ maxSkillTotalBytes: 512 * 1024,
10
+ maxSkillDiscoveryEntries: 16_384,
11
+ maxSkillDiscoveryFiles: 4096,
12
+ maxSkillDiscoveryBytes: 64 * 1024 * 1024,
13
+ maxSkillNestDepth: 5,
14
+ maxSkillPromptBytes: 48_000,
15
+ // Provider-neutral conservative ceiling: one token cannot require fewer
16
+ // than zero bytes, and byte-level tokenizers cannot produce more tokens than
17
+ // the UTF-8 byte sequence. Hosts with a smaller context may tighten this.
18
+ maxSkillPromptTokens: 48_000,
19
+ maxSkillPromptTotalBytes: 192_000,
20
+ maxSkillPromptTotalTokens: 192_000,
21
+ });
22
+
23
+ const LIMIT_KEYS = Object.freeze(Object.keys(HOST_SKILL_LIMITS));
24
+
25
+ function tighteningLimit(value, hardLimit) {
26
+ if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
27
+ return hardLimit;
28
+ }
29
+ return Math.min(hardLimit, Math.max(1, Math.floor(value)));
30
+ }
31
+
32
+ export function resolveSkillLimits(options = {}) {
33
+ const limits = {};
34
+ for (const key of LIMIT_KEYS) {
35
+ limits[key] = tighteningLimit(options?.[key], HOST_SKILL_LIMITS[key]);
36
+ }
37
+ return Object.freeze(limits);
38
+ }
39
+
40
+ export function skillBudgetError(code, message, details = {}) {
41
+ const error = new Error(message);
42
+ error.name = "SkillBudgetError";
43
+ error.code = code;
44
+ if (Number.isFinite(details.limit)) error.limit = details.limit;
45
+ if (Number.isFinite(details.actual)) error.actual = details.actual;
46
+ if (details.component) error.component = details.component;
47
+ return error;
48
+ }
49
+
50
+ export function isSkillBudgetError(error) {
51
+ return error?.name === "SkillBudgetError";
52
+ }
53
+
54
+ export function assertSkillFileSize(component, size, limitsInput = {}) {
55
+ const limits = resolveSkillLimits(limitsInput);
56
+ if (!Number.isSafeInteger(size) || size < 0) {
57
+ throw skillBudgetError(
58
+ "CC_SKILL_FILE_SIZE_INVALID",
59
+ `Skill component size is invalid: ${component}`,
60
+ { component },
61
+ );
62
+ }
63
+ if (size > limits.maxSkillFileBytes) {
64
+ throw skillBudgetError(
65
+ "CC_SKILL_FILE_TOO_LARGE",
66
+ `Skill component exceeds the host byte limit: ${component}`,
67
+ { component, limit: limits.maxSkillFileBytes, actual: size },
68
+ );
69
+ }
70
+ return size;
71
+ }
72
+
73
+ export function assertSkillTotalSize(size, limitsInput = {}) {
74
+ const limits = resolveSkillLimits(limitsInput);
75
+ if (!Number.isSafeInteger(size) || size < 0) {
76
+ throw skillBudgetError(
77
+ "CC_SKILL_TOTAL_SIZE_INVALID",
78
+ "Skill component total is invalid.",
79
+ );
80
+ }
81
+ if (size > limits.maxSkillTotalBytes) {
82
+ throw skillBudgetError(
83
+ "CC_SKILL_TOTAL_BYTES_EXCEEDED",
84
+ "Skill components exceed the host aggregate byte limit.",
85
+ { limit: limits.maxSkillTotalBytes, actual: size },
86
+ );
87
+ }
88
+ return size;
89
+ }
90
+
91
+ export function createSkillDiscoveryBudget(limitsInput = {}) {
92
+ return {
93
+ limits: resolveSkillLimits(limitsInput),
94
+ entries: 0,
95
+ files: 0,
96
+ bytes: 0,
97
+ };
98
+ }
99
+
100
+ export function debitSkillDiscoveryEntry(budget) {
101
+ const nextEntries = budget.entries + 1;
102
+ if (
103
+ !Number.isSafeInteger(nextEntries) ||
104
+ nextEntries > budget.limits.maxSkillDiscoveryEntries
105
+ ) {
106
+ throw skillBudgetError(
107
+ "CC_SKILL_DISCOVERY_ENTRIES_EXCEEDED",
108
+ "Recursive skill discovery exceeds the host directory-entry limit.",
109
+ {
110
+ limit: budget.limits.maxSkillDiscoveryEntries,
111
+ actual: nextEntries,
112
+ },
113
+ );
114
+ }
115
+ budget.entries = nextEntries;
116
+ return budget;
117
+ }
118
+
119
+ export function debitSkillDiscoveryBudget(budget, fileCount, byteCount) {
120
+ const nextFiles = budget.files + fileCount;
121
+ const nextBytes = budget.bytes + byteCount;
122
+ if (
123
+ !Number.isSafeInteger(nextFiles) ||
124
+ nextFiles > budget.limits.maxSkillDiscoveryFiles
125
+ ) {
126
+ throw skillBudgetError(
127
+ "CC_SKILL_DISCOVERY_FILES_EXCEEDED",
128
+ "Recursive skill discovery exceeds the host file-count limit.",
129
+ {
130
+ limit: budget.limits.maxSkillDiscoveryFiles,
131
+ actual: nextFiles,
132
+ },
133
+ );
134
+ }
135
+ if (
136
+ !Number.isSafeInteger(nextBytes) ||
137
+ nextBytes > budget.limits.maxSkillDiscoveryBytes
138
+ ) {
139
+ throw skillBudgetError(
140
+ "CC_SKILL_DISCOVERY_BYTES_EXCEEDED",
141
+ "Recursive skill discovery exceeds the host aggregate byte limit.",
142
+ {
143
+ limit: budget.limits.maxSkillDiscoveryBytes,
144
+ actual: nextBytes,
145
+ },
146
+ );
147
+ }
148
+ budget.files = nextFiles;
149
+ budget.bytes = nextBytes;
150
+ return budget;
151
+ }
152
+
153
+ export function measureSkillPrompt(body) {
154
+ if (typeof body !== "string") {
155
+ throw skillBudgetError(
156
+ "CC_SKILL_PROMPT_INVALID",
157
+ "Skill instructions must be a string before model projection.",
158
+ );
159
+ }
160
+ const bytes = Buffer.byteLength(body, "utf8");
161
+ return Object.freeze({
162
+ bytes,
163
+ // Conservative provider-neutral upper bound for text-derived tokens. This
164
+ // intentionally does not trust a configurable estimator that could return
165
+ // zero or NaN.
166
+ tokenUpperBound: bytes,
167
+ });
168
+ }
169
+
170
+ export function admitSkillPrompt(body, limitsInput = {}) {
171
+ const limits = resolveSkillLimits(limitsInput);
172
+ const measured = measureSkillPrompt(body);
173
+ if (measured.bytes > limits.maxSkillPromptBytes) {
174
+ throw skillBudgetError(
175
+ "CC_SKILL_PROMPT_BYTES_EXCEEDED",
176
+ "Skill instructions exceed the host model-projection byte limit.",
177
+ { limit: limits.maxSkillPromptBytes, actual: measured.bytes },
178
+ );
179
+ }
180
+ if (measured.tokenUpperBound > limits.maxSkillPromptTokens) {
181
+ throw skillBudgetError(
182
+ "CC_SKILL_PROMPT_TOKENS_EXCEEDED",
183
+ "Skill instructions exceed the host model-projection token limit.",
184
+ { limit: limits.maxSkillPromptTokens, actual: measured.tokenUpperBound },
185
+ );
186
+ }
187
+ return measured;
188
+ }
189
+
190
+ export function debitSkillPromptBudget(budget, measured) {
191
+ const nextBytes = budget.bytes + measured.bytes;
192
+ const nextTokens = budget.tokens + measured.tokenUpperBound;
193
+ if (
194
+ !Number.isSafeInteger(nextBytes) ||
195
+ nextBytes > budget.limits.maxSkillPromptTotalBytes
196
+ ) {
197
+ throw skillBudgetError(
198
+ "CC_SKILL_PROMPT_TOTAL_BYTES_EXCEEDED",
199
+ "Skill instructions exceed the host aggregate model-projection byte limit.",
200
+ {
201
+ limit: budget.limits.maxSkillPromptTotalBytes,
202
+ actual: nextBytes,
203
+ },
204
+ );
205
+ }
206
+ if (
207
+ !Number.isSafeInteger(nextTokens) ||
208
+ nextTokens > budget.limits.maxSkillPromptTotalTokens
209
+ ) {
210
+ throw skillBudgetError(
211
+ "CC_SKILL_PROMPT_TOTAL_TOKENS_EXCEEDED",
212
+ "Skill instructions exceed the host aggregate model-projection token limit.",
213
+ {
214
+ limit: budget.limits.maxSkillPromptTotalTokens,
215
+ actual: nextTokens,
216
+ },
217
+ );
218
+ }
219
+ budget.bytes = nextBytes;
220
+ budget.tokens = nextTokens;
221
+ return budget;
222
+ }