chainlesschain 0.166.100 → 0.166.102

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 (187) hide show
  1. package/package.json +3 -3
  2. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  3. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-Cd4iUOPt.js → AIOps-CyHIMEd8.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton--ucr-zko.js → ActionButton-vuNxDpHm.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-DbejYMWk.js → Analytics-D0quEM0q.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CLgKxeGw.js → AppLayout-xRSVpbCs.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-CTT5BIL5.js → Artifacts-ktfVAZBC.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DP-WBWe9.js → Audit-UJW6maH4.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-B6VqheJk.js → BackgroundAgents-BYrfdCoT.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-VWJK5zim.js → Backup-IBgsJ7BK.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-YGFO9RHd.js → BaseInput-BmP8_zxy.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-CVfydnCd.js → Chat-urkw8_BF.js} +5 -5
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BICpB-qU.js → ChatBubbleRenderer-Cw44zZbh.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-Bd5vKRMk.js → Checkbox-CYboo-__.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-DHNgPHvg.js → Codegen-DaqR_Ay8.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-CA2BYQ8T.js → Col-04BSIj_z.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DnKJ-qpI.js → Community-DxFk7Trv.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-C9BZ8t4r.js → Compact-mjgWlMCB.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-ByyQ2FOl.js → Compliance-CC5ee7QV.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-rXTwXE_c.js → Cowork-BK4BhHZd.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-BuW-HODy.js → Cron-CP6jAxq0.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-OudNtbYW.js → Crosschain-DJPaViZS.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BQ6BxYNN.js → DID-BTLxkuOj.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-Cz5HG8tz.js → Dashboard-Djkiqh3d.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BzclHOVv.js → Dropdown-t_eUhqom.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-CbJETFdy.js → EmailListRenderer-7w6USx_J.js} +1 -1
  28. package/src/assets/web-panel/assets/{EvolutionSettings-Dx_pJG3d.js → EvolutionSettings-mU5IHEk5.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-6JCS1MNg.js → FamilyGuardDashboard-BCh-VBBC.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-BrPkMYaf.js → Federation-Be_VpjI2.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-Bhc9pobs.js → FormItemContext-D_lzQ7PI.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-BxOh07uQ.js → GenericCardRenderer-LYu3KapV.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-D_idoujr.js → Git-BBeF-PP4.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-ZGfIRE-x.js → Governance-CoF8Kzg7.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-DpAmcwbw.js → Inference-C4DLMnXS.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-D1S1UTgP.js → KnowledgeGraph-B2mlNewk.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-2sc8V5XV.js → Logs-DMZ_44Ya.js} +2 -2
  38. package/src/assets/web-panel/assets/MarkdownRenderer-Ck7Iv_9e.js +1 -0
  39. package/src/assets/web-panel/assets/{Marketplace-0xlFUKbe.js → Marketplace-BqDzTew_.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-D25eJLGm.js → McpTools-BbwSbDN9.js} +3 -3
  41. package/src/assets/web-panel/assets/{Memory-BLRGd9hM.js → Memory-DAaTWgrm.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-zpFINGzn.js → MobileBridge-BjbTGxoR.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileProjects-Cbyd-8kx.js → MobileProjects-DMODOBr-.js} +1 -1
  44. package/src/assets/web-panel/assets/{Mtc-DgXgUlHc.js → Mtc-DT9N2rCs.js} +2 -2
  45. package/src/assets/web-panel/assets/{MtcAudit-DzcL-dKH.js → MtcAudit-DagMfUVv.js} +2 -2
  46. package/src/assets/web-panel/assets/{Multisig-C3OrZ6VN.js → Multisig-C1BKP6nM.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-Bqp_vWA7.js → NLProgramming-B5LFh72i.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-Dyn45-Ht.js → Notes-Q77V3ltW.js} +3 -3
  49. package/src/assets/web-panel/assets/{NotificationSettings-CLjafGZr.js → NotificationSettings-HxdpNIBs.js} +1 -1
  50. package/src/assets/web-panel/assets/OrderTableRenderer-Dc0DpvBH.js +1 -0
  51. package/src/assets/web-panel/assets/{Organization-5gr9hyLm.js → Organization-QL3NZ7uW.js} +4 -4
  52. package/src/assets/web-panel/assets/{Overflow-BRdU02hT.js → Overflow-B_gqOKho.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-DIi7fzh6.js → P2P-BBJubU8Z.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-BCbS1KpA.js → PdhVaultBrowser-CFnGd-2E.js} +3 -3
  55. package/src/assets/web-panel/assets/{Permissions-BjeP9VtA.js → Permissions-BKkznIUM.js} +4 -4
  56. package/src/assets/web-panel/assets/{PersonalDataHub-y8PXOQUc.js → PersonalDataHub-DYK7ZAcd.js} +4 -4
  57. package/src/assets/web-panel/assets/{Pipeline-B0fL5uxY.js → Pipeline-CoeKpjoN.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-C8jCDn8Z.js → Privacy-Diw4G-92.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-B_L6Dc6V.js → ProjectInit-CHBOFkma.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-Bb1CYbZh.js → ProjectSettings-BJIsgdOf.js} +2 -2
  61. package/src/assets/web-panel/assets/{Projects-CUSV10Cn.js → Projects-GJjItXIk.js} +1 -1
  62. package/src/assets/web-panel/assets/{Providers-mBSTDJ0E.js → Providers-o8QCimor.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-CHxgalvt.js → QrScannerModal-z2W-zvhW.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-DI9KIMEV.js → QuickAsk-_yubhsna.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-B5_zW1JH.js → Recommend-CucgJwih.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-BkH4bmM5.js → RemoteSession-EzfIIRg1.js} +2 -2
  67. package/src/assets/web-panel/assets/{Reputation-DJrAqwAq.js → Reputation-_shttE67.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-xZ3MAM34.js → Row-DQA_S8-9.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-CCsrLLiu.js → RssFeed-BOqWawXT.js} +3 -3
  70. package/src/assets/web-panel/assets/{Search-CTCRKvaP.js → Search-Dx1v2xOq.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-D7joyfp2.js → Security-Bt4HHsT4.js} +4 -4
  72. package/src/assets/web-panel/assets/{Services-oqHPmTG4.js → Services-sruHiQ-r.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-BR_32bTG.js → Skeleton-CiBxvmOJ.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-BoRz9mln.js → Skills-De9qKODU.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-UAGUHZ9b.js → Sla-B_6yn8Wp.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-DeP_rMgv.js → SpeechSettings-C2CafExS.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-CSzzMmeA.js → SyncSettings-Dhh3Qmb0.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-CcqOLsLB.js → Tasks-Mvo5mTWm.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates-cDbkGSDG.js → Templates-D7WVTQQy.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-DmOy58cq.js → Tenant-7ur9Yfxd.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-CsRZH5vr.js → Terminal-BgzrOA6k.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-BgJrk6HG.js → TimelineRenderer-Dco20pT1.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-CCQglKDE.js → Tokens-hN6qBPag.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-t-Gt3oBY.js → Trigger-C4f_twAM.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-DQgu2kI0.js → Trust-Wf1SMypp.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-Cod2WUGj.js → UkeySign-DUXSyg3N.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-SGN5zaVK.js → VideoEditing-BvqsJaL0.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-CnLEL-LD.js → Wallet-CgAbcjKl.js} +3 -3
  89. package/src/assets/web-panel/assets/{WebAuthn-C2keUpD6.js → WebAuthn-DaLT0W3s.js} +2 -2
  90. package/src/assets/web-panel/assets/{WorkflowEditor-B1GvrwWJ.js → WorkflowEditor-CQqAXoaS.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-1E9_P_qY.js → chat-BhlohFTB.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-DuU6Os4q.js → colors-D7HqXIL8.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-C5NfOAcM.js → compact-item-Bqk4FCLY.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-D4Fxz9qQ.js → createContext-CEmWrWf0.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-YPX_TU7w.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-C6C49iFk.js → hasIn-CDY0pFi2.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DP2DCKD-.js → index-1HBam9t1.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B-bb-R99.js → index-6f6n0KFR.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BmvU4Tp_.js → index-B8L3_-sG.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BsH8mFp4.js → index-BHGOdvOQ.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BVE2wCeb.js → index-BNrvBWDS.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CJS6GTpv.js → index-BPmRkxeX.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-C7mh6xlu.js → index-BXRooi-O.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BZKRZYTX.js → index-BiLu-ImR.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-jFg3CPlQ.js → index-BuKGuH_y.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BULggEX6.js → index-BxXFRLTZ.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DPzunJER.js → index-BxYO6nde.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-AO6iDCSL.js → index-C02yDu4f.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BU5mPkNX.js → index-C3opQg47.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DSypQU1h.js → index-C9mvnSii.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DZgT7pH-.js → index-CVrwozwH.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CpiOzt7U.js → index-CYcjOnDX.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BlHkc48f.js → index-Cf1ha8l0.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CXb8gEWh.js → index-Chxt0t-A.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-HQXFl8fh.js → index-CkjgSHVz.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DpaGe-dr.js → index-CkqBoCiu.js} +3 -3
  117. package/src/assets/web-panel/assets/{index-C2nO02uW.js → index-CqK0J4Sj.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bu6qMjf4.js → index-CrsM-oiD.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bk-paNL3.js → index-Cur88hoN.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CXn-e3ki.js → index-D0nfNmbq.js} +1 -1
  121. package/src/assets/web-panel/assets/index-D53szVZQ.js +1 -0
  122. package/src/assets/web-panel/assets/{index-CDVwN9Sv.js → index-DEzL7s7P.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-B_ON9La1.js → index-DGKRAO61.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CQJoh5rw.js → index-DPBoWNwq.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-cnDfwWU5.js → index-DRcDWMwP.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BBVqlelF.js → index-DmKdCWq1.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BYg1dtne.js → index-DpI1LqJX.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-B5lzRoHp.js → index-DuMt3ewl.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-gh11zJ9h.js → index-Dwob5XoD.js} +1 -1
  130. package/src/assets/web-panel/assets/index-Ub2nJbV2.js +1 -0
  131. package/src/assets/web-panel/assets/{index-D1TXgNPA.js → index-XErJQ1yF.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DFK6PTGJ.js → index-aBHlgMrq.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Dh-vezHe.js → index-e9oCy7_4.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-bW6vfpLH.js → index-lBAbMOzg.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-lNmDaf3J.js → index-o_lc3eww.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-3DSfnIpD.js → initDefaultProps-CIeEUxIN.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-DxGLmgA0.js → motion-IPIj1ZtP.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-DrlLG6m5.js → move-BfSeXZ-f.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-BITbrJSb.js → mtc-parser-DX03-Xp4.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-D7k5vIbk.js → omit-z9EannfX.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-BJSvYFWo.js → pickAttrs-DXKmRkqZ.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-Bf4to1jA.js → placementArrow-k2HV7cIU.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-BXzeyzTa.js → responsiveObserve-bX7CsyWy.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-DLzNUNdj.js → slide-NskjQLbJ.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-wBBnrRm_.js → statusUtils-B3IoG-Er.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-BnmJzXNr.js → styleChecker-DHv_UilX.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-DrN8MrJb.js → useFlexGapSupport-DEqGB5Ng.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-dnkYGkjY.js → useFs-Bl9CbrqZ.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-k_xkv7-k.js → usePersonalDataHub-O-Ukv93M.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-B-v8PXpK.js → vnode-hGCHTaZt.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-Coue8wAK.js → zoom-BWhIVeKQ.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/command-help-index.json +1 -1
  154. package/src/commands/agent.js +64 -40
  155. package/src/commands/eval.js +11 -8
  156. package/src/data/changelog.json +26 -0
  157. package/src/harness/provider-backed-compaction.js +13 -5
  158. package/src/lib/config-schema.js +18 -5
  159. package/src/lib/context-memory-kernel/live-compaction.js +142 -61
  160. package/src/lib/context-memory-kernel/memory-query-index.js +5 -2
  161. package/src/lib/context-memory-kernel/runtime.js +4 -0
  162. package/src/lib/context-memory-kernel/segmented-memory-port.js +28 -3
  163. package/src/lib/context-source-ledger.js +52 -9
  164. package/src/lib/formal-budget-authority.js +533 -0
  165. package/src/lib/formal-budget-contract.js +609 -0
  166. package/src/lib/formal-budget-transport.js +345 -0
  167. package/src/lib/goal-condition-engine.js +25 -2
  168. package/src/lib/llm-config-defaults.js +10 -4
  169. package/src/lib/llm-pricing.js +16 -4
  170. package/src/lib/model-capabilities.js +26 -0
  171. package/src/lib/model-catalog-review.js +18 -1
  172. package/src/lib/model-context-catalog.js +41 -1
  173. package/src/lib/openai-responses.js +8 -0
  174. package/src/lib/skill-retrieval-router.js +1 -0
  175. package/src/lib/usage-pricing-context.js +33 -2
  176. package/src/repl/agent-repl.js +247 -153
  177. package/src/runtime/agent-core.js +371 -97
  178. package/src/runtime/coding-agent-contract-shared.cjs +14 -1
  179. package/src/runtime/headless-runner.js +1 -0
  180. package/src/runtime/headless-stream.js +137 -4
  181. package/src/runtime/mcp-tool-search.js +0 -0
  182. package/src/runtime/provider-stream-state.js +14 -1
  183. package/src/assets/web-panel/assets/MarkdownRenderer-575jjYE6.js +0 -1
  184. package/src/assets/web-panel/assets/OrderTableRenderer-Bx8wMauC.js +0 -1
  185. package/src/assets/web-panel/assets/devWarning-zDWbYMr7.js +0 -1
  186. package/src/assets/web-panel/assets/index-BPBsZZnT.js +0 -1
  187. package/src/assets/web-panel/assets/index-CtGQDg7m.js +0 -1
@@ -0,0 +1,609 @@
1
+ import { createHash } from "node:crypto";
2
+ import { validateVerify01Bundle } from "./eval/verify01-contracts.js";
3
+
4
+ const VOLCENGINE_V3_PLAN_DIGEST =
5
+ "sha256:04b90d1a93cfd6556f91688a39508c69e4423671a7b6bcb85fac4dc7e82c0e13";
6
+
7
+ export function budgetError(code, message) {
8
+ return Object.assign(new Error(message), { code });
9
+ }
10
+ export function requireBudget(condition, message, code = "CC_BUDGET_INVALID") {
11
+ if (!condition) throw budgetError(code, message);
12
+ }
13
+ export function integer(value, name, minimum = 0) {
14
+ requireBudget(
15
+ Number.isSafeInteger(value) && value >= minimum,
16
+ `${name} must be a safe integer >= ${minimum}`,
17
+ );
18
+ return value;
19
+ }
20
+ export function canonical(value) {
21
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
22
+ if (value && typeof value === "object")
23
+ return `{${Object.keys(value)
24
+ .sort()
25
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
26
+ .join(",")}}`;
27
+ requireBudget(
28
+ value !== undefined &&
29
+ (typeof value !== "number" || Number.isFinite(value)),
30
+ "Non-JSON evidence",
31
+ );
32
+ return JSON.stringify(value);
33
+ }
34
+ export const evidenceDigest = (value) =>
35
+ createHash("sha256").update(canonical(value)).digest("hex");
36
+ export function label(value, name) {
37
+ requireBudget(
38
+ typeof value === "string" && /^[A-Za-z0-9._:-]{1,160}$/u.test(value),
39
+ `Invalid ${name}`,
40
+ );
41
+ return value;
42
+ }
43
+ function digest(value, name) {
44
+ requireBudget(
45
+ typeof value === "string" && /^[a-f0-9]{64}$/u.test(value),
46
+ `Missing ${name} digest`,
47
+ );
48
+ }
49
+ function validity(value, now) {
50
+ integer(value.validFrom, "validFrom");
51
+ integer(value.validUntil, "validUntil", 1);
52
+ requireBudget(
53
+ value.validFrom <= now && now < value.validUntil,
54
+ "Contract or FX receipt expired",
55
+ "CC_BUDGET_EXPIRED",
56
+ );
57
+ }
58
+ function verified(kind, subject, receipt, verifyEvidence) {
59
+ requireBudget(
60
+ receipt && typeof receipt.id === "string" && receipt.id.length > 0,
61
+ `Missing ${kind} account evidence`,
62
+ "CC_BUDGET_EVIDENCE_REQUIRED",
63
+ );
64
+ digest(receipt.sha256, kind);
65
+ requireBudget(
66
+ verifyEvidence({
67
+ kind,
68
+ subjectDigest: evidenceDigest(subject),
69
+ receipt,
70
+ }) === true,
71
+ `Unverified ${kind} evidence`,
72
+ "CC_BUDGET_EVIDENCE_REQUIRED",
73
+ );
74
+ }
75
+
76
+ // Verification is supplied by the trusted host, never by task JSON/environment.
77
+ // There is deliberately no default verifier and no public-price activation.
78
+ export function validateActivation(config, verifyEvidence, now = Date.now()) {
79
+ requireBudget(
80
+ typeof verifyEvidence === "function",
81
+ "Trusted evidence verifier required",
82
+ "CC_BUDGET_EVIDENCE_REQUIRED",
83
+ );
84
+ const { plan, contracts, fx, history, evidence } = config;
85
+ requireBudget(
86
+ plan &&
87
+ Array.isArray(contracts) &&
88
+ Array.isArray(fx) &&
89
+ history &&
90
+ evidence,
91
+ "Incomplete activation facts",
92
+ "CC_BUDGET_EVIDENCE_REQUIRED",
93
+ );
94
+ label(plan.lineageId, "lineage ID");
95
+ digest(plan.digest, "frozen plan");
96
+ requireBudget(
97
+ plan.limitUsdMicros === 99_000_000,
98
+ "Original lineage ceiling must be $99",
99
+ );
100
+ requireBudget(
101
+ Array.isArray(plan.tasks) && plan.tasks.length === 45,
102
+ "Frozen plan needs 36 tasks and 9 soaks",
103
+ );
104
+ requireBudget(
105
+ new Set(plan.tasks.map((task) => task.id)).size === 45,
106
+ "Duplicate task ID",
107
+ );
108
+ requireBudget(
109
+ plan.tasks.filter((task) => task.kind === "task").length === 36 &&
110
+ plan.tasks.filter((task) => task.kind === "soak").length === 9,
111
+ "Frozen allocation changed",
112
+ );
113
+ for (const task of plan.tasks) {
114
+ label(task.id, "task ID");
115
+ label(task.contractId, "contract ID");
116
+ requireBudget(
117
+ task.capUsdMicros === (task.kind === "task" ? 2_000_000 : 3_000_000),
118
+ "Task cap changed",
119
+ );
120
+ }
121
+ requireBudget(
122
+ new Set(contracts.map((c) => c.id)).size === contracts.length,
123
+ "Duplicate contract ID",
124
+ );
125
+ requireBudget(
126
+ new Set(fx.map((c) => c.currency)).size === fx.length,
127
+ "Duplicate currency conversion",
128
+ );
129
+ for (const contract of contracts) {
130
+ label(contract.id, "contract ID");
131
+ label(contract.provider, "provider");
132
+ label(contract.model, "model");
133
+ const url = new URL(contract.endpoint);
134
+ requireBudget(
135
+ url.protocol === "https:" &&
136
+ !url.username &&
137
+ !url.password &&
138
+ !url.search &&
139
+ !url.hash &&
140
+ url.pathname.endsWith("/chat/completions"),
141
+ "Only exact HTTPS Chat endpoint supported",
142
+ );
143
+ requireBudget(
144
+ contract.protocol === "openai-chat" &&
145
+ /^[A-Z]{3}$/u.test(contract.currency),
146
+ "Unsupported billing protocol/currency",
147
+ );
148
+ requireBudget(
149
+ contract.defaultThinkingPreserved === true &&
150
+ contract.allBilledDimensionsBounded === true,
151
+ "Complete default-thinking liability ceiling required",
152
+ );
153
+ const envelope = contract.inputEnvelope;
154
+ requireBudget(
155
+ envelope?.kind === "json-utf8-byte-ceiling/v1" &&
156
+ envelope.requestSchema === "text-function-chat/v1" &&
157
+ envelope.includesMessagesToolsAndProviderFraming === true &&
158
+ envelope.includesAllBilledInputAndImplicitSystemOverhead === true,
159
+ "Verified inclusive input envelope required",
160
+ "CC_BUDGET_EVIDENCE_REQUIRED",
161
+ );
162
+ integer(envelope.maximumRequestBytes, "maximumRequestBytes", 1);
163
+ integer(
164
+ envelope.inclusivePromptTokenUpperBound,
165
+ "inclusivePromptTokenUpperBound",
166
+ 1,
167
+ );
168
+ requireBudget(
169
+ envelope.inclusivePromptTokenUpperBound <= contract.maxInputTokens,
170
+ "Input envelope exceeds reserved prompt bound",
171
+ );
172
+ validity(contract, now);
173
+ for (const name of [
174
+ "maxInputTokens",
175
+ "maxAnswerTokens",
176
+ "maxReasoningTokens",
177
+ "inputMicrosPerMillion",
178
+ "cachedMicrosPerMillion",
179
+ "outputMicrosPerMillion",
180
+ "fixedFeeMicros",
181
+ ])
182
+ integer(contract[name], name);
183
+ requireBudget(
184
+ contract.maxInputTokens > 0 &&
185
+ contract.maxAnswerTokens > 0 &&
186
+ contract.inputMicrosPerMillion > 0 &&
187
+ contract.outputMicrosPerMillion > 0,
188
+ "Unbounded or unpriced contract",
189
+ );
190
+ requireBudget(
191
+ contract.cachedMicrosPerMillion <= contract.inputMicrosPerMillion,
192
+ "Cache cannot exceed reserved input price",
193
+ );
194
+ requireBudget(
195
+ Array.isArray(contract.responseTiers) &&
196
+ contract.responseTiers.length > 0 &&
197
+ contract.responseTiers.every(
198
+ (x) => typeof x === "string" && x.length > 0,
199
+ ),
200
+ "Exact response tier mapping required",
201
+ );
202
+ verified(
203
+ "contract",
204
+ contract,
205
+ evidence.contracts?.[contract.id],
206
+ verifyEvidence,
207
+ );
208
+ requireBudget(
209
+ fx.some((item) => item.currency === contract.currency),
210
+ "Missing native currency conversion ceiling",
211
+ );
212
+ }
213
+ for (const rate of fx) {
214
+ validity(rate, now);
215
+ integer(rate.numerator, "FX numerator", 1);
216
+ integer(rate.denominator, "FX denominator", 1);
217
+ requireBudget(
218
+ rate.includesSettlementFees === true,
219
+ "FX ceiling must include settlement fees",
220
+ );
221
+ verified("fx", rate, evidence.fx?.[rate.currency], verifyEvidence);
222
+ }
223
+ for (const task of plan.tasks)
224
+ requireBudget(
225
+ contracts.some((c) => c.id === task.contractId),
226
+ "Task contract missing",
227
+ );
228
+ requireBudget(
229
+ plan.digest !== VOLCENGINE_V3_PLAN_DIGEST.slice(7) ||
230
+ Object.hasOwn(plan, "frozenBundle"),
231
+ "Volcengine v3 activation requires its complete frozen bundle",
232
+ );
233
+ if (Object.hasOwn(plan, "frozenBundle")) {
234
+ const bundle = plan.frozenBundle;
235
+ // A new assignment is admitted only against the exact authorized v3.
236
+ // Its full frozen evidence belongs to the host-verified plan subject.
237
+ requireBudget(
238
+ bundle?.expectedPlanDigest === VOLCENGINE_V3_PLAN_DIGEST &&
239
+ plan.digest === VOLCENGINE_V3_PLAN_DIGEST.slice(7),
240
+ "Only the exact authorized Volcengine v3 allocation is supported",
241
+ );
242
+ const { samples } = validateVerify01Bundle(bundle);
243
+ for (const task of plan.tasks) {
244
+ const sample = samples.get(task.id);
245
+ const comparison = bundle.bindings.comparisons[sample?.stratum];
246
+ const contract = contracts.find((item) => item.id === task.contractId);
247
+ requireBudget(
248
+ sample &&
249
+ comparison &&
250
+ (sample.kind === "task" ? "task" : "soak") === task.kind &&
251
+ sample.costBudget * 1_000_000 === task.capUsdMicros &&
252
+ comparison.provider === contract.provider &&
253
+ comparison.model === contract.model &&
254
+ contract.provider === "volcengine" &&
255
+ contract.model === "deepseek-v4-flash-ga-260731" &&
256
+ contract.endpoint ===
257
+ "https://ark.cn-beijing.volces.com/api/v3/chat/completions" &&
258
+ comparison.declared.modelRevision ===
259
+ `${contract.model}@https://ark.cn-beijing.volces.com/api/v3`,
260
+ "Task contract differs from the frozen v3 comparison",
261
+ );
262
+ }
263
+ } else {
264
+ // Preserve the existing dual-provider activation contract for v1/v2.
265
+ const taskProviders = plan.tasks
266
+ .filter((task) => task.kind === "task")
267
+ .map((task) => contracts.find((c) => c.id === task.contractId).provider);
268
+ requireBudget(
269
+ taskProviders.filter((provider) => provider === "volcengine").length ===
270
+ 18 &&
271
+ taskProviders.filter((provider) => provider === "openai").length === 18,
272
+ "Frozen task strata require 18 Volcengine and 18 OpenAI tasks",
273
+ );
274
+ }
275
+ requireBudget(
276
+ history.lineageId === plan.lineageId &&
277
+ history.planDigest === plan.digest &&
278
+ history.complete === true,
279
+ "Original lineage reconciliation required",
280
+ "CC_BUDGET_HISTORY_REQUIRED",
281
+ );
282
+ requireBudget(
283
+ Array.isArray(history.tasks) &&
284
+ history.tasks.length === 45 &&
285
+ new Set(history.tasks.map((t) => t.id)).size === 45,
286
+ "All task history required",
287
+ );
288
+ let total = 0;
289
+ for (const item of history.tasks) {
290
+ const task = plan.tasks.find((t) => t.id === item.id);
291
+ requireBudget(task, "Unknown historical task");
292
+ integer(item.spentUsdMicros, "Historical spend");
293
+ integer(item.reservedUsdMicros, "Historical unknown liability");
294
+ integer(item.runsUsed, "Historical run slots");
295
+ requireBudget(
296
+ item.runsUsed <= 2,
297
+ "Historical task exceeded remediation slots",
298
+ );
299
+ requireBudget(
300
+ typeof item.unknown === "boolean",
301
+ "Historical unknown flag required",
302
+ );
303
+ requireBudget(
304
+ item.reservedUsdMicros === 0 || item.unknown === true,
305
+ "Historical reservation must stay unknown",
306
+ );
307
+ requireBudget(
308
+ item.spentUsdMicros + item.reservedUsdMicros <= task.capUsdMicros,
309
+ "Historical task cap exceeded",
310
+ );
311
+ total += item.spentUsdMicros + item.reservedUsdMicros;
312
+ }
313
+ requireBudget(
314
+ total <= plan.limitUsdMicros,
315
+ "Historical lineage cap exceeded",
316
+ );
317
+ verified("plan", plan, evidence.plan, verifyEvidence);
318
+ verified("history", history, evidence.history, verifyEvidence);
319
+ return JSON.parse(canonical(config));
320
+ }
321
+
322
+ function safeNumber(value) {
323
+ requireBudget(
324
+ value <= BigInt(Number.MAX_SAFE_INTEGER),
325
+ "Money exceeds safe integer range",
326
+ );
327
+ return Number(value);
328
+ }
329
+ const ceil = (n, d) => (n + d - 1n) / d;
330
+ export function quoteNative(contract, usage = null) {
331
+ const input = BigInt(usage?.prompt_tokens ?? contract.maxInputTokens);
332
+ const cached = BigInt(usage?.prompt_tokens_details?.cached_tokens ?? 0);
333
+ const output = usage
334
+ ? BigInt(usage.completion_tokens)
335
+ : BigInt(contract.maxAnswerTokens) + BigInt(contract.maxReasoningTokens);
336
+ return safeNumber(
337
+ ceil(
338
+ (input - cached) * BigInt(contract.inputMicrosPerMillion) +
339
+ cached * BigInt(contract.cachedMicrosPerMillion) +
340
+ output * BigInt(contract.outputMicrosPerMillion),
341
+ 1_000_000n,
342
+ ) + BigInt(contract.fixedFeeMicros),
343
+ );
344
+ }
345
+ export function convertToUsd(nativeMicros, rate) {
346
+ integer(nativeMicros, "Native cost");
347
+ return safeNumber(
348
+ ceil(
349
+ BigInt(nativeMicros) * BigInt(rate.numerator),
350
+ BigInt(rate.denominator),
351
+ ),
352
+ );
353
+ }
354
+ export function validateResponse(contract, response) {
355
+ requireBudget(
356
+ response && !Object.hasOwn(response, "error"),
357
+ "Provider error envelope cannot settle",
358
+ );
359
+ requireBudget(response?.model === contract.model, "Unknown response model");
360
+ requireBudget(
361
+ contract.responseTiers.includes(response.service_tier),
362
+ "Unknown response service tier",
363
+ );
364
+ requireBudget(
365
+ typeof response.id === "string" &&
366
+ response.id.length > 0 &&
367
+ response.id.length <= 256,
368
+ "Provider receipt ID required",
369
+ );
370
+ const usage = response.usage;
371
+ requireBudget(usage && typeof usage === "object", "Missing provider usage");
372
+ requireBudget(
373
+ Object.keys(usage).every((key) =>
374
+ [
375
+ "prompt_tokens",
376
+ "completion_tokens",
377
+ "total_tokens",
378
+ "prompt_tokens_details",
379
+ "completion_tokens_details",
380
+ ].includes(key),
381
+ ) &&
382
+ usage.prompt_tokens_details &&
383
+ Object.keys(usage.prompt_tokens_details).every(
384
+ (key) => key === "cached_tokens",
385
+ ) &&
386
+ usage.completion_tokens_details &&
387
+ Object.keys(usage.completion_tokens_details).every(
388
+ (key) => key === "reasoning_tokens",
389
+ ),
390
+ "Unsupported provider usage dimensions",
391
+ );
392
+ integer(usage.prompt_tokens, "prompt_tokens");
393
+ integer(usage.completion_tokens, "completion_tokens");
394
+ integer(usage.prompt_tokens_details?.cached_tokens, "cached_tokens");
395
+ integer(
396
+ usage.completion_tokens_details?.reasoning_tokens,
397
+ "reasoning_tokens",
398
+ );
399
+ requireBudget(
400
+ usage.prompt_tokens_details.cached_tokens <= usage.prompt_tokens,
401
+ "Cache is not a subset of prompt",
402
+ );
403
+ requireBudget(
404
+ usage.completion_tokens_details.reasoning_tokens <= usage.completion_tokens,
405
+ "Reasoning is not a subset of completion",
406
+ );
407
+ requireBudget(
408
+ usage.prompt_tokens <= contract.maxInputTokens &&
409
+ usage.completion_tokens_details.reasoning_tokens <=
410
+ contract.maxReasoningTokens &&
411
+ usage.completion_tokens -
412
+ usage.completion_tokens_details.reasoning_tokens <=
413
+ contract.maxAnswerTokens,
414
+ "Provider usage exceeds contract bound",
415
+ );
416
+ if (usage.total_tokens !== undefined)
417
+ requireBudget(
418
+ usage.total_tokens === usage.prompt_tokens + usage.completion_tokens,
419
+ "Inconsistent total tokens",
420
+ );
421
+ return usage;
422
+ }
423
+ export function validateRequest(contract, body) {
424
+ requireBudget(
425
+ body &&
426
+ body.model === contract.model &&
427
+ Array.isArray(body.messages) &&
428
+ body.messages.length > 0,
429
+ "Exact model and messages required",
430
+ );
431
+ const keys = [
432
+ "model",
433
+ "messages",
434
+ "stream",
435
+ "stream_options",
436
+ "tools",
437
+ "tool_choice",
438
+ "max_tokens",
439
+ "temperature",
440
+ "top_p",
441
+ "stop",
442
+ "n",
443
+ ];
444
+ requireBudget(
445
+ Object.keys(body).every((key) => keys.includes(key)),
446
+ "Unsupported request dimension or thinking override",
447
+ );
448
+ requireBudget(
449
+ body.n === undefined || body.n === 1,
450
+ "Only a single billed completion supported",
451
+ );
452
+ requireBudget(
453
+ body.stream === undefined || typeof body.stream === "boolean",
454
+ "Invalid stream flag",
455
+ );
456
+ if (body.stream_options !== undefined)
457
+ requireBudget(
458
+ canonical(body.stream_options) === '{"include_usage":true}',
459
+ "Unsupported stream options",
460
+ );
461
+ if (body.max_tokens !== undefined) {
462
+ integer(body.max_tokens, "max_tokens", 1);
463
+ requireBudget(
464
+ body.max_tokens <= contract.maxAnswerTokens,
465
+ "Requested answer exceeds contract bound",
466
+ );
467
+ }
468
+ const onlyKeys = (object, allowed) =>
469
+ object &&
470
+ typeof object === "object" &&
471
+ !Array.isArray(object) &&
472
+ Object.keys(object).every((key) => allowed.includes(key));
473
+ const functionName = (name) =>
474
+ typeof name === "string" && /^[A-Za-z0-9_-]{1,64}$/u.test(name);
475
+ for (const message of body.messages) {
476
+ requireBudget(
477
+ onlyKeys(message, [
478
+ "role",
479
+ "content",
480
+ "name",
481
+ "tool_calls",
482
+ "tool_call_id",
483
+ ]),
484
+ "Unsupported message input dimension",
485
+ );
486
+ requireBudget(
487
+ ["system", "developer", "user", "assistant", "tool"].includes(
488
+ message.role,
489
+ ),
490
+ "Unsupported message role",
491
+ );
492
+ requireBudget(
493
+ typeof message.content === "string" ||
494
+ (message.role === "assistant" &&
495
+ message.content == null &&
496
+ Array.isArray(message.tool_calls) &&
497
+ message.tool_calls.length > 0),
498
+ "Only textual messages and function results are supported",
499
+ );
500
+ if (message.name !== undefined)
501
+ requireBudget(functionName(message.name), "Invalid message name");
502
+ if (message.tool_call_id !== undefined)
503
+ requireBudget(
504
+ message.role === "tool" &&
505
+ typeof message.tool_call_id === "string" &&
506
+ message.tool_call_id.length > 0,
507
+ "Invalid function result",
508
+ );
509
+ if (message.role === "tool")
510
+ requireBudget(
511
+ typeof message.tool_call_id === "string",
512
+ "Function result ID required",
513
+ );
514
+ if (message.tool_calls !== undefined) {
515
+ requireBudget(
516
+ message.role === "assistant" &&
517
+ Array.isArray(message.tool_calls) &&
518
+ message.tool_calls.length > 0,
519
+ "Invalid function calls",
520
+ );
521
+ for (const call of message.tool_calls)
522
+ requireBudget(
523
+ onlyKeys(call, ["id", "type", "function"]) &&
524
+ typeof call.id === "string" &&
525
+ call.id.length > 0 &&
526
+ call.type === "function" &&
527
+ onlyKeys(call.function, ["name", "arguments"]) &&
528
+ functionName(call.function.name) &&
529
+ typeof call.function.arguments === "string",
530
+ "Unsupported function call input",
531
+ );
532
+ }
533
+ }
534
+ if (body.tools !== undefined) {
535
+ requireBudget(
536
+ Array.isArray(body.tools) &&
537
+ body.tools.every(
538
+ (tool) =>
539
+ onlyKeys(tool, ["type", "function"]) &&
540
+ tool.type === "function" &&
541
+ onlyKeys(tool.function, [
542
+ "name",
543
+ "description",
544
+ "parameters",
545
+ "strict",
546
+ ]) &&
547
+ functionName(tool.function.name) &&
548
+ (tool.function.description === undefined ||
549
+ typeof tool.function.description === "string") &&
550
+ (tool.function.parameters === undefined ||
551
+ (tool.function.parameters &&
552
+ typeof tool.function.parameters === "object" &&
553
+ !Array.isArray(tool.function.parameters))) &&
554
+ (tool.function.strict === undefined ||
555
+ typeof tool.function.strict === "boolean"),
556
+ ),
557
+ "Unbounded provider-hosted tools rejected",
558
+ );
559
+ }
560
+ if (body.tool_choice !== undefined)
561
+ requireBudget(
562
+ ["none", "auto", "required"].includes(body.tool_choice) ||
563
+ (onlyKeys(body.tool_choice, ["type", "function"]) &&
564
+ body.tool_choice.type === "function" &&
565
+ onlyKeys(body.tool_choice.function, ["name"]) &&
566
+ functionName(body.tool_choice.function.name)),
567
+ "Unsupported tool choice",
568
+ );
569
+ if (body.temperature !== undefined)
570
+ requireBudget(
571
+ typeof body.temperature === "number" &&
572
+ Number.isFinite(body.temperature) &&
573
+ body.temperature >= 0 &&
574
+ body.temperature <= 2,
575
+ "Invalid temperature",
576
+ );
577
+ if (body.top_p !== undefined)
578
+ requireBudget(
579
+ typeof body.top_p === "number" &&
580
+ Number.isFinite(body.top_p) &&
581
+ body.top_p > 0 &&
582
+ body.top_p <= 1,
583
+ "Invalid top_p",
584
+ );
585
+ if (body.stop !== undefined)
586
+ requireBudget(
587
+ typeof body.stop === "string" ||
588
+ (Array.isArray(body.stop) &&
589
+ body.stop.length <= 4 &&
590
+ body.stop.every((item) => typeof item === "string")),
591
+ "Invalid stop sequence",
592
+ );
593
+ requireBudget(
594
+ contract.inputEnvelope?.kind === "json-utf8-byte-ceiling/v1" &&
595
+ contract.inputEnvelope.requestSchema === "text-function-chat/v1" &&
596
+ contract.inputEnvelope.includesMessagesToolsAndProviderFraming === true &&
597
+ contract.inputEnvelope.includesAllBilledInputAndImplicitSystemOverhead ===
598
+ true &&
599
+ contract.inputEnvelope.inclusivePromptTokenUpperBound <=
600
+ contract.maxInputTokens,
601
+ "No verified inclusive input envelope",
602
+ );
603
+ requireBudget(
604
+ Buffer.byteLength(canonical(body), "utf8") <=
605
+ contract.inputEnvelope.maximumRequestBytes,
606
+ "Serialized input exceeds verified envelope",
607
+ );
608
+ return evidenceDigest(body);
609
+ }