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
@@ -39,21 +39,62 @@ function projectNotification(notification) {
39
39
  if (method === "turn/started") {
40
40
  return { method: "turn/started", params: { turn: params.turn } };
41
41
  }
42
+ const deltaKinds = {
43
+ "item/agentMessage/delta": "assistant_message",
44
+ "item/commandExecution/outputDelta": "tool",
45
+ "item/fileChange/outputDelta": "tool",
46
+ "item/reasoning/textDelta": "reasoning",
47
+ "item/reasoning/summaryTextDelta": "reasoning",
48
+ };
49
+ if (Object.hasOwn(deltaKinds, method)) {
50
+ return {
51
+ method: "item/delta",
52
+ params: {
53
+ item: {
54
+ id: params.itemId,
55
+ kind: deltaKinds[method],
56
+ status: "streaming",
57
+ delta: params.delta || "",
58
+ },
59
+ },
60
+ ...(method === "item/agentMessage/delta"
61
+ ? {
62
+ outputDelta: String(params.delta || ""),
63
+ outputItemId: params.itemId,
64
+ }
65
+ : {}),
66
+ };
67
+ }
68
+ if (method === "thread/tokenUsage/updated") {
69
+ return {
70
+ method: "thread/usage",
71
+ params: { tokenUsage: params.tokenUsage },
72
+ usage: params.tokenUsage?.last || null,
73
+ };
74
+ }
42
75
  if (["item/started", "item/updated", "item/completed"].includes(method)) {
43
76
  const item = params.item || {};
44
- const status = method === "item/completed" ? "completed" : "streaming";
77
+ const tool = item.type === "commandExecution" || item.type === "fileChange";
78
+ let status = method === "item/completed" ? "completed" : "streaming";
79
+ // item/completed means lifecycle closure, not successful execution. A
80
+ // declined approval still closes the tool item before interrupting the
81
+ // turn. Preserve that outcome and never infer success for unknown states.
82
+ if (method === "item/completed" && tool) {
83
+ status = ["completed", "failed", "declined"].includes(item.status)
84
+ ? item.status
85
+ : "unknown";
86
+ }
45
87
  return {
46
88
  method: method === "item/updated" ? "item/delta" : method,
47
89
  params: {
48
90
  item: {
49
91
  id: item.id,
50
92
  kind:
51
- item.type === "agent_message"
93
+ item.type === "agentMessage"
52
94
  ? "assistant_message"
53
95
  : item.type === "reasoning"
54
96
  ? "reasoning"
55
- : item.type === "command_execution" ||
56
- item.type === "file_change"
97
+ : tool
57
98
  ? "tool"
58
99
  : "artifact",
59
100
  status,
@@ -61,9 +102,10 @@ function projectNotification(notification) {
61
102
  },
62
103
  },
63
104
  output:
64
- method === "item/completed" && item.type === "agent_message"
105
+ method === "item/completed" && item.type === "agentMessage"
65
106
  ? String(item.text || "")
66
- : "",
107
+ : undefined,
108
+ outputItemId: item.id,
67
109
  };
68
110
  }
69
111
  if (method === "turn/completed" || method === "turn/failed") {
@@ -160,44 +202,97 @@ export class CodexAppServerAdapter extends EventEmitter {
160
202
  }
161
203
  const notifications = [];
162
204
  const unknownMethods = new Set();
163
- let output = "";
205
+ const outputItems = new Map();
206
+ let usage = null;
164
207
  let activeThreadId = threadId;
208
+ let activeTurnId = null;
165
209
  let submissionStarted = false;
166
210
  let admissionObserved = false;
167
211
  let observedTerminal = null;
168
212
  let terminalResolve;
169
- let terminalReject;
170
- const terminal = new Promise((resolve, reject) => {
213
+ const terminal = new Promise((resolve) => {
171
214
  terminalResolve = resolve;
172
- terminalReject = reject;
173
215
  });
216
+ let deadlineReject;
217
+ const deadline = new Promise((_, reject) => {
218
+ deadlineReject = reject;
219
+ });
220
+ // Attach immediately: startup/RPC may hang or reject before terminal await.
221
+ deadline.catch(() => {});
174
222
  const timer = setTimeout(
175
223
  () =>
176
- terminalReject(
224
+ deadlineReject(
177
225
  adapterError(
178
226
  "CC_CODEX_APP_SERVER_TIMEOUT",
179
- "Codex App Server turn timed out after admission",
227
+ "Codex App Server request timed out",
180
228
  ),
181
229
  ),
182
230
  this.timeoutMs,
183
231
  );
184
232
  timer.unref?.();
233
+ const withinDeadline = (pending) => Promise.race([pending, deadline]);
234
+ let buffered = [];
235
+ let retainedBytes = 0;
236
+ let eventFailure = null;
237
+ const retain = (notification) => {
238
+ retainedBytes += Buffer.byteLength(JSON.stringify(notification));
239
+ if (
240
+ retainedBytes > 4 * 1024 * 1024 ||
241
+ notifications.length + buffered.length >= 4096
242
+ ) {
243
+ eventFailure = adapterError(
244
+ "CC_CODEX_APP_SERVER_EVENT_LIMIT",
245
+ "Codex App Server event retention limit exceeded",
246
+ );
247
+ deadlineReject(eventFailure);
248
+ return false;
249
+ }
250
+ return true;
251
+ };
185
252
  const onNotification = (notification) => {
253
+ if (observedTerminal || eventFailure || !submissionStarted) return;
254
+ const params = notification?.params || {};
255
+ const eventThread =
256
+ params.threadId ||
257
+ (notification.method === "thread/started" ? params.thread?.id : null);
258
+ if (!eventThread || eventThread !== activeThreadId) return;
259
+ if (!activeTurnId) {
260
+ if (retain(notification)) buffered.push(notification);
261
+ return;
262
+ }
263
+ const eventTurn = params.turnId || params.turn?.id;
264
+ // Thread-wide events carry no turn. Only thread/started is safe to
265
+ // project here; usage and terminal events require the exact turn ID.
266
+ if (
267
+ notification.method !== "thread/started" &&
268
+ eventTurn !== activeTurnId
269
+ )
270
+ return;
271
+ if (!retain(notification)) return;
186
272
  const projected = projectNotification(notification);
187
- if (projected.unknownMethod) unknownMethods.add(projected.unknownMethod);
188
- else {
273
+ if (projected.unknownMethod) {
274
+ if (unknownMethods.size < 64)
275
+ unknownMethods.add(projected.unknownMethod);
276
+ } else {
277
+ projected.params = {
278
+ ...projected.params,
279
+ threadId: activeThreadId,
280
+ turnId: activeTurnId,
281
+ };
189
282
  notifications.push(projected);
190
283
  this.emit("notification", projected);
191
284
  }
192
- if (
193
- submissionStarted &&
194
- (projected.method === "turn/started" ||
195
- projected.method?.startsWith("item/") ||
196
- Boolean(projected.terminal))
197
- ) {
198
- admissionObserved = true;
285
+ if (projected.outputItemId) {
286
+ if (projected.output !== undefined)
287
+ outputItems.set(projected.outputItemId, projected.output);
288
+ else if (projected.outputDelta)
289
+ outputItems.set(
290
+ projected.outputItemId,
291
+ (outputItems.get(projected.outputItemId) || "") +
292
+ projected.outputDelta,
293
+ );
199
294
  }
200
- if (projected.output) output = projected.output;
295
+ if (projected.usage) usage = projected.usage;
201
296
  if (projected.terminal) {
202
297
  observedTerminal = projected;
203
298
  terminalResolve(projected);
@@ -208,10 +303,11 @@ export class CodexAppServerAdapter extends EventEmitter {
208
303
  Object.freeze({
209
304
  protocol: CODEX_APP_SERVER_PROTOCOL,
210
305
  threadId: activeThreadId,
306
+ turnId: activeTurnId,
211
307
  terminal: terminalEvent.terminal,
212
- output,
308
+ output: [...outputItems.values()].join("\n"),
213
309
  error: terminalEvent.error || null,
214
- usage: terminalEvent.usage || null,
310
+ usage: terminalEvent.usage || usage,
215
311
  notifications: Object.freeze(notifications),
216
312
  unknownMethods: Object.freeze([...unknownMethods].sort()),
217
313
  fallback: false,
@@ -219,13 +315,14 @@ export class CodexAppServerAdapter extends EventEmitter {
219
315
  });
220
316
  try {
221
317
  if (!this.client.running && typeof this.client.start === "function") {
222
- await this.client.start();
318
+ await withinDeadline(this.client.start());
223
319
  }
224
320
  if (!activeThreadId) {
225
- const started = await this.client.request("thread/start", {
226
- ephemeral: false,
227
- provider: "codex",
228
- });
321
+ const started = await withinDeadline(
322
+ this.client.request("thread/start", {
323
+ ephemeral: false,
324
+ }),
325
+ );
229
326
  activeThreadId = started?.thread?.id;
230
327
  }
231
328
  if (!activeThreadId) {
@@ -238,20 +335,49 @@ export class CodexAppServerAdapter extends EventEmitter {
238
335
  // the server did not accept the input. Never launch a second execution
239
336
  // path from that ambiguous state.
240
337
  submissionStarted = true;
241
- const started = await this.client.request("turn/start", {
242
- threadId: activeThreadId,
243
- input: [{ type: "text", text: String(prompt || "") }],
244
- });
338
+ const started = await withinDeadline(
339
+ this.client.request("turn/start", {
340
+ threadId: activeThreadId,
341
+ input: [{ type: "text", text: String(prompt || "") }],
342
+ }),
343
+ );
344
+ activeTurnId = started?.turn?.id;
345
+ if (typeof activeTurnId !== "string" || !activeTurnId) {
346
+ throw adapterError(
347
+ "CC_CODEX_APP_SERVER_PROTOCOL_FAILED",
348
+ "Codex App Server did not return a turn identity",
349
+ );
350
+ }
245
351
  admissionObserved = true;
352
+ if (eventFailure) throw eventFailure;
353
+ const early = buffered;
354
+ buffered = [];
355
+ retainedBytes = 0;
356
+ for (const notification of early) onNotification(notification);
357
+ if (eventFailure) throw eventFailure;
358
+ // Some servers finish before writing the RPC response, including items
359
+ // in the response without separate item notifications.
360
+ if (!observedTerminal)
361
+ for (const item of started.turn.items || []) {
362
+ onNotification({
363
+ method: "item/completed",
364
+ params: { threadId: activeThreadId, turnId: activeTurnId, item },
365
+ });
366
+ }
367
+ if (eventFailure) throw eventFailure;
246
368
  const initialStatus = String(started?.turn?.status || "");
247
369
  const terminalEvent = ["completed", "failed", "interrupted"].includes(
248
370
  initialStatus,
249
371
  )
250
372
  ? projectNotification({
251
373
  method: "turn/completed",
252
- params: { turn: started.turn, usage: started.turn.usage || null },
374
+ params: {
375
+ threadId: activeThreadId,
376
+ turn: started.turn,
377
+ usage: started.turn.usage || null,
378
+ },
253
379
  })
254
- : await terminal;
380
+ : await withinDeadline(terminal);
255
381
  return buildResult(terminalEvent);
256
382
  } catch (error) {
257
383
  if (!submissionStarted) {
@@ -18,6 +18,7 @@
18
18
  */
19
19
 
20
20
  import { estimateCost } from "./llm-pricing.js";
21
+ import { projectUsagePricingContext } from "./usage-pricing-context.js";
21
22
 
22
23
  /** Parse a `--max-budget-usd` value into a positive number, or null when unset. */
23
24
  export function parseBudgetUsd(value) {
@@ -64,6 +65,7 @@ export class CostBudget {
64
65
  // or it undercounts real spend on a cached Anthropic run and stops too late.
65
66
  const cacheReadTokens = usage?.cache_read_input_tokens || 0;
66
67
  const cacheCreationTokens = usage?.cache_creation_input_tokens || 0;
68
+ const pricingContext = projectUsagePricingContext(usage || {});
67
69
  const est = estimateCost({
68
70
  provider,
69
71
  model,
@@ -71,6 +73,8 @@ export class CostBudget {
71
73
  outputTokens: usage?.output_tokens || 0,
72
74
  cacheReadTokens,
73
75
  cacheCreationTokens,
76
+ serviceTier: pricingContext.service_tier ?? "standard",
77
+ regionalProcessing: pricingContext.regional_processing === true,
74
78
  table: this.table,
75
79
  });
76
80
  const tokens =
@@ -26,6 +26,7 @@ import {
26
26
  rmSync,
27
27
  } from "node:fs";
28
28
  import { join, basename } from "node:path";
29
+ import { release as kernelRelease } from "node:os";
29
30
  import { getHomeDir, getConfigPath } from "./paths.js";
30
31
  import { inspectPrivatePaths, repairPrivatePaths } from "./secure-fs.js";
31
32
  import executionBroker from "./process-execution-broker/index.js";
@@ -68,6 +69,7 @@ export const _deps = {
68
69
  spawnSync: (...args) => executionBroker.spawnSync(...args),
69
70
  now: () => Date.now(),
70
71
  platform: () => process.platform,
72
+ kernelRelease,
71
73
  };
72
74
 
73
75
  function check(id, name, level, detail = "", fix = null) {
@@ -1242,12 +1244,39 @@ async function runtimeSection(opts, deps) {
1242
1244
 
1243
1245
  // ── execution context (P1-7) ───────────────────────────────────────────────
1244
1246
  // "任务在哪执行是 Session 一等属性": surface the DETECTED execution location and
1245
- // the fail-closed permission posture it implies. Read-only advisory — it never
1246
- // blocks. A local trusted machine is OK; a remote/unknown environment is a WARN
1247
+ // the fail-closed permission posture it implies. Read-only diagnosis; this does
1248
+ // not change execution authority. A remote/unknown environment is a WARN
1247
1249
  // because a session there fails closed to read-only unless powers are granted
1248
1250
  // explicitly (and any policy violation from the pure model is listed).
1249
1251
  async function executionSection(opts, deps) {
1250
1252
  const checks = [];
1253
+ try {
1254
+ // WSL1 lacks STATX_BTIME: Node substitutes mutable ctime for birthtime.
1255
+ // Do not silently drop generation from workspace identity, reset consent,
1256
+ // or claim that a different kernel establishes filesystem trust support.
1257
+ if (
1258
+ deps.platform() === "linux" &&
1259
+ /^4\.4\..*-Microsoft$/iu.test(deps.kernelRelease())
1260
+ ) {
1261
+ checks.push(
1262
+ check(
1263
+ "workspace-trust-identity",
1264
+ "Workspace trust filesystem identity",
1265
+ CHECK_LEVELS.ERR,
1266
+ "WSL1 reports mutable change time as creation time; workspace consent can be lost after directory edits or moves. Use the native Windows CLI for workspace trust operations. There is no safe automatic repair.",
1267
+ ),
1268
+ );
1269
+ }
1270
+ } catch {
1271
+ checks.push(
1272
+ check(
1273
+ "workspace-trust-identity",
1274
+ "Workspace trust filesystem identity",
1275
+ CHECK_LEVELS.ERR,
1276
+ "Kernel information is unavailable; the WSL1 workspace trust limitation could not be checked.",
1277
+ ),
1278
+ );
1279
+ }
1251
1280
  try {
1252
1281
  const {
1253
1282
  detectAmbientLocation,
@@ -48,7 +48,12 @@ export function readSecurityStore(filePath, label) {
48
48
 
49
49
  export function writeSecurityStore(filePath, label, store) {
50
50
  const directory = path.dirname(filePath);
51
- fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
51
+ // A caller may already hold a Linux directory through /proc/self/fd/N.
52
+ // WSL1 refuses mkdir on that existing descriptor alias; keep all later
53
+ // writes and fsync bound to the held directory without reopening its path.
54
+ if (!fs.statSync(directory, { throwIfNoEntry: false })?.isDirectory()) {
55
+ fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
56
+ }
52
57
  const temporaryPath = path.join(
53
58
  directory,
54
59
  `.${path.basename(filePath)}.${process.pid}.${crypto.randomUUID()}.tmp`,
@@ -0,0 +1,21 @@
1
+ import os from "node:os";
2
+
3
+ // WSL1's stat fallback reports ctime as birthtime. Creating an index or child
4
+ // directory changes that value without replacing the object. It supplies no
5
+ // creation-time identity; keep device/inode and the caller's no-link, physical
6
+ // containment and descriptor checks. WSL2 and other platforms retain birthtime.
7
+ export function artifactPhysicalIdentity(
8
+ stat,
9
+ { platform = process.platform, kernelRelease = os.release() } = {},
10
+ ) {
11
+ const birthtimeMs = Number(stat.birthtimeMs);
12
+ const wsl1CtimeFallback =
13
+ platform === "linux" &&
14
+ /^4\.4\..*-Microsoft$/iu.test(kernelRelease) &&
15
+ birthtimeMs === Number(stat.ctimeMs);
16
+ return Object.freeze({
17
+ birthtimeMs: wsl1CtimeFallback ? null : birthtimeMs,
18
+ dev: String(stat.dev),
19
+ ino: String(stat.ino),
20
+ });
21
+ }
@@ -13,6 +13,7 @@ import fs from "node:fs";
13
13
  import path from "node:path";
14
14
  import { types as utilTypes } from "node:util";
15
15
  import { ArtifactStore } from "../artifact-store.js";
16
+ import { artifactPhysicalIdentity as physicalIdentity } from "./evolution-artifact-identity.js";
16
17
  import { withEvolutionFileIdentity } from "./evolution-file-identity.js";
17
18
  import {
18
19
  EVOLUTION_ARTIFACT_REF_SCHEMA,
@@ -1060,19 +1061,12 @@ function isContained(root, candidate) {
1060
1061
  );
1061
1062
  }
1062
1063
 
1063
- function physicalIdentity(stat) {
1064
- return Object.freeze({
1065
- birthtimeMs: Number(stat.birthtimeMs),
1066
- dev: String(stat.dev),
1067
- ino: String(stat.ino),
1068
- });
1069
- }
1070
-
1071
1064
  function samePhysicalIdentity(stat, expected) {
1065
+ const actual = physicalIdentity(stat);
1072
1066
  return (
1073
- String(stat.dev) === expected.dev &&
1074
- String(stat.ino) === expected.ino &&
1075
- Number(stat.birthtimeMs) === expected.birthtimeMs
1067
+ actual.dev === expected.dev &&
1068
+ actual.ino === expected.ino &&
1069
+ actual.birthtimeMs === expected.birthtimeMs
1076
1070
  );
1077
1071
  }
1078
1072