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
@@ -7,45 +7,7 @@
7
7
 
8
8
  import { createHash } from "crypto";
9
9
 
10
- /**
11
- * Pricing data per million tokens (USD)
12
- */
13
- const PRICING = {
14
- ollama: { input: 0, output: 0 },
15
- openai: {
16
- "gpt-4o": { input: 2.5, output: 10 },
17
- "gpt-4o-mini": { input: 0.15, output: 0.6 },
18
- "gpt-4-turbo": { input: 10, output: 30 },
19
- "gpt-3.5-turbo": { input: 0.5, output: 1.5 },
20
- o1: { input: 15, output: 60 },
21
- _default: { input: 2.5, output: 10 },
22
- },
23
- anthropic: {
24
- // Current Anthropic list prices (USD/1M), verified 2026-06-21 vs the
25
- // claude-api reference. Lookup is EXACT-key (calculateCost), so keep current
26
- // model ids listed or they fall back to the Sonnet _default and mis-price —
27
- // e.g. claude-opus-4-8 would otherwise be billed at $3/$15 not $5/$25. The
28
- // Opus tier dropped to $5/$25 with Opus 4.5; Haiku 4.5 is $1/$5.
29
- "claude-opus-4-8": { input: 5, output: 25 },
30
- "claude-opus-4-7": { input: 5, output: 25 },
31
- "claude-opus-4-6": { input: 5, output: 25 },
32
- "claude-opus-4-5": { input: 5, output: 25 },
33
- "claude-sonnet-4-6": { input: 3, output: 15 },
34
- "claude-haiku-4-5": { input: 1, output: 5 },
35
- "claude-haiku-4-5-20251001": { input: 1, output: 5 },
36
- "claude-fable-5": { input: 10, output: 50 },
37
- _default: { input: 3, output: 15 },
38
- },
39
- deepseek: {
40
- "deepseek-chat": { input: 0.14, output: 0.28 },
41
- _default: { input: 0.14, output: 0.28 },
42
- },
43
- dashscope: {
44
- "qwen-turbo": { input: 0.3, output: 0.6 },
45
- "qwen-plus": { input: 0.8, output: 2 },
46
- _default: { input: 0.3, output: 0.6 },
47
- },
48
- };
10
+ import { estimateCost } from "./llm-pricing.js";
49
11
 
50
12
  function ensureTokenTable(db) {
51
13
  db.exec(`
@@ -67,19 +29,22 @@ function ensureTokenTable(db) {
67
29
  /**
68
30
  * Calculate cost for a given usage
69
31
  */
70
- export function calculateCost(provider, model, inputTokens, outputTokens) {
71
- const providerPricing = PRICING[provider];
72
- if (!providerPricing) return 0;
73
-
74
- // Ollama is free
75
- if (provider === "ollama") return 0;
76
-
77
- const modelPricing = providerPricing[model] || providerPricing._default;
78
- if (!modelPricing) return 0;
79
-
80
- const inputCost = (inputTokens / 1_000_000) * modelPricing.input;
81
- const outputCost = (outputTokens / 1_000_000) * modelPricing.output;
82
- return inputCost + outputCost;
32
+ export function calculateCost(
33
+ provider,
34
+ model,
35
+ inputTokens,
36
+ outputTokens,
37
+ options = {},
38
+ ) {
39
+ const estimate = estimateCost({
40
+ ...options,
41
+ provider,
42
+ model,
43
+ inputTokens,
44
+ outputTokens,
45
+ });
46
+ // SQL NULL represents unpriced usage; it must never be confused with free.
47
+ return estimate.matched ? estimate.totalCost : null;
83
48
  }
84
49
 
85
50
  /**
@@ -98,7 +63,13 @@ export function recordUsage(db, params) {
98
63
  } = params;
99
64
 
100
65
  const totalTokens = inputTokens + outputTokens;
101
- const costUsd = calculateCost(provider, model, inputTokens, outputTokens);
66
+ const costUsd = calculateCost(
67
+ provider,
68
+ model,
69
+ inputTokens,
70
+ outputTokens,
71
+ params,
72
+ );
102
73
 
103
74
  const id = createHash("sha256")
104
75
  .update(`${Date.now()}-${Math.random()}`)
@@ -120,7 +91,7 @@ export function recordUsage(db, params) {
120
91
  endpoint,
121
92
  );
122
93
 
123
- return { id, totalTokens, costUsd };
94
+ return { id, totalTokens, costUsd, priced: costUsd !== null };
124
95
  }
125
96
 
126
97
  /**
@@ -132,6 +103,7 @@ export function getUsageStats(db, options = {}) {
132
103
  const { startDate, endDate, provider, model } = options;
133
104
  let sql = `SELECT
134
105
  COUNT(*) as total_calls,
106
+ COUNT(cost_usd) as priced_calls,
135
107
  COALESCE(SUM(input_tokens), 0) as total_input_tokens,
136
108
  COALESCE(SUM(output_tokens), 0) as total_output_tokens,
137
109
  COALESCE(SUM(total_tokens), 0) as total_tokens,
@@ -165,6 +137,11 @@ export function getUsageStats(db, options = {}) {
165
137
  total_tokens: result?.total_tokens || 0,
166
138
  total_cost_usd: result?.total_cost_usd || 0,
167
139
  avg_response_time_ms: result?.avg_response_time_ms || 0,
140
+ unpriced_calls: Math.max(
141
+ 0,
142
+ (result?.total_calls || 0) -
143
+ (result?.priced_calls ?? result?.total_calls ?? 0),
144
+ ),
168
145
  };
169
146
  }
170
147
 
@@ -178,6 +155,7 @@ export function getCostBreakdown(db) {
178
155
  .prepare(
179
156
  `SELECT provider, model,
180
157
  COUNT(*) as calls,
158
+ COUNT(*) - COUNT(cost_usd) as unpriced_calls,
181
159
  SUM(input_tokens) as input_tokens,
182
160
  SUM(output_tokens) as output_tokens,
183
161
  SUM(total_tokens) as total_tokens,
@@ -0,0 +1,93 @@
1
+ import {
2
+ DOCUMENTED_OPENAI_MODELS,
3
+ GPT6_PRICING_TERMS,
4
+ } from "./model-context-catalog.js";
5
+
6
+ /** Only bounded, non-secret pricing labels may enter the durable usage ledger. */
7
+ export function projectUsagePricingContext(usage = {}) {
8
+ const projected = {};
9
+ for (const [key, alias] of [
10
+ ["service_tier", "serviceTier"],
11
+ ["regional_processing", "regionalProcessing"],
12
+ ]) {
13
+ if (!Object.hasOwn(usage, key) && !Object.hasOwn(usage, alias)) continue;
14
+ if (
15
+ Object.hasOwn(usage, key) &&
16
+ Object.hasOwn(usage, alias) &&
17
+ usage[key] !== usage[alias]
18
+ ) {
19
+ throw new TypeError(`usage pricing aliases conflict: ${key}`);
20
+ }
21
+ const value = Object.hasOwn(usage, key) ? usage[key] : usage[alias];
22
+ if (key === "service_tier") {
23
+ projected[key] =
24
+ typeof value === "string" &&
25
+ Object.hasOwn(GPT6_PRICING_TERMS.serviceMultipliers, value)
26
+ ? value
27
+ : "unknown";
28
+ } else {
29
+ if (typeof value !== "boolean")
30
+ throw new TypeError("usage regional processing must be boolean");
31
+ projected[key] = value;
32
+ }
33
+ }
34
+ return projected;
35
+ }
36
+
37
+ /** Preserve per-request thresholds in a bounded set of aggregate price buckets. */
38
+ export function mergeUsagePricingBucket(entry, usage) {
39
+ if (
40
+ String(entry.provider).toLowerCase() !== "openai" ||
41
+ !DOCUMENTED_OPENAI_MODELS[String(entry.model).toLowerCase()]?.pricing
42
+ )
43
+ return;
44
+ const metadata = projectUsagePricingContext(usage);
45
+ const promptTokens =
46
+ usage.requestInputTokens ??
47
+ usage.inputTokens +
48
+ (usage.cacheReadTokens || 0) +
49
+ (usage.cacheCreationTokens || 0);
50
+ const long = promptTokens > GPT6_PRICING_TERMS.longContext.threshold;
51
+ const serviceTier = metadata.service_tier || "standard";
52
+ const regionalProcessing = metadata.regional_processing === true;
53
+ entry.pricingBuckets ||= [];
54
+ let bucket = entry.pricingBuckets.find(
55
+ (item) =>
56
+ item.serviceTier === serviceTier &&
57
+ item.regionalProcessing === regionalProcessing &&
58
+ item.requestInputTokens > GPT6_PRICING_TERMS.longContext.threshold ===
59
+ long,
60
+ );
61
+ if (!bucket) {
62
+ bucket = {
63
+ inputTokens: 0,
64
+ outputTokens: 0,
65
+ cacheReadTokens: 0,
66
+ cacheCreationTokens: 0,
67
+ totalTokens: 0,
68
+ calls: 0,
69
+ serviceTier,
70
+ regionalProcessing,
71
+ requestInputTokens: promptTokens,
72
+ };
73
+ entry.pricingBuckets.push(bucket);
74
+ }
75
+ for (const key of [
76
+ "inputTokens",
77
+ "outputTokens",
78
+ "cacheReadTokens",
79
+ "cacheCreationTokens",
80
+ "totalTokens",
81
+ "calls",
82
+ ]) {
83
+ const value = usage[key] ?? (key === "calls" ? 1 : 0);
84
+ if (
85
+ !Number.isSafeInteger(value) ||
86
+ value < 0 ||
87
+ !Number.isSafeInteger(bucket[key] + value)
88
+ ) {
89
+ throw new TypeError(`invalid pricing bucket ${key}`);
90
+ }
91
+ bucket[key] += value;
92
+ }
93
+ }
@@ -6637,34 +6637,55 @@ async function executeToolInner(
6637
6637
  );
6638
6638
  }
6639
6639
  await admitShellDispatch();
6640
- const { executeSandboxedShell, sandboxSummary } =
6641
- await import("../lib/agent-sandbox.js");
6642
- // Domain-restricted networking is ENFORCED by routing the sandboxed
6643
- // process's egress through a local filtering proxy (see
6644
- // sandbox-egress-proxy.js). Start it only when the policy actually
6645
- // restricts domains and network is on; tear it down after the command.
6640
+ const {
6641
+ assessAgentSandboxCapabilities,
6642
+ executeDockerEgressShell,
6643
+ executeSandboxedShell,
6644
+ sandboxSummary,
6645
+ } = await import("../lib/agent-sandbox.js");
6646
+ // Keep the proxy on a separate event loop: the legacy sandbox dispatch
6647
+ // below is synchronous. The sandbox still refuses domain-restricted
6648
+ // execution until a non-bypassable network backend is available.
6646
6649
  const sboxPolicy = shellSandbox.policy || {};
6647
6650
  const needsEgress =
6648
6651
  shellSandbox.network === true &&
6649
6652
  (sboxPolicy.allowedDomains?.length || 0) +
6650
6653
  (sboxPolicy.deniedDomains?.length || 0) >
6651
6654
  0;
6655
+ const dockerEgress = shellSandbox.engine === "docker-egress";
6652
6656
  let egressProxy = null;
6653
6657
  let proxyHandle = null;
6658
+ let privateSocketDir = null;
6659
+ let dockerEgressSession = null;
6660
+ let proxyFailed = false;
6654
6661
  if (needsEgress) {
6655
6662
  try {
6656
- const { createEgressProxy } =
6657
- await import("../lib/sandbox-egress-proxy.js");
6658
- proxyHandle = createEgressProxy(
6663
+ const { startEgressProxyWorker } =
6664
+ await import("../lib/sandbox-egress-worker.js");
6665
+ if (dockerEgress) {
6666
+ privateSocketDir = fs.mkdtempSync(
6667
+ path.join(os.tmpdir(), "cc-egress-"),
6668
+ );
6669
+ fs.chmodSync(privateSocketDir, 0o700);
6670
+ }
6671
+ proxyHandle = await startEgressProxyWorker(
6659
6672
  {
6660
6673
  allowedDomains: sboxPolicy.allowedDomains || [],
6661
6674
  deniedDomains: sboxPolicy.deniedDomains || [],
6662
6675
  allowPrivate: sboxPolicy.allowPrivate === true,
6663
6676
  },
6664
- { bindHost: "0.0.0.0" }, // reachable from the container/netns
6677
+ {
6678
+ bindHost: "127.0.0.1",
6679
+ ...(privateSocketDir
6680
+ ? { socketPath: path.join(privateSocketDir, "broker.sock") }
6681
+ : {}),
6682
+ onFailure() {
6683
+ proxyFailed = true;
6684
+ void dockerEgressSession?.close().catch(() => {});
6685
+ },
6686
+ },
6665
6687
  );
6666
- const listened = await proxyHandle.listen();
6667
- egressProxy = { port: listened.port };
6688
+ if (proxyHandle.port) egressProxy = { port: proxyHandle.port };
6668
6689
  } catch {
6669
6690
  // If the proxy can't start, leave egressProxy null so the sandbox
6670
6691
  // fails closed (refuses) rather than running without enforcement.
@@ -6687,15 +6708,72 @@ async function executeToolInner(
6687
6708
  error.pluginBinFailClosed = true;
6688
6709
  throw error;
6689
6710
  }
6690
- result = executeSandboxedShell(args.command, shellSandbox, {
6691
- cwd: args.cwd || cwd,
6692
- timeout: _resolveShellTimeout(args.timeout),
6693
- maxBuffer: 1024 * 1024,
6694
- egressProxy,
6695
- env: sandboxChildEnvironment,
6696
- auditContext: createShellProcessAuditContext(),
6697
- });
6711
+ if (dockerEgress && !proxyHandle?.socketPath) {
6712
+ result = {
6713
+ stdout: "",
6714
+ stderr: "Docker egress policy broker is unavailable",
6715
+ exitCode: 1,
6716
+ failedToStart: true,
6717
+ sandboxCapabilities: assessAgentSandboxCapabilities(
6718
+ shellSandbox,
6719
+ {
6720
+ execution: { attempted: true, started: false },
6721
+ availability: {
6722
+ available: false,
6723
+ reason: "egress-broker-unavailable",
6724
+ },
6725
+ },
6726
+ ),
6727
+ };
6728
+ } else if (dockerEgress) {
6729
+ result = await executeDockerEgressShell(
6730
+ args.command,
6731
+ shellSandbox,
6732
+ {
6733
+ cwd: args.cwd || cwd,
6734
+ timeoutMs: _resolveShellTimeout(args.timeout),
6735
+ brokerSocketPath: proxyHandle.socketPath,
6736
+ env: sandboxChildEnvironment,
6737
+ auditContext: createShellProcessAuditContext(),
6738
+ onSession(session) {
6739
+ dockerEgressSession = session;
6740
+ if (proxyFailed) void session.close().catch(() => {});
6741
+ },
6742
+ async beforeStart() {
6743
+ await shellDispatchPolicyAuthority?.revalidate?.();
6744
+ refreshPluginExecutionAuthority();
6745
+ if (
6746
+ proxyFailed ||
6747
+ proxyHandle.revision !== 0 ||
6748
+ pluginBinSandboxPolicy
6749
+ ) {
6750
+ const error = new Error(
6751
+ "Docker egress authority changed before target start",
6752
+ );
6753
+ error.code = "CC_DOCKER_EGRESS_AUTHORITY_CHANGED";
6754
+ throw error;
6755
+ }
6756
+ },
6757
+ },
6758
+ );
6759
+ } else {
6760
+ result = executeSandboxedShell(args.command, shellSandbox, {
6761
+ cwd: args.cwd || cwd,
6762
+ timeout: _resolveShellTimeout(args.timeout),
6763
+ maxBuffer: 1024 * 1024,
6764
+ egressProxy,
6765
+ env: sandboxChildEnvironment,
6766
+ auditContext: createShellProcessAuditContext(),
6767
+ });
6768
+ }
6698
6769
  } finally {
6770
+ if (dockerEgressSession) {
6771
+ try {
6772
+ await dockerEgressSession.close();
6773
+ } catch {
6774
+ /* execution result retains its cleanup status */
6775
+ }
6776
+ }
6699
6777
  if (proxyHandle) {
6700
6778
  try {
6701
6779
  await proxyHandle.close();
@@ -6703,10 +6781,26 @@ async function executeToolInner(
6703
6781
  /* best-effort teardown */
6704
6782
  }
6705
6783
  }
6784
+ if (privateSocketDir) {
6785
+ try {
6786
+ fs.rmSync(path.join(privateSocketDir, "broker.sock"), {
6787
+ force: true,
6788
+ });
6789
+ fs.rmdirSync(privateSocketDir);
6790
+ } catch {
6791
+ /* a failed broker cleanup remains visible via failed-to-start */
6792
+ }
6793
+ }
6706
6794
  }
6707
6795
  const common = {
6708
6796
  sandbox: sandboxSummary(shellSandbox),
6709
6797
  sandboxCapabilities: result.sandboxCapabilities || null,
6798
+ ...(result.executionOutcome
6799
+ ? {
6800
+ executionOutcome: result.executionOutcome,
6801
+ retrySafe: result.retrySafe,
6802
+ }
6803
+ : {}),
6710
6804
  shellCommandPolicy: shellPolicy,
6711
6805
  approval: approvalOutcome,
6712
6806
  policyTrace: ["shell-policy", "approval", "sandbox"],
@@ -11740,7 +11834,33 @@ export async function chatWithTools(rawMessages, options) {
11740
11834
  throw new Error("Invalid API response: no choices returned");
11741
11835
  }
11742
11836
  const choice = data.choices[0];
11743
- const out = { message: choice.message };
11837
+ const providerMessage = choice.message;
11838
+ if (
11839
+ !providerMessage ||
11840
+ typeof providerMessage !== "object" ||
11841
+ Array.isArray(providerMessage) ||
11842
+ providerMessage.role !== "assistant" ||
11843
+ (providerMessage.content !== null &&
11844
+ providerMessage.content !== undefined &&
11845
+ typeof providerMessage.content !== "string") ||
11846
+ (Object.hasOwn(providerMessage, "tool_calls") &&
11847
+ !Array.isArray(providerMessage.tool_calls)) ||
11848
+ (Object.hasOwn(providerMessage, "reasoning_content") &&
11849
+ providerMessage.reasoning_content !== null &&
11850
+ typeof providerMessage.reasoning_content !== "string") ||
11851
+ Object.keys(providerMessage).some(
11852
+ (key) =>
11853
+ !["role", "content", "tool_calls", "reasoning_content"].includes(key),
11854
+ )
11855
+ ) {
11856
+ throw new TypeError("Invalid API response: unsupported assistant message");
11857
+ }
11858
+ // Provider reasoning text is not part of the governed replay protocol.
11859
+ const message = { role: "assistant", content: providerMessage.content };
11860
+ if (Object.hasOwn(providerMessage, "tool_calls")) {
11861
+ message.tool_calls = providerMessage.tool_calls;
11862
+ }
11863
+ const out = { message };
11744
11864
  const providerReceipt = supportsOpenAIRequestIdentity
11745
11865
  ? _openAIProviderRequestReceipt(response, data, providerRequestId)
11746
11866
  : null;