chainlesschain 0.166.77 → 0.166.79

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 +9 -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-CpiCBhRh.js → AIOps-CwD6Pm_Y.js} +1 -1
  12. package/src/assets/web-panel/assets/{ActionButton-CnU-Xvx-.js → ActionButton-Du5Rp-O6.js} +1 -1
  13. package/src/assets/web-panel/assets/{Analytics-BJW-CNtf.js → Analytics-DY9l72ma.js} +3 -3
  14. package/src/assets/web-panel/assets/{AppLayout-UFQJL3G9.js → AppLayout-7t1WIaCJ.js} +5 -5
  15. package/src/assets/web-panel/assets/{Artifacts-Dr_IUDoY.js → Artifacts-BLIA5yny.js} +1 -1
  16. package/src/assets/web-panel/assets/{Audit-aglWo6rr.js → Audit-BC_N0QTg.js} +1 -1
  17. package/src/assets/web-panel/assets/{BackgroundAgents-Dm_TCiXC.js → BackgroundAgents-CA7SxDtg.js} +1 -1
  18. package/src/assets/web-panel/assets/{Backup-DUdX4-gA.js → Backup-BZ4AzS1_.js} +1 -1
  19. package/src/assets/web-panel/assets/{BaseInput-BTcLjy1o.js → BaseInput-BhiggGaH.js} +1 -1
  20. package/src/assets/web-panel/assets/{Chat-Bhy9qZrl.js → Chat-CDdBoIBI.js} +5 -5
  21. package/src/assets/web-panel/assets/ChatBubbleRenderer-hsBsrl31.js +1 -0
  22. package/src/assets/web-panel/assets/{Checkbox-CblrPa21.js → Checkbox-asoMKSEK.js} +1 -1
  23. package/src/assets/web-panel/assets/{Codegen-SEAHzOlr.js → Codegen-B0gElLdm.js} +1 -1
  24. package/src/assets/web-panel/assets/{Col-DJz8iFOR.js → Col-DrNzLpF6.js} +1 -1
  25. package/src/assets/web-panel/assets/{Community-RufKhcQt.js → Community-DCzB5qkI.js} +1 -1
  26. package/src/assets/web-panel/assets/{Compact-Dlifx08U.js → Compact-Db-Eua_j.js} +1 -1
  27. package/src/assets/web-panel/assets/{Compliance-DdhQWcHh.js → Compliance-B76NByjl.js} +1 -1
  28. package/src/assets/web-panel/assets/{Cowork-BLNn6oOm.js → Cowork-C-nK6Qpk.js} +3 -3
  29. package/src/assets/web-panel/assets/{Cron-Dv-JWY2d.js → Cron-C-GlQO19.js} +2 -2
  30. package/src/assets/web-panel/assets/{Crosschain-k7Pz7O-b.js → Crosschain-Cuuz9IIh.js} +1 -1
  31. package/src/assets/web-panel/assets/{DID-C_10syUW.js → DID-gwFaT973.js} +2 -2
  32. package/src/assets/web-panel/assets/{Dashboard-CMyH6Szx.js → Dashboard-DHDt5jEf.js} +2 -2
  33. package/src/assets/web-panel/assets/{Dropdown-DjmD2Saa.js → Dropdown-CJ9kog-Y.js} +1 -1
  34. package/src/assets/web-panel/assets/{EmailListRenderer-36_IRUSo.js → EmailListRenderer-DOSXFRiQ.js} +1 -1
  35. package/src/assets/web-panel/assets/{EvolutionSettings-CmtU0XmM.js → EvolutionSettings-CHYMP7rR.js} +1 -1
  36. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DEgf9kyP.js → FamilyGuardDashboard-C1gzG5EK.js} +1 -1
  37. package/src/assets/web-panel/assets/{Federation-DGO1wQls.js → Federation-CEdNVWUw.js} +1 -1
  38. package/src/assets/web-panel/assets/{FormItemContext-Doj1FmKW.js → FormItemContext-CwVOWPX8.js} +1 -1
  39. package/src/assets/web-panel/assets/{GenericCardRenderer-GzOU27iT.js → GenericCardRenderer-CgNUs3kT.js} +1 -1
  40. package/src/assets/web-panel/assets/{Git-Dd7D1EDK.js → Git-DM4MNnQo.js} +2 -2
  41. package/src/assets/web-panel/assets/{Governance-6IY8LcjI.js → Governance-DdOtjkvd.js} +1 -1
  42. package/src/assets/web-panel/assets/{Inference-BB9gl8q1.js → Inference-28PidFfr.js} +1 -1
  43. package/src/assets/web-panel/assets/{KnowledgeGraph-CeCed5wd.js → KnowledgeGraph-Bpj_qNUK.js} +1 -1
  44. package/src/assets/web-panel/assets/{Logs-CYOeHuaI.js → Logs-C6Ix19Ay.js} +2 -2
  45. package/src/assets/web-panel/assets/{MarkdownRenderer-Bk8Zqc2R.js → MarkdownRenderer-Bj6mtPbf.js} +1 -1
  46. package/src/assets/web-panel/assets/{Marketplace-D-_xgHgM.js → Marketplace-DqkhRSMP.js} +1 -1
  47. package/src/assets/web-panel/assets/{McpTools-NnaUTF5t.js → McpTools-1WQ2SjaE.js} +3 -3
  48. package/src/assets/web-panel/assets/{Memory-CndN9pMt.js → Memory-BWTi7v6R.js} +2 -2
  49. package/src/assets/web-panel/assets/{MobileBridge-BXblFmhY.js → MobileBridge-DB4wu3UE.js} +1 -1
  50. package/src/assets/web-panel/assets/{MobileProjects-CC26Dm2k.js → MobileProjects-Bh9pWx2f.js} +1 -1
  51. package/src/assets/web-panel/assets/{Mtc-BhaqWCiW.js → Mtc-BVF1Wrno.js} +4 -4
  52. package/src/assets/web-panel/assets/{MtcAudit-D6fktM2w.js → MtcAudit-DtNfslPf.js} +5 -5
  53. package/src/assets/web-panel/assets/{Multisig-CFvahz7s.js → Multisig-4qcXP0bf.js} +3 -3
  54. package/src/assets/web-panel/assets/{NLProgramming-Co73Ivya.js → NLProgramming-BRJl5Ehw.js} +1 -1
  55. package/src/assets/web-panel/assets/{Notes-B4g33L1o.js → Notes-BRY_bgMk.js} +3 -3
  56. package/src/assets/web-panel/assets/{NotificationSettings-lXd17EbN.js → NotificationSettings-DirXMFz4.js} +1 -1
  57. package/src/assets/web-panel/assets/{OrderTableRenderer-BiOB0GIi.js → OrderTableRenderer-BlrY8lwu.js} +1 -1
  58. package/src/assets/web-panel/assets/{Organization-JQ7_wQIA.js → Organization-CVzQ1vO-.js} +4 -4
  59. package/src/assets/web-panel/assets/{Overflow-gwgJgozQ.js → Overflow-A3rXTPG4.js} +1 -1
  60. package/src/assets/web-panel/assets/{P2P-D9L_0gie.js → P2P-Db9ABWz0.js} +2 -2
  61. package/src/assets/web-panel/assets/{PdhVaultBrowser-CbOPsFE9.js → PdhVaultBrowser-CPv0H2OZ.js} +3 -3
  62. package/src/assets/web-panel/assets/{Permissions-Cz42HNQf.js → Permissions-COnW4sIR.js} +4 -4
  63. package/src/assets/web-panel/assets/{PersonalDataHub-DjorYtrF.js → PersonalDataHub-C1hG7rp7.js} +5 -5
  64. package/src/assets/web-panel/assets/{Pipeline-DyWPhmm5.js → Pipeline---GLRDEe.js} +1 -1
  65. package/src/assets/web-panel/assets/{Privacy-DyfLMl2j.js → Privacy-aaN9R3Lu.js} +1 -1
  66. package/src/assets/web-panel/assets/{ProjectInit-CyqDx1OE.js → ProjectInit-C-kw49hE.js} +2 -2
  67. package/src/assets/web-panel/assets/{ProjectSettings-DsBw0Csy.js → ProjectSettings-y5tTkBTC.js} +2 -2
  68. package/src/assets/web-panel/assets/Projects-DZHlhyPB.js +1 -0
  69. package/src/assets/web-panel/assets/{Providers-CCI_klN-.js → Providers-LqxnV72o.js} +1 -1
  70. package/src/assets/web-panel/assets/{QrScannerModal-DNsnlDdS.js → QrScannerModal-D_q-Y5F0.js} +1 -1
  71. package/src/assets/web-panel/assets/{QuickAsk-B9r2iaee.js → QuickAsk-_E_KB5o8.js} +1 -1
  72. package/src/assets/web-panel/assets/{Recommend-BJDe03GR.js → Recommend-BN8S5WJA.js} +1 -1
  73. package/src/assets/web-panel/assets/{RemoteSession-J7JR3rRo.js → RemoteSession-BFzrY_aW.js} +3 -3
  74. package/src/assets/web-panel/assets/{Reputation-DR39AJeV.js → Reputation-C1HCLaTV.js} +1 -1
  75. package/src/assets/web-panel/assets/{Row-Dh77m3NZ.js → Row-B8T2-Qv7.js} +1 -1
  76. package/src/assets/web-panel/assets/{RssFeed-BUdg28nJ.js → RssFeed-CNQLk8v1.js} +3 -3
  77. package/src/assets/web-panel/assets/{Search-BNC7sGhj.js → Search-BOx720Kc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Security-DISENGI7.js → Security-Ds8z6PF6.js} +4 -4
  79. package/src/assets/web-panel/assets/{Services-BBBGpJ1-.js → Services-C0-YkRSF.js} +2 -2
  80. package/src/assets/web-panel/assets/{Skeleton-DMcIoIv2.js → Skeleton-DUHlSySD.js} +1 -1
  81. package/src/assets/web-panel/assets/{Skills-QAyFbI3r.js → Skills-C8CBbbh0.js} +1 -1
  82. package/src/assets/web-panel/assets/{Sla-CSg5wLH7.js → Sla-lQltyYfB.js} +1 -1
  83. package/src/assets/web-panel/assets/{SpeechSettings-DMPxTc5x.js → SpeechSettings-B5vyOma-.js} +1 -1
  84. package/src/assets/web-panel/assets/{SyncSettings-CPG7l30y.js → SyncSettings-BKDPu_y-.js} +2 -2
  85. package/src/assets/web-panel/assets/{Tasks-Y1kOVvVL.js → Tasks-Bgvf7LTx.js} +1 -1
  86. package/src/assets/web-panel/assets/{Templates-jt9NagL0.js → Templates-BMZyYYS7.js} +1 -1
  87. package/src/assets/web-panel/assets/{Tenant-DauuJICx.js → Tenant-7PYTig8f.js} +1 -1
  88. package/src/assets/web-panel/assets/{Terminal-E9rnKeGq.js → Terminal-C2W0LMdR.js} +2 -2
  89. package/src/assets/web-panel/assets/{TimelineRenderer-Cc7z2APG.js → TimelineRenderer-CqREew_l.js} +1 -1
  90. package/src/assets/web-panel/assets/{Tokens-CV0UthRA.js → Tokens-BhTyxTuD.js} +1 -1
  91. package/src/assets/web-panel/assets/{Trigger-BFcJJGfu.js → Trigger-DxNSSZy_.js} +1 -1
  92. package/src/assets/web-panel/assets/{Trust-BAydbNJA.js → Trust-Dy_wfbIh.js} +1 -1
  93. package/src/assets/web-panel/assets/{UkeySign-DcOS6sqL.js → UkeySign-DJC5ANqx.js} +1 -1
  94. package/src/assets/web-panel/assets/{VideoEditing-BLHJZvif.js → VideoEditing-CNFevrO4.js} +1 -1
  95. package/src/assets/web-panel/assets/{Wallet-4QFLKHwW.js → Wallet-CXzuS1YK.js} +4 -4
  96. package/src/assets/web-panel/assets/{WebAuthn-BocEOOSj.js → WebAuthn-BWS6HP8c.js} +5 -5
  97. package/src/assets/web-panel/assets/{WorkflowEditor-DCfF7D0B.js → WorkflowEditor-swiN_7Vj.js} +1 -1
  98. package/src/assets/web-panel/assets/{chat-CxvfsYGr.js → chat-NwH7qlBs.js} +1 -1
  99. package/src/assets/web-panel/assets/{colors-KtQB9DmQ.js → colors-h6nRhBTw.js} +1 -1
  100. package/src/assets/web-panel/assets/{compact-item-Dx4J6arN.js → compact-item-BQ6B6rP2.js} +1 -1
  101. package/src/assets/web-panel/assets/{createContext-Cq0olgzo.js → createContext-CQkJuRcG.js} +1 -1
  102. package/src/assets/web-panel/assets/devWarning-Bz6vqBGV.js +1 -0
  103. package/src/assets/web-panel/assets/{hasIn-Bf9-h3D-.js → hasIn-Diwl1WyI.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CpO6DKuu.js → index-0ZztPzIm.js} +1 -1
  105. package/src/assets/web-panel/assets/index-1b7DEw-w.js +1 -0
  106. package/src/assets/web-panel/assets/{index-DQDR-_ai.js → index-AzeSQJDK.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-BMcC4cbj.js → index-B3QgcUBV.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BO6XvO-C.js → index-B5gj_uCC.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-ClUfSChI.js → index-BI3ALCgN.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B3xfiItB.js → index-BRl3KUj0.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DFdEDvFn.js → index-BYYb8oeV.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CqnggDos.js → index-BcKDUGYf.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B_8UcDan.js → index-BcjlIMP9.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CmQuG0fr.js → index-BheCvudN.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-iE9tqEN5.js → index-BjcARUtr.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-nmyDOh_b.js → index-BnQUin2K.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Br1mDMfO.js → index-Bs6HyCfP.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DZWjYfWt.js → index-BvPz6vZ8.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-0fi8DIVQ.js → index-C3Ye1ISy.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-hSzyoXri.js → index-C7-T-u0L.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-DfrFNMvz.js → index-CRWpixu2.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C9yaUHm9.js → index-CatBQDSQ.js} +1 -1
  123. package/src/assets/web-panel/assets/index-CfD4tMuW.js +1 -0
  124. package/src/assets/web-panel/assets/{index-DMR-keCL.js → index-CqH-oOR3.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Cy865Hhq.js → index-CwsoVDi-.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DI5bRqNG.js → index-CyBtEVLM.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-gt5N6VM_.js → index-D5P498Rk.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-6dDDSCHD.js → index-DKaB4xTf.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BKtQyb2o.js → index-DQYZa1Ci.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CaIclw-E.js → index-DZ9CNcbJ.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-_FIz-0tp.js → index-DZAsByy4.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DBRlZdZj.js → index-D_HY0nyN.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DsCdl2Od.js → index-Da8frO_A.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Cfsn7N18.js → index-DjB8IC9D.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CeYP_kT9.js → index-Dwpthe2b.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-B8WuPI-h.js → index-Fm95dO4u.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-CK2U_AHi.js → index-GTefQSbY.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-DnU-dUWd.js → index-OEWSrqit.js} +1 -1
  139. package/src/assets/web-panel/assets/{index-DDAe1UmZ.js → index-TYMmUsxZ.js} +1 -1
  140. package/src/assets/web-panel/assets/{index-D2BfSIrn.js → index-iHNOr_wL.js} +1 -1
  141. package/src/assets/web-panel/assets/{index-Cz7f4Jaq.js → index-mxxZtsHp.js} +1 -1
  142. package/src/assets/web-panel/assets/{index-BHmdMKYl.js → index-pYwYBVeQ.js} +1 -1
  143. package/src/assets/web-panel/assets/{initDefaultProps-DvzKJ6o5.js → initDefaultProps-BeUrpC_H.js} +1 -1
  144. package/src/assets/web-panel/assets/{motion-D1yTvmxW.js → motion-CHW5EXt1.js} +1 -1
  145. package/src/assets/web-panel/assets/{move-DxtSIF8K.js → move-CWaoWJvF.js} +1 -1
  146. package/src/assets/web-panel/assets/{mtc-parser-BDsQgIHY.js → mtc-parser-CEC6Us1u.js} +1 -1
  147. package/src/assets/web-panel/assets/{omit-UVBJW8kh.js → omit-1D-kP_Qj.js} +1 -1
  148. package/src/assets/web-panel/assets/{pickAttrs-D4QqtTyX.js → pickAttrs-CsS0myLl.js} +1 -1
  149. package/src/assets/web-panel/assets/{placementArrow-QXmu6vBf.js → placementArrow-bMThOvkI.js} +1 -1
  150. package/src/assets/web-panel/assets/{responsiveObserve-D-PmXO9M.js → responsiveObserve-B72knbW8.js} +1 -1
  151. package/src/assets/web-panel/assets/{slide-CKbGxEZJ.js → slide-C3bI_2yy.js} +1 -1
  152. package/src/assets/web-panel/assets/{statusUtils-BbgXPkXm.js → statusUtils-0-FmcCAS.js} +1 -1
  153. package/src/assets/web-panel/assets/{styleChecker-DOr9rk68.js → styleChecker-DXUyqoWY.js} +1 -1
  154. package/src/assets/web-panel/assets/{useFlexGapSupport-B2wO2r36.js → useFlexGapSupport-BSSnL3f1.js} +1 -1
  155. package/src/assets/web-panel/assets/{useFs-SeVGBK34.js → useFs-B0Cvvl0S.js} +1 -1
  156. package/src/assets/web-panel/assets/{usePersonalDataHub-DUJBCxjD.js → usePersonalDataHub-6D-d4WU5.js} +1 -1
  157. package/src/assets/web-panel/assets/{vnode-CF4EYsig.js → vnode-zjIrlxT_.js} +1 -1
  158. package/src/assets/web-panel/assets/{zoom-pRUs5pqI.js → zoom-Hw7NEisu.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/agent-sandbox.js +302 -2
  174. package/src/lib/app-server/server.js +14 -0
  175. package/src/lib/background-agent-supervisor.js +14 -4
  176. package/src/lib/causal-observability.js +64 -1
  177. package/src/lib/checkpoint-summary-projection.js +98 -0
  178. package/src/lib/checkpoint-timeline-authority.js +15 -51
  179. package/src/lib/claude-code-bridge.js +302 -60
  180. package/src/lib/codex-app-server-adapter.js +161 -35
  181. package/src/lib/cost-budget.js +4 -0
  182. package/src/lib/doctor-checkup.js +31 -2
  183. package/src/lib/durable-security-store.js +6 -1
  184. package/src/lib/evolution/evolution-artifact-identity.js +21 -0
  185. package/src/lib/evolution/evolution-artifact-ports.js +5 -11
  186. package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
  187. package/src/lib/execution-location-failure-site.js +63 -0
  188. package/src/lib/execution-location-target.js +102 -8
  189. package/src/lib/external-agent-adapters.js +2 -0
  190. package/src/lib/image-file-boundary.js +154 -0
  191. package/src/lib/image-input.js +16 -3
  192. package/src/lib/llm-pricing.js +114 -8
  193. package/src/lib/lsp/code-intelligence.js +7 -1
  194. package/src/lib/mcp-call-ledger-store.js +7 -2
  195. package/src/lib/model-capabilities.js +21 -10
  196. package/src/lib/model-context-catalog.js +60 -1
  197. package/src/lib/openai-responses.js +7 -1
  198. package/src/lib/orchestrator.js +8 -2
  199. package/src/lib/process-execution-broker/index.js +93 -1
  200. package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
  201. package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
  202. package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
  203. package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
  204. package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
  205. package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
  206. package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
  207. package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
  208. package/src/lib/runtime-usage-ledger.js +3 -0
  209. package/src/lib/sandbox-docker-egress.js +507 -0
  210. package/src/lib/sandbox-egress-proxy.js +167 -10
  211. package/src/lib/sandbox-egress-worker-thread.js +38 -0
  212. package/src/lib/sandbox-egress-worker.js +196 -0
  213. package/src/lib/secure-fs.js +158 -42
  214. package/src/lib/session-branch-history.js +240 -0
  215. package/src/lib/session-history-origins.js +285 -0
  216. package/src/lib/session-input-receipt.js +110 -0
  217. package/src/lib/session-resource-budget.js +8 -8
  218. package/src/lib/session-transcript-history.js +456 -0
  219. package/src/lib/session-transcript-page.js +164 -0
  220. package/src/lib/session-transcript-reference.js +38 -0
  221. package/src/lib/session-usage.js +8 -0
  222. package/src/lib/token-tracker.js +32 -54
  223. package/src/lib/usage-pricing-context.js +93 -0
  224. package/src/runtime/agent-core.js +141 -21
  225. package/src/runtime/headless-stream.js +202 -4
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-D0WrJQaQ.js +0 -1
  227. package/src/assets/web-panel/assets/Projects-CRaSI25Z.js +0 -1
  228. package/src/assets/web-panel/assets/devWarning-CmgDNkoO.js +0 -1
  229. package/src/assets/web-panel/assets/index-BpIZ2S01.js +0 -1
  230. package/src/assets/web-panel/assets/index-C-VmKuyv.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 = {