chainlesschain 0.166.59 → 0.166.63

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 (182) hide show
  1. package/README.md +38 -8
  2. package/package.json +4 -1
  3. package/src/assets/web-panel/assets/{AIOps-B9i3kk5f.js → AIOps-CfPrpABR.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-DGMs1wBm.js → ActionButton-Bkv1erki.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D-JGeynM.js → Analytics-fY_7epoU.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DLECnXlP.js → AppLayout-DegaN-aa.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-CwaTiXN4.js → Artifacts-90-UNTVE.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-BCb7s5Ky.js → Audit-BRQ1F4sA.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-D4IOzvKs.js → BackgroundAgents-Cb85uP7O.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-Cknunk10.js → Backup-CrLBSWQK.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DnU8pbUh.js → BaseInput-DditUW5B.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-DOouYIhz.js → Chat-0XozleDQ.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-8QXBJvgy.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-BrumNw6V.js → Checkbox-C2Ck_3ju.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-B4E_uI_N.js → Codegen-Chjw-MS7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-C7H2sdaL.js → Col-B_w8_Oka.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BFdzcMSl.js → Community-XAqxPnXq.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-BzVXohrg.js → Compact-BX_3GJ3m.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-B_4QcuSH.js → Compliance-DE3kIC9z.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-DjuQzJx8.js → Cowork-DPBYp1ey.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-Bf2iY-1-.js → Cron-D9cknqzn.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CY9QW7IT.js → Crosschain-BzHrGWY9.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-kDZBvaKr.js → DID-BuD8TkZl.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-DoYboS3g.js → Dashboard-BbxMuZVK.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-LLEzI6l1.js → Dropdown-jq0ki-tE.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-D2kmSvkg.js → EmailListRenderer-RiMvINxT.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-DHj2yUGZ.js → EvolutionSettings-DE-URi9i.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-B7Hg7fR0.js → FamilyGuardDashboard-DV3ao62-.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CUdwU6aH.js → Federation-BF6BmBPg.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-D1KrwjwY.js → FormItemContext-CKTX59j2.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-CXGLoHfw.js → GenericCardRenderer-DZkH-CTs.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-TG3Q9JWG.js → Git-B5JYb-w-.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-BJD7h_fv.js → Governance-D3WfDZ6W.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-Dky4l_bZ.js → Inference-DoSvfDUk.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-CCx9aXBV.js → KnowledgeGraph-DUDIzN97.js} +1 -1
  36. package/src/assets/web-panel/assets/Logs-JfJerfFD.js +2 -0
  37. package/src/assets/web-panel/assets/MarkdownRenderer-DXgA7cZm.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-BzL6KJMX.js → Marketplace-BpVrOM_V.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-BReSRzEU.js → McpTools-CFnQdiSv.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-BhmkkCxd.js → Memory-Dxv81cNl.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BeQMHr_n.js → MobileBridge-C92eX7PB.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CphEwj_l.js → MobileProjects-BUHw7Wox.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-CFk1ibuN.js → Mtc-D-G9H4A1.js} +2 -2
  44. package/src/assets/web-panel/assets/{MtcAudit-CU9qrmbH.js → MtcAudit-CAEaEtAz.js} +5 -5
  45. package/src/assets/web-panel/assets/{Multisig-CKR-Gh0Y.js → Multisig-Cx_-X9HD.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-D1qWY6Mx.js → NLProgramming-DRIKG4Xy.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-B4CM0C65.js → Notes-CmL0vKUv.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-BTQYWveR.js → NotificationSettings-D2cQ5aQn.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-DxN6fAn8.js → OrderTableRenderer-CPfd7PNy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-scgboNfd.js → Organization-EKqO46hz.js} +2 -2
  51. package/src/assets/web-panel/assets/{Overflow-BP4aQhid.js → Overflow-BOHjBwJo.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-65jIo6MY.js → P2P-Dx4LdCE0.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-Bfi4-tDQ.js → PdhVaultBrowser-CgCt2xdT.js} +5 -5
  54. package/src/assets/web-panel/assets/{Permissions-DWtxT7bE.js → Permissions-DWjDeO7O.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-Bilmr8BR.js → PersonalDataHub-Bx4Od8pG.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-IPIMM-1y.js → Pipeline-oKxws_Ch.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-DFB8RiVK.js → Privacy-Df1HVRKR.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-DxZksvu1.js → ProjectInit-BraLwZT4.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-DsjPsnYN.js → ProjectSettings-CKru54M0.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-CC5FBLLq.js → Projects-BEr7cJcS.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-Dk3ViPuF.js → Providers-C8v30DU3.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-CJ8R6-bF.js → QrScannerModal-CPyNV-O5.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DJfCPORc.js → QuickAsk-BLIew7A5.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DjDygXeb.js → Recommend-DVjWmsPs.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BJiJ1YHw.js → RemoteSession-B4PNTaEf.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-fYE8jPcc.js → Reputation-D5HOV6oI.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-vcvsjMm4.js → Row-DgCQom2M.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-CZnKliwn.js → RssFeed-zvIcGHgz.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-DEStiFGI.js → Search-C-KbJP_z.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-BPb_szxS.js → Security-CasnI-Ld.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-TR0xZhSF.js → Services-CR-pSlFv.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-BSPu9boC.js → Skeleton-BB5On1b5.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CXEj9pC6.js → Skills-CC-wdQi-.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-jlOlDGMA.js → Sla-CPX5QKEu.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-C8oPE_HQ.js → SpeechSettings-Bifkl6Zz.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-DZNUx8zt.js → SyncSettings-CdUVeB-S.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-B4T6aoOl.js → Tasks-BttwN3fs.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-DeRgtwZ5.js → Templates-CBHNbpQ7.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DDVoXGxa.js → Tenant-B90lEwSQ.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-DGAUoJMz.js → Terminal-u8KqitsA.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-Co4Nkpjm.js → TimelineRenderer-CnEJMkJo.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-DaMLa0Fm.js → Tokens-CTM2OOJ_.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C7iLr-Ik.js → Trigger-Ca8NmmgU.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-CxX_tQqi.js → Trust-CI9GpUj2.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-ClrdckEx.js → UkeySign-BlMLGqKK.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-DgTVhaoK.js → VideoEditing-C8yCZrH0.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-SIbwES0O.js → Wallet-BpuYrz8o.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-YNqVnhZF.js → WebAuthn-DFpNfLG_.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BvynT9mj.js → WorkflowEditor-BWhLoeU4.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-X79b2tVy.js → chat-Dwo4LC7E.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-DioWDCbu.js → colors-DkdGvKBf.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DpAXXaqu.js → compact-item-1gI0lfs3.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BYq8bCQX.js → createContext-O9iHirtr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-axBqv361.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CDJNMJ_n.js → hasIn-DY1jo9BQ.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DUe-hFGb.js → index-1AnBwAoM.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CS3QdYDW.js → index-B-kbagPi.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DZysaS5T.js → index-B0TX-bLV.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-Cx0_WiSe.js → index-B5l7eb6E.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CJEFd0QJ.js → index-BDwV_V5g.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-D88MWTOx.js → index-BgHG4f2K.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BK53HyEP.js → index-BgVO1aXv.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-COqkDiRU.js → index-Bl6GfsQZ.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CUbuCFWb.js → index-BmAK4o9I.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C7cXBJcM.js → index-BsQkwBu2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Byt1ny7l.js → index-BumRAO-7.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Bh9la-GL.js → index-Bx4MNNMY.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B8_grEFP.js → index-C4c0XaiT.js} +1 -1
  109. package/src/assets/web-panel/assets/index-CAsOttsq.js +1 -0
  110. package/src/assets/web-panel/assets/{index-YviHYMA2.js → index-CBqSTwY9.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-00kVj4me.js → index-D8fqsTHW.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Wl55a61D.js → index-DCqPIE3G.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CLSt7mOy.js → index-DNnaEzC5.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C4xggKQp.js → index-DTppQua6.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CbxqdIzD.js → index-DfFzjnA0.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BwHEGjR7.js → index-DskEFn8M.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D3J9FKFr.js → index-DvRvwzc-.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BGEXGr9g.js → index-DwBcFhcc.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-B6wxVEIZ.js → index-DwJBbK3Z.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-mHAPEcPi.js → index-DwhJqZqM.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-C1-NqghD.js → index-Dx51Am-0.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DP9ZLjra.js → index-E5Ar6dNV.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DSFkmRvK.js → index-ETHEhWvI.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DmNspbVU.js → index-KUrBWzIM.js} +1 -1
  125. package/src/assets/web-panel/assets/index-MgEKheCh.js +1 -0
  126. package/src/assets/web-panel/assets/{index-TqLyy6IR.js → index-YnGvCu0P.js} +3 -3
  127. package/src/assets/web-panel/assets/{index-Q3WQ5Zhr.js → index-hRtVittm.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DAnXSg0r.js → index-nXoV4OCZ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BBvA7Hxj.js → index-qUbrqzvO.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BIO8EVHt.js → index-rIJqtLz-.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B8ChecWd.js → index-rkkMl4Lb.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DwG9khVs.js → index-tXjOuLZm.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-V6l3ia83.js → index-zLOzCcxM.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-Bt0zcD5R.js → index-zPpssHXA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-18rmGkik.js → initDefaultProps-Du5HHTVt.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-3kvGzSgV.js → motion-D9mAVPKP.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Dx3DiVHc.js → move-DPO_sFtt.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-VX1dFJEI.js → mtc-parser-CnezVcXi.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-CniSeCOA.js → omit-DNpYMbet.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-RPggmcOd.js → pickAttrs-BUFm_slL.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B45YBykr.js → placementArrow-DvwJtnzY.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-D0nciAEn.js → responsiveObserve-CUWOh_KI.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-UxLNWqjI.js → slide-bVHCUsdj.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-CukpV_uI.js → statusUtils-FlOzOrxf.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BIcEZk6Y.js → styleChecker-C6CFXutA.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-Zah-xvV3.js → useFlexGapSupport-BNGqO_E0.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-BA7ihKFN.js → useFs-DyKOrA27.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-C64CsyY3.js → usePersonalDataHub-DZAqeMAJ.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-Datcekgj.js → vnode-Do7fVasi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-CaFQv1KF.js → zoom-DYkEmOT2.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +52 -0
  153. package/src/lib/background-agent-supervisor.js +10 -1
  154. package/src/lib/evolution/evidence-backed-wiki-maintainer.js +119 -12
  155. package/src/lib/evolution/evolution-artifact-ports.js +6 -0
  156. package/src/lib/evolution/evolution-deployment-loader.js +139 -0
  157. package/src/lib/evolution/evolution-eval-gate.js +5 -0
  158. package/src/lib/evolution/evolution-ledger-ports.js +41 -17
  159. package/src/lib/evolution/pm-exploration-benchmark.js +253 -0
  160. package/src/lib/evolution/pm-exploration-budget-executor.js +346 -0
  161. package/src/lib/evolution/pm-exploration-business-grader.js +581 -0
  162. package/src/lib/evolution/pm-exploration-evidence-bundle.js +613 -0
  163. package/src/lib/evolution/pm-exploration-execution-host.js +946 -0
  164. package/src/lib/evolution/pm-exploration-ledger-adapter.js +860 -0
  165. package/src/lib/evolution/pm-exploration-provider-settlement-adapter.js +420 -0
  166. package/src/lib/evolution/pm-exploration-receipts.js +626 -0
  167. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +521 -0
  168. package/src/lib/evolution/pm-exploration-rounds.js +842 -0
  169. package/src/lib/evolution/pm-exploration-transition-committer.js +541 -0
  170. package/src/lib/evolution/pm-exploration-volcengine-provider.js +724 -0
  171. package/src/lib/evolution/pm-result-grader.cjs +287 -0
  172. package/src/lib/read-file-loop-guard.js +36 -5
  173. package/src/lib/secure-fs.js +51 -4
  174. package/src/lib/task-progress-tracker.js +29 -7
  175. package/src/lib/text-file-search.js +1 -0
  176. package/src/runtime/agent-core.js +46 -4
  177. package/src/assets/web-panel/assets/ChatBubbleRenderer-C4tdSms8.js +0 -1
  178. package/src/assets/web-panel/assets/Logs-BtesccPB.js +0 -2
  179. package/src/assets/web-panel/assets/MarkdownRenderer-DoN7oE2J.js +0 -1
  180. package/src/assets/web-panel/assets/devWarning-ONeWC5dH.js +0 -1
  181. package/src/assets/web-panel/assets/index--QLnQuO9.js +0 -1
  182. package/src/assets/web-panel/assets/index-CkgeII0e.js +0 -1
@@ -0,0 +1,724 @@
1
+ import { createHash } from "node:crypto";
2
+ import { performance } from "node:perf_hooks";
3
+ import { isProxy } from "node:util/types";
4
+
5
+ import { createChatFn } from "../cowork-adapter.js";
6
+ import { loadConfig } from "../config-manager.js";
7
+ import { applyConfigLlmDefaults } from "../llm-config-defaults.js";
8
+ import { BUILT_IN_PROVIDERS } from "../llm-providers.js";
9
+ import { estimateCost, lookupRate, mergePricing } from "../llm-pricing.js";
10
+ import { captureAgentEvolutionIngress } from "./agent-evolution-ingress.js";
11
+
12
+ export const PM_EXPLORATION_VOLCENGINE_PROVIDER_SCHEMA =
13
+ "chainlesschain.pm-exploration-volcengine-provider/v1";
14
+ export const PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA =
15
+ "chainlesschain.pm-exploration-provider-settlement/v1";
16
+ export const PM_EXPLORATION_PROVIDER_RESULT_SCHEMA =
17
+ "chainlesschain.pm-exploration-provider-result/v1";
18
+ export const PM_EXPLORATION_PROVIDER_PERSISTENCE_SCHEMA =
19
+ "chainlesschain.pm-exploration-provider-persistence/v1";
20
+
21
+ const PROVIDER = "volcengine";
22
+ const CLIENTS = new WeakMap();
23
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
24
+ const OPERATION_ID = /^[a-z][a-z0-9]*(?:[._:-][a-z0-9]+)*$/u;
25
+ const MESSAGE_ROLES = new Set(["assistant", "system", "user"]);
26
+ const OPTION_KEYS = new Set([
27
+ "apiKey",
28
+ "baseUrl",
29
+ "evolutionIngress",
30
+ "maxOutputTokens",
31
+ "model",
32
+ "persistSettlement",
33
+ "pricing",
34
+ "timeoutMs",
35
+ ]);
36
+ const INVOCATION_KEYS = [
37
+ "messages",
38
+ "runtime",
39
+ "maxOutputTokens",
40
+ "operationId",
41
+ "executionRequestDigest",
42
+ ];
43
+ const MAX_MESSAGES = 16;
44
+ const MAX_PROMPT_BYTES = 256 * 1024;
45
+ const MAX_RESPONSE_BYTES = 1024 * 1024;
46
+
47
+ function canonical(value) {
48
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
49
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
50
+ return `{${Object.keys(value)
51
+ .sort()
52
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
53
+ .join(",")}}`;
54
+ }
55
+
56
+ function hash(domain, value) {
57
+ return `sha256:${createHash("sha256")
58
+ .update(domain)
59
+ .update("\0")
60
+ .update(canonical(value))
61
+ .digest("hex")}`;
62
+ }
63
+
64
+ function digest(value, label) {
65
+ if (typeof value !== "string" || !DIGEST.test(value))
66
+ throw new TypeError(`${label} must be a sha256 digest`);
67
+ return value;
68
+ }
69
+
70
+ function deepFreeze(value, seen = new WeakSet()) {
71
+ if (!value || typeof value !== "object" || seen.has(value)) return value;
72
+ seen.add(value);
73
+ for (const key of Reflect.ownKeys(value)) {
74
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
75
+ if (descriptor && "value" in descriptor) deepFreeze(descriptor.value, seen);
76
+ }
77
+ return Object.freeze(value);
78
+ }
79
+
80
+ function plainOptions(value, label) {
81
+ if (
82
+ !value ||
83
+ typeof value !== "object" ||
84
+ Array.isArray(value) ||
85
+ isProxy(value) ||
86
+ Object.getPrototypeOf(value) !== Object.prototype
87
+ ) {
88
+ throw new TypeError(`${label} must be a plain object`);
89
+ }
90
+ for (const key of Reflect.ownKeys(value)) {
91
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
92
+ if (
93
+ typeof key !== "string" ||
94
+ !OPTION_KEYS.has(key) ||
95
+ !descriptor ||
96
+ !descriptor.enumerable ||
97
+ !("value" in descriptor)
98
+ ) {
99
+ throw new TypeError(`${label} contains unsupported fields`);
100
+ }
101
+ }
102
+ return value;
103
+ }
104
+
105
+ function exact(value, keys, label) {
106
+ if (
107
+ !value ||
108
+ typeof value !== "object" ||
109
+ Array.isArray(value) ||
110
+ isProxy(value) ||
111
+ Object.getPrototypeOf(value) !== Object.prototype
112
+ ) {
113
+ throw new TypeError(`${label} must be a plain object`);
114
+ }
115
+ const actual = Reflect.ownKeys(value);
116
+ if (
117
+ actual.length !== keys.length ||
118
+ actual.some((key) => {
119
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
120
+ return (
121
+ typeof key !== "string" ||
122
+ !keys.includes(key) ||
123
+ !descriptor ||
124
+ !descriptor.enumerable ||
125
+ !("value" in descriptor)
126
+ );
127
+ })
128
+ ) {
129
+ throw new TypeError(`${label} has unexpected or accessor fields`);
130
+ }
131
+ }
132
+
133
+ function boundedString(value, label, maximum, { trim = true } = {}) {
134
+ if (
135
+ typeof value !== "string" ||
136
+ value.length === 0 ||
137
+ value.length > maximum ||
138
+ (trim && value.trim() !== value) ||
139
+ value.includes("\0")
140
+ ) {
141
+ throw new TypeError(`${label} must be a non-empty bounded string`);
142
+ }
143
+ return value;
144
+ }
145
+
146
+ function integer(value, label, minimum, maximum) {
147
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {
148
+ throw new TypeError(
149
+ `${label} must be an integer from ${minimum} to ${maximum}`,
150
+ );
151
+ }
152
+ return value;
153
+ }
154
+
155
+ function normalizeBaseUrl(value) {
156
+ const expected = BUILT_IN_PROVIDERS[PROVIDER].baseUrl;
157
+ let parsed;
158
+ try {
159
+ parsed = new URL(value || expected);
160
+ } catch {
161
+ throw new TypeError("PM Volcengine provider baseUrl is invalid");
162
+ }
163
+ if (
164
+ parsed.protocol !== "https:" ||
165
+ parsed.username ||
166
+ parsed.password ||
167
+ parsed.search ||
168
+ parsed.hash ||
169
+ parsed.href.replace(/\/$/u, "") !== expected.replace(/\/$/u, "")
170
+ ) {
171
+ throw new TypeError(
172
+ "PM Volcengine provider baseUrl must match the credential-free built-in endpoint",
173
+ );
174
+ }
175
+ return expected;
176
+ }
177
+
178
+ function localOptions(options) {
179
+ let llm = {};
180
+ try {
181
+ const configured = loadConfig()?.llm;
182
+ if (
183
+ configured &&
184
+ typeof configured === "object" &&
185
+ !Array.isArray(configured)
186
+ ) {
187
+ llm = configured;
188
+ }
189
+ } catch {
190
+ llm = {};
191
+ }
192
+ if (
193
+ !options.apiKey &&
194
+ llm.provider &&
195
+ llm.provider !== PROVIDER &&
196
+ !process.env.VOLCENGINE_API_KEY
197
+ ) {
198
+ throw new Error("local LLM configuration is not Volcengine");
199
+ }
200
+ const resolved = { provider: PROVIDER };
201
+ applyConfigLlmDefaults(resolved, llm, {
202
+ explicitModel: options.model,
203
+ });
204
+ if (options.model !== undefined) resolved.model = options.model;
205
+ if (options.baseUrl !== undefined) resolved.baseUrl = options.baseUrl;
206
+ if (options.apiKey !== undefined) resolved.apiKey = options.apiKey;
207
+ resolved.apiKey ||= process.env.VOLCENGINE_API_KEY;
208
+ return { llm, resolved };
209
+ }
210
+
211
+ function normalizeMessages(value) {
212
+ if (
213
+ !Array.isArray(value) ||
214
+ isProxy(value) ||
215
+ Object.getPrototypeOf(value) !== Array.prototype ||
216
+ value.length === 0 ||
217
+ value.length > MAX_MESSAGES ||
218
+ Reflect.ownKeys(value).length !== value.length + 1
219
+ ) {
220
+ throw new TypeError(
221
+ `PM Volcengine messages must contain 1 to ${MAX_MESSAGES} dense entries`,
222
+ );
223
+ }
224
+ let bytes = 0;
225
+ const messages = value.map((entry, index) => {
226
+ if (!Object.hasOwn(value, index))
227
+ throw new TypeError("PM Volcengine messages cannot contain holes");
228
+ exact(entry, ["role", "content"], `PM Volcengine message ${index}`);
229
+ if (!MESSAGE_ROLES.has(entry.role))
230
+ throw new TypeError(`PM Volcengine message ${index} role is invalid`);
231
+ const content = boundedString(
232
+ entry.content,
233
+ `PM Volcengine message ${index} content`,
234
+ MAX_PROMPT_BYTES,
235
+ { trim: false },
236
+ );
237
+ if (content.trim().length === 0)
238
+ throw new TypeError(`PM Volcengine message ${index} content is empty`);
239
+ bytes += Buffer.byteLength(content, "utf8");
240
+ return Object.freeze({ role: entry.role, content });
241
+ });
242
+ if (bytes > MAX_PROMPT_BYTES)
243
+ throw new TypeError(
244
+ `PM Volcengine prompt exceeds ${MAX_PROMPT_BYTES} bytes`,
245
+ );
246
+ return Object.freeze(messages);
247
+ }
248
+
249
+ function normalizeRuntime(value) {
250
+ if (
251
+ !value ||
252
+ typeof value !== "object" ||
253
+ isProxy(value) ||
254
+ !(value.signal instanceof AbortSignal) ||
255
+ typeof value.recordTokens !== "function" ||
256
+ typeof value.snapshot !== "function"
257
+ ) {
258
+ throw new TypeError(
259
+ "PM Volcengine invocation requires a budget runtime capability",
260
+ );
261
+ }
262
+ return value;
263
+ }
264
+
265
+ function usageInteger(value, label) {
266
+ if (!Number.isSafeInteger(value) || value < 0)
267
+ throw new TypeError(`${label} must be a non-negative safe integer`);
268
+ return value;
269
+ }
270
+
271
+ function normalizeUsage(value) {
272
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
273
+ throw new Error("Volcengine response did not include accountable usage");
274
+ }
275
+ const usage = Object.freeze({
276
+ inputTokens: usageInteger(value.input_tokens, "usage.input_tokens"),
277
+ outputTokens: usageInteger(value.output_tokens, "usage.output_tokens"),
278
+ cacheReadTokens: usageInteger(
279
+ value.cache_read_input_tokens,
280
+ "usage.cache_read_input_tokens",
281
+ ),
282
+ cacheCreationTokens: usageInteger(
283
+ value.cache_creation_input_tokens,
284
+ "usage.cache_creation_input_tokens",
285
+ ),
286
+ });
287
+ const totalTokens = Object.values(usage).reduce((sum, count) => {
288
+ const next = sum + count;
289
+ if (!Number.isSafeInteger(next))
290
+ throw new TypeError(
291
+ "Volcengine usage total exceeds the safe integer range",
292
+ );
293
+ return next;
294
+ }, 0);
295
+ if (totalTokens === 0)
296
+ throw new Error("Volcengine response reported zero accountable tokens");
297
+ return Object.freeze({ ...usage, totalTokens });
298
+ }
299
+
300
+ function normalizePersistence(value, settlementDigest) {
301
+ exact(
302
+ value,
303
+ ["schema", "settlementDigest", "persisted", "durable", "recordDigest"],
304
+ "PM provider settlement persistence",
305
+ );
306
+ if (
307
+ value.schema !== PM_EXPLORATION_PROVIDER_PERSISTENCE_SCHEMA ||
308
+ value.settlementDigest !== settlementDigest ||
309
+ value.persisted !== true ||
310
+ value.durable !== true ||
311
+ typeof value.recordDigest !== "string" ||
312
+ !DIGEST.test(value.recordDigest)
313
+ ) {
314
+ throw new Error("PM provider settlement persistence was not durable");
315
+ }
316
+ return deepFreeze({ ...value });
317
+ }
318
+
319
+ function finiteNumber(value, label) {
320
+ if (typeof value !== "number" || !Number.isFinite(value) || value < 0)
321
+ throw new TypeError(`${label} must be a finite non-negative number`);
322
+ return value;
323
+ }
324
+
325
+ function normalizeEstimatedCost(value, usage) {
326
+ exact(
327
+ value,
328
+ [
329
+ "currency",
330
+ "input",
331
+ "output",
332
+ "cacheRead",
333
+ "cacheCreation",
334
+ "total",
335
+ "rate",
336
+ ],
337
+ "PM Volcengine estimated cost",
338
+ );
339
+ exact(
340
+ value.rate,
341
+ ["in", "out", "pattern", "cacheReadMultiplier", "cacheCreationMultiplier"],
342
+ "PM Volcengine cost rate",
343
+ );
344
+ if (value.currency !== "USD")
345
+ throw new TypeError("PM Volcengine estimated cost currency is invalid");
346
+ const rate = Object.freeze({
347
+ in: finiteNumber(value.rate.in, "PM Volcengine cost rate.in"),
348
+ out: finiteNumber(value.rate.out, "PM Volcengine cost rate.out"),
349
+ cacheReadMultiplier: finiteNumber(
350
+ value.rate.cacheReadMultiplier,
351
+ "PM Volcengine cost rate.cacheReadMultiplier",
352
+ ),
353
+ cacheCreationMultiplier: finiteNumber(
354
+ value.rate.cacheCreationMultiplier,
355
+ "PM Volcengine cost rate.cacheCreationMultiplier",
356
+ ),
357
+ pattern: boundedString(
358
+ value.rate.pattern,
359
+ "PM Volcengine cost rate.pattern",
360
+ 256,
361
+ ),
362
+ });
363
+ const expected = Object.freeze({
364
+ input: (usage.inputTokens / 1e6) * rate.in,
365
+ output: (usage.outputTokens / 1e6) * rate.out,
366
+ cacheRead:
367
+ (usage.cacheReadTokens / 1e6) * rate.in * rate.cacheReadMultiplier,
368
+ cacheCreation:
369
+ (usage.cacheCreationTokens / 1e6) *
370
+ rate.in *
371
+ rate.cacheCreationMultiplier,
372
+ });
373
+ const result = Object.freeze({
374
+ currency: value.currency,
375
+ input: finiteNumber(value.input, "PM Volcengine estimated input cost"),
376
+ output: finiteNumber(value.output, "PM Volcengine estimated output cost"),
377
+ cacheRead: finiteNumber(
378
+ value.cacheRead,
379
+ "PM Volcengine estimated cache read cost",
380
+ ),
381
+ cacheCreation: finiteNumber(
382
+ value.cacheCreation,
383
+ "PM Volcengine estimated cache creation cost",
384
+ ),
385
+ total: finiteNumber(value.total, "PM Volcengine estimated total cost"),
386
+ rate,
387
+ });
388
+ if (
389
+ result.input !== expected.input ||
390
+ result.output !== expected.output ||
391
+ result.cacheRead !== expected.cacheRead ||
392
+ result.cacheCreation !== expected.cacheCreation ||
393
+ result.total !==
394
+ expected.input +
395
+ expected.output +
396
+ expected.cacheRead +
397
+ expected.cacheCreation
398
+ ) {
399
+ throw new Error("PM Volcengine estimated cost does not match usage");
400
+ }
401
+ return result;
402
+ }
403
+
404
+ function operationId(value) {
405
+ if (
406
+ typeof value !== "string" ||
407
+ value.length > 256 ||
408
+ !OPERATION_ID.test(value)
409
+ ) {
410
+ throw new TypeError("PM Volcengine operationId is invalid");
411
+ }
412
+ return value;
413
+ }
414
+
415
+ /**
416
+ * Create a credential-closing, governed Volcengine egress for PM exploration.
417
+ * Local CLI configuration is used only when the caller omits explicit model,
418
+ * endpoint or credential values. The returned object exposes no secret fields.
419
+ */
420
+ export function createPmExplorationVolcengineProvider(options = {}) {
421
+ plainOptions(options, "PM Volcengine provider options");
422
+ const { llm, resolved } = localOptions(options);
423
+ const model = boundedString(
424
+ resolved.model || BUILT_IN_PROVIDERS[PROVIDER].models[0],
425
+ "PM Volcengine model",
426
+ 256,
427
+ );
428
+ const baseUrl = normalizeBaseUrl(
429
+ resolved.baseUrl || BUILT_IN_PROVIDERS[PROVIDER].baseUrl,
430
+ );
431
+ const apiKey = boundedString(
432
+ resolved.apiKey,
433
+ "PM Volcengine credential",
434
+ 16 * 1024,
435
+ );
436
+ const maxOutputTokens = integer(
437
+ options.maxOutputTokens ?? 2_048,
438
+ "PM Volcengine maxOutputTokens",
439
+ 1,
440
+ 4_096,
441
+ );
442
+ const timeoutMs = integer(
443
+ options.timeoutMs ?? 30_000,
444
+ "PM Volcengine timeoutMs",
445
+ 1_000,
446
+ 120_000,
447
+ );
448
+ if (
449
+ options.persistSettlement !== undefined &&
450
+ (typeof options.persistSettlement !== "function" ||
451
+ isProxy(options.persistSettlement))
452
+ ) {
453
+ throw new TypeError("persistSettlement must be a direct function");
454
+ }
455
+ const pricing = mergePricing(options.pricing ?? llm.pricing);
456
+ const rate = lookupRate(PROVIDER, model, pricing);
457
+ if (rate === null)
458
+ throw new Error(
459
+ `Volcengine model is unpriced for PM exploration: ${model}`,
460
+ );
461
+ const descriptor = deepFreeze({
462
+ schema: PM_EXPLORATION_VOLCENGINE_PROVIDER_SCHEMA,
463
+ provider: PROVIDER,
464
+ model,
465
+ endpointDigest: hash(PM_EXPLORATION_VOLCENGINE_PROVIDER_SCHEMA, baseUrl),
466
+ maxOutputTokens,
467
+ timeoutMs,
468
+ pricingPattern: rate.pattern,
469
+ settlementPersistenceRequired: options.persistSettlement !== undefined,
470
+ });
471
+ const provider = Object.freeze({});
472
+ CLIENTS.set(provider, {
473
+ apiKey,
474
+ baseUrl,
475
+ descriptor,
476
+ evolutionIngress: captureAgentEvolutionIngress(options.evolutionIngress),
477
+ maxOutputTokens,
478
+ model,
479
+ persistSettlement: options.persistSettlement ?? null,
480
+ pricing,
481
+ timeoutMs,
482
+ });
483
+ return provider;
484
+ }
485
+
486
+ export function inspectPmExplorationVolcengineProvider(value) {
487
+ const client = CLIENTS.get(value);
488
+ if (!client)
489
+ throw new TypeError("a branded PM Volcengine provider is required");
490
+ return client.descriptor;
491
+ }
492
+
493
+ /**
494
+ * Revalidate the canonical no-secret settlement before it is added to a
495
+ * signed execution trace or a replayable PM evidence bundle.
496
+ */
497
+ export function verifyPmExplorationVolcengineSettlement(value) {
498
+ exact(
499
+ value,
500
+ [
501
+ "schema",
502
+ "provider",
503
+ "model",
504
+ "operationId",
505
+ "executionRequestDigest",
506
+ "requestDigest",
507
+ "responseDigest",
508
+ "usage",
509
+ "estimatedCost",
510
+ "settlementDigest",
511
+ ],
512
+ "PM Volcengine settlement",
513
+ );
514
+ if (value.schema !== PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA)
515
+ throw new TypeError("PM Volcengine settlement schema is invalid");
516
+ if (value.provider !== PROVIDER)
517
+ throw new TypeError("PM Volcengine settlement provider is invalid");
518
+ const usage = normalizeUsage({
519
+ input_tokens: value.usage?.inputTokens,
520
+ output_tokens: value.usage?.outputTokens,
521
+ cache_read_input_tokens: value.usage?.cacheReadTokens,
522
+ cache_creation_input_tokens: value.usage?.cacheCreationTokens,
523
+ });
524
+ if (usage.totalTokens !== value.usage?.totalTokens)
525
+ throw new Error("PM Volcengine settlement usage total is invalid");
526
+ const core = deepFreeze({
527
+ schema: value.schema,
528
+ provider: value.provider,
529
+ model: boundedString(value.model, "PM Volcengine settlement model", 256),
530
+ operationId: operationId(value.operationId),
531
+ executionRequestDigest: digest(
532
+ value.executionRequestDigest,
533
+ "PM Volcengine settlement executionRequestDigest",
534
+ ),
535
+ requestDigest: digest(
536
+ value.requestDigest,
537
+ "PM Volcengine settlement requestDigest",
538
+ ),
539
+ responseDigest: digest(
540
+ value.responseDigest,
541
+ "PM Volcengine settlement responseDigest",
542
+ ),
543
+ usage,
544
+ estimatedCost: normalizeEstimatedCost(value.estimatedCost, usage),
545
+ });
546
+ if (
547
+ digest(value.settlementDigest, "PM Volcengine settlementDigest") !==
548
+ hash(PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA, core)
549
+ ) {
550
+ throw new Error("PM Volcengine settlement digest mismatch");
551
+ }
552
+ return deepFreeze({ ...core, settlementDigest: value.settlementDigest });
553
+ }
554
+
555
+ export function verifyPmExplorationVolcengineSettlementRecord(value) {
556
+ exact(
557
+ value,
558
+ ["settlement", "persistence"],
559
+ "PM Volcengine settlement record",
560
+ );
561
+ const settlement = verifyPmExplorationVolcengineSettlement(value.settlement);
562
+ const persistence =
563
+ value.persistence === null
564
+ ? null
565
+ : normalizePersistence(value.persistence, settlement.settlementDigest);
566
+ return deepFreeze({ settlement, persistence });
567
+ }
568
+
569
+ /**
570
+ * Invoke the real configured provider inside a host-issued budget capability.
571
+ * Provider-reported usage is charged before any response is returned. Missing
572
+ * usage, unpriced models, budget overflow and optional persistence failures are
573
+ * all fail-closed outcomes for the surrounding budget executor.
574
+ */
575
+ export async function invokePmExplorationVolcengine(value, input = {}) {
576
+ const client = CLIENTS.get(value);
577
+ if (!client)
578
+ throw new TypeError("a branded PM Volcengine provider is required");
579
+ exact(input, INVOCATION_KEYS, "PM Volcengine invocation");
580
+ const messages = normalizeMessages(input.messages);
581
+ const runtime = normalizeRuntime(input.runtime);
582
+ const requestedOutputTokens = integer(
583
+ input.maxOutputTokens,
584
+ "PM Volcengine invocation maxOutputTokens",
585
+ 1,
586
+ client.maxOutputTokens,
587
+ );
588
+ const boundOperationId = operationId(input.operationId);
589
+ const executionRequestDigest = digest(
590
+ input.executionRequestDigest,
591
+ "PM Volcengine invocation executionRequestDigest",
592
+ );
593
+ const requestCore = {
594
+ provider: PROVIDER,
595
+ model: client.model,
596
+ operationId: boundOperationId,
597
+ maxOutputTokens: requestedOutputTokens,
598
+ messages,
599
+ };
600
+ const requestDigest = hash(
601
+ PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA,
602
+ requestCore,
603
+ );
604
+ let settlement = null;
605
+ let persistence = null;
606
+ const startedAt = performance.now();
607
+ const chat = createChatFn({
608
+ provider: PROVIDER,
609
+ model: client.model,
610
+ baseUrl: client.baseUrl,
611
+ apiKey: client.apiKey,
612
+ evolutionIngress: client.evolutionIngress,
613
+ callWrapper: async ({ call, provider, model }) => {
614
+ if (provider !== PROVIDER || model !== client.model)
615
+ throw new Error("PM Volcengine provider identity changed during call");
616
+ const envelope = await call({ signal: runtime.signal });
617
+ const content = boundedString(
618
+ envelope?.content,
619
+ "PM Volcengine response",
620
+ MAX_RESPONSE_BYTES,
621
+ { trim: false },
622
+ );
623
+ if (content.trim().length === 0)
624
+ throw new Error("Volcengine response content is empty");
625
+ const usage = normalizeUsage(envelope?.usage);
626
+ runtime.recordTokens(usage.totalTokens);
627
+ const estimated = estimateCost({
628
+ provider: PROVIDER,
629
+ model: client.model,
630
+ inputTokens: usage.inputTokens,
631
+ outputTokens: usage.outputTokens,
632
+ cacheReadTokens: usage.cacheReadTokens,
633
+ cacheCreationTokens: usage.cacheCreationTokens,
634
+ table: client.pricing,
635
+ });
636
+ if (!estimated.matched || estimated.currency !== "USD")
637
+ throw new Error("Volcengine usage could not be priced");
638
+ const settlementCore = deepFreeze({
639
+ schema: PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA,
640
+ provider: PROVIDER,
641
+ model: client.model,
642
+ operationId: boundOperationId,
643
+ executionRequestDigest,
644
+ requestDigest,
645
+ responseDigest: hash(
646
+ PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA,
647
+ content,
648
+ ),
649
+ usage,
650
+ estimatedCost: {
651
+ currency: estimated.currency,
652
+ input: estimated.inputCost,
653
+ output: estimated.outputCost,
654
+ cacheRead: estimated.cacheReadCost,
655
+ cacheCreation: estimated.cacheCreationCost,
656
+ total: estimated.totalCost,
657
+ rate: {
658
+ ...estimated.rate,
659
+ cacheReadMultiplier: 0.1,
660
+ cacheCreationMultiplier: 1.25,
661
+ },
662
+ },
663
+ });
664
+ settlement = deepFreeze({
665
+ ...settlementCore,
666
+ settlementDigest: hash(
667
+ PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA,
668
+ settlementCore,
669
+ ),
670
+ });
671
+ if (client.persistSettlement !== null) {
672
+ persistence = normalizePersistence(
673
+ await client.persistSettlement(settlement),
674
+ settlement.settlementDigest,
675
+ );
676
+ }
677
+ return envelope;
678
+ },
679
+ });
680
+ const controller = new AbortController();
681
+ const timer = setTimeout(() => controller.abort(), client.timeoutMs);
682
+ timer.unref?.();
683
+ try {
684
+ const signal = AbortSignal.any([runtime.signal, controller.signal]);
685
+ let content;
686
+ try {
687
+ content = await chat(messages, {
688
+ maxTokens: requestedOutputTokens,
689
+ signal,
690
+ });
691
+ } catch (cause) {
692
+ if (!controller.signal.aborted) throw cause;
693
+ const error = new Error(
694
+ `PM Volcengine provider timed out after ${client.timeoutMs}ms`,
695
+ { cause },
696
+ );
697
+ error.code = "CC_PM_VOLCENGINE_TIMEOUT";
698
+ throw error;
699
+ }
700
+ if (controller.signal.aborted) {
701
+ const error = new Error(
702
+ `PM Volcengine provider timed out after ${client.timeoutMs}ms`,
703
+ );
704
+ error.code = "CC_PM_VOLCENGINE_TIMEOUT";
705
+ throw error;
706
+ }
707
+ if (
708
+ settlement === null ||
709
+ settlement.responseDigest !==
710
+ hash(PM_EXPLORATION_PROVIDER_SETTLEMENT_SCHEMA, content)
711
+ ) {
712
+ throw new Error("PM Volcengine settlement does not bind the response");
713
+ }
714
+ return deepFreeze({
715
+ schema: PM_EXPLORATION_PROVIDER_RESULT_SCHEMA,
716
+ content,
717
+ settlement,
718
+ persistence,
719
+ elapsedMs: Math.ceil(performance.now() - startedAt),
720
+ });
721
+ } finally {
722
+ clearTimeout(timer);
723
+ }
724
+ }