chainlesschain 0.166.129 → 0.166.130

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 (168) hide show
  1. package/README.md +8 -2
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-CjPaaF2r.js → AIOps-o-rFKEYL.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-_zlP_Z6z.js → ActionButton-Dzv1ReHF.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-C7X31L8l.js → Analytics-Bt7H_jrh.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-BmYa34Se.js → AppLayout-CgynsRFP.js} +4 -4
  9. package/src/assets/web-panel/assets/{Artifacts-B_YKNjlp.js → Artifacts-gghOGDyE.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-5JsI67XQ.js → Audit-DBXn-AZ6.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-BL3QbzvS.js → BackgroundAgents--dxPftKa.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-BRmg-gTa.js → Backup-D9Zf_2tH.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-DNE7mT3K.js → BaseInput-DDTOjovq.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-OYwAopdM.js → Chat-2ETqdBLn.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Dtxw3Wgt.js → ChatBubbleRenderer-DSg2Xs8G.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-nMgYkH8H.js → Checkbox-B5uzaLLP.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-B9G2ngLI.js → Codegen-4ieEEIwt.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-i0owJaGP.js → Col-D3I2kUGu.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-B3Ta0mI_.js → Community-DeYxFMJb.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-DDXrvvm-.js → Compact-5GigOmb8.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-Bn4Uq6U1.js → Compliance-DLVjbVUh.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-CO5NKD6r.js → Cowork-DfUKa0T5.js} +3 -3
  23. package/src/assets/web-panel/assets/{Cron-ByjNese0.js → Cron-_RpktpO5.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-BN1FUYyi.js → Crosschain-7x6xdbwH.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-CUFX5RL3.js → DID-ccVhToC1.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-D_2FDPBP.js → Dashboard-DhygcaoK.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-lGOMtIzb.js → Dropdown-DFplwXK7.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DA3Qf1S2.js → EmailListRenderer-Bm01soCN.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-DLcnicCr.js → EvolutionSettings-C4v--DkD.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BPOSaIN1.js → FamilyGuardDashboard-ChQXDBA3.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-DzJUCQq8.js → Federation-C0yomE-M.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DVx1XNKx.js → FormItemContext-DtT3ZEZK.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-BkqzO_lh.js → GenericCardRenderer-DgITtFRv.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-Dr_rdT_j.js → Git-CCY42R8S.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-DyVkZddw.js → Governance-N66Bwvqg.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-IN2YDd4v.js → Inference-BkbPuR_2.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Ceiy4n6N.js → KnowledgeGraph-B3PibXdA.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-d7pIEAX2.js → Logs-CUtNB_N6.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-DmSl0MNI.js → MarkdownRenderer-D-V4dOe3.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-uVE7U14g.js → Marketplace-DLNJb6Nr.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-DUfBM--y.js → McpTools-2zGjJb5K.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-6gkcR02J.js → Memory-9rNZ1EvR.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-Cl6ys2O9.js → MobileBridge-Cw7sAAgn.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-5P8jN4gf.js → MobileProjects-8XACrqqy.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-DtiT1Kol.js → Mtc-mg02JNy-.js} +4 -4
  46. package/src/assets/web-panel/assets/{MtcAudit-DZz8iiTE.js → MtcAudit-B1Vkhj2l.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DFH3-fBJ.js → Multisig-BQEeA7GG.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-BYNuDOt-.js → NLProgramming-BIbkjZV3.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BCY4jgYy.js → Notes-DIwhkZNY.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-Bk2ltghU.js → NotificationSettings-Cj9175ce.js} +1 -1
  51. package/src/assets/web-panel/assets/OrderTableRenderer-IfNpXT2R.js +1 -0
  52. package/src/assets/web-panel/assets/{Organization-CY4_mSiV.js → Organization-DPFp6G9o.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-CaRUAOY_.js → Overflow-ky9UfGv4.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-Bd96rBWQ.js → P2P-tXck8GLq.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-JjnExxan.js → PdhVaultBrowser-DSvpQl9k.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-CW1PUJB0.js → Permissions-CKPkdLj-.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-BNn9alTk.js → PersonalDataHub-DnqXc12l.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-01_PBiUu.js → Pipeline-BKjFU_kd.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BP4DlVGb.js → Privacy-ChC-J5Tn.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-CAMnQj4n.js → ProjectInit-ByFZG9sY.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-DKxV5On_.js → ProjectSettings-Bbv1Kiw-.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-B_4kRnM8.js → Projects-QYyGW31-.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-DeqqZyUv.js → Providers-CJLnWw0r.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-fFkycCT4.js → QrScannerModal-er_HkLCI.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-Ln6qQidy.js → QuickAsk-DoXU0np9.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DeENA-y0.js → Recommend-DCo_vuaf.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-CRxSYxo4.js → RemoteSession-CLuL925Z.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-B2kU2F0l.js → Reputation-CNNCA_-M.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-lV_nLlFq.js → Row-Vu4j631i.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-Df21mCdF.js → RssFeed-C18B4xiy.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-8_Dz4qU9.js → Search-DxiqccE2.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-Cl5-PEcp.js → Security-Droe_hHI.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-C5qgCqA7.js → Services-CwmmyXzq.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-ASRgSh_Y.js → Skeleton-CrFs6rUL.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-DWx01ZJ7.js → Skills-Dp-d2miK.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-I2gbgtW8.js → Sla-2DFXVbK4.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-BqTikzfe.js → SpeechSettings-Cdd9lCoy.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-D3zCpBFV.js → SyncSettings-CxQhcYSk.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-DjMWII45.js → Tasks-BHWVRfXx.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-Cq7qDnHX.js → Templates-DNFk3a5_.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-DEasKDpQ.js → Tenant-B6X6dPo8.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-J6fLkTzi.js → Terminal-BuUNoLGM.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CNvWrWN-.js → TimelineRenderer-DThrBYj8.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-BSgHJCKH.js → Tokens-CA_u4Blu.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DgGU_D0o.js → Trigger-CXrW4Nry.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-BANlv-uB.js → Trust-DHcLpNy3.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-qh8GPRsU.js → UkeySign-B_fni4C2.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-DBiGTB4H.js → VideoEditing-g9nf2EhS.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-DMUFR7cL.js → Wallet-C8pOjIve.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-DP9nQQzW.js → WebAuthn-BaKNjxZt.js} +2 -2
  91. package/src/assets/web-panel/assets/{WorkflowEditor-DT_6jDkL.js → WorkflowEditor-CX030Wb1.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-C_kELmV6.js → chat-BpJsXlTK.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-DE-ZxAv_.js → colors-CUNg0-fh.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BowulLDi.js → compact-item-C3tFHnhu.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DCh8oMBQ.js → createContext-B8rTvO61.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-B4_IVU_n.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-Be7mK-iw.js → hasIn-CU6RIciB.js} +1 -1
  98. package/src/assets/web-panel/assets/index--6BUI55w.js +1 -0
  99. package/src/assets/web-panel/assets/{index-Ao-LXr-d.js → index-111hR8WZ.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-4KkYmFy5.js → index-1L0tt7G2.js} +1 -1
  101. package/src/assets/web-panel/assets/index-5Q1bepcM.js +1 -0
  102. package/src/assets/web-panel/assets/{index-lN916819.js → index-6EwPIfXu.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Ck6MYKVN.js → index-B10Ia2KL.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-C_VnSUjh.js → index-B1SLBLli.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DOebEvgn.js → index-B8_VQAav.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BdzVLz-c.js → index-BG4zuFf0.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DEDVYN7D.js → index-BJjEAoDb.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DSRKtgJg.js → index-BMuPJra-.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DSqZBvQM.js → index-BOCjph-k.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-_cYsz4df.js → index-BOlAutGy.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-nLHTuHoT.js → index-BPWJw4Ji.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C2pCquZC.js → index-BpBaOWmV.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DMKo49Um.js → index-BzhobTgZ.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BDIIR8g6.js → index-CDlHvQtw.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DLCzaLH4.js → index-CEIoRm_c.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-D3lOYd9_.js → index-CLQjdKmE.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-6OluUVJJ.js → index-CPF7Vqri.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CwJfLNqv.js → index-CPmgKQcl.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DbrQO1p9.js → index-CcpMHPWd.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B-3EDOlf.js → index-Cyksnofp.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Cvy4vdVW.js → index-CyyhilXV.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-3Ql7xQLn.js → index-D4njcYFw.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BlzMqaWB.js → index-Dc9pcin6.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DMDaGPxG.js → index-DfAC55QA.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CKmC6ugN.js → index-DgNCfwvg.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DN1AT3FH.js → index-DvfhIBNZ.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CL2hAUWh.js → index-Hbzd9WeI.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DPX3N4T8.js → index-IiS7WoUl.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CXvy8HrM.js → index-K2Uqqkr1.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-DjC2TJeH.js → index-KgR1f2Gq.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-OH54KMLN.js → index-X6e0cGRU.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CecGCLWI.js → index-Xa6TlaD7.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BwY31W-u.js → index-YczWc2_0.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CUXfwAhF.js → index-h_ANnbR8.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-Qx8cTReg.js → index-k7QsBwyo.js} +3 -3
  136. package/src/assets/web-panel/assets/{index-LVrxqU88.js → index-lo9rgpyj.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BNhziAal.js → initDefaultProps-FI8D7E2x.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-fUkbJz38.js → motion-B1hpJYSD.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-rFx211Cl.js → move-Vl1vUReW.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-CEP1wN3R.js → mtc-parser-6Cu2aFME.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DacHd_Zm.js → omit-VRKL8iSO.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-Dqp58Ep2.js → pickAttrs-DZfWsOe0.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-Cv6Rm0pV.js → placementArrow-qmcOUc4W.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-rNE0p9ZW.js → responsiveObserve-BLB6SsSw.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-C97JxD4S.js → slide-41jdYeSH.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-Cxk1gV9M.js → statusUtils-Yn8OQ5ey.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-CbtKKsPo.js → styleChecker-4CEwz9Zd.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-CQATs2JQ.js → useFlexGapSupport-BClv53kR.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-6c7qrpE_.js → useFs-Bugo8HuF.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-OjxtBGe7.js → usePersonalDataHub-B-q2ElB0.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-CSlXfUSh.js → vnode-ejVeFJ0x.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-Cc1qKiSZ.js → zoom-DM1y_KKP.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/constants.js +1 -1
  155. package/src/data/changelog.json +14 -1
  156. package/src/lib/goal-assess.js +4 -1
  157. package/src/lib/goal-check-evidence.js +77 -9
  158. package/src/lib/goal-model-call.js +107 -0
  159. package/src/lib/goal-workspace-evidence.js +299 -0
  160. package/src/lib/llm-onboarding-catalog.json +1 -1
  161. package/src/lib/llm-providers.js +1 -0
  162. package/src/lib/task-model-selector.js +1 -1
  163. package/src/runtime/agent-core.js +27 -1
  164. package/src/runtime/headless-runner.js +201 -107
  165. package/src/assets/web-panel/assets/OrderTableRenderer-OdeXEGAn.js +0 -1
  166. package/src/assets/web-panel/assets/devWarning-BVvJAp91.js +0 -1
  167. package/src/assets/web-panel/assets/index-B7IhCfsh.js +0 -1
  168. package/src/assets/web-panel/assets/index-BMrbe_Ey.js +0 -1
@@ -245,7 +245,11 @@ import {
245
245
  runtimeUsageEventType,
246
246
  runtimeToolCallId,
247
247
  } from "../lib/runtime-usage-ledger.js";
248
- import { runMeteredDirectModelCall } from "../lib/direct-model-usage.js";
248
+ import {
249
+ goalModelCallError,
250
+ runGoalModelCall,
251
+ } from "../lib/goal-model-call.js";
252
+ import { captureGoalWorkspace } from "../lib/goal-workspace-evidence.js";
249
253
  import {
250
254
  GoalCheckEvidence,
251
255
  buildGoalJudgePrompt,
@@ -3380,6 +3384,52 @@ async function runAgentHeadlessInWorkspace(
3380
3384
  };
3381
3385
  };
3382
3386
 
3387
+ const recordRunUsage = (event) => {
3388
+ if (!event.attribution) {
3389
+ usage.input_tokens += event.usage?.input_tokens || 0;
3390
+ usage.output_tokens += event.usage?.output_tokens || 0;
3391
+ // Carry prompt-cache tokens into accumulated usage (cost accuracy).
3392
+ usage.cache_read_input_tokens +=
3393
+ event.usage?.cache_read_input_tokens || 0;
3394
+ usage.cache_creation_input_tokens +=
3395
+ event.usage?.cache_creation_input_tokens || 0;
3396
+ }
3397
+ emitStream({
3398
+ type: "token_usage",
3399
+ provider: event.provider,
3400
+ model: event.model,
3401
+ usage: event.usage,
3402
+ ...(event.contextWindow ? { contextWindow: event.contextWindow } : {}),
3403
+ ...(event.attribution ? { attribution: event.attribution } : {}),
3404
+ ...(event.source ? { source: event.source } : {}),
3405
+ });
3406
+ if (costBudget) {
3407
+ costBudget.add({
3408
+ provider: event.provider,
3409
+ model: event.model,
3410
+ usage: event.usage,
3411
+ });
3412
+ if (costBudget.shouldWarnInactive()) {
3413
+ const m = `cost cap $${options.maxCostUsd} set but model "${event.model}" is unpriced/free — cap inactive`;
3414
+ if (isText) writeErr(` ${m}\n`);
3415
+ emitStream({ type: "cost_warning", message: m });
3416
+ }
3417
+ if (costBudget.exceeded()) {
3418
+ endReason = "cost-budget-exhausted";
3419
+ stopForCost = true;
3420
+ if (isText)
3421
+ writeErr(
3422
+ ` ⛔ cost budget $${options.maxCostUsd} reached (spent ≈$${costBudget.spentUsd}) — stopping\n`,
3423
+ );
3424
+ emitStream({
3425
+ type: "cost_budget_exhausted",
3426
+ limit_usd: options.maxCostUsd,
3427
+ spent_usd: costBudget.spentUsd,
3428
+ });
3429
+ }
3430
+ }
3431
+ };
3432
+
3383
3433
  // --goal-condition: session-level completion-condition engine (P1). After each
3384
3434
  // outer turn an independent checker judges a completion CONDITION; if unmet and
3385
3435
  // budget remains, a follow-up user turn re-drives the agent — until met
@@ -3390,6 +3440,51 @@ async function runAgentHeadlessInWorkspace(
3390
3440
  let _goalHelpers = null;
3391
3441
  let _goalTokensSeen = 0; // per-turn usage deltas (engine totals == run total)
3392
3442
  let _goalCostSeen = 0;
3443
+ const recordGoalUsage = () => {
3444
+ if (!goalEngine) return;
3445
+ const tokens =
3446
+ usage.input_tokens +
3447
+ usage.output_tokens +
3448
+ usage.cache_read_input_tokens +
3449
+ usage.cache_creation_input_tokens;
3450
+ goalEngine.recordTurnUsage({
3451
+ tokens: tokens - _goalTokensSeen,
3452
+ costUsd: costBudget.spentUsd - _goalCostSeen,
3453
+ });
3454
+ _goalTokensSeen = tokens;
3455
+ _goalCostSeen = costBudget.spentUsd;
3456
+ };
3457
+ const callGoalModel = async (prompt, operationId) => {
3458
+ const { chatWithTools } = await import("./agent-core.js");
3459
+ try {
3460
+ return await runGoalModelCall({
3461
+ sessionId: resolveHeadlessMeteredSessionId(persist, sessionId),
3462
+ persist: persist
3463
+ ? (type, data) => store.appendEvent(sessionId, type, data)
3464
+ : null,
3465
+ sessionBudget: options.sessionBudget || null,
3466
+ iterationBudget: budget,
3467
+ costBudget,
3468
+ signal: options.signal,
3469
+ operationId,
3470
+ prompt,
3471
+ chat: chatWithTools,
3472
+ chatOptions: {
3473
+ ...(evolutionIngress === null ? {} : { evolutionIngress }),
3474
+ model,
3475
+ provider,
3476
+ baseUrl,
3477
+ apiKey,
3478
+ serviceTier: options.serviceTier,
3479
+ maxOutputTokens: options.maxOutputTokens,
3480
+ },
3481
+ onUsage: recordRunUsage,
3482
+ });
3483
+ } finally {
3484
+ // Include auxiliary usage before the completion decision and checkpoint.
3485
+ recordGoalUsage();
3486
+ }
3487
+ };
3393
3488
  let goalSetupFailure = null;
3394
3489
  let goalRecoveryReviewed = false;
3395
3490
  const goalEvidence = options.goalCondition
@@ -3398,36 +3493,47 @@ async function runAgentHeadlessInWorkspace(
3398
3493
  // Model-judged conditions reuse the run's own model as an independent
3399
3494
  // evaluator (mirrors --goal-assess). Overridable via deps for tests.
3400
3495
  const _defaultGoalJudge = async (cond, transcript) => {
3496
+ const checkCancellation = () => {
3497
+ if (options.signal?.aborted || options.sessionBudget?.signal?.aborted)
3498
+ throw goalModelCallError("cancelled");
3499
+ };
3500
+ checkCancellation();
3501
+ const goalBudget = goalEngine?.budget;
3502
+ const goalState = goalEngine?.state;
3503
+ if (
3504
+ goalBudget &&
3505
+ ((goalBudget.maxTokens != null &&
3506
+ goalState.tokens >= goalBudget.maxTokens) ||
3507
+ (goalBudget.maxCostUsd != null &&
3508
+ goalState.costUsd >= goalBudget.maxCostUsd) ||
3509
+ (goalBudget.maxTimeMs != null &&
3510
+ (deps.now ? deps.now() : Date.now()) - goalState.startedAtMs >=
3511
+ goalBudget.maxTimeMs))
3512
+ ) {
3513
+ return {
3514
+ met: false,
3515
+ reason: "Goal budget exhausted before model evaluation",
3516
+ };
3517
+ }
3401
3518
  if (!usableGoalEvidence(transcript.goalEvidence).length) {
3519
+ const bindingReasons = [
3520
+ ...new Set(
3521
+ (transcript.goalEvidence?.tools || [])
3522
+ .map((record) => record.workspace?.reason)
3523
+ .filter(Boolean),
3524
+ ),
3525
+ ];
3402
3526
  return {
3403
3527
  met: false,
3404
- reason:
3405
- "No current successful tool evidence; run an explicit check for the goal condition",
3528
+ reason: bindingReasons.length
3529
+ ? `Goal workspace evidence unavailable (${bindingReasons.join(", ")}); run a fresh artifact read or explicit check`
3530
+ : "No current successful tool evidence; run an explicit check for the goal condition",
3406
3531
  evidence: { kind: "model", source: "current-turn-tools", toolIds: [] },
3407
3532
  };
3408
3533
  }
3409
- const { chatWithTools } = await import("./agent-core.js");
3410
3534
  const { firstBalancedJson } = await import("../lib/json-schema-output.js");
3411
3535
  const judgePrompt = buildGoalJudgePrompt(cond, transcript);
3412
- const r = await runMeteredDirectModelCall({
3413
- sessionId: resolveHeadlessMeteredSessionId(persist, sessionId),
3414
- persist: persist
3415
- ? (type, data) => store.appendEvent(sessionId, type, data)
3416
- : null,
3417
- provider,
3418
- model,
3419
- source: "model",
3420
- sessionBudget: options.sessionBudget || null,
3421
- call: () =>
3422
- chatWithTools([{ role: "user", content: judgePrompt }], {
3423
- ...(evolutionIngress === null ? {} : { evolutionIngress }),
3424
- model,
3425
- provider,
3426
- baseUrl,
3427
- apiKey,
3428
- enabledToolNames: [],
3429
- }),
3430
- });
3536
+ const r = await callGoalModel(judgePrompt, "goal-condition");
3431
3537
  const text = r?.message?.content || "";
3432
3538
  let verdict = null;
3433
3539
  const block = firstBalancedJson(text, "{");
@@ -3438,16 +3544,25 @@ async function runAgentHeadlessInWorkspace(
3438
3544
  /* tolerant: a non-JSON verdict stays unmet */
3439
3545
  }
3440
3546
  }
3441
- return validateGoalJudgeVerdict(verdict, transcript.goalEvidence);
3547
+ // A user or background writer can change files while the model evaluates.
3548
+ // Re-read the bound inputs before accepting its cited observations.
3549
+ await goalEvidence.refreshWorkspace();
3550
+ checkCancellation();
3551
+ return validateGoalJudgeVerdict(verdict, goalEvidence.snapshot());
3442
3552
  };
3443
3553
  // A running checkpoint precedes model/tool effects; an evaluated checkpoint
3444
3554
  // precedes publishing the decision. An interrupted running phase requires
3445
3555
  // reconciliation on resume instead of silently replaying the old goal state.
3446
- const persistGoalSnapshot = (phase, failurePhase = "after-model") => {
3556
+ const persistGoalSnapshot = (
3557
+ phase,
3558
+ failurePhase = "after-model",
3559
+ evaluation = null,
3560
+ ) => {
3447
3561
  if (!persist || !goalEngine) return;
3448
3562
  try {
3449
3563
  store.appendEvent(sessionId, "goal_snapshot", {
3450
3564
  ...goalEngine.snapshot(),
3565
+ ...(evaluation ? { evaluation } : {}),
3451
3566
  checkpoint: {
3452
3567
  schema: "chainlesschain.goal-checkpoint/v1",
3453
3568
  phase,
@@ -3520,6 +3635,15 @@ async function runAgentHeadlessInWorkspace(
3520
3635
  now: goalNow,
3521
3636
  });
3522
3637
  }
3638
+ if (goalEngine.condition.kind === "model" && !deps.goalConditionJudge) {
3639
+ const signals = [options.signal, options.sessionBudget?.signal].filter(
3640
+ Boolean,
3641
+ );
3642
+ const signal =
3643
+ signals.length > 1 ? AbortSignal.any(signals) : signals[0];
3644
+ goalEvidence.captureWorkspace = (call) =>
3645
+ captureGoalWorkspace(cwd, call, { signal });
3646
+ }
3523
3647
  _goalHelpers = {
3524
3648
  isDeterministicCondition: eng.isDeterministicCondition,
3525
3649
  runDeterministicCheck: eng.runDeterministicCheck,
@@ -3650,7 +3774,7 @@ async function runAgentHeadlessInWorkspace(
3650
3774
  args: event.args,
3651
3775
  };
3652
3776
  toolCalls.push(toolCall);
3653
- goalEvidence?.started(toolCall);
3777
+ await goalEvidence?.started(toolCall);
3654
3778
  toolStartedAt.set(
3655
3779
  telemetryToolId,
3656
3780
  deps.now ? deps.now() : Date.now(),
@@ -3778,7 +3902,11 @@ async function runAgentHeadlessInWorkspace(
3778
3902
  if (policyEvent) emitStream(policyEvent);
3779
3903
  }
3780
3904
  if (settledCall) {
3781
- goalEvidence?.settled(settledCall, event.result, Boolean(err));
3905
+ await goalEvidence?.settled(
3906
+ settledCall,
3907
+ event.result,
3908
+ Boolean(err),
3909
+ );
3782
3910
  settledCall.is_error = Boolean(err);
3783
3911
  settledCall.durationMs =
3784
3912
  event.result?.toolTelemetryRecord?.durationMs ??
@@ -3921,51 +4049,7 @@ async function runAgentHeadlessInWorkspace(
3921
4049
  event,
3922
4050
  "headless usage settlement",
3923
4051
  );
3924
- if (!event.attribution) {
3925
- usage.input_tokens += event.usage?.input_tokens || 0;
3926
- usage.output_tokens += event.usage?.output_tokens || 0;
3927
- // Carry prompt-cache tokens into accumulated usage (cost accuracy).
3928
- usage.cache_read_input_tokens +=
3929
- event.usage?.cache_read_input_tokens || 0;
3930
- usage.cache_creation_input_tokens +=
3931
- event.usage?.cache_creation_input_tokens || 0;
3932
- }
3933
- emitStream({
3934
- type: "token_usage",
3935
- provider: event.provider,
3936
- model: event.model,
3937
- usage: event.usage,
3938
- ...(event.contextWindow
3939
- ? { contextWindow: event.contextWindow }
3940
- : {}),
3941
- ...(event.attribution ? { attribution: event.attribution } : {}),
3942
- ...(event.source ? { source: event.source } : {}),
3943
- });
3944
- if (costBudget) {
3945
- costBudget.add({
3946
- provider: event.provider,
3947
- model: event.model,
3948
- usage: event.usage,
3949
- });
3950
- if (costBudget.shouldWarnInactive()) {
3951
- const m = `cost cap $${options.maxCostUsd} set but model "${event.model}" is unpriced/free — cap inactive`;
3952
- if (isText) writeErr(` ${m}\n`);
3953
- emitStream({ type: "cost_warning", message: m });
3954
- }
3955
- if (costBudget.exceeded()) {
3956
- endReason = "cost-budget-exhausted";
3957
- stopForCost = true;
3958
- if (isText)
3959
- writeErr(
3960
- ` ⛔ cost budget $${options.maxCostUsd} reached (spent ≈$${costBudget.spentUsd}) — stopping\n`,
3961
- );
3962
- emitStream({
3963
- type: "cost_budget_exhausted",
3964
- limit_usd: options.maxCostUsd,
3965
- spent_usd: costBudget.spentUsd,
3966
- });
3967
- }
3968
- }
4052
+ recordRunUsage(event);
3969
4053
  break;
3970
4054
  }
3971
4055
  case "iteration-warning": {
@@ -4095,18 +4179,7 @@ async function runAgentHeadlessInWorkspace(
4095
4179
  ) {
4096
4180
  // Feed this turn's usage DELTA so the engine's totals equal the run's
4097
4181
  // cumulative usage (recordTurnUsage accumulates).
4098
- const curTokens =
4099
- usage.input_tokens +
4100
- usage.output_tokens +
4101
- usage.cache_read_input_tokens +
4102
- usage.cache_creation_input_tokens;
4103
- const curCost = costBudget ? Number(costBudget.spentUsd) || 0 : 0;
4104
- goalEngine.recordTurnUsage({
4105
- tokens: curTokens - _goalTokensSeen,
4106
- costUsd: curCost - _goalCostSeen,
4107
- });
4108
- _goalTokensSeen = curTokens;
4109
- _goalCostSeen = curCost;
4182
+ recordGoalUsage();
4110
4183
 
4111
4184
  const cond = goalEngine.condition;
4112
4185
  let evaluation;
@@ -4131,6 +4204,7 @@ async function runAgentHeadlessInWorkspace(
4131
4204
  throw error;
4132
4205
  }
4133
4206
  const judge = deps.goalConditionJudge || _defaultGoalJudge;
4207
+ await goalEvidence.refreshWorkspace();
4134
4208
  evaluation = await judge(cond, {
4135
4209
  prompt: options.prompt,
4136
4210
  finalText,
@@ -4140,6 +4214,12 @@ async function runAgentHeadlessInWorkspace(
4140
4214
  }
4141
4215
  } catch (err) {
4142
4216
  if (err?.runtimeLedgerPersistence === true) throw err;
4217
+ if (
4218
+ err?.goalModelFailure ||
4219
+ (typeof err?.code === "string" &&
4220
+ err.code.startsWith("CC_SESSION_BUDGET_"))
4221
+ )
4222
+ throw err;
4143
4223
  if (err?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED") throw err;
4144
4224
  evaluation = {
4145
4225
  met: false,
@@ -4150,7 +4230,7 @@ async function runAgentHeadlessInWorkspace(
4150
4230
 
4151
4231
  const { decision, events } = goalEngine.evaluate(evaluation);
4152
4232
  // Publish only after the decision and accumulated usage are durable.
4153
- persistGoalSnapshot("evaluated");
4233
+ persistGoalSnapshot("evaluated", "after-model", evaluation);
4154
4234
  for (const ev of events) {
4155
4235
  emitStream(ev);
4156
4236
  if (isText) {
@@ -4167,6 +4247,10 @@ async function runAgentHeadlessInWorkspace(
4167
4247
  }
4168
4248
  }
4169
4249
  if (decision === _goalHelpers.GOAL_DECISION.CONTINUE) {
4250
+ if (budget.isExhausted()) {
4251
+ endReason = "max_turns";
4252
+ break;
4253
+ }
4170
4254
  messages.push(
4171
4255
  markRuntimeOnlySessionMessage({
4172
4256
  role: "user",
@@ -4232,7 +4316,9 @@ async function runAgentHeadlessInWorkspace(
4232
4316
  ? "error_persistence"
4233
4317
  : sessionBudgetFailed
4234
4318
  ? "error_session_budget"
4235
- : "error";
4319
+ : err?.goalModelFailure
4320
+ ? err.subtype
4321
+ : "error";
4236
4322
  const transportDetails =
4237
4323
  errorSubtype === "error" ? transportErrorDetails(err) : undefined;
4238
4324
  const diagnosticFields = transportDetails
@@ -4247,6 +4333,13 @@ async function runAgentHeadlessInWorkspace(
4247
4333
  subtype: errorSubtype,
4248
4334
  is_error: true,
4249
4335
  error: message,
4336
+ ...(err?.goalModelFailure
4337
+ ? {
4338
+ usage,
4339
+ total_cost_usd: costBudget.spentUsd,
4340
+ num_turns: budget.consumed,
4341
+ }
4342
+ : {}),
4250
4343
  ...diagnosticFields,
4251
4344
  });
4252
4345
  } else if (isJson) {
@@ -4259,6 +4352,7 @@ async function runAgentHeadlessInWorkspace(
4259
4352
  sessionId,
4260
4353
  toolCalls,
4261
4354
  usage,
4355
+ totalCostUsd: costBudget.spentUsd,
4262
4356
  numTurns: budget.consumed,
4263
4357
  durationMs: (deps.now ? deps.now() : Date.now()) - startedAt,
4264
4358
  denials,
@@ -4274,7 +4368,11 @@ async function runAgentHeadlessInWorkspace(
4274
4368
  // "the model call failed" from "the run itself errored" (1).
4275
4369
  loopFailureOutcome = {
4276
4370
  exitCode:
4277
- persistenceFailed || sessionBudgetFailed ? 1 : classifyLoopError(err),
4371
+ persistenceFailed || sessionBudgetFailed
4372
+ ? 1
4373
+ : err?.goalModelFailure
4374
+ ? exitCodeForEndReason(err.endReason, true)
4375
+ : classifyLoopError(err),
4278
4376
  result: message,
4279
4377
  isError: true,
4280
4378
  ...(persistence ? { persistence } : {}),
@@ -4538,26 +4636,7 @@ async function runAgentHeadlessInWorkspace(
4538
4636
  const assessChat =
4539
4637
  deps.assessChat ||
4540
4638
  (async (assessPrompt) => {
4541
- const { chatWithTools } = await import("./agent-core.js");
4542
- const r = await runMeteredDirectModelCall({
4543
- sessionId: resolveHeadlessMeteredSessionId(persist, sessionId),
4544
- persist: persist
4545
- ? (type, data) => store.appendEvent(sessionId, type, data)
4546
- : null,
4547
- provider,
4548
- model,
4549
- source: "model",
4550
- sessionBudget: options.sessionBudget || null,
4551
- call: () =>
4552
- chatWithTools([{ role: "user", content: assessPrompt }], {
4553
- ...(evolutionIngress === null ? {} : { evolutionIngress }),
4554
- model,
4555
- provider,
4556
- baseUrl,
4557
- apiKey,
4558
- enabledToolNames: [],
4559
- }),
4560
- });
4639
+ const r = await callGoalModel(assessPrompt, "goal-assessment");
4561
4640
  return r?.message?.content || "";
4562
4641
  });
4563
4642
  const { assessment } = await doAssess({
@@ -4585,6 +4664,21 @@ async function runAgentHeadlessInWorkspace(
4585
4664
  }
4586
4665
  }
4587
4666
  } catch (error) {
4667
+ if (error?.goalModelFailure) {
4668
+ isError = true;
4669
+ subtype = error.subtype;
4670
+ endReason = error.endReason;
4671
+ finalText = error.message;
4672
+ }
4673
+ if (
4674
+ typeof error?.code === "string" &&
4675
+ error.code.startsWith("CC_SESSION_BUDGET_")
4676
+ ) {
4677
+ isError = true;
4678
+ subtype = "error_session_budget";
4679
+ endReason = "session-budget-exhausted";
4680
+ finalText = error.message;
4681
+ }
4588
4682
  if (error?.runtimeLedgerPersistence === true) {
4589
4683
  isError = true;
4590
4684
  subtype = "error_persistence";
@@ -1 +0,0 @@
1
- import{I as w,P as l,J as u,U as s,R as n,c as i,K as v,Q as _,V as g,b as o}from"./vendor-Bn1JzzAn.js";import{_ as S}from"./index-Qx8cTReg.js";import"./icons-DG5UD-6K.js";const k={__name:"OrderTableRenderer",props:{event:{type:Object,required:!0}},setup(p,{expose:r}){r();const a=p,e=o(()=>a.event.content||{}),d=o(()=>a.event.extra||{}),m=o(()=>d.value.merchant||e.value.merchant||e.value.counterparty||"—"),c=o(()=>e.value.title||e.value.name||e.value.itemName||e.value.text||"—"),y=o(()=>{const t=e.value.amount??e.value.price??e.value.total;return t==null?"—":`${e.value.currency||"¥"} ${typeof t=="number"?t.toFixed(2):t}`}),T=o(()=>d.value.orderNo||e.value.orderNo||e.value.orderId),f=o(()=>e.value.status||e.value.state),b=o(()=>{const t=(f.value||"").toLowerCase();return t.includes("成功")||t.includes("succe")||t.includes("paid")?"green":t.includes("退")||t.includes("refund")?"orange":t.includes("失败")||t.includes("fail")?"red":"default"}),h=o(()=>{if(!a.event.occurredAt)return"";const t=new Date(a.event.occurredAt);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")} ${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}),x={props:a,c:e,e:d,merchantText:m,itemText:c,amountText:y,orderNo:T,statusText:f,statusColor:b,formattedTime:h,computed:o};return Object.defineProperty(x,"__isScriptSetup",{enumerable:!1,value:!0}),x}},N={class:"order-card"},C={class:"head"},O={class:"time"},V={class:"row"},R={class:"val"},B={class:"row"},D={class:"val"},I={class:"row amount-row"},j={class:"val amount"},A={key:0,class:"row"},F={class:"val mono"},M={key:1,class:"row"};function P(p,r,a,e,d,m){const c=w("a-tag");return l(),u("div",N,[s("div",C,[s("span",O,n(e.formattedTime),1),i(c,{color:"gold"},{default:v(()=>[_(n(a.event.source.adapter),1)]),_:1}),i(c,null,{default:v(()=>[_(n(a.event.subtype),1)]),_:1})]),s("div",V,[r[0]||(r[0]=s("span",{class:"key"},"商户",-1)),s("span",R,n(e.merchantText),1)]),s("div",B,[r[1]||(r[1]=s("span",{class:"key"},"商品/项目",-1)),s("span",D,n(e.itemText),1)]),s("div",I,[r[2]||(r[2]=s("span",{class:"key"},"金额",-1)),s("span",j,n(e.amountText),1)]),e.orderNo?(l(),u("div",A,[r[3]||(r[3]=s("span",{class:"key"},"单号",-1)),s("span",F,n(e.orderNo),1)])):g("v-if",!0),e.statusText?(l(),u("div",M,[r[4]||(r[4]=s("span",{class:"key"},"状态",-1)),i(c,{color:e.statusColor},{default:v(()=>[_(n(e.statusText),1)]),_:1},8,["color"])])):g("v-if",!0)])}const K=S(k,[["render",P],["__scopeId","data-v-5ed5524d"],["__file","/tmp/cc-web-panel-nob91t/repo/packages/web-panel/src/components/pdh/renderers/OrderTableRenderer.vue"]]);export{K as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-Qx8cTReg.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-lV_nLlFq.js";import{a0 as t}from"./index-Qx8cTReg.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-rNE0p9ZW.js";import"./useFlexGapSupport-CQATs2JQ.js";import"./styleChecker-CbtKKsPo.js";import"./index-OH54KMLN.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-i0owJaGP.js";import{a0 as t}from"./index-Qx8cTReg.js";import"./vendor-Bn1JzzAn.js";import"./index-OH54KMLN.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};