chainlesschain 0.166.76 → 0.166.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/README.md +19 -8
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +1 -1
  7. package/src/assets/linux-subreaper/linux-arm64/manifest.json +10 -0
  8. package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
  9. package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
  10. package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
  11. package/src/assets/web-panel/assets/{AIOps-CNaejClV.js → AIOps-DSyZEY2G.js} +1 -1
  12. package/src/assets/web-panel/assets/{ActionButton-CF_CVKT_.js → ActionButton-DhNyZ577.js} +1 -1
  13. package/src/assets/web-panel/assets/{Analytics-a3Z6J7gv.js → Analytics-HMMpxmyi.js} +3 -3
  14. package/src/assets/web-panel/assets/{AppLayout-BFtWEnct.js → AppLayout-CwKMM5Ie.js} +5 -5
  15. package/src/assets/web-panel/assets/{Artifacts-BQ8oeMvX.js → Artifacts-CNzDmph7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Audit-NOo9bmgk.js → Audit-DxWpUW3V.js} +1 -1
  17. package/src/assets/web-panel/assets/{BackgroundAgents-QRc7F3Tp.js → BackgroundAgents-C1R2ST-P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Backup-UlVgLn2P.js → Backup-B6biTaEV.js} +1 -1
  19. package/src/assets/web-panel/assets/{BaseInput-BER9LJAr.js → BaseInput-CVnkD2Z5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Chat-Z8z2Fdfz.js → Chat-Dbewl4Je.js} +6 -6
  21. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DdmuBrdQ.js → ChatBubbleRenderer-DVZ6SwC5.js} +1 -1
  22. package/src/assets/web-panel/assets/{Checkbox-CXPgyB8L.js → Checkbox-BqqiF1JE.js} +1 -1
  23. package/src/assets/web-panel/assets/{Codegen-D1vOsLJ7.js → Codegen-BVMkGumc.js} +1 -1
  24. package/src/assets/web-panel/assets/{Col-ucLnUJC7.js → Col-DmiRHy96.js} +1 -1
  25. package/src/assets/web-panel/assets/{Community-COsV9n9t.js → Community-BDlpygqA.js} +1 -1
  26. package/src/assets/web-panel/assets/{Compact-D0EkBEYh.js → Compact-B2NME_m-.js} +1 -1
  27. package/src/assets/web-panel/assets/{Compliance-C8w9SUjt.js → Compliance-BlzDLE-R.js} +1 -1
  28. package/src/assets/web-panel/assets/{Cowork-CmVaKEJS.js → Cowork-C8raPybB.js} +3 -3
  29. package/src/assets/web-panel/assets/{Cron-B_FiMMV2.js → Cron-DA8Py0zP.js} +2 -2
  30. package/src/assets/web-panel/assets/{Crosschain-ByO3YL8N.js → Crosschain-DU2XyHqB.js} +1 -1
  31. package/src/assets/web-panel/assets/{DID-DwpsLM9r.js → DID-Df098fT_.js} +2 -2
  32. package/src/assets/web-panel/assets/{Dashboard-B_8IUvM_.js → Dashboard-D1rT702x.js} +2 -2
  33. package/src/assets/web-panel/assets/{Dropdown-Bo6WQkuX.js → Dropdown-BweXGo1O.js} +1 -1
  34. package/src/assets/web-panel/assets/{EmailListRenderer-C9LiQesx.js → EmailListRenderer-B9ShbgJH.js} +1 -1
  35. package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +1 -0
  36. package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dst6VUnO.js → FamilyGuardDashboard-DrznZFVs.js} +1 -1
  37. package/src/assets/web-panel/assets/{Federation-Ci7CoLkJ.js → Federation-DQZ2adIA.js} +1 -1
  38. package/src/assets/web-panel/assets/{FormItemContext-bdDyUhUM.js → FormItemContext-DN30Dowh.js} +1 -1
  39. package/src/assets/web-panel/assets/{GenericCardRenderer-CrRwOUVi.js → GenericCardRenderer-DRdt0j1e.js} +1 -1
  40. package/src/assets/web-panel/assets/{Git-Dis8h-Z-.js → Git-wwRgStzk.js} +2 -2
  41. package/src/assets/web-panel/assets/{Governance-DX7OH5w2.js → Governance-CI4Uw0Nh.js} +1 -1
  42. package/src/assets/web-panel/assets/{Inference-Cavv_Q_Z.js → Inference-5TuE2AJI.js} +1 -1
  43. package/src/assets/web-panel/assets/{KnowledgeGraph-Cck8tnZn.js → KnowledgeGraph-oXyvmFSR.js} +1 -1
  44. package/src/assets/web-panel/assets/{Logs-BQt3aGMu.js → Logs-ewudSWuv.js} +2 -2
  45. package/src/assets/web-panel/assets/MarkdownRenderer-Cz5nyufm.js +1 -0
  46. package/src/assets/web-panel/assets/{Marketplace-CdmAKNSN.js → Marketplace-DcZeWFrs.js} +1 -1
  47. package/src/assets/web-panel/assets/{McpTools-BUlJdyPY.js → McpTools-BcV9p1RS.js} +3 -3
  48. package/src/assets/web-panel/assets/{Memory-DQRTQDr-.js → Memory-CMhYvugt.js} +2 -2
  49. package/src/assets/web-panel/assets/{MobileBridge-C0dnxgsl.js → MobileBridge-5RP2uwvT.js} +1 -1
  50. package/src/assets/web-panel/assets/{MobileProjects-DQ5Gy7fa.js → MobileProjects-BIuM9Ze4.js} +1 -1
  51. package/src/assets/web-panel/assets/{Mtc-Xl7u2isS.js → Mtc-DmBszTDe.js} +5 -5
  52. package/src/assets/web-panel/assets/{MtcAudit-C3KX0574.js → MtcAudit-Czdp5ZGt.js} +2 -2
  53. package/src/assets/web-panel/assets/{Multisig-CHEhfkn8.js → Multisig-DRWUuNr-.js} +3 -3
  54. package/src/assets/web-panel/assets/{NLProgramming-Ce38mH-8.js → NLProgramming-IRQQN0-c.js} +1 -1
  55. package/src/assets/web-panel/assets/{Notes-C7nuTd7c.js → Notes-CGhD1lW9.js} +4 -4
  56. package/src/assets/web-panel/assets/{NotificationSettings-BcoEcyq8.js → NotificationSettings-BtyPgQAh.js} +1 -1
  57. package/src/assets/web-panel/assets/{OrderTableRenderer-D-t5hKkx.js → OrderTableRenderer-yUaqwCty.js} +1 -1
  58. package/src/assets/web-panel/assets/{Organization-C_BGi4xi.js → Organization-C3kTVn5i.js} +4 -4
  59. package/src/assets/web-panel/assets/{Overflow-BodhraDq.js → Overflow-C2-0iZhq.js} +1 -1
  60. package/src/assets/web-panel/assets/{P2P-BTa3sAIy.js → P2P-CISoEUxA.js} +2 -2
  61. package/src/assets/web-panel/assets/{PdhVaultBrowser-BjZslP9T.js → PdhVaultBrowser-NfTVtvKQ.js} +5 -5
  62. package/src/assets/web-panel/assets/{Permissions-u3UDzGef.js → Permissions-CfK0jJhm.js} +3 -3
  63. package/src/assets/web-panel/assets/{PersonalDataHub-Cb7ybv65.js → PersonalDataHub-OsVxxh_j.js} +4 -4
  64. package/src/assets/web-panel/assets/{Pipeline-CS24k-P7.js → Pipeline-DEmK_Ch2.js} +1 -1
  65. package/src/assets/web-panel/assets/{Privacy-Ddj6Kqs7.js → Privacy-D61s73b0.js} +1 -1
  66. package/src/assets/web-panel/assets/{ProjectInit-Bg5uQIgg.js → ProjectInit-DkLF5gHb.js} +2 -2
  67. package/src/assets/web-panel/assets/{ProjectSettings-AmPR8T12.js → ProjectSettings-BA7odTrI.js} +2 -2
  68. package/src/assets/web-panel/assets/{Projects-DGSbAyTK.js → Projects-CdI1GcAG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Providers-Dc1C3lbB.js → Providers-D9BYyP1r.js} +1 -1
  70. package/src/assets/web-panel/assets/{QrScannerModal-Cv3HXpce.js → QrScannerModal-CXMItUDD.js} +1 -1
  71. package/src/assets/web-panel/assets/{QuickAsk-3dpbXARb.js → QuickAsk-8-tF9ffZ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Recommend-5aGRVnJK.js → Recommend-C2QGWOSi.js} +1 -1
  73. package/src/assets/web-panel/assets/{RemoteSession-CTS2jx0p.js → RemoteSession-B1M_v1lx.js} +2 -2
  74. package/src/assets/web-panel/assets/{Reputation-BxaKI0hY.js → Reputation-D0WZHgv1.js} +1 -1
  75. package/src/assets/web-panel/assets/{Row-C23uQdwd.js → Row-D6nf9-c-.js} +1 -1
  76. package/src/assets/web-panel/assets/{RssFeed-ssX9YOhm.js → RssFeed-ClZ6M-mN.js} +3 -3
  77. package/src/assets/web-panel/assets/{Search-C24GogII.js → Search-ZWkt8vuO.js} +1 -1
  78. package/src/assets/web-panel/assets/{Security-DdAcGKkk.js → Security-BUlQut2m.js} +3 -3
  79. package/src/assets/web-panel/assets/{Services-D0dCiEuq.js → Services-Cd_3xJOc.js} +2 -2
  80. package/src/assets/web-panel/assets/{Skeleton-DEY44o0v.js → Skeleton-C8e2-cHW.js} +1 -1
  81. package/src/assets/web-panel/assets/Skills-DucVRJp1.js +1 -0
  82. package/src/assets/web-panel/assets/{Sla-B_bbo2vB.js → Sla-Csr5pUwI.js} +1 -1
  83. package/src/assets/web-panel/assets/SpeechSettings-CXvyaRAT.js +1 -0
  84. package/src/assets/web-panel/assets/{SyncSettings-CpIXql0Z.js → SyncSettings-KdsIcV5h.js} +2 -2
  85. package/src/assets/web-panel/assets/Tasks-B-eHmJm9.js +1 -0
  86. package/src/assets/web-panel/assets/{Templates-C_44nVPq.js → Templates-BglVeaLK.js} +1 -1
  87. package/src/assets/web-panel/assets/{Tenant-CyZ2ey2P.js → Tenant-BBbQ8qan.js} +1 -1
  88. package/src/assets/web-panel/assets/{Terminal-DwGNHWnp.js → Terminal-Ca_pCVBi.js} +2 -2
  89. package/src/assets/web-panel/assets/{TimelineRenderer-BTAHNkqU.js → TimelineRenderer-YD6XG_vZ.js} +1 -1
  90. package/src/assets/web-panel/assets/{Tokens-DCJWkUwc.js → Tokens-2lRoeVli.js} +1 -1
  91. package/src/assets/web-panel/assets/{Trigger-BCjDO9-E.js → Trigger-C-3XNAU9.js} +1 -1
  92. package/src/assets/web-panel/assets/{Trust-_YS8WbRb.js → Trust-k-1PxdLG.js} +1 -1
  93. package/src/assets/web-panel/assets/{UkeySign-m6R8xGq7.js → UkeySign-FG-qW646.js} +1 -1
  94. package/src/assets/web-panel/assets/{VideoEditing-xOfk29c4.js → VideoEditing-BNOe1cmd.js} +1 -1
  95. package/src/assets/web-panel/assets/{Wallet-B1Gw0awc.js → Wallet-D5C3i2Kw.js} +4 -4
  96. package/src/assets/web-panel/assets/{WebAuthn-CHK5ft18.js → WebAuthn-BOpztqd3.js} +4 -4
  97. package/src/assets/web-panel/assets/{WorkflowEditor-DEp1ukQQ.js → WorkflowEditor-BpVrpUEv.js} +1 -1
  98. package/src/assets/web-panel/assets/{chat-B2sFizun.js → chat-DIuMHb38.js} +1 -1
  99. package/src/assets/web-panel/assets/{colors-DJ17YV1E.js → colors-CTFJPyzQ.js} +1 -1
  100. package/src/assets/web-panel/assets/{compact-item-CBhJJgEC.js → compact-item-CONfmJcW.js} +1 -1
  101. package/src/assets/web-panel/assets/{createContext-BZkpvNJy.js → createContext-RkW5CRrz.js} +1 -1
  102. package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +1 -0
  103. package/src/assets/web-panel/assets/{hasIn-C0ZKo6Ei.js → hasIn-CW4XOjDC.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Bc3vVG2X.js → index-7wMSBCU7.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-vFMwiAN4.js → index-Akmg1WdH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DOBXNMdh.js → index-B54qoVff.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DLo8Ls9u.js → index-B8r2t0Ch.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C7gv9dvb.js → index-B9XoBoty.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DHtpMr1G.js → index-B9aS2VLu.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Dxe0YlZe.js → index-BFs1Tznc.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DumLgj1t.js → index-BKgaRT0b.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BNp6HKFh.js → index-BM7bOUvu.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DM0rWF6z.js → index-BMg2JFmW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-4oULtRqE.js → index-BRZsPxNn.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-LPPe0val.js → index-Bf19fKef.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-Ctguam0K.js → index-BkAbfBF-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DrU5xVpF.js → index-CBjb2A5R.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CCOr6Q27.js → index-CEZWQthY.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C9gYiACH.js → index-CFGLf88d.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CZW84cEf.js → index-CLUa68JH.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-BoDUYyuo.js → index-CM2X25Er.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DyiCbHeL.js → index-CX4T2uKN.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CW5o1Gar.js → index-CixqfdRk.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-5K2z_tgO.js → index-CkRojEip.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BOfPp5OV.js → index-Cvmc3f25.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CdxJm-HB.js → index-D-lpTPS8.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-8ueG48gl.js → index-D59GbWCN.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BMxOoITz.js → index-DAESljiJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DLMr5KMd.js → index-DDHUx4Yz.js} +1 -1
  130. package/src/assets/web-panel/assets/index-DG1mcYTa.js +1 -0
  131. package/src/assets/web-panel/assets/{index-BGIvhCPl.js → index-DP5pPedy.js} +1 -1
  132. package/src/assets/web-panel/assets/index-DRs5Pe8u.js +1 -0
  133. package/src/assets/web-panel/assets/{index-DjdSFO0d.js → index-DSlXL6Ju.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Cn5UzvgR.js → index-DWCJnn2O.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Chct9tL8.js → index-DWY7YwDu.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BEnd5fiz.js → index-DZTwP364.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-KzNhWykP.js → index-DidrMvOx.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-BpyrhOeh.js → index-Dj3K5kHs.js} +1 -1
  139. package/src/assets/web-panel/assets/{index-CZlkPrxb.js → index-YaeGscSw.js} +1 -1
  140. package/src/assets/web-panel/assets/{index-Dfgxe-fw.js → index-YlMnFNOi.js} +1 -1
  141. package/src/assets/web-panel/assets/{index-IHgzfc1u.js → index-asWsB34i.js} +1 -1
  142. package/src/assets/web-panel/assets/{index-DJkoJzTU.js → index-gkjiFjQd.js} +1 -1
  143. package/src/assets/web-panel/assets/{initDefaultProps-Cqfoq0TJ.js → initDefaultProps-BOr4igh3.js} +1 -1
  144. package/src/assets/web-panel/assets/{motion-CIiVJHNu.js → motion-CK469n2j.js} +1 -1
  145. package/src/assets/web-panel/assets/{move-CFl1o_A8.js → move-DzjudlYQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{mtc-parser-DYoCxcZ1.js → mtc-parser-BQaKUxC6.js} +1 -1
  147. package/src/assets/web-panel/assets/{omit-C1P2q5TY.js → omit-MciovCFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{pickAttrs-BtTRpJtC.js → pickAttrs-DDPJ4zAz.js} +1 -1
  149. package/src/assets/web-panel/assets/{placementArrow-Cst2PcNM.js → placementArrow-Cznyb-jI.js} +1 -1
  150. package/src/assets/web-panel/assets/{responsiveObserve-CF5kalV2.js → responsiveObserve-AJK3SLzJ.js} +1 -1
  151. package/src/assets/web-panel/assets/{slide-CtHGqpXN.js → slide-CPQ28wu7.js} +1 -1
  152. package/src/assets/web-panel/assets/{statusUtils-N__biHXf.js → statusUtils-CFjzvqf_.js} +1 -1
  153. package/src/assets/web-panel/assets/{styleChecker-DR8V_H-i.js → styleChecker-BPyFfTuR.js} +1 -1
  154. package/src/assets/web-panel/assets/{useFlexGapSupport-D274dqun.js → useFlexGapSupport-Dq7N6R05.js} +1 -1
  155. package/src/assets/web-panel/assets/{useFs-BwHLYU5b.js → useFs-C3GS0uTc.js} +1 -1
  156. package/src/assets/web-panel/assets/{usePersonalDataHub-BiA-hVqt.js → usePersonalDataHub-BhgIVzP_.js} +1 -1
  157. package/src/assets/web-panel/assets/{vnode-Bugl94dy.js → vnode-4ZD9-MDr.js} +1 -1
  158. package/src/assets/web-panel/assets/{zoom-DEFl8GCu.js → zoom-Bx4MRVNW.js} +1 -1
  159. package/src/assets/web-panel/index.html +1 -1
  160. package/src/command-help-index.json +1 -1
  161. package/src/command-manifest.json +1 -1
  162. package/src/commands/checkpoint.js +42 -7
  163. package/src/commands/orchestrate.js +85 -25
  164. package/src/commands/session-location.js +5 -0
  165. package/src/commands/session-show.js +109 -1
  166. package/src/commands/session.js +26 -2
  167. package/src/commands/tokens.js +9 -4
  168. package/src/data/changelog.json +26 -0
  169. package/src/generated/cc-agent-protocol.schema.json +71 -0
  170. package/src/harness/jsonl-session-store.js +357 -114
  171. package/src/harness/mcp-client.js +44 -1
  172. package/src/lib/agent-router.js +35 -7
  173. package/src/lib/app-server/server.js +14 -0
  174. package/src/lib/background-agent-supervisor.js +14 -4
  175. package/src/lib/causal-observability.js +64 -1
  176. package/src/lib/checkpoint-summary-projection.js +98 -0
  177. package/src/lib/checkpoint-timeline-authority.js +15 -51
  178. package/src/lib/claude-code-bridge.js +302 -60
  179. package/src/lib/codex-app-server-adapter.js +161 -35
  180. package/src/lib/cost-budget.js +4 -0
  181. package/src/lib/decision-layer/providers.js +84 -9
  182. package/src/lib/decision-layer/runtime.js +86 -49
  183. package/src/lib/direct-model-usage.js +14 -3
  184. package/src/lib/doctor-checkup.js +31 -2
  185. package/src/lib/durable-security-store.js +6 -1
  186. package/src/lib/evolution/evolution-artifact-identity.js +21 -0
  187. package/src/lib/evolution/evolution-artifact-ports.js +5 -11
  188. package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
  189. package/src/lib/execution-location-failure-site.js +63 -0
  190. package/src/lib/execution-location-target.js +102 -8
  191. package/src/lib/external-agent-adapters.js +2 -0
  192. package/src/lib/image-file-boundary.js +154 -0
  193. package/src/lib/image-input.js +16 -3
  194. package/src/lib/llm-pricing.js +114 -8
  195. package/src/lib/mcp-call-ledger-store.js +7 -2
  196. package/src/lib/model-capabilities.js +21 -10
  197. package/src/lib/model-context-catalog.js +60 -1
  198. package/src/lib/openai-responses.js +7 -1
  199. package/src/lib/orchestrator.js +8 -2
  200. package/src/lib/process-execution-broker/index.js +93 -1
  201. package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
  202. package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
  203. package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
  204. package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
  205. package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
  206. package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
  207. package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
  208. package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
  209. package/src/lib/runtime-usage-ledger.js +3 -0
  210. package/src/lib/secure-fs.js +158 -42
  211. package/src/lib/session-branch-history.js +240 -0
  212. package/src/lib/session-history-origins.js +285 -0
  213. package/src/lib/session-input-receipt.js +110 -0
  214. package/src/lib/session-resource-budget.js +8 -8
  215. package/src/lib/session-transcript-history.js +456 -0
  216. package/src/lib/session-transcript-page.js +164 -0
  217. package/src/lib/session-transcript-reference.js +38 -0
  218. package/src/lib/session-usage.js +8 -0
  219. package/src/lib/token-tracker.js +32 -54
  220. package/src/lib/usage-pricing-context.js +93 -0
  221. package/src/runtime/headless-runner.js +8 -0
  222. package/src/runtime/headless-stream.js +202 -4
  223. package/src/assets/web-panel/assets/EvolutionSettings-Pc1IpRfk.js +0 -1
  224. package/src/assets/web-panel/assets/MarkdownRenderer-BIUeeiVA.js +0 -1
  225. package/src/assets/web-panel/assets/Skills-CYt0Mu2W.js +0 -1
  226. package/src/assets/web-panel/assets/SpeechSettings-a2BBjtTL.js +0 -1
  227. package/src/assets/web-panel/assets/Tasks-BYQKU-GL.js +0 -1
  228. package/src/assets/web-panel/assets/devWarning-DZhu13vj.js +0 -1
  229. package/src/assets/web-panel/assets/index-C6iFyQYz.js +0 -1
  230. package/src/assets/web-panel/assets/index-CztThH9f.js +0 -1
@@ -228,12 +228,14 @@ export class AgentRouter extends EventEmitter {
228
228
  */
229
229
  static autoDetect(options = {}) {
230
230
  const backends = [];
231
+ const claude = options.cliDetections?.claude || detectClaudeCode();
232
+ const codex = options.cliDetections?.codex || detectCodex();
231
233
 
232
- if (detectClaudeCode().found) {
233
- backends.push({ type: BACKEND_TYPE.CLAUDE, weight: 3 });
234
+ if (claude.found) {
235
+ backends.push({ type: BACKEND_TYPE.CLAUDE, weight: 3, installed: true });
234
236
  }
235
- if (detectCodex().found) {
236
- backends.push({ type: BACKEND_TYPE.CODEX, weight: 2 });
237
+ if (codex.found) {
238
+ backends.push({ type: BACKEND_TYPE.CODEX, weight: 2, installed: true });
237
239
  }
238
240
  if (process.env.GEMINI_API_KEY) {
239
241
  backends.push({ type: BACKEND_TYPE.GEMINI, weight: 2 });
@@ -263,7 +265,7 @@ export class AgentRouter extends EventEmitter {
263
265
  const { cwd = process.cwd() } = options;
264
266
  if (this._backends.length === 0) {
265
267
  throw new Error(
266
- "No agent backends available. Install Claude Code: npm i -g @anthropic-ai/claude-code",
268
+ "No agent backends available. Use cc agent for tool execution; orchestrate API backends produce text only.",
267
269
  );
268
270
  }
269
271
  const evolutionIngress =
@@ -277,8 +279,7 @@ export class AgentRouter extends EventEmitter {
277
279
  error.code = "CC_AGENT_EVOLUTION_INGRESS_FAILED";
278
280
  throw error;
279
281
  }
280
- const backends =
281
- this._backends.filter((backend) => !backend.isCLI);
282
+ const backends = this._backends.filter((backend) => !backend.isCLI);
282
283
 
283
284
  if (backends.length === 0) {
284
285
  const error = new Error(
@@ -475,6 +476,7 @@ export class AgentRouter extends EventEmitter {
475
476
  return {
476
477
  type,
477
478
  isCLI: true,
479
+ installed: cfg.installed ?? null,
478
480
  weight: cfg.weight || 1,
479
481
  _pool: pool,
480
482
  timeout: cfg.timeout || 300_000,
@@ -530,8 +532,34 @@ export class AgentRouter extends EventEmitter {
530
532
  kind: b.isCLI ? "cli" : "api",
531
533
  provider: b.provider || b.type,
532
534
  weight: b.weight,
535
+ installed: b.isCLI ? (b.installed ?? null) : null,
536
+ configured: true,
537
+ governanceAdmitted: b.isCLI ? false : null,
538
+ requiresAuthenticatedRun: true,
539
+ dispatchable: !b.isCLI,
540
+ runnable: false,
541
+ executionMode: b.isCLI ? "blocked" : "text-only",
542
+ blockedReason: b.isCLI
543
+ ? AGENT_ROUTER_ERROR.EXTERNAL_MODEL_INGRESS_UNATTESTED
544
+ : "API_TEXT_ONLY_NO_TOOL_EXECUTION",
545
+ alternative: "cc agent",
533
546
  }));
534
547
  }
548
+
549
+ /** Configuration preflight only; dispatch still authenticates each Run. */
550
+ assertDispatchAvailable() {
551
+ if (this._backends.some((backend) => !backend.isCLI)) return;
552
+ const error = new Error(
553
+ this._backends.length
554
+ ? "External Claude/Codex CLIs are blocked: per-request model governance is unattested. Use cc agent for tool execution."
555
+ : "No agent backends available. Use cc agent for tool execution.",
556
+ );
557
+ error.code = this._backends.length
558
+ ? AGENT_ROUTER_ERROR.EXTERNAL_MODEL_INGRESS_UNATTESTED
559
+ : "AGENT_ROUTER_NO_BACKENDS";
560
+ error.backends = this.summary();
561
+ throw error;
562
+ }
535
563
  }
536
564
 
537
565
  // ===== V2 Surface: Agent Router governance overlay (CLI v0.132.0) =====
@@ -1463,6 +1463,20 @@ export class CcAppServer {
1463
1463
  contextRevision: Number.isSafeInteger(event.context_revision)
1464
1464
  ? event.context_revision
1465
1465
  : null,
1466
+ // Preserve the MCP form/URL vocabulary for native host review. This is
1467
+ // question metadata, not an approval decision or host execution authority.
1468
+ ...(event.metadata?.kind === "mcp_elicitation"
1469
+ ? {
1470
+ metadata: {
1471
+ kind: "mcp_elicitation",
1472
+ mode: event.metadata.mode || "form",
1473
+ server: event.metadata.server ?? null,
1474
+ requestedSchema: event.metadata.requestedSchema ?? null,
1475
+ url: event.metadata.url ?? null,
1476
+ elicitationId: event.metadata.elicitationId ?? null,
1477
+ },
1478
+ }
1479
+ : {}),
1466
1480
  expiresAt: new Date(this.now() + this.requestTimeoutMs).toISOString(),
1467
1481
  };
1468
1482
  }
@@ -2174,14 +2174,22 @@ function isBackgroundAgentAfterCursor(state, cursor) {
2174
2174
  return String(state.id).localeCompare(cursor.id) > 0;
2175
2175
  }
2176
2176
 
2177
+ function observeBackgroundAgentList(options, source, entryCount) {
2178
+ // Optional in-process measurement only; telemetry failures cannot change a read.
2179
+ try {
2180
+ options.indexObserver?.(Object.freeze({ source, entryCount }));
2181
+ } catch {
2182
+ // Keep observers outside the authoritative result.
2183
+ }
2184
+ }
2185
+
2177
2186
  /**
2178
2187
  * Return one stable, bounded page from the newest-first background session
2179
2188
  * feed. The cursor is an opaque ordering fence, not an authority token.
2180
2189
  *
2181
- * State files are still read to preserve the current authoritative lifecycle
2182
- * reconciliation. A future read-only index may reduce that I/O, but this API
2183
- * immediately bounds the object graph and protocol response retained by a
2184
- * caller.
2190
+ * The index still enumerates and stats every authority file; selected rows are
2191
+ * read again for lifecycle reconciliation. It reduces content reads, not the
2192
+ * O(N) inventory fence. indexObserver receives the chosen read path and count.
2185
2193
  */
2186
2194
  export function listBackgroundAgentsPage(options = {}) {
2187
2195
  const limit = normalizeBackgroundAgentPageLimit(options.limit);
@@ -2223,6 +2231,7 @@ export function listBackgroundAgentsPage(options = {}) {
2223
2231
  projected.length > sessions.length
2224
2232
  ? encodeBackgroundAgentPageCursor(sessions.at(-1), options.all)
2225
2233
  : null;
2234
+ observeBackgroundAgentList(options, indexed.source, indexed.entries.length);
2226
2235
  return Object.freeze({
2227
2236
  sessions: Object.freeze(sessions),
2228
2237
  nextCursor,
@@ -2238,6 +2247,7 @@ export function listBackgroundAgentsPage(options = {}) {
2238
2247
  eligible.length > sessions.length
2239
2248
  ? encodeBackgroundAgentPageCursor(sessions.at(-1), options.all)
2240
2249
  : null;
2250
+ observeBackgroundAgentList(options, "full-scan", eligible.length);
2241
2251
  return Object.freeze({
2242
2252
  sessions: Object.freeze(sessions),
2243
2253
  nextCursor,
@@ -8,6 +8,10 @@
8
8
 
9
9
  import crypto from "node:crypto";
10
10
  import { PRICE_TABLE, priceRollup } from "./llm-pricing.js";
11
+ import {
12
+ projectUsagePricingContext,
13
+ mergeUsagePricingBucket,
14
+ } from "./usage-pricing-context.js";
11
15
  import { canonicalDeliveryJson } from "./delivery-evidence.js";
12
16
  import { createSessionTranscriptStructureProjection } from "./session-transcript-structure.js";
13
17
 
@@ -251,7 +255,64 @@ function normalizePricingTable(table = PRICE_TABLE) {
251
255
  ) {
252
256
  throw new Error("pricing rates must be finite non-negative numbers");
253
257
  }
254
- return { match, in: input, out: output };
258
+ const result = { match, in: input, out: output };
259
+ if (Object.hasOwn(entry, "explicitOverride")) {
260
+ if (typeof entry.explicitOverride !== "boolean")
261
+ throw new Error("pricing explicitOverride must be boolean");
262
+ result.explicitOverride = entry.explicitOverride;
263
+ }
264
+ if (Object.hasOwn(entry, "exact")) {
265
+ if (typeof entry.exact !== "boolean")
266
+ throw new Error("pricing exact must be boolean");
267
+ result.exact = entry.exact;
268
+ }
269
+ if (Object.hasOwn(entry, "terms")) {
270
+ const terms = entry.terms;
271
+ const nonNegative = (value) => {
272
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
273
+ throw new Error("invalid pricing multiplier");
274
+ return value;
275
+ };
276
+ assertKnownOwnKeys(
277
+ terms,
278
+ new Set([
279
+ "cacheReadMultiplier",
280
+ "cacheWriteMultiplier",
281
+ "longContext",
282
+ "serviceMultipliers",
283
+ ]),
284
+ "pricing terms",
285
+ );
286
+ assertKnownOwnKeys(
287
+ terms.longContext,
288
+ new Set(["threshold", "inputMultiplier", "outputMultiplier"]),
289
+ "pricing long context",
290
+ );
291
+ const threshold = nonNegative(terms.longContext.threshold);
292
+ if (!Number.isSafeInteger(threshold))
293
+ throw new Error("invalid pricing threshold");
294
+ assertKnownOwnKeys(
295
+ terms.serviceMultipliers,
296
+ new Set(["standard", "default", "auto", "batch", "flex", "fast"]),
297
+ "pricing service multipliers",
298
+ );
299
+ result.terms = {
300
+ cacheReadMultiplier: nonNegative(terms.cacheReadMultiplier),
301
+ cacheWriteMultiplier: nonNegative(terms.cacheWriteMultiplier),
302
+ longContext: {
303
+ threshold,
304
+ inputMultiplier: nonNegative(terms.longContext.inputMultiplier),
305
+ outputMultiplier: nonNegative(terms.longContext.outputMultiplier),
306
+ },
307
+ serviceMultipliers: Object.fromEntries(
308
+ Object.entries(terms.serviceMultipliers).map(([key, value]) => [
309
+ key,
310
+ nonNegative(value),
311
+ ]),
312
+ ),
313
+ };
314
+ }
315
+ return result;
255
316
  });
256
317
  normalized.set(providerKey, normalizedEntries);
257
318
  }
@@ -672,6 +733,7 @@ function strictUsage(event) {
672
733
  totalTokens: expectedTotal,
673
734
  cacheReadTokens,
674
735
  cacheCreationTokens,
736
+ ...projectUsagePricingContext(raw),
675
737
  };
676
738
  }
677
739
 
@@ -1101,6 +1163,7 @@ export function createVerifiedSessionObservabilityProjection(
1101
1163
  }),
1102
1164
  );
1103
1165
  addUsageSums(row, usage, "session usage model");
1166
+ mergeUsagePricingBucket(row, usage);
1104
1167
  }
1105
1168
 
1106
1169
  if (event?.type === "tool_call") {
@@ -0,0 +1,98 @@
1
+ import {
2
+ buildExtractiveHandoff,
3
+ formatStructuredHandoff,
4
+ } from "../harness/structured-handoff.js";
5
+ import {
6
+ DURABLE_SYSTEM_MESSAGE_KINDS,
7
+ getDurableSystemMessageProvenance,
8
+ markDurableSystemMessage,
9
+ projectCanonicalResumeMessages,
10
+ } from "./session-message-provenance.js";
11
+
12
+ export const HISTORY_SUMMARY_SCHEMA =
13
+ "chainlesschain.session-history-summary/v1";
14
+
15
+ function summaryMessage(messages, action, turnId) {
16
+ const handoff = buildExtractiveHandoff(messages, {
17
+ maxFallbackSourceChars: 24_000,
18
+ });
19
+ return markDurableSystemMessage(
20
+ {
21
+ role: "system",
22
+ content:
23
+ `[Conversation Summary: ${action} ${turnId}]\n` +
24
+ formatStructuredHandoff(handoff),
25
+ },
26
+ DURABLE_SYSTEM_MESSAGE_KINDS.CHECKPOINT_SUMMARY,
27
+ );
28
+ }
29
+
30
+ /**
31
+ * Deterministic v1 rewrite shared by the planner and verified history reader.
32
+ * Source indexes describe the conservative dependency of each output, not a
33
+ * claim that the bounded extractive summary quotes every source. Changes to
34
+ * this transform/formatter require a new history schema or a v1 reader.
35
+ */
36
+ export function projectCheckpointSummary({
37
+ messages,
38
+ action,
39
+ turnId,
40
+ start,
41
+ end,
42
+ }) {
43
+ if (
44
+ !Array.isArray(messages) ||
45
+ typeof turnId !== "string" ||
46
+ !turnId ||
47
+ !Number.isSafeInteger(start) ||
48
+ !Number.isSafeInteger(end) ||
49
+ start < 0 ||
50
+ start >= end ||
51
+ end > messages.length ||
52
+ !["summary-from", "summary-to"].includes(action)
53
+ )
54
+ throw new TypeError("Invalid checkpoint summary source range");
55
+ const copied = (begin, finish) =>
56
+ messages.slice(begin, finish).map((message, index) => ({
57
+ message,
58
+ sourceIndexes: [begin + index],
59
+ }));
60
+ const summarized = (entries) => ({
61
+ message: summaryMessage(
62
+ entries.map((entry) => entry.message),
63
+ action,
64
+ turnId,
65
+ ),
66
+ sourceIndexes: entries.flatMap((entry) => entry.sourceIndexes),
67
+ });
68
+ if (action === "summary-from") {
69
+ if (end !== messages.length || messages[start]?.role !== "user")
70
+ throw new TypeError("Invalid checkpoint summary suffix");
71
+ return [...copied(0, start), summarized(copied(start, end))];
72
+ }
73
+ if (
74
+ start !== (messages[0]?.role === "system" ? 1 : 0) ||
75
+ (end < messages.length && messages[end]?.role !== "user")
76
+ )
77
+ throw new TypeError("Invalid checkpoint summary prefix");
78
+
79
+ const prefix = messages.slice(start, end);
80
+ // Validate/sanitize before inspecting roles. Unmarked systems must neither
81
+ // survive the rewrite nor be quoted into a newly authorized summary.
82
+ const canonical = projectCanonicalResumeMessages(prefix, { strict: true });
83
+ const indexes = prefix.flatMap((message, index) =>
84
+ message.role !== "system" || getDurableSystemMessageProvenance(message)
85
+ ? [start + index]
86
+ : [],
87
+ );
88
+ const entries = canonical.map((message, index) => ({
89
+ message,
90
+ sourceIndexes: [indexes[index]],
91
+ }));
92
+ return [
93
+ ...copied(0, start),
94
+ ...entries.filter((entry) => entry.message.role === "system"),
95
+ summarized(entries.filter((entry) => entry.message.role !== "system")),
96
+ ...copied(end, messages.length),
97
+ ];
98
+ }
@@ -11,16 +11,7 @@ import {
11
11
  resolveCheckpointTimelineAction,
12
12
  } from "./checkpoint-timeline.js";
13
13
  import { planSessionBranch } from "./session-branch.js";
14
- import {
15
- buildExtractiveHandoff,
16
- formatStructuredHandoff,
17
- } from "../harness/structured-handoff.js";
18
- import {
19
- DURABLE_SYSTEM_MESSAGE_KINDS,
20
- getDurableSystemMessageProvenance,
21
- markDurableSystemMessage,
22
- projectCanonicalResumeMessages,
23
- } from "./session-message-provenance.js";
14
+ import { projectCheckpointSummary } from "./checkpoint-summary-projection.js";
24
15
 
25
16
  export const CHECKPOINT_TIMELINE_RESULT_SCHEMA =
26
17
  "cc-checkpoint-timeline-result/v1";
@@ -243,21 +234,6 @@ function userAnchor(messages, offset) {
243
234
  return null;
244
235
  }
245
236
 
246
- function summaryMessage(messages, action, turnId) {
247
- const handoff = buildExtractiveHandoff(messages, {
248
- maxFallbackSourceChars: 24_000,
249
- });
250
- return markDurableSystemMessage(
251
- {
252
- role: "system",
253
- content:
254
- `[Conversation Summary: ${action} ${turnId}]\n` +
255
- formatStructuredHandoff(handoff),
256
- },
257
- DURABLE_SYSTEM_MESSAGE_KINDS.CHECKPOINT_SUMMARY,
258
- );
259
- }
260
-
261
237
  function codePreviewShape(value, checkpointId) {
262
238
  const data = value && typeof value === "object" ? value : {};
263
239
  const source = (key) => (Array.isArray(data[key]) ? data[key] : []);
@@ -348,11 +324,13 @@ export function planCheckpointTimelineAction({
348
324
  commit.messages = messages.slice(0, anchor);
349
325
  commit.bindingPruneOffset = submission.conversationOffset;
350
326
  } else if (action === CHECKPOINT_TIMELINE_ACTIONS.SUMMARY_FROM) {
351
- const selected = messages.slice(anchor);
352
- commit.messages = [
353
- ...messages.slice(0, anchor),
354
- summaryMessage(selected, action, entry.turnId),
355
- ];
327
+ commit.summaryRange = { start: anchor, end: messages.length };
328
+ commit.messages = projectCheckpointSummary({
329
+ messages,
330
+ action,
331
+ turnId: entry.turnId,
332
+ ...commit.summaryRange,
333
+ }).map((entry) => entry.message);
356
334
  commit.bindingPruneOffset = submission.conversationOffset;
357
335
  } else if (action === CHECKPOINT_TIMELINE_ACTIONS.SUMMARY_TO) {
358
336
  const entryIndex = timeline.entries.indexOf(entry);
@@ -364,31 +342,17 @@ export function planCheckpointTimelineAction({
364
342
  return { ok: false, code: "TIMELINE_CONVERSATION_ANCHOR_STALE" };
365
343
  }
366
344
  const systemCount = messages[0]?.role === "system" ? 1 : 0;
367
- const prefix = messages.slice(systemCount, nextAnchor);
368
- let canonicalPrefix;
345
+ commit.summaryRange = { start: systemCount, end: nextAnchor };
369
346
  try {
370
- canonicalPrefix = projectCanonicalResumeMessages(prefix, {
371
- strict: true,
372
- });
347
+ commit.messages = projectCheckpointSummary({
348
+ messages,
349
+ action,
350
+ turnId: entry.turnId,
351
+ ...commit.summaryRange,
352
+ }).map((entry) => entry.message);
373
353
  } catch {
374
354
  return { ok: false, code: "TIMELINE_CONVERSATION_INVALID" };
375
355
  }
376
- const durableSystems = canonicalPrefix.filter((message) =>
377
- Boolean(getDurableSystemMessageProvenance(message)),
378
- );
379
- // The first system is the current host-owned prompt and stays in place.
380
- // Other systems survive the rewrite only with runtime provenance. An
381
- // unmarked verified event must neither survive nor be quoted into the new
382
- // durable summary, otherwise SUMMARY_TO would bless it on persistence.
383
- const selected = canonicalPrefix.filter(
384
- (message) => message.role !== "system",
385
- );
386
- commit.messages = [
387
- ...messages.slice(0, systemCount),
388
- ...durableSystems,
389
- summaryMessage(selected, action, entry.turnId),
390
- ...messages.slice(nextAnchor),
391
- ];
392
356
  // Every surviving later offset shifts when a prefix is summarized.
393
357
  commit.bindingPruneOffset = 0;
394
358
  } else if (action === CHECKPOINT_TIMELINE_ACTIONS.BRANCH) {