chainlesschain 0.166.76 → 0.166.78

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 (230) hide show
  1. package/README.md +19 -8
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +1 -1
  7. package/src/assets/linux-subreaper/linux-arm64/manifest.json +10 -0
  8. package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
  9. package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
  10. package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
  11. package/src/assets/web-panel/assets/{AIOps-CNaejClV.js → AIOps-DSyZEY2G.js} +1 -1
  12. package/src/assets/web-panel/assets/{ActionButton-CF_CVKT_.js → ActionButton-DhNyZ577.js} +1 -1
  13. package/src/assets/web-panel/assets/{Analytics-a3Z6J7gv.js → Analytics-HMMpxmyi.js} +3 -3
  14. package/src/assets/web-panel/assets/{AppLayout-BFtWEnct.js → AppLayout-CwKMM5Ie.js} +5 -5
  15. package/src/assets/web-panel/assets/{Artifacts-BQ8oeMvX.js → Artifacts-CNzDmph7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Audit-NOo9bmgk.js → Audit-DxWpUW3V.js} +1 -1
  17. package/src/assets/web-panel/assets/{BackgroundAgents-QRc7F3Tp.js → BackgroundAgents-C1R2ST-P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Backup-UlVgLn2P.js → Backup-B6biTaEV.js} +1 -1
  19. package/src/assets/web-panel/assets/{BaseInput-BER9LJAr.js → BaseInput-CVnkD2Z5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Chat-Z8z2Fdfz.js → Chat-Dbewl4Je.js} +6 -6
  21. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DdmuBrdQ.js → ChatBubbleRenderer-DVZ6SwC5.js} +1 -1
  22. package/src/assets/web-panel/assets/{Checkbox-CXPgyB8L.js → Checkbox-BqqiF1JE.js} +1 -1
  23. package/src/assets/web-panel/assets/{Codegen-D1vOsLJ7.js → Codegen-BVMkGumc.js} +1 -1
  24. package/src/assets/web-panel/assets/{Col-ucLnUJC7.js → Col-DmiRHy96.js} +1 -1
  25. package/src/assets/web-panel/assets/{Community-COsV9n9t.js → Community-BDlpygqA.js} +1 -1
  26. package/src/assets/web-panel/assets/{Compact-D0EkBEYh.js → Compact-B2NME_m-.js} +1 -1
  27. package/src/assets/web-panel/assets/{Compliance-C8w9SUjt.js → Compliance-BlzDLE-R.js} +1 -1
  28. package/src/assets/web-panel/assets/{Cowork-CmVaKEJS.js → Cowork-C8raPybB.js} +3 -3
  29. package/src/assets/web-panel/assets/{Cron-B_FiMMV2.js → Cron-DA8Py0zP.js} +2 -2
  30. package/src/assets/web-panel/assets/{Crosschain-ByO3YL8N.js → Crosschain-DU2XyHqB.js} +1 -1
  31. package/src/assets/web-panel/assets/{DID-DwpsLM9r.js → DID-Df098fT_.js} +2 -2
  32. package/src/assets/web-panel/assets/{Dashboard-B_8IUvM_.js → Dashboard-D1rT702x.js} +2 -2
  33. package/src/assets/web-panel/assets/{Dropdown-Bo6WQkuX.js → Dropdown-BweXGo1O.js} +1 -1
  34. package/src/assets/web-panel/assets/{EmailListRenderer-C9LiQesx.js → EmailListRenderer-B9ShbgJH.js} +1 -1
  35. package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +1 -0
  36. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dst6VUnO.js → FamilyGuardDashboard-DrznZFVs.js} +1 -1
  37. package/src/assets/web-panel/assets/{Federation-Ci7CoLkJ.js → Federation-DQZ2adIA.js} +1 -1
  38. package/src/assets/web-panel/assets/{FormItemContext-bdDyUhUM.js → FormItemContext-DN30Dowh.js} +1 -1
  39. package/src/assets/web-panel/assets/{GenericCardRenderer-CrRwOUVi.js → GenericCardRenderer-DRdt0j1e.js} +1 -1
  40. package/src/assets/web-panel/assets/{Git-Dis8h-Z-.js → Git-wwRgStzk.js} +2 -2
  41. package/src/assets/web-panel/assets/{Governance-DX7OH5w2.js → Governance-CI4Uw0Nh.js} +1 -1
  42. package/src/assets/web-panel/assets/{Inference-Cavv_Q_Z.js → Inference-5TuE2AJI.js} +1 -1
  43. package/src/assets/web-panel/assets/{KnowledgeGraph-Cck8tnZn.js → KnowledgeGraph-oXyvmFSR.js} +1 -1
  44. package/src/assets/web-panel/assets/{Logs-BQt3aGMu.js → Logs-ewudSWuv.js} +2 -2
  45. package/src/assets/web-panel/assets/MarkdownRenderer-Cz5nyufm.js +1 -0
  46. package/src/assets/web-panel/assets/{Marketplace-CdmAKNSN.js → Marketplace-DcZeWFrs.js} +1 -1
  47. package/src/assets/web-panel/assets/{McpTools-BUlJdyPY.js → McpTools-BcV9p1RS.js} +3 -3
  48. package/src/assets/web-panel/assets/{Memory-DQRTQDr-.js → Memory-CMhYvugt.js} +2 -2
  49. package/src/assets/web-panel/assets/{MobileBridge-C0dnxgsl.js → MobileBridge-5RP2uwvT.js} +1 -1
  50. package/src/assets/web-panel/assets/{MobileProjects-DQ5Gy7fa.js → MobileProjects-BIuM9Ze4.js} +1 -1
  51. package/src/assets/web-panel/assets/{Mtc-Xl7u2isS.js → Mtc-DmBszTDe.js} +5 -5
  52. package/src/assets/web-panel/assets/{MtcAudit-C3KX0574.js → MtcAudit-Czdp5ZGt.js} +2 -2
  53. package/src/assets/web-panel/assets/{Multisig-CHEhfkn8.js → Multisig-DRWUuNr-.js} +3 -3
  54. package/src/assets/web-panel/assets/{NLProgramming-Ce38mH-8.js → NLProgramming-IRQQN0-c.js} +1 -1
  55. package/src/assets/web-panel/assets/{Notes-C7nuTd7c.js → Notes-CGhD1lW9.js} +4 -4
  56. package/src/assets/web-panel/assets/{NotificationSettings-BcoEcyq8.js → NotificationSettings-BtyPgQAh.js} +1 -1
  57. package/src/assets/web-panel/assets/{OrderTableRenderer-D-t5hKkx.js → OrderTableRenderer-yUaqwCty.js} +1 -1
  58. package/src/assets/web-panel/assets/{Organization-C_BGi4xi.js → Organization-C3kTVn5i.js} +4 -4
  59. package/src/assets/web-panel/assets/{Overflow-BodhraDq.js → Overflow-C2-0iZhq.js} +1 -1
  60. package/src/assets/web-panel/assets/{P2P-BTa3sAIy.js → P2P-CISoEUxA.js} +2 -2
  61. package/src/assets/web-panel/assets/{PdhVaultBrowser-BjZslP9T.js → PdhVaultBrowser-NfTVtvKQ.js} +5 -5
  62. package/src/assets/web-panel/assets/{Permissions-u3UDzGef.js → Permissions-CfK0jJhm.js} +3 -3
  63. package/src/assets/web-panel/assets/{PersonalDataHub-Cb7ybv65.js → PersonalDataHub-OsVxxh_j.js} +4 -4
  64. package/src/assets/web-panel/assets/{Pipeline-CS24k-P7.js → Pipeline-DEmK_Ch2.js} +1 -1
  65. package/src/assets/web-panel/assets/{Privacy-Ddj6Kqs7.js → Privacy-D61s73b0.js} +1 -1
  66. package/src/assets/web-panel/assets/{ProjectInit-Bg5uQIgg.js → ProjectInit-DkLF5gHb.js} +2 -2
  67. package/src/assets/web-panel/assets/{ProjectSettings-AmPR8T12.js → ProjectSettings-BA7odTrI.js} +2 -2
  68. package/src/assets/web-panel/assets/{Projects-DGSbAyTK.js → Projects-CdI1GcAG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Providers-Dc1C3lbB.js → Providers-D9BYyP1r.js} +1 -1
  70. package/src/assets/web-panel/assets/{QrScannerModal-Cv3HXpce.js → QrScannerModal-CXMItUDD.js} +1 -1
  71. package/src/assets/web-panel/assets/{QuickAsk-3dpbXARb.js → QuickAsk-8-tF9ffZ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Recommend-5aGRVnJK.js → Recommend-C2QGWOSi.js} +1 -1
  73. package/src/assets/web-panel/assets/{RemoteSession-CTS2jx0p.js → RemoteSession-B1M_v1lx.js} +2 -2
  74. package/src/assets/web-panel/assets/{Reputation-BxaKI0hY.js → Reputation-D0WZHgv1.js} +1 -1
  75. package/src/assets/web-panel/assets/{Row-C23uQdwd.js → Row-D6nf9-c-.js} +1 -1
  76. package/src/assets/web-panel/assets/{RssFeed-ssX9YOhm.js → RssFeed-ClZ6M-mN.js} +3 -3
  77. package/src/assets/web-panel/assets/{Search-C24GogII.js → Search-ZWkt8vuO.js} +1 -1
  78. package/src/assets/web-panel/assets/{Security-DdAcGKkk.js → Security-BUlQut2m.js} +3 -3
  79. package/src/assets/web-panel/assets/{Services-D0dCiEuq.js → Services-Cd_3xJOc.js} +2 -2
  80. package/src/assets/web-panel/assets/{Skeleton-DEY44o0v.js → Skeleton-C8e2-cHW.js} +1 -1
  81. package/src/assets/web-panel/assets/Skills-DucVRJp1.js +1 -0
  82. package/src/assets/web-panel/assets/{Sla-B_bbo2vB.js → Sla-Csr5pUwI.js} +1 -1
  83. package/src/assets/web-panel/assets/SpeechSettings-CXvyaRAT.js +1 -0
  84. package/src/assets/web-panel/assets/{SyncSettings-CpIXql0Z.js → SyncSettings-KdsIcV5h.js} +2 -2
  85. package/src/assets/web-panel/assets/Tasks-B-eHmJm9.js +1 -0
  86. package/src/assets/web-panel/assets/{Templates-C_44nVPq.js → Templates-BglVeaLK.js} +1 -1
  87. package/src/assets/web-panel/assets/{Tenant-CyZ2ey2P.js → Tenant-BBbQ8qan.js} +1 -1
  88. package/src/assets/web-panel/assets/{Terminal-DwGNHWnp.js → Terminal-Ca_pCVBi.js} +2 -2
  89. package/src/assets/web-panel/assets/{TimelineRenderer-BTAHNkqU.js → TimelineRenderer-YD6XG_vZ.js} +1 -1
  90. package/src/assets/web-panel/assets/{Tokens-DCJWkUwc.js → Tokens-2lRoeVli.js} +1 -1
  91. package/src/assets/web-panel/assets/{Trigger-BCjDO9-E.js → Trigger-C-3XNAU9.js} +1 -1
  92. package/src/assets/web-panel/assets/{Trust-_YS8WbRb.js → Trust-k-1PxdLG.js} +1 -1
  93. package/src/assets/web-panel/assets/{UkeySign-m6R8xGq7.js → UkeySign-FG-qW646.js} +1 -1
  94. package/src/assets/web-panel/assets/{VideoEditing-xOfk29c4.js → VideoEditing-BNOe1cmd.js} +1 -1
  95. package/src/assets/web-panel/assets/{Wallet-B1Gw0awc.js → Wallet-D5C3i2Kw.js} +4 -4
  96. package/src/assets/web-panel/assets/{WebAuthn-CHK5ft18.js → WebAuthn-BOpztqd3.js} +4 -4
  97. package/src/assets/web-panel/assets/{WorkflowEditor-DEp1ukQQ.js → WorkflowEditor-BpVrpUEv.js} +1 -1
  98. package/src/assets/web-panel/assets/{chat-B2sFizun.js → chat-DIuMHb38.js} +1 -1
  99. package/src/assets/web-panel/assets/{colors-DJ17YV1E.js → colors-CTFJPyzQ.js} +1 -1
  100. package/src/assets/web-panel/assets/{compact-item-CBhJJgEC.js → compact-item-CONfmJcW.js} +1 -1
  101. package/src/assets/web-panel/assets/{createContext-BZkpvNJy.js → createContext-RkW5CRrz.js} +1 -1
  102. package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +1 -0
  103. package/src/assets/web-panel/assets/{hasIn-C0ZKo6Ei.js → hasIn-CW4XOjDC.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Bc3vVG2X.js → index-7wMSBCU7.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-vFMwiAN4.js → index-Akmg1WdH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DOBXNMdh.js → index-B54qoVff.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DLo8Ls9u.js → index-B8r2t0Ch.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C7gv9dvb.js → index-B9XoBoty.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DHtpMr1G.js → index-B9aS2VLu.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Dxe0YlZe.js → index-BFs1Tznc.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DumLgj1t.js → index-BKgaRT0b.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BNp6HKFh.js → index-BM7bOUvu.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DM0rWF6z.js → index-BMg2JFmW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-4oULtRqE.js → index-BRZsPxNn.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-LPPe0val.js → index-Bf19fKef.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Ctguam0K.js → index-BkAbfBF-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DrU5xVpF.js → index-CBjb2A5R.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CCOr6Q27.js → index-CEZWQthY.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C9gYiACH.js → index-CFGLf88d.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CZW84cEf.js → index-CLUa68JH.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-BoDUYyuo.js → index-CM2X25Er.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DyiCbHeL.js → index-CX4T2uKN.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CW5o1Gar.js → index-CixqfdRk.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-5K2z_tgO.js → index-CkRojEip.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BOfPp5OV.js → index-Cvmc3f25.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CdxJm-HB.js → index-D-lpTPS8.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-8ueG48gl.js → index-D59GbWCN.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BMxOoITz.js → index-DAESljiJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DLMr5KMd.js → index-DDHUx4Yz.js} +1 -1
  130. package/src/assets/web-panel/assets/index-DG1mcYTa.js +1 -0
  131. package/src/assets/web-panel/assets/{index-BGIvhCPl.js → index-DP5pPedy.js} +1 -1
  132. package/src/assets/web-panel/assets/index-DRs5Pe8u.js +1 -0
  133. package/src/assets/web-panel/assets/{index-DjdSFO0d.js → index-DSlXL6Ju.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Cn5UzvgR.js → index-DWCJnn2O.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Chct9tL8.js → index-DWY7YwDu.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BEnd5fiz.js → index-DZTwP364.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-KzNhWykP.js → index-DidrMvOx.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-BpyrhOeh.js → index-Dj3K5kHs.js} +1 -1
  139. package/src/assets/web-panel/assets/{index-CZlkPrxb.js → index-YaeGscSw.js} +1 -1
  140. package/src/assets/web-panel/assets/{index-Dfgxe-fw.js → index-YlMnFNOi.js} +1 -1
  141. package/src/assets/web-panel/assets/{index-IHgzfc1u.js → index-asWsB34i.js} +1 -1
  142. package/src/assets/web-panel/assets/{index-DJkoJzTU.js → index-gkjiFjQd.js} +1 -1
  143. package/src/assets/web-panel/assets/{initDefaultProps-Cqfoq0TJ.js → initDefaultProps-BOr4igh3.js} +1 -1
  144. package/src/assets/web-panel/assets/{motion-CIiVJHNu.js → motion-CK469n2j.js} +1 -1
  145. package/src/assets/web-panel/assets/{move-CFl1o_A8.js → move-DzjudlYQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{mtc-parser-DYoCxcZ1.js → mtc-parser-BQaKUxC6.js} +1 -1
  147. package/src/assets/web-panel/assets/{omit-C1P2q5TY.js → omit-MciovCFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{pickAttrs-BtTRpJtC.js → pickAttrs-DDPJ4zAz.js} +1 -1
  149. package/src/assets/web-panel/assets/{placementArrow-Cst2PcNM.js → placementArrow-Cznyb-jI.js} +1 -1
  150. package/src/assets/web-panel/assets/{responsiveObserve-CF5kalV2.js → responsiveObserve-AJK3SLzJ.js} +1 -1
  151. package/src/assets/web-panel/assets/{slide-CtHGqpXN.js → slide-CPQ28wu7.js} +1 -1
  152. package/src/assets/web-panel/assets/{statusUtils-N__biHXf.js → statusUtils-CFjzvqf_.js} +1 -1
  153. package/src/assets/web-panel/assets/{styleChecker-DR8V_H-i.js → styleChecker-BPyFfTuR.js} +1 -1
  154. package/src/assets/web-panel/assets/{useFlexGapSupport-D274dqun.js → useFlexGapSupport-Dq7N6R05.js} +1 -1
  155. package/src/assets/web-panel/assets/{useFs-BwHLYU5b.js → useFs-C3GS0uTc.js} +1 -1
  156. package/src/assets/web-panel/assets/{usePersonalDataHub-BiA-hVqt.js → usePersonalDataHub-BhgIVzP_.js} +1 -1
  157. package/src/assets/web-panel/assets/{vnode-Bugl94dy.js → vnode-4ZD9-MDr.js} +1 -1
  158. package/src/assets/web-panel/assets/{zoom-DEFl8GCu.js → zoom-Bx4MRVNW.js} +1 -1
  159. package/src/assets/web-panel/index.html +1 -1
  160. package/src/command-help-index.json +1 -1
  161. package/src/command-manifest.json +1 -1
  162. package/src/commands/checkpoint.js +42 -7
  163. package/src/commands/orchestrate.js +85 -25
  164. package/src/commands/session-location.js +5 -0
  165. package/src/commands/session-show.js +109 -1
  166. package/src/commands/session.js +26 -2
  167. package/src/commands/tokens.js +9 -4
  168. package/src/data/changelog.json +26 -0
  169. package/src/generated/cc-agent-protocol.schema.json +71 -0
  170. package/src/harness/jsonl-session-store.js +357 -114
  171. package/src/harness/mcp-client.js +44 -1
  172. package/src/lib/agent-router.js +35 -7
  173. package/src/lib/app-server/server.js +14 -0
  174. package/src/lib/background-agent-supervisor.js +14 -4
  175. package/src/lib/causal-observability.js +64 -1
  176. package/src/lib/checkpoint-summary-projection.js +98 -0
  177. package/src/lib/checkpoint-timeline-authority.js +15 -51
  178. package/src/lib/claude-code-bridge.js +302 -60
  179. package/src/lib/codex-app-server-adapter.js +161 -35
  180. package/src/lib/cost-budget.js +4 -0
  181. package/src/lib/decision-layer/providers.js +84 -9
  182. package/src/lib/decision-layer/runtime.js +86 -49
  183. package/src/lib/direct-model-usage.js +14 -3
  184. package/src/lib/doctor-checkup.js +31 -2
  185. package/src/lib/durable-security-store.js +6 -1
  186. package/src/lib/evolution/evolution-artifact-identity.js +21 -0
  187. package/src/lib/evolution/evolution-artifact-ports.js +5 -11
  188. package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
  189. package/src/lib/execution-location-failure-site.js +63 -0
  190. package/src/lib/execution-location-target.js +102 -8
  191. package/src/lib/external-agent-adapters.js +2 -0
  192. package/src/lib/image-file-boundary.js +154 -0
  193. package/src/lib/image-input.js +16 -3
  194. package/src/lib/llm-pricing.js +114 -8
  195. package/src/lib/mcp-call-ledger-store.js +7 -2
  196. package/src/lib/model-capabilities.js +21 -10
  197. package/src/lib/model-context-catalog.js +60 -1
  198. package/src/lib/openai-responses.js +7 -1
  199. package/src/lib/orchestrator.js +8 -2
  200. package/src/lib/process-execution-broker/index.js +93 -1
  201. package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
  202. package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
  203. package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
  204. package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
  205. package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
  206. package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
  207. package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
  208. package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
  209. package/src/lib/runtime-usage-ledger.js +3 -0
  210. package/src/lib/secure-fs.js +158 -42
  211. package/src/lib/session-branch-history.js +240 -0
  212. package/src/lib/session-history-origins.js +285 -0
  213. package/src/lib/session-input-receipt.js +110 -0
  214. package/src/lib/session-resource-budget.js +8 -8
  215. package/src/lib/session-transcript-history.js +456 -0
  216. package/src/lib/session-transcript-page.js +164 -0
  217. package/src/lib/session-transcript-reference.js +38 -0
  218. package/src/lib/session-usage.js +8 -0
  219. package/src/lib/token-tracker.js +32 -54
  220. package/src/lib/usage-pricing-context.js +93 -0
  221. package/src/runtime/headless-runner.js +8 -0
  222. package/src/runtime/headless-stream.js +202 -4
  223. package/src/assets/web-panel/assets/EvolutionSettings-Pc1IpRfk.js +0 -1
  224. package/src/assets/web-panel/assets/MarkdownRenderer-BIUeeiVA.js +0 -1
  225. package/src/assets/web-panel/assets/Skills-CYt0Mu2W.js +0 -1
  226. package/src/assets/web-panel/assets/SpeechSettings-a2BBjtTL.js +0 -1
  227. package/src/assets/web-panel/assets/Tasks-BYQKU-GL.js +0 -1
  228. package/src/assets/web-panel/assets/devWarning-DZhu13vj.js +0 -1
  229. package/src/assets/web-panel/assets/index-C6iFyQYz.js +0 -1
  230. package/src/assets/web-panel/assets/index-CztThH9f.js +0 -1
@@ -0,0 +1,285 @@
1
+ import { canonicalDigest } from "@chainlesschain/context-memory-kernel";
2
+ import {
3
+ contextItemsToMessages,
4
+ messagesToContextItems,
5
+ } from "./context-memory-kernel/message-adapter.js";
6
+ import {
7
+ decodeVerifiedPersistedMessage,
8
+ encodePersistedMessage,
9
+ getDurableSystemMessageProvenance,
10
+ DURABLE_SYSTEM_MESSAGE_KINDS,
11
+ } from "./session-message-provenance.js";
12
+ import {
13
+ HISTORY_SUMMARY_SCHEMA,
14
+ projectCheckpointSummary,
15
+ } from "./checkpoint-summary-projection.js";
16
+
17
+ export const HISTORY_PREFIX_SCHEMA = "chainlesschain.session-history-prefix/v1";
18
+ const MAX_CONTEXT_BYTES = 8 * 1024 * 1024;
19
+ const MAX_CONTEXT_MESSAGES = 32768;
20
+ const displayable = (message) =>
21
+ ["user", "assistant", "tool"].includes(message?.role);
22
+ const derivedSystemKinds = new Set([
23
+ DURABLE_SYSTEM_MESSAGE_KINDS.COMPACT_SUMMARY,
24
+ DURABLE_SYSTEM_MESSAGE_KINDS.COMPACT_TOOL_COLLAPSE,
25
+ DURABLE_SYSTEM_MESSAGE_KINDS.CHECKPOINT_SUMMARY,
26
+ DURABLE_SYSTEM_MESSAGE_KINDS.MIGRATION_SUMMARY,
27
+ ]);
28
+ const historyBearing = (entry) =>
29
+ displayable(entry.message) ||
30
+ Boolean(entry.origin) ||
31
+ derivedSystemKinds.has(
32
+ getDurableSystemMessageProvenance(entry.message)?.kind,
33
+ );
34
+ const fingerprint = (messages) =>
35
+ canonicalDigest(messages.map(encodePersistedMessage));
36
+
37
+ /**
38
+ * Origins belong to positions in the current display history, never to equal
39
+ * text. Only indexed, digest-checked compaction sources can carry them forward.
40
+ * The optional mapping is bounded independently of the display page; losing it
41
+ * forces a later rewind to use its explicit snapshot.
42
+ */
43
+ export function createSessionHistoryOrigins() {
44
+ let context = [];
45
+ let bytes = 0;
46
+
47
+ function replace(entries) {
48
+ context = [];
49
+ bytes = 0;
50
+ for (const entry of entries) {
51
+ append(entry.message, entry.origin);
52
+ if (!context) break;
53
+ }
54
+ }
55
+ function append(message, origin) {
56
+ if (!context || typeof message?.role !== "string") return;
57
+ bytes += Buffer.byteLength(JSON.stringify(message));
58
+ if (bytes > MAX_CONTEXT_BYTES || context.length >= MAX_CONTEXT_MESSAGES) {
59
+ context = null;
60
+ return;
61
+ }
62
+ context.push({ message, origin });
63
+ }
64
+ function span(entries) {
65
+ const visible = entries.filter(historyBearing);
66
+ if (visible.length === 0) return null;
67
+ if (visible.some((entry) => !entry.origin)) return null;
68
+ return {
69
+ first: Math.min(...visible.map((entry) => entry.origin.first)),
70
+ last: Math.max(...visible.map((entry) => entry.origin.last)),
71
+ };
72
+ }
73
+
74
+ const api = {
75
+ appendPersisted(message, ordinal) {
76
+ if (!context) return;
77
+ append(
78
+ decodeVerifiedPersistedMessage(message),
79
+ displayable(message) ? { first: ordinal, last: ordinal } : null,
80
+ );
81
+ },
82
+ appendMappedPersisted(message, origin) {
83
+ append(decodeVerifiedPersistedMessage(message), origin);
84
+ },
85
+ branchPrefix(messages, head, count) {
86
+ if (!context) return null;
87
+ const cutoff = api.rewind(
88
+ {
89
+ prevHash: head,
90
+ data: {
91
+ action: "restore-conversation",
92
+ messages: messages.map(encodePersistedMessage),
93
+ historyPrefix: {
94
+ schema: HISTORY_PREFIX_SCHEMA,
95
+ sourceHead: head,
96
+ sourceMessageCount: context.length,
97
+ retainedMessageCount: messages.length,
98
+ },
99
+ },
100
+ },
101
+ count,
102
+ );
103
+ return cutoff === null
104
+ ? null
105
+ : {
106
+ cutoff,
107
+ entries: context.map((entry) => ({
108
+ message: entry.message,
109
+ origin: entry.origin ? { ...entry.origin } : null,
110
+ })),
111
+ };
112
+ },
113
+ snapshot(messages) {
114
+ let ordinal = 0;
115
+ replace(
116
+ messages.map((message) => ({
117
+ message: decodeVerifiedPersistedMessage(message),
118
+ origin: displayable(message)
119
+ ? { first: ordinal, last: ordinal++ }
120
+ : null,
121
+ })),
122
+ );
123
+ },
124
+ compact(data) {
125
+ const canonical = data.canonical;
126
+ let entries = null;
127
+ try {
128
+ if (context) {
129
+ const originals = messagesToContextItems(
130
+ context.map((entry) => entry.message),
131
+ { sessionId: canonical.sessionId },
132
+ );
133
+ const byDigest = new Map(
134
+ originals.map((item) => [item.digest, item]),
135
+ );
136
+ const bySequence = new Map(
137
+ originals.map((item) => [item.sourceRef.eventSequence, item]),
138
+ );
139
+ const itemEntries = (item) =>
140
+ context.slice(
141
+ item.sourceRef.eventSequence,
142
+ item.sourceRef.eventSequence +
143
+ contextItemsToMessages([item]).length,
144
+ );
145
+ entries = [...canonical.outputItems]
146
+ .sort(
147
+ (left, right) =>
148
+ (left.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER) -
149
+ (right.sourceRef.eventSequence ?? Number.MAX_SAFE_INTEGER) ||
150
+ left.itemId.localeCompare(right.itemId, "en"),
151
+ )
152
+ .flatMap((item) => {
153
+ const messages = contextItemsToMessages([item]);
154
+ const source = bySequence.get(item.sourceRef.eventSequence);
155
+ if (
156
+ item.sourceRef.store === "cli-jsonl-session" &&
157
+ source?.sourceRef.digest === item.sourceRef.digest &&
158
+ source.content === item.content
159
+ ) {
160
+ return itemEntries(source);
161
+ }
162
+ let origin = null;
163
+ if (
164
+ item.sourceRef.store === "cli-context-summary" &&
165
+ item.provenance?.parentDigests?.length > 0
166
+ ) {
167
+ const digests = item.provenance.parentDigests;
168
+ if (
169
+ digests.length <= originals.length &&
170
+ new Set(digests).size === digests.length
171
+ ) {
172
+ const parents = digests.map((digest) => byDigest.get(digest));
173
+ if (parents.every(Boolean))
174
+ origin = span(parents.flatMap(itemEntries));
175
+ }
176
+ }
177
+ return messages.map((message) => ({ message, origin }));
178
+ });
179
+ const persisted = data.messages.map(decodeVerifiedPersistedMessage);
180
+ if (
181
+ fingerprint(entries.map((entry) => entry.message)) !==
182
+ fingerprint(persisted)
183
+ )
184
+ entries = null;
185
+ }
186
+ } catch {
187
+ entries = null;
188
+ }
189
+ replace(
190
+ entries ||
191
+ data.messages.map((message) => ({
192
+ message: decodeVerifiedPersistedMessage(message),
193
+ origin: null,
194
+ })),
195
+ );
196
+ },
197
+ summarize(event) {
198
+ const data = event.data;
199
+ const certificate = data.historySummary;
200
+ if (
201
+ !context ||
202
+ certificate?.schema !== HISTORY_SUMMARY_SCHEMA ||
203
+ !/^[a-f0-9]{64}$/u.test(certificate.sourceHead) ||
204
+ certificate.sourceHead !== event.prevHash ||
205
+ certificate.sourceMessageCount !== context.length
206
+ )
207
+ return false;
208
+ try {
209
+ const projected = projectCheckpointSummary({
210
+ messages: context.map((entry) => entry.message),
211
+ action: data.action,
212
+ turnId: data.turnId,
213
+ start: certificate.start,
214
+ end: certificate.end,
215
+ });
216
+ if (
217
+ fingerprint(projected.map((entry) => entry.message)) !==
218
+ fingerprint(data.messages.map(decodeVerifiedPersistedMessage))
219
+ )
220
+ return false;
221
+ const entries = projected.map(({ message, sourceIndexes }) => ({
222
+ message,
223
+ origin: span(sourceIndexes.map((index) => context[index])),
224
+ }));
225
+ replace(entries);
226
+ return true;
227
+ } catch {
228
+ return false;
229
+ }
230
+ },
231
+ rewind(event, count) {
232
+ const data = event.data;
233
+ const prefix = data.historyPrefix;
234
+ if (
235
+ !context ||
236
+ prefix?.schema !== HISTORY_PREFIX_SCHEMA ||
237
+ !/^[a-f0-9]{64}$/u.test(prefix.sourceHead) ||
238
+ prefix.sourceHead !== event.prevHash ||
239
+ prefix.sourceMessageCount !== context.length ||
240
+ !["restore-conversation", "restore-both"].includes(data.action) ||
241
+ !Number.isSafeInteger(prefix.retainedMessageCount) ||
242
+ prefix.retainedMessageCount < 0 ||
243
+ prefix.retainedMessageCount >= context.length
244
+ )
245
+ return null;
246
+ const retained = context.slice(0, prefix.retainedMessageCount);
247
+ const removed = context.slice(prefix.retainedMessageCount);
248
+ const anchor = removed[0];
249
+ if (
250
+ anchor.message.role !== "user" ||
251
+ !anchor.origin ||
252
+ anchor.origin.first !== anchor.origin.last
253
+ )
254
+ return null;
255
+ const cutoff = anchor.origin.first;
256
+ if (
257
+ cutoff < 0 ||
258
+ cutoff > count ||
259
+ retained.some(
260
+ (entry) =>
261
+ historyBearing(entry) &&
262
+ (!entry.origin || entry.origin.last >= cutoff),
263
+ ) ||
264
+ removed.some(
265
+ (entry) =>
266
+ historyBearing(entry) &&
267
+ (!entry.origin || entry.origin.first < cutoff),
268
+ )
269
+ )
270
+ return null;
271
+ try {
272
+ if (
273
+ fingerprint(retained.map((entry) => entry.message)) !==
274
+ fingerprint(data.messages.map(decodeVerifiedPersistedMessage))
275
+ )
276
+ return null;
277
+ } catch {
278
+ return null;
279
+ }
280
+ replace(retained);
281
+ return cutoff;
282
+ },
283
+ };
284
+ return api;
285
+ }
@@ -0,0 +1,110 @@
1
+ import { createHash } from "node:crypto";
2
+ import {
3
+ appendAuthorityEventWithVerifiedProjection,
4
+ readVerifiedProjection,
5
+ } from "../harness/jsonl-session-store.js";
6
+
7
+ export function validateClientMessageId(value) {
8
+ if (typeof value !== "string" || !/^[a-zA-Z0-9_-]{1,80}$/u.test(value)) {
9
+ throw new TypeError(
10
+ "client_message_id must be 1–80 ASCII letters, digits, _ or -",
11
+ );
12
+ }
13
+ return value;
14
+ }
15
+
16
+ export function inputSubmissionDigest(input) {
17
+ return createHash("sha256").update(JSON.stringify(input)).digest("hex");
18
+ }
19
+
20
+ function receiptProjection(sessionId, clientMessageId) {
21
+ let receipt = null;
22
+ return {
23
+ accept(event) {
24
+ if (
25
+ event.type !== "user_message" ||
26
+ event.data?.clientMessageId !== clientMessageId
27
+ )
28
+ return;
29
+ const next = {
30
+ sessionId,
31
+ clientMessageId,
32
+ inputDigest: event.data.inputDigest,
33
+ eventHash: event.hash,
34
+ };
35
+ if (
36
+ !/^[a-f0-9]{64}$/u.test(next.inputDigest || "") ||
37
+ !/^[a-f0-9]{64}$/u.test(next.eventHash || "") ||
38
+ receipt
39
+ ) {
40
+ throw new Error("Invalid or repeated durable input receipt");
41
+ }
42
+ receipt = next;
43
+ },
44
+ finish() {
45
+ return receipt;
46
+ },
47
+ };
48
+ }
49
+
50
+ export function readSessionInputReceipt(sessionId, clientMessageId) {
51
+ validateClientMessageId(clientMessageId);
52
+ const receipt = readVerifiedProjection(sessionId, () =>
53
+ receiptProjection(sessionId, clientMessageId),
54
+ );
55
+ return {
56
+ schema: "chainlesschain.input-receipt/v1",
57
+ sessionId,
58
+ clientMessageId,
59
+ accepted: !!receipt,
60
+ receipt,
61
+ };
62
+ }
63
+
64
+ /** Acceptance and deduplication share the existing canonical writer authority. */
65
+ export function appendSessionInputWithReceipt(
66
+ sessionId,
67
+ content,
68
+ clientMessageId,
69
+ submission = content,
70
+ ) {
71
+ validateClientMessageId(clientMessageId);
72
+ const inputDigest = inputSubmissionDigest(submission);
73
+ let duplicate = null;
74
+ try {
75
+ const appended = appendAuthorityEventWithVerifiedProjection(
76
+ sessionId,
77
+ "user_message",
78
+ {
79
+ role: "user",
80
+ content,
81
+ clientMessageId,
82
+ inputDigest,
83
+ },
84
+ {
85
+ createProjection: () => receiptProjection(sessionId, clientMessageId),
86
+ validateProjection: (receipt) => {
87
+ if (!receipt) return;
88
+ if (receipt.inputDigest !== inputDigest)
89
+ throw new Error(
90
+ "client_message_id was already used for different input",
91
+ );
92
+ // The store has verified the full chain and anchor before invoking
93
+ // this callback. Rejecting here means no append can have started.
94
+ duplicate = receipt;
95
+ throw new Error("Input already accepted");
96
+ },
97
+ },
98
+ );
99
+ return {
100
+ sessionId,
101
+ clientMessageId,
102
+ inputDigest,
103
+ eventHash: appended.hash,
104
+ duplicate: false,
105
+ };
106
+ } catch (error) {
107
+ if (duplicate) return { ...duplicate, duplicate: true };
108
+ throw error;
109
+ }
110
+ }
@@ -17,6 +17,7 @@
17
17
  import { AsyncLocalStorage } from "node:async_hooks";
18
18
  import { createHash, randomUUID } from "node:crypto";
19
19
  import { CostBudget } from "./cost-budget.js";
20
+ import { projectUsagePricingContext } from "./usage-pricing-context.js";
20
21
 
21
22
  export const SESSION_RESOURCE_BUDGET_VERSION = 1;
22
23
  export const SESSION_BUDGET_RECOVERY_ADJUDICATION_SCHEMA =
@@ -123,6 +124,7 @@ function normalizeRecoveryIdentity(field, raw) {
123
124
  typeof raw !== "string" ||
124
125
  raw.length < 1 ||
125
126
  raw.length > 256 ||
127
+ // eslint-disable-next-line no-control-regex -- Recovery IDs forbid exactly C0 and DEL.
126
128
  /[\u0000-\u001f\u007f]/u.test(raw)
127
129
  ) {
128
130
  throw new TypeError(`invalid session budget recovery ${field}`);
@@ -256,10 +258,7 @@ function cloneCostBudget(cost) {
256
258
  return clone;
257
259
  }
258
260
 
259
- function calculateUsageAccounting(
260
- { tokens, cost, unpricedUsage },
261
- usageInput,
262
- ) {
261
+ function calculateUsageAccounting({ tokens, cost, unpricedUsage }, usageInput) {
263
262
  const { tokenCount, pricedRecords } = normalizeUsageAccounting(usageInput);
264
263
  const nextTokens = tokens + tokenCount;
265
264
  if (!Number.isSafeInteger(nextTokens)) {
@@ -293,7 +292,10 @@ function canonicalRecoveryUsageRecord(record, field) {
293
292
  return {
294
293
  provider: normalizeRecoveryIdentity(`${field} provider`, record.provider),
295
294
  model: normalizeRecoveryIdentity(`${field} model`, record.model),
296
- usage: normalizeUsageTokens(record.usage).fields,
295
+ usage: {
296
+ ...normalizeUsageTokens(record.usage).fields,
297
+ ...projectUsagePricingContext(record.usage),
298
+ },
297
299
  };
298
300
  }
299
301
 
@@ -1832,9 +1834,7 @@ export class SessionResourceBudget {
1832
1834
  const sortedAbandoned = [...abandonedIds].sort();
1833
1835
  const sortedSettlements = normalizedSettlements
1834
1836
  .map((record) => record.canonical)
1835
- .sort((left, right) =>
1836
- left.authorityId.localeCompare(right.authorityId),
1837
- );
1837
+ .sort((left, right) => left.authorityId.localeCompare(right.authorityId));
1838
1838
  const tokenDelta = accounting.tokens - this.tokens;
1839
1839
  const spentUsdDelta = accounting.cost.spentUsd - this.cost.spentUsd;
1840
1840
  const adjudicationCore = {