chainlesschain 0.166.77 → 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 (222) hide show
  1. package/README.md +16 -7
  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-DSyZEY2G.js} +1 -1
  12. package/src/assets/web-panel/assets/{ActionButton-CnU-Xvx-.js → ActionButton-DhNyZ577.js} +1 -1
  13. package/src/assets/web-panel/assets/{Analytics-BJW-CNtf.js → Analytics-HMMpxmyi.js} +3 -3
  14. package/src/assets/web-panel/assets/{AppLayout-UFQJL3G9.js → AppLayout-CwKMM5Ie.js} +5 -5
  15. package/src/assets/web-panel/assets/{Artifacts-Dr_IUDoY.js → Artifacts-CNzDmph7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Audit-aglWo6rr.js → Audit-DxWpUW3V.js} +1 -1
  17. package/src/assets/web-panel/assets/{BackgroundAgents-Dm_TCiXC.js → BackgroundAgents-C1R2ST-P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Backup-DUdX4-gA.js → Backup-B6biTaEV.js} +1 -1
  19. package/src/assets/web-panel/assets/{BaseInput-BTcLjy1o.js → BaseInput-CVnkD2Z5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Chat-Bhy9qZrl.js → Chat-Dbewl4Je.js} +6 -6
  21. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D0WrJQaQ.js → ChatBubbleRenderer-DVZ6SwC5.js} +1 -1
  22. package/src/assets/web-panel/assets/{Checkbox-CblrPa21.js → Checkbox-BqqiF1JE.js} +1 -1
  23. package/src/assets/web-panel/assets/{Codegen-SEAHzOlr.js → Codegen-BVMkGumc.js} +1 -1
  24. package/src/assets/web-panel/assets/{Col-DJz8iFOR.js → Col-DmiRHy96.js} +1 -1
  25. package/src/assets/web-panel/assets/{Community-RufKhcQt.js → Community-BDlpygqA.js} +1 -1
  26. package/src/assets/web-panel/assets/{Compact-Dlifx08U.js → Compact-B2NME_m-.js} +1 -1
  27. package/src/assets/web-panel/assets/{Compliance-DdhQWcHh.js → Compliance-BlzDLE-R.js} +1 -1
  28. package/src/assets/web-panel/assets/{Cowork-BLNn6oOm.js → Cowork-C8raPybB.js} +3 -3
  29. package/src/assets/web-panel/assets/{Cron-Dv-JWY2d.js → Cron-DA8Py0zP.js} +2 -2
  30. package/src/assets/web-panel/assets/{Crosschain-k7Pz7O-b.js → Crosschain-DU2XyHqB.js} +1 -1
  31. package/src/assets/web-panel/assets/{DID-C_10syUW.js → DID-Df098fT_.js} +2 -2
  32. package/src/assets/web-panel/assets/{Dashboard-CMyH6Szx.js → Dashboard-D1rT702x.js} +2 -2
  33. package/src/assets/web-panel/assets/{Dropdown-DjmD2Saa.js → Dropdown-BweXGo1O.js} +1 -1
  34. package/src/assets/web-panel/assets/{EmailListRenderer-36_IRUSo.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-DEgf9kyP.js → FamilyGuardDashboard-DrznZFVs.js} +1 -1
  37. package/src/assets/web-panel/assets/{Federation-DGO1wQls.js → Federation-DQZ2adIA.js} +1 -1
  38. package/src/assets/web-panel/assets/{FormItemContext-Doj1FmKW.js → FormItemContext-DN30Dowh.js} +1 -1
  39. package/src/assets/web-panel/assets/{GenericCardRenderer-GzOU27iT.js → GenericCardRenderer-DRdt0j1e.js} +1 -1
  40. package/src/assets/web-panel/assets/{Git-Dd7D1EDK.js → Git-wwRgStzk.js} +2 -2
  41. package/src/assets/web-panel/assets/{Governance-6IY8LcjI.js → Governance-CI4Uw0Nh.js} +1 -1
  42. package/src/assets/web-panel/assets/{Inference-BB9gl8q1.js → Inference-5TuE2AJI.js} +1 -1
  43. package/src/assets/web-panel/assets/{KnowledgeGraph-CeCed5wd.js → KnowledgeGraph-oXyvmFSR.js} +1 -1
  44. package/src/assets/web-panel/assets/{Logs-CYOeHuaI.js → Logs-ewudSWuv.js} +2 -2
  45. package/src/assets/web-panel/assets/{MarkdownRenderer-Bk8Zqc2R.js → MarkdownRenderer-Cz5nyufm.js} +1 -1
  46. package/src/assets/web-panel/assets/{Marketplace-D-_xgHgM.js → Marketplace-DcZeWFrs.js} +1 -1
  47. package/src/assets/web-panel/assets/{McpTools-NnaUTF5t.js → McpTools-BcV9p1RS.js} +3 -3
  48. package/src/assets/web-panel/assets/{Memory-CndN9pMt.js → Memory-CMhYvugt.js} +2 -2
  49. package/src/assets/web-panel/assets/{MobileBridge-BXblFmhY.js → MobileBridge-5RP2uwvT.js} +1 -1
  50. package/src/assets/web-panel/assets/{MobileProjects-CC26Dm2k.js → MobileProjects-BIuM9Ze4.js} +1 -1
  51. package/src/assets/web-panel/assets/{Mtc-BhaqWCiW.js → Mtc-DmBszTDe.js} +4 -4
  52. package/src/assets/web-panel/assets/{MtcAudit-D6fktM2w.js → MtcAudit-Czdp5ZGt.js} +5 -5
  53. package/src/assets/web-panel/assets/{Multisig-CFvahz7s.js → Multisig-DRWUuNr-.js} +3 -3
  54. package/src/assets/web-panel/assets/{NLProgramming-Co73Ivya.js → NLProgramming-IRQQN0-c.js} +1 -1
  55. package/src/assets/web-panel/assets/{Notes-B4g33L1o.js → Notes-CGhD1lW9.js} +4 -4
  56. package/src/assets/web-panel/assets/{NotificationSettings-lXd17EbN.js → NotificationSettings-BtyPgQAh.js} +1 -1
  57. package/src/assets/web-panel/assets/{OrderTableRenderer-BiOB0GIi.js → OrderTableRenderer-yUaqwCty.js} +1 -1
  58. package/src/assets/web-panel/assets/{Organization-JQ7_wQIA.js → Organization-C3kTVn5i.js} +4 -4
  59. package/src/assets/web-panel/assets/{Overflow-gwgJgozQ.js → Overflow-C2-0iZhq.js} +1 -1
  60. package/src/assets/web-panel/assets/{P2P-D9L_0gie.js → P2P-CISoEUxA.js} +2 -2
  61. package/src/assets/web-panel/assets/{PdhVaultBrowser-CbOPsFE9.js → PdhVaultBrowser-NfTVtvKQ.js} +5 -5
  62. package/src/assets/web-panel/assets/{Permissions-Cz42HNQf.js → Permissions-CfK0jJhm.js} +4 -4
  63. package/src/assets/web-panel/assets/{PersonalDataHub-DjorYtrF.js → PersonalDataHub-OsVxxh_j.js} +5 -5
  64. package/src/assets/web-panel/assets/{Pipeline-DyWPhmm5.js → Pipeline-DEmK_Ch2.js} +1 -1
  65. package/src/assets/web-panel/assets/{Privacy-DyfLMl2j.js → Privacy-D61s73b0.js} +1 -1
  66. package/src/assets/web-panel/assets/{ProjectInit-CyqDx1OE.js → ProjectInit-DkLF5gHb.js} +2 -2
  67. package/src/assets/web-panel/assets/{ProjectSettings-DsBw0Csy.js → ProjectSettings-BA7odTrI.js} +2 -2
  68. package/src/assets/web-panel/assets/{Projects-CRaSI25Z.js → Projects-CdI1GcAG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Providers-CCI_klN-.js → Providers-D9BYyP1r.js} +1 -1
  70. package/src/assets/web-panel/assets/{QrScannerModal-DNsnlDdS.js → QrScannerModal-CXMItUDD.js} +1 -1
  71. package/src/assets/web-panel/assets/{QuickAsk-B9r2iaee.js → QuickAsk-8-tF9ffZ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Recommend-BJDe03GR.js → Recommend-C2QGWOSi.js} +1 -1
  73. package/src/assets/web-panel/assets/{RemoteSession-J7JR3rRo.js → RemoteSession-B1M_v1lx.js} +3 -3
  74. package/src/assets/web-panel/assets/{Reputation-DR39AJeV.js → Reputation-D0WZHgv1.js} +1 -1
  75. package/src/assets/web-panel/assets/{Row-Dh77m3NZ.js → Row-D6nf9-c-.js} +1 -1
  76. package/src/assets/web-panel/assets/{RssFeed-BUdg28nJ.js → RssFeed-ClZ6M-mN.js} +3 -3
  77. package/src/assets/web-panel/assets/{Search-BNC7sGhj.js → Search-ZWkt8vuO.js} +1 -1
  78. package/src/assets/web-panel/assets/{Security-DISENGI7.js → Security-BUlQut2m.js} +4 -4
  79. package/src/assets/web-panel/assets/{Services-BBBGpJ1-.js → Services-Cd_3xJOc.js} +2 -2
  80. package/src/assets/web-panel/assets/{Skeleton-DMcIoIv2.js → Skeleton-C8e2-cHW.js} +1 -1
  81. package/src/assets/web-panel/assets/{Skills-QAyFbI3r.js → Skills-DucVRJp1.js} +1 -1
  82. package/src/assets/web-panel/assets/{Sla-CSg5wLH7.js → Sla-Csr5pUwI.js} +1 -1
  83. package/src/assets/web-panel/assets/{SpeechSettings-DMPxTc5x.js → SpeechSettings-CXvyaRAT.js} +1 -1
  84. package/src/assets/web-panel/assets/{SyncSettings-CPG7l30y.js → SyncSettings-KdsIcV5h.js} +2 -2
  85. package/src/assets/web-panel/assets/{Tasks-Y1kOVvVL.js → Tasks-B-eHmJm9.js} +1 -1
  86. package/src/assets/web-panel/assets/{Templates-jt9NagL0.js → Templates-BglVeaLK.js} +1 -1
  87. package/src/assets/web-panel/assets/{Tenant-DauuJICx.js → Tenant-BBbQ8qan.js} +1 -1
  88. package/src/assets/web-panel/assets/{Terminal-E9rnKeGq.js → Terminal-Ca_pCVBi.js} +2 -2
  89. package/src/assets/web-panel/assets/{TimelineRenderer-Cc7z2APG.js → TimelineRenderer-YD6XG_vZ.js} +1 -1
  90. package/src/assets/web-panel/assets/{Tokens-CV0UthRA.js → Tokens-2lRoeVli.js} +1 -1
  91. package/src/assets/web-panel/assets/{Trigger-BFcJJGfu.js → Trigger-C-3XNAU9.js} +1 -1
  92. package/src/assets/web-panel/assets/{Trust-BAydbNJA.js → Trust-k-1PxdLG.js} +1 -1
  93. package/src/assets/web-panel/assets/{UkeySign-DcOS6sqL.js → UkeySign-FG-qW646.js} +1 -1
  94. package/src/assets/web-panel/assets/{VideoEditing-BLHJZvif.js → VideoEditing-BNOe1cmd.js} +1 -1
  95. package/src/assets/web-panel/assets/{Wallet-4QFLKHwW.js → Wallet-D5C3i2Kw.js} +4 -4
  96. package/src/assets/web-panel/assets/{WebAuthn-BocEOOSj.js → WebAuthn-BOpztqd3.js} +5 -5
  97. package/src/assets/web-panel/assets/{WorkflowEditor-DCfF7D0B.js → WorkflowEditor-BpVrpUEv.js} +1 -1
  98. package/src/assets/web-panel/assets/{chat-CxvfsYGr.js → chat-DIuMHb38.js} +1 -1
  99. package/src/assets/web-panel/assets/{colors-KtQB9DmQ.js → colors-CTFJPyzQ.js} +1 -1
  100. package/src/assets/web-panel/assets/{compact-item-Dx4J6arN.js → compact-item-CONfmJcW.js} +1 -1
  101. package/src/assets/web-panel/assets/{createContext-Cq0olgzo.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-Bf9-h3D-.js → hasIn-CW4XOjDC.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CK2U_AHi.js → index-7wMSBCU7.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DMR-keCL.js → index-Akmg1WdH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-6dDDSCHD.js → index-B54qoVff.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CmQuG0fr.js → index-B8r2t0Ch.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-ClUfSChI.js → index-B9XoBoty.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B3xfiItB.js → index-B9aS2VLu.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DQDR-_ai.js → index-BFs1Tznc.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DZWjYfWt.js → index-BKgaRT0b.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-nmyDOh_b.js → index-BM7bOUvu.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B_8UcDan.js → index-BMg2JFmW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C9yaUHm9.js → index-BRZsPxNn.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Cz7f4Jaq.js → index-Bf19fKef.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CpO6DKuu.js → index-BkAbfBF-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DFdEDvFn.js → index-CBjb2A5R.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-gt5N6VM_.js → index-CEZWQthY.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-0fi8DIVQ.js → index-CFGLf88d.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-hSzyoXri.js → index-CLUa68JH.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-Cy865Hhq.js → index-CM2X25Er.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DDAe1UmZ.js → index-CX4T2uKN.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BMcC4cbj.js → index-CixqfdRk.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DsCdl2Od.js → index-CkRojEip.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DnU-dUWd.js → index-Cvmc3f25.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Br1mDMfO.js → index-D-lpTPS8.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CaIclw-E.js → index-D59GbWCN.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DBRlZdZj.js → index-DAESljiJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-B8WuPI-h.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-D2BfSIrn.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-CqnggDos.js → index-DSlXL6Ju.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-_FIz-0tp.js → index-DWCJnn2O.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-BKtQyb2o.js → index-DWY7YwDu.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DfrFNMvz.js → index-DZTwP364.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-BHmdMKYl.js → index-DidrMvOx.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-BO6XvO-C.js → index-Dj3K5kHs.js} +1 -1
  139. package/src/assets/web-panel/assets/{index-iE9tqEN5.js → index-YaeGscSw.js} +1 -1
  140. package/src/assets/web-panel/assets/{index-DI5bRqNG.js → index-YlMnFNOi.js} +1 -1
  141. package/src/assets/web-panel/assets/{index-Cfsn7N18.js → index-asWsB34i.js} +1 -1
  142. package/src/assets/web-panel/assets/{index-CeYP_kT9.js → index-gkjiFjQd.js} +1 -1
  143. package/src/assets/web-panel/assets/{initDefaultProps-DvzKJ6o5.js → initDefaultProps-BOr4igh3.js} +1 -1
  144. package/src/assets/web-panel/assets/{motion-D1yTvmxW.js → motion-CK469n2j.js} +1 -1
  145. package/src/assets/web-panel/assets/{move-DxtSIF8K.js → move-DzjudlYQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{mtc-parser-BDsQgIHY.js → mtc-parser-BQaKUxC6.js} +1 -1
  147. package/src/assets/web-panel/assets/{omit-UVBJW8kh.js → omit-MciovCFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{pickAttrs-D4QqtTyX.js → pickAttrs-DDPJ4zAz.js} +1 -1
  149. package/src/assets/web-panel/assets/{placementArrow-QXmu6vBf.js → placementArrow-Cznyb-jI.js} +1 -1
  150. package/src/assets/web-panel/assets/{responsiveObserve-D-PmXO9M.js → responsiveObserve-AJK3SLzJ.js} +1 -1
  151. package/src/assets/web-panel/assets/{slide-CKbGxEZJ.js → slide-CPQ28wu7.js} +1 -1
  152. package/src/assets/web-panel/assets/{statusUtils-BbgXPkXm.js → statusUtils-CFjzvqf_.js} +1 -1
  153. package/src/assets/web-panel/assets/{styleChecker-DOr9rk68.js → styleChecker-BPyFfTuR.js} +1 -1
  154. package/src/assets/web-panel/assets/{useFlexGapSupport-B2wO2r36.js → useFlexGapSupport-Dq7N6R05.js} +1 -1
  155. package/src/assets/web-panel/assets/{useFs-SeVGBK34.js → useFs-C3GS0uTc.js} +1 -1
  156. package/src/assets/web-panel/assets/{usePersonalDataHub-DUJBCxjD.js → usePersonalDataHub-BhgIVzP_.js} +1 -1
  157. package/src/assets/web-panel/assets/{vnode-CF4EYsig.js → vnode-4ZD9-MDr.js} +1 -1
  158. package/src/assets/web-panel/assets/{zoom-pRUs5pqI.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 +13 -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/doctor-checkup.js +31 -2
  182. package/src/lib/durable-security-store.js +6 -1
  183. package/src/lib/evolution/evolution-artifact-identity.js +21 -0
  184. package/src/lib/evolution/evolution-artifact-ports.js +5 -11
  185. package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
  186. package/src/lib/execution-location-failure-site.js +63 -0
  187. package/src/lib/execution-location-target.js +102 -8
  188. package/src/lib/external-agent-adapters.js +2 -0
  189. package/src/lib/image-file-boundary.js +154 -0
  190. package/src/lib/image-input.js +16 -3
  191. package/src/lib/llm-pricing.js +114 -8
  192. package/src/lib/mcp-call-ledger-store.js +7 -2
  193. package/src/lib/model-capabilities.js +21 -10
  194. package/src/lib/model-context-catalog.js +60 -1
  195. package/src/lib/openai-responses.js +7 -1
  196. package/src/lib/orchestrator.js +8 -2
  197. package/src/lib/process-execution-broker/index.js +93 -1
  198. package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
  199. package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
  200. package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
  201. package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
  202. package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
  203. package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
  204. package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
  205. package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
  206. package/src/lib/runtime-usage-ledger.js +3 -0
  207. package/src/lib/secure-fs.js +158 -42
  208. package/src/lib/session-branch-history.js +240 -0
  209. package/src/lib/session-history-origins.js +285 -0
  210. package/src/lib/session-input-receipt.js +110 -0
  211. package/src/lib/session-resource-budget.js +8 -8
  212. package/src/lib/session-transcript-history.js +456 -0
  213. package/src/lib/session-transcript-page.js +164 -0
  214. package/src/lib/session-transcript-reference.js +38 -0
  215. package/src/lib/session-usage.js +8 -0
  216. package/src/lib/token-tracker.js +32 -54
  217. package/src/lib/usage-pricing-context.js +93 -0
  218. package/src/runtime/headless-stream.js +202 -4
  219. package/src/assets/web-panel/assets/EvolutionSettings-CmtU0XmM.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-CmgDNkoO.js +0 -1
  221. package/src/assets/web-panel/assets/index-BpIZ2S01.js +0 -1
  222. 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
+ }
@@ -52,6 +52,12 @@ import {
52
52
  } from "../lib/policy-decision-event.js";
53
53
  import { runWithHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
54
54
  import { bootstrap } from "./bootstrap.js";
55
+ import {
56
+ appendSessionInputWithReceipt,
57
+ readSessionInputReceipt,
58
+ inputSubmissionDigest,
59
+ validateClientMessageId,
60
+ } from "../lib/session-input-receipt.js";
55
61
  import {
56
62
  buildSystemPrompt,
57
63
  chatWithTools as coreChatWithTools,
@@ -78,6 +84,7 @@ import {
78
84
  buildUserContent,
79
85
  resolveVisionLlm,
80
86
  } from "../lib/image-input.js";
87
+ import { MAX_INPUT_IMAGES } from "../lib/image-file-boundary.js";
81
88
  import {
82
89
  buildIdePromptContext,
83
90
  expandIdeMentions,
@@ -115,6 +122,7 @@ import { IterationBudget } from "../lib/iteration-budget.js";
115
122
  import { CostBudget } from "../lib/cost-budget.js";
116
123
  import {
117
124
  resolvePermissionMode,
125
+ normalizePermissionMode,
118
126
  resolveEnabledTools,
119
127
  parseToolList,
120
128
  installPipeSafety,
@@ -171,6 +179,10 @@ import { createMcpHostRecoveryRuntime } from "../lib/mcp-host-recovery-runtime.j
171
179
  import { operationIdempotencyKey } from "../lib/idempotency.js";
172
180
  import { TurnBindingLog, createTurnBindingFeed } from "../lib/turn-binding.js";
173
181
  import { TURN_BINDING_EVENT } from "../lib/turn-binding-store.js";
182
+ import {
183
+ transcriptMessageEventId,
184
+ transcriptResultReferences,
185
+ } from "../lib/session-transcript-reference.js";
174
186
  import { getPlanModeManager } from "../lib/plan-mode.js";
175
187
  import {
176
188
  SESSION_SLASH_COMMANDS,
@@ -710,6 +722,14 @@ export function parseInputEvent(line) {
710
722
  };
711
723
  }
712
724
  const msg = obj && typeof obj === "object" ? obj.message || obj : {};
725
+ let clientMessageId;
726
+ if (obj?.client_message_id !== undefined) {
727
+ try {
728
+ clientMessageId = validateClientMessageId(obj.client_message_id);
729
+ } catch (error) {
730
+ return { error: error.message };
731
+ }
732
+ }
713
733
  let content = msg.content ?? obj.text ?? obj.prompt;
714
734
  if (Array.isArray(content)) {
715
735
  content = content
@@ -738,7 +758,9 @@ export function parseInputEvent(line) {
738
758
  content = detected.text;
739
759
  }
740
760
  }
741
- images = [...new Set(images)].slice(0, 8);
761
+ images = [...new Set(images)];
762
+ if (images.length > MAX_INPUT_IMAGES)
763
+ return { error: `Attach at most ${MAX_INPUT_IMAGES} images per message` };
742
764
  // §3.5.10 接线6: optional per-turn LLM override (PDH privacy-tier switch) —
743
765
  // {"type":"user","text":…,"llm":{"provider","model","baseUrl"?,"apiKey"?}}.
744
766
  // Switches THIS turn's model (e.g. cloud → your own PC Ollama) without
@@ -750,6 +772,7 @@ export function parseInputEvent(line) {
750
772
  // An image-only turn is valid — give the model something to act on.
751
773
  if (images.length) {
752
774
  const r = { text: "Please look at the attached image(s).", images };
775
+ if (clientMessageId) r.clientMessageId = clientMessageId;
753
776
  if (obj.worklog_session_id !== undefined)
754
777
  r.worklogSessionId = obj.worklog_session_id;
755
778
  if (llm) r.llm = llm;
@@ -758,6 +781,7 @@ export function parseInputEvent(line) {
758
781
  return null;
759
782
  }
760
783
  const result = images.length ? { text: content, images } : { text: content };
784
+ if (clientMessageId) result.clientMessageId = clientMessageId;
761
785
  if (obj.worklog_session_id !== undefined)
762
786
  result.worklogSessionId = obj.worklog_session_id;
763
787
  if (llm) result.llm = llm;
@@ -2085,6 +2109,12 @@ async function runAgentHeadlessStreamInWorkspace(
2085
2109
  sessionExists: deps.sessionExists || jsonlSessionExists,
2086
2110
  startSession: deps.startSession || jsonlStartSession,
2087
2111
  appendUserMessage: deps.appendUserMessage || jsonlAppendUserMessage,
2112
+ appendInputWithReceipt:
2113
+ deps.appendInputWithReceipt ||
2114
+ (hasInjectedSessionStore ? null : appendSessionInputWithReceipt),
2115
+ readInputReceipt:
2116
+ deps.readInputReceipt ||
2117
+ (hasInjectedSessionStore ? null : readSessionInputReceipt),
2088
2118
  appendAssistantMessage:
2089
2119
  deps.appendAssistantMessage || jsonlAppendAssistantMessage,
2090
2120
  appendTokenUsage: deps.appendTokenUsage || jsonlAppendTokenUsage,
@@ -3106,10 +3136,37 @@ async function runAgentHeadlessStreamInWorkspace(
3106
3136
  protocol_version: STREAM_PROTOCOL_VERSION,
3107
3137
  session_id: sessionId,
3108
3138
  session_persistence: persist,
3139
+ input_receipts: {
3140
+ version:
3141
+ persist && store.appendInputWithReceipt && store.readInputReceipt
3142
+ ? 1
3143
+ : 0,
3144
+ },
3109
3145
  task_worklog: taskWorklog ? { version: 1, path: taskWorklog.file } : null,
3110
3146
  model,
3111
3147
  provider,
3112
3148
  permission_mode: options.permissionMode || "default",
3149
+ // Correlates display state with this exact IDE child. This echo grants no
3150
+ // authority: effective mode is derived only from validated CLI options.
3151
+ ...(/^[a-zA-Z0-9-]{1,80}$/.test(process.env.CC_IDE_MODE_REQUEST_ID || "")
3152
+ ? {
3153
+ permission_mode_state: {
3154
+ correlation_id: process.env.CC_IDE_MODE_REQUEST_ID,
3155
+ requested: ["default", "acceptEdits", "bypassPermissions"].includes(
3156
+ process.env.CC_IDE_REQUESTED_MODE,
3157
+ )
3158
+ ? process.env.CC_IDE_REQUESTED_MODE
3159
+ : "default",
3160
+ effective: normalizePermissionMode(options.permissionMode),
3161
+ policy_revision: computePolicyDigest({
3162
+ permissionMode: options.permissionMode,
3163
+ allowedTools: options.allowedTools,
3164
+ disallowedTools: disabledTools,
3165
+ permissionRules,
3166
+ }),
3167
+ },
3168
+ }
3169
+ : {}),
3113
3170
  tools: enabledToolNames,
3114
3171
  tools_hash: computeToolsHash(enabledToolNames),
3115
3172
  policy_digest: computePolicyDigest({
@@ -4087,6 +4144,89 @@ async function runAgentHeadlessStreamInWorkspace(
4087
4144
  continue;
4088
4145
  }
4089
4146
 
4147
+ // Bind the receipt to the submitted input, before commands, hooks, file
4148
+ // expansion or image reads can change it. A repeated ID never replays work.
4149
+ const inputSubmission = parsed.clientMessageId
4150
+ ? {
4151
+ text: parsed.text,
4152
+ images: parsed.images || [],
4153
+ llm: parsed.llm || null,
4154
+ worklogSessionId: parsed.worklogSessionId || null,
4155
+ }
4156
+ : null;
4157
+ const acknowledgeInput = (receipt) => {
4158
+ emit({
4159
+ type: "system",
4160
+ subtype: "input_accepted",
4161
+ session_id: sessionId,
4162
+ client_message_id: parsed.clientMessageId,
4163
+ receipt,
4164
+ });
4165
+ if (receipt.duplicate)
4166
+ emit({
4167
+ type: "result",
4168
+ subtype: "input_already_accepted",
4169
+ is_error: false,
4170
+ session_id: sessionId,
4171
+ client_message_id: parsed.clientMessageId,
4172
+ execution_status: "not-reexecuted",
4173
+ result:
4174
+ "Input was already accepted. No work was re-executed; inspect the session for its outcome.",
4175
+ });
4176
+ };
4177
+ if (parsed.clientMessageId) {
4178
+ if (
4179
+ !persist ||
4180
+ !store.appendInputWithReceipt ||
4181
+ !store.readInputReceipt
4182
+ ) {
4183
+ emit({
4184
+ type: "result",
4185
+ subtype: "error_input_receipt",
4186
+ is_error: true,
4187
+ session_id: sessionId,
4188
+ client_message_id: parsed.clientMessageId,
4189
+ acceptance: "rejected",
4190
+ error: "Durable input receipts require canonical session persistence",
4191
+ });
4192
+ sawError = true;
4193
+ continue;
4194
+ }
4195
+ try {
4196
+ const prior = requireSynchronousRecoveryResult(
4197
+ store.readInputReceipt(sessionId, parsed.clientMessageId),
4198
+ "readInputReceipt",
4199
+ );
4200
+ if (prior?.accepted) {
4201
+ const receipt = prior.receipt;
4202
+ if (
4203
+ !/^[a-f0-9]{64}$/u.test(receipt?.eventHash || "") ||
4204
+ receipt.sessionId !== sessionId ||
4205
+ receipt.clientMessageId !== parsed.clientMessageId ||
4206
+ receipt.inputDigest !== inputSubmissionDigest(inputSubmission)
4207
+ )
4208
+ throw new Error("Input receipt conflicts with submission");
4209
+ acknowledgeInput({ ...receipt, duplicate: true });
4210
+ continue;
4211
+ }
4212
+ if (prior?.accepted !== false)
4213
+ throw new Error("Invalid input receipt lookup");
4214
+ } catch {
4215
+ emit({
4216
+ type: "result",
4217
+ subtype: "error_input_receipt",
4218
+ is_error: true,
4219
+ session_id: sessionId,
4220
+ client_message_id: parsed.clientMessageId,
4221
+ acceptance: "unknown",
4222
+ error:
4223
+ "Cannot verify input acceptance; inspect the canonical session before sending again",
4224
+ });
4225
+ sawError = true;
4226
+ continue;
4227
+ }
4228
+ }
4229
+
4090
4230
  // Manual `/compact` uses the same provider-backed structured handoff as the
4091
4231
  // other long-lived hosts. Provider/schema failures degrade to the shared
4092
4232
  // extractive handoff instead of silently dropping all but recent turns.
@@ -4879,11 +5019,38 @@ async function runAgentHeadlessStreamInWorkspace(
4879
5019
  else turnContent = [{ type: "text", text: historyPart }, ...turnContent];
4880
5020
  }
4881
5021
  updateWorklog((log) => log.user(parsed.text));
4882
- messages.push({ role: "user", content: turnContent });
4883
5022
  let persistenceFailure = null;
5023
+ let inputReceipt = null;
5024
+ let userEventId = null;
4884
5025
  if (persist) {
4885
5026
  try {
4886
- store.appendUserMessage(sessionId, turnContent);
5027
+ if (parsed.clientMessageId) {
5028
+ if (!store.appendInputWithReceipt)
5029
+ throw new Error("Durable input receipts are unavailable");
5030
+ inputReceipt = requireSynchronousRecoveryResult(
5031
+ store.appendInputWithReceipt(
5032
+ sessionId,
5033
+ turnContent,
5034
+ parsed.clientMessageId,
5035
+ inputSubmission,
5036
+ ),
5037
+ "appendInputWithReceipt",
5038
+ );
5039
+ if (
5040
+ !/^[a-f0-9]{64}$/u.test(inputReceipt?.eventHash || "") ||
5041
+ inputReceipt.sessionId !== sessionId ||
5042
+ inputReceipt.clientMessageId !== parsed.clientMessageId ||
5043
+ inputReceipt.inputDigest !==
5044
+ inputSubmissionDigest(inputSubmission) ||
5045
+ typeof inputReceipt.duplicate !== "boolean"
5046
+ )
5047
+ throw new Error("Invalid durable input receipt");
5048
+ userEventId = inputReceipt.eventHash;
5049
+ } else {
5050
+ userEventId = transcriptMessageEventId(
5051
+ store.appendUserMessage(sessionId, turnContent),
5052
+ );
5053
+ }
4887
5054
  } catch (error) {
4888
5055
  const persistenceError = createSessionPersistenceFailure(error, {
4889
5056
  sessionId,
@@ -4893,6 +5060,20 @@ async function runAgentHeadlessStreamInWorkspace(
4893
5060
  persistenceError,
4894
5061
  { phase: "before-model" },
4895
5062
  );
5063
+ if (parsed.clientMessageId && !persistenceFailure) {
5064
+ emit({
5065
+ type: "result",
5066
+ subtype: "error_input_receipt",
5067
+ is_error: true,
5068
+ session_id: sessionId,
5069
+ client_message_id: parsed.clientMessageId,
5070
+ acceptance: "unknown",
5071
+ error:
5072
+ "Cannot verify durable input append; inspect the canonical session before sending again",
5073
+ });
5074
+ sawError = true;
5075
+ break;
5076
+ }
4896
5077
  if (persistenceFailure) {
4897
5078
  try {
4898
5079
  deps.onPersistenceFailure?.(persistenceFailure);
@@ -4902,6 +5083,11 @@ async function runAgentHeadlessStreamInWorkspace(
4902
5083
  }
4903
5084
  }
4904
5085
  }
5086
+ if (inputReceipt && !persistenceFailure) {
5087
+ acknowledgeInput(inputReceipt);
5088
+ if (inputReceipt.duplicate) continue; // Never re-run an accepted input.
5089
+ }
5090
+ messages.push({ role: "user", content: turnContent });
4905
5091
  turns += 1;
4906
5092
  approvalGrantLedger.beginTurn(turns);
4907
5093
  if (persistenceFailure) {
@@ -5215,9 +5401,12 @@ async function runAgentHeadlessStreamInWorkspace(
5215
5401
 
5216
5402
  // Grow the conversation so the next turn has context.
5217
5403
  messages.push({ role: "assistant", content: outcome.finalText });
5404
+ let assistantEventId = null;
5218
5405
  if (persist) {
5219
5406
  try {
5220
- store.appendAssistantMessage(sessionId, outcome.finalText);
5407
+ assistantEventId = transcriptMessageEventId(
5408
+ store.appendAssistantMessage(sessionId, outcome.finalText),
5409
+ );
5221
5410
  } catch (error) {
5222
5411
  const persistenceError = createSessionPersistenceFailure(error, {
5223
5412
  sessionId,
@@ -5248,6 +5437,14 @@ async function runAgentHeadlessStreamInWorkspace(
5248
5437
  outcome.endReason === "no-response" ||
5249
5438
  Boolean(persistenceFailure);
5250
5439
  if (isError) sawError = true;
5440
+ const transcriptRefs = !persistenceFailure
5441
+ ? transcriptResultReferences({
5442
+ sessionId,
5443
+ userEventId,
5444
+ assistantEventId,
5445
+ clientMessageId: parsed.clientMessageId || null,
5446
+ })
5447
+ : null;
5251
5448
 
5252
5449
  if (costStopped) {
5253
5450
  emit({
@@ -5275,6 +5472,7 @@ async function runAgentHeadlessStreamInWorkspace(
5275
5472
  session_id: sessionId,
5276
5473
  turn: turns,
5277
5474
  usage: outcome.usage,
5475
+ ...(transcriptRefs ? { transcript_refs: transcriptRefs } : {}),
5278
5476
  ...(persistenceFailure ? { persistence: persistenceFailure } : {}),
5279
5477
  });
5280
5478
 
@@ -1 +0,0 @@
1
- import{I as r,J as T,U as c,c as a,K as o,S as L,V as C,o as M,r as k,a as V,b as I,P as R,Q as d,R as m,F as H,Z as W}from"./vendor-Bn1JzzAn.js";import{_ as A,u as N,d as i}from"./index-hSzyoXri.js";import{R as F}from"./icons-DG5UD-6K.js";function B(P){return["ask","agent"].map(t=>{const n=P?.readiness?.[t],e=n?.state==="admitted",f=n?.scope==="deployment-admission"&&n.runtimeVerification==="not_checked"&&Array.isArray(n.requiredCommands)&&n.requiredCommands.includes(t)&&(e?n.ready===!0&&n.taskReady===null:["not_configured","disabled","invalid","command_not_allowed"].includes(n.state)&&n.ready===!1&&n.taskReady===!1);return{command:t,state:f?n.state:"unknown",summary:f?e?"部署准入通过":"部署准入被阻断":"未提供准入诊断",detail:f&&typeof n.detail=="string"?n.detail:"当前 CLI 未提供可识别的部署准入诊断,请更新 CLI。",remediation:f&&typeof n.remediation=="string"?n.remediation:""}})}function U(P,t){for(const n of Object.keys(P))delete P[n];Object.assign(P,{source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[],readiness:null},t||{})}const J={__name:"EvolutionSettings",setup(P,{expose:t}){t();const n=N(),e=k(!1),f=k(!1),S=k(!1),p=k(!1),w=k(!1),g=k(""),_=k(""),E=k(""),v=V({source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[]}),x=I(()=>e.value||f.value||S.value||p.value||w.value),h=I(()=>B(v));function b(s){U(v,s),_.value=v.descriptorPath||"",E.value=v.trustRootPath||"",g.value=v.modulePath||g.value||""}async function u(s,z=3e4){return await n.waitConnected(8e3),(await n.sendRaw(s,z)).result}async function y(){e.value=!0;try{b(await u({type:"evolution.deployment.status"}))}catch(s){i.error("读取配置失败:"+s.message)}finally{e.value=!1}}async function D(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写描述符和信任根公钥的绝对路径");return}f.value=!0;try{b(await u({type:"evolution.deployment.configure",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("签名校验通过,配置已保存并启用;自动发布仍为 HOLD")}catch(s){i.error("配置失败:"+s.message)}finally{f.value=!1}}async function O(){if(!g.value.trim()){i.warning("请填写测试部署宿主模块的服务器绝对路径");return}p.value=!0;try{b(await u({type:"evolution.deployment.init-test",modulePath:g.value.trim()},6e4)),i.success("TEST 测试开发环境已生成并启用;禁止用于生产")}catch(s){i.error("生成测试环境失败:"+s.message)}finally{p.value=!1}}async function l(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写正式描述符和正式信任根公钥的绝对路径");return}w.value=!0;try{b(await u({type:"evolution.deployment.replace-test",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("测试根已安全轮换为正式受管证书;请重启 cc ui、IDE 或 Desktop 长驻进程后做正式验证")}catch(s){i.error("替换失败:"+s.message)}finally{w.value=!1}}async function q(){S.value=!0;try{b(await u({type:"evolution.deployment.set-enabled",enabled:!v.profileEnabled})),i.success(v.profileEnabled?"已启用":"已停用")}catch(s){i.error("更新失败:"+s.message)}finally{S.value=!1}}M(y);const j={ws:n,loading:e,saving:f,toggling:S,initializingTest:p,replacingTest:w,modulePath:g,descriptorPath:_,trustRootPath:E,status:v,busy:x,readinessRows:h,apply:b,request:u,loadStatus:y,save:D,initTest:O,replaceTest:l,toggle:q,computed:I,onMounted:M,reactive:V,ref:k,get ReloadOutlined(){return F},get message(){return i},get useWsStore(){return N},get deploymentReadinessRows(){return B},get replaceDeploymentStatus(){return U}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},Z={class:"page-head"},K={class:"mono"},Q={class:"mono"},Y={class:"admission-status","aria-live":"polite"},G=["data-admission-command"],X={class:"mono"},$={key:0,class:"mono"};function ee(P,t,n,e,f,S){const p=r("a-button"),w=r("a-alert"),g=r("a-input"),_=r("a-form-item"),E=r("a-divider"),v=r("a-space"),x=r("a-form"),h=r("a-card"),b=r("a-col"),u=r("a-tag"),y=r("a-descriptions-item"),D=r("a-descriptions"),O=r("a-row");return R(),T("div",null,[c("div",Z,[t[4]||(t[4]=c("div",null,[c("h2",{class:"page-title"},"Skill 自进化配置"),c("p",{class:"page-sub"},"统一配置受治理部署;CLI、IDE 插件与 cc ui 共享。")],-1)),a(p,{loading:e.loading,onClick:e.loadStatus},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[3]||(t[3]=d("刷新 ",-1))]),_:1},8,["loading"])]),a(w,{message:"不会开启自动发布",description:"此开关只启用经过签名的 Skill 自进化运行时。候选项进入 active 前仍需人工审核,自动发布始终保持 HOLD。",type:"warning","show-icon":"",class:"notice"}),e.status.deploymentMode==="test"?(R(),L(w,{key:0,message:"当前为 TEST 测试开发环境",description:"本机自动生成的测试密钥不能用于生产。正式 descriptor 和 trust root 到位后,请使用下方“一键替换测试证书并转正式”。",type:"error","show-icon":"",class:"notice"})):C("v-if",!0),a(O,{gutter:16},{default:o(()=>[a(b,{xs:24,xl:15},{default:o(()=>[a(h,{title:"上线前测试与正式部署",class:"panel-card"},{default:o(()=>[a(x,{layout:"vertical"},{default:o(()=>[a(_,{label:"测试部署宿主模块"},{extra:o(()=>[...t[5]||(t[5]=[d("首次填写后点击一次即可生成 Ed25519 测试密钥、签名描述符并启用;宿主模块修改后再次点击可刷新。",-1)])]),default:o(()=>[a(g,{value:e.modulePath,"onUpdate:value":t[0]||(t[0]=l=>e.modulePath=l),disabled:e.busy,placeholder:"运行 cc ui 的机器上 deployment host .mjs/.js 的绝对路径"},null,8,["value","disabled"])]),_:1}),a(p,{type:"primary",loading:e.initializingTest,onClick:e.initTest},{default:o(()=>[...t[6]||(t[6]=[d("一键生成/刷新测试环境",-1)])]),_:1},8,["loading"]),a(E),a(_,{label:"签名部署描述符"},{extra:o(()=>[...t[7]||(t[7]=[d("Web 页面不能读取本机文件选择器,请填写运行 cc ui 的机器上的绝对路径。",-1)])]),default:o(()=>[a(g,{value:e.descriptorPath,"onUpdate:value":t[1]||(t[1]=l=>e.descriptorPath=l),disabled:e.busy,placeholder:"deployment descriptor JSON 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(_,{label:"Ed25519 信任根公钥"},{default:o(()=>[a(g,{value:e.trustRootPath,"onUpdate:value":t[2]||(t[2]=l=>e.trustRootPath=l),disabled:e.busy,placeholder:"信任根 public key 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(v,null,{default:o(()=>[a(p,{type:"primary",loading:e.saving,onClick:e.save},{default:o(()=>[...t[8]||(t[8]=[d("校验、保存并启用",-1)])]),_:1},8,["loading"]),a(p,{danger:e.status.profileEnabled,disabled:!e.status.descriptorPath,loading:e.toggling,onClick:e.toggle},{default:o(()=>[d(m(e.status.profileEnabled?"停用":"启用"),1)]),_:1},8,["danger","disabled","loading"]),e.status.deploymentMode==="test"?(R(),L(p,{key:0,loading:e.replacingTest,onClick:e.replaceTest},{default:o(()=>[...t[9]||(t[9]=[d("一键替换测试证书并转正式",-1)])]),_:1},8,["loading"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})]),_:1}),a(b,{xs:24,xl:9},{default:o(()=>[a(h,{title:"治理状态",class:"panel-card status-card"},{default:o(()=>[a(D,{column:1,size:"small"},{default:o(()=>[a(y,{label:"部署模式"},{default:o(()=>[a(u,{color:e.status.deploymentMode==="test"?"red":"blue"},{default:o(()=>[d(m(e.status.deploymentMode==="test"?"TEST(仅限上线前联调)":e.status.deploymentMode||"none"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效状态"},{default:o(()=>[a(u,{color:e.status.effectiveEnabled?"green":"default"},{default:o(()=>[d(m(e.status.effectiveEnabled?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效来源"},{default:o(()=>[d(m(e.status.source||"none"),1)]),_:1}),a(y,{label:"签名校验"},{default:o(()=>[a(u,{color:e.status.verified?"green":"red"},{default:o(()=>[d(m(e.status.verified?"已通过":"未通过"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"自动发布"},{default:o(()=>[a(u,{color:"orange"},{default:o(()=>[...t[10]||(t[10]=[d("HOLD",-1)])]),_:1})]),_:1}),a(y,{label:"配置文件"},{default:o(()=>[c("span",K,m(e.status.profilePath||"—"),1)]),_:1}),a(y,{label:"允许命令"},{default:o(()=>[c("span",Q,m((e.status.commands||[]).join(", ")||"—"),1)]),_:1})]),_:1}),c("section",Y,[t[11]||(t[11]=c("h3",null,"模型命令部署准入",-1)),t[12]||(t[12]=c("p",null,"这里只检查部署准入,实际任务运行尚未验证。",-1)),(R(!0),T(H,null,W(e.readinessRows,l=>(R(),T("div",{key:l.command,"data-admission-command":l.command},[c("strong",null,m(l.command)+":"+m(l.summary),1),c("p",X,m(l.detail),1),l.remediation?(R(),T("p",$,m(l.remediation),1)):C("v-if",!0)],8,G))),128))]),e.status.error?(R(),L(w,{key:0,message:e.status.error,type:"error","show-icon":"",class:"error"},null,8,["message"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})])}const le=A(J,[["render",ee],["__scopeId","data-v-5a42105e"],["__file","/tmp/cc-web-panel-6ZYRLD/repo/packages/web-panel/src/views/EvolutionSettings.vue"]]);export{le as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-hSzyoXri.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DJz8iFOR.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-Dh77m3NZ.js";import{a0 as t}from"./index-hSzyoXri.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-D-PmXO9M.js";import"./useFlexGapSupport-B2wO2r36.js";import"./styleChecker-DOr9rk68.js";import"./index-BO6XvO-C.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};