chainlesschain 0.166.65 → 0.166.68

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 (198) hide show
  1. package/README.md +20 -12
  2. package/package.json +4 -4
  3. package/src/assets/web-panel/assets/{AIOps-Byz17CTN.js → AIOps-CXkSNOGY.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-C5LiW2-J.js → ActionButton-ysMR6gTs.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D1INcvZF.js → Analytics-WGZ0sWuw.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DZzHO1VV.js → AppLayout-Cs2iRlQG.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-WfYQL6Ia.js → Artifacts-5IdfxWz0.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DohBoGWO.js → Audit-U9V434QX.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-Chtk-Hde.js → BackgroundAgents-BvFwxPlC.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-B813PuMz.js → Backup-C9yTr9hO.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DaDdWWgK.js → BaseInput-BdsSwUgE.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-D4pJ6oZ7.js → Chat-BB_2oBgH.js} +5 -5
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bpf1hDUl.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-Clo9TvO6.js → Checkbox-v6M5m7dK.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-uejLg8Ih.js → Codegen-CtouWSIz.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-B7nbx-iJ.js → Col-CqQJ4ORW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-FEyjPK1j.js → Community-BO__QCOy.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-B6Fk0Kn6.js → Compact-D0Kq4xlH.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BQG8goUl.js → Compliance-BSLKKBjA.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CbBeEfHp.js → Cowork-VsujXW5o.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-DPzlFcEZ.js → Cron-j8DbLGi5.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-B8pWJrbg.js → Crosschain-DWpYH1yN.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-gGQHUlFN.js → DID-mLaRxLQh.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2TMFHrn.js → Dashboard-Cff033Jr.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BVPxGbll.js → Dropdown-B1Upt6fP.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-CNPxs0hd.js → EmailListRenderer-CPtb8joV.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-_XTiB7q1.js → EvolutionSettings-CVh4Uv4g.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-UyE3VWtI.js → FamilyGuardDashboard-CrD1PhbF.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CLt6FHK-.js → Federation-ftxrvqW5.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CdNQPRPw.js → FormItemContext-9O80slC1.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-BJ0AMhrh.js → GenericCardRenderer-DaYvYIj9.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CQnvMfOM.js → Git-BKZh0YE5.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-deYsHC-o.js → Governance-vWbN873j.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-qaSck43z.js → Inference-BN6RR-l8.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-De0aJ3Ls.js → KnowledgeGraph-x49x9m7Q.js} +1 -1
  36. package/src/assets/web-panel/assets/Logs-Co2EPLsJ.js +2 -0
  37. package/src/assets/web-panel/assets/MarkdownRenderer-D7wIB-c7.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Byz3xCBN.js → Marketplace-DpPu6XQp.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DOZUUW6z.js → McpTools-BR0ksiax.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-C33wC2hA.js → Memory-BXznJ5-C.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-zZe-T_6M.js → MobileBridge-BHSOpfv7.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CRnUIume.js → MobileProjects-DdWmgIup.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-C1xlRVAN.js → Mtc-D9Rk_IGT.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-D0U07bIi.js → MtcAudit--i8q1lKc.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DF8uvV3h.js → Multisig-BHnNG7R9.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-bBPGAFlt.js → NLProgramming-Duo1ij2_.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BHAaOsgg.js → Notes-B44Le73p.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Cl0fG_rA.js → NotificationSettings-C3oy_7Gf.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-BEPAs8Zv.js → OrderTableRenderer-Da_73SI5.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-BAxSwgk5.js → Organization-ChsSwKxT.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-D68KubAu.js → Overflow-DR5G_cCn.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-bhdT17zk.js → P2P-yfaobqow.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-DgimH6Jp.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-Bq8fvkak.js → Permissions-DhinFvtE.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BYd2JEic.js → PersonalDataHub-CfeNVic1.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-Csg_ja69.js → Pipeline-CGKO26Nk.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-lwxwLj4M.js → Privacy-CxxfYEJh.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-BdBZkH8z.js → ProjectInit-CZsaAab9.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-ClWgFy-K.js → ProjectSettings-BUm_6clQ.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Bu-qj8N1.js → Projects-Capr8bVq.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-DEjxrxw3.js → Providers-D28VqPja.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-eccy-8Vi.js → QrScannerModal-Cj200vUb.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-Vx3uDvFg.js → QuickAsk-BGpnEiam.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CfUivNps.js → Recommend-Ix79Tpni.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BU4gk7GI.js → RemoteSession-BdGAFbIk.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-CbPzdZ0C.js → Reputation-B1Lis0Wk.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-CYLrgfKA.js → Row-Ba_okwOW.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-DbY1oyuv.js → RssFeed-DDbEuI-m.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-QeW41K5r.js → Search-D89wAkMy.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CJxf1kLZ.js → Security-CJKCKAU-.js} +3 -3
  71. package/src/assets/web-panel/assets/{Services-CFO9ySZc.js → Services-mitEc1XV.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CQFjeQN0.js → Skeleton-CnBjLDfX.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CLLB4INW.js → Skills-DSzDYvH3.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DxeLIJk0.js → Sla-CglJ_4p3.js} +1 -1
  75. package/src/assets/web-panel/assets/SpeechSettings-BicWJS7f.js +1 -0
  76. package/src/assets/web-panel/assets/{SyncSettings-C6NOkcQK.js → SyncSettings-Cq7o6fmr.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-LmVPWDfQ.js → Tasks-DOxFOBpU.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-BdEfUoVB.js → Templates-bY0wSbQM.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-IUlESacN.js → Tenant-BAyyl0qX.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B9pDe7sn.js → Terminal-BGBhSpqc.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-ZCwB-Pki.js → TimelineRenderer-BvW5lXYz.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-4qk16LX1.js → Tokens-Ua_LIx8-.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-jXNyargn.js → Trigger-BGwb2KL1.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D13PydtT.js → Trust-CD2IEHvj.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-yPgws6mS.js → UkeySign-D5LetK6P.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-B329WjpG.js → VideoEditing-oP7ehFgR.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-T8VM-Ttm.js → Wallet-BBtu4-xa.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-XuRibrpP.js → WebAuthn-iSPRU4Ht.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-D1Gwz3YR.js → WorkflowEditor-DuEDhQmB.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-DjydtnT-.js → chat-DGDgqvvm.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-gFtBvPrr.js → colors-DGQMWa1-.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-CndxhGfx.js → compact-item-COVznBL4.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DnfGpd0L.js → createContext-DIxVeHXI.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-CjR9h-Z_.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CmT5hRVW.js → hasIn-DkxZO3E9.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BGlmPbl_.js → index-0ToBFsvW.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BsRKmb6k.js → index-2JZizEPc.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-C14jryXi.js → index-BAL2p7YC.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-B0WFjxWs.js → index-BAlrovUm.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BlTcxT_L.js → index-BBw2MLIe.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DjcR-CwS.js → index-BHH95jcm.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DreYqebI.js → index-BOTshZNx.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DaEPE2DC.js → index-BQm7ntcn.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BNHdO6Jr.js → index-BUqwlzc8.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C3HvYeA3.js → index-BY6MSbWT.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DUlubR4l.js → index-BY9Ossof.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Dbpk75MO.js → index-BgM-3a1w.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CqpR0Des.js → index-Bv0_u0ze.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DjY-3sMA.js → index-C3XeNS82.js} +3 -3
  110. package/src/assets/web-panel/assets/{index-DV6NrfJx.js → index-C3bN6751.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DuAvYTmY.js → index-CNRRrP3-.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BW3nWiu0.js → index-CV0KnNqR.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CZLDbPTa.js → index-CcNGQWum.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-D5na0B7G.js → index-Ci34vbh0.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DoBKSzqu.js → index-ClQVcrFt.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CuOx4Pbe.js → index-Cligb-Dl.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CgMKElUh.js → index-CokrhbY2.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-BFif4Cev.js → index-CpZxDiVK.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-HHP1zzo7.js → index-CyMHF2Bi.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-_-wGLtAg.js → index-DDwPBGdA.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-ktN-K1Tf.js → index-DU1ArKl5.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C4Mqhmas.js → index-DV0H83eS.js} +1 -1
  123. package/src/assets/web-panel/assets/index-D_nxBMX5.js +1 -0
  124. package/src/assets/web-panel/assets/{index-BXNUTiW8.js → index-DaWQSp5a.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DKyuE_Y2.js → index-DmduvOYT.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DV2PR3Fa.js → index-ECoDhyH3.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BVM_w30N.js → index-ZcqTvPnt.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CRqz8TtI.js → index-b2_M6o20.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CB27echm.js → index-b_0qTo8O.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-D88-8bsB.js → index-dfYkGovV.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DGbKeg8G.js → index-jo7DbU0w.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D2d7358Y.js → index-usmG13jq.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-zQf599Uq.js → index-vXrktF3e.js} +1 -1
  134. package/src/assets/web-panel/assets/index-z_cTUMX-.js +1 -0
  135. package/src/assets/web-panel/assets/{initDefaultProps-KV3V-PNH.js → initDefaultProps-CkSeiBwL.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-PFGQg7_X.js → motion-CSzhDP0s.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Dnl79wq4.js → move-mgCt4iC6.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-Bwl5JH9V.js → mtc-parser-BEZBLcKt.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-DCcTtM1l.js → omit-BsHctMEr.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Cl6BjjDf.js → pickAttrs-1BHamnGW.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-fdqhyo42.js → placementArrow--Vb4Bd7l.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DYQpmcDW.js → responsiveObserve-DD33SqCm.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-C4l-VfO4.js → slide-DfrLtxgK.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DYDw_dyZ.js → statusUtils-D9Pe_gXW.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BEsubSMu.js → styleChecker-0NY5iMun.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-Cj82ggQ_.js → useFlexGapSupport-DSsZstwg.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-B7L1eJ0V.js → useFs-BU8HyH59.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-DVlJVD4d.js → usePersonalDataHub-D_xttink.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-BBAbRN_Y.js → vnode-39VhX2lM.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BYn48q-I.js → zoom-D5KQ8Pks.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +20 -7
  153. package/src/lib/dependency-install-policy.js +1 -1
  154. package/src/lib/evolution/browser-download-action-authority.js +747 -0
  155. package/src/lib/evolution/browser-download-artifact-disposal-authority.js +436 -0
  156. package/src/lib/evolution/browser-filesystem-quarantine-custody.js +2453 -0
  157. package/src/lib/evolution/browser-filesystem-quarantine-disposal.js +36 -0
  158. package/src/lib/evolution/browser-keyboard-action-authority.js +560 -0
  159. package/src/lib/evolution/browser-navigation-action-authority.js +546 -0
  160. package/src/lib/evolution/browser-quarantine-lock-maintenance-authority.js +573 -0
  161. package/src/lib/evolution/browser-quarantine-operator-revocation-authority.js +442 -0
  162. package/src/lib/evolution/browser-quarantine-retention-authority.js +503 -0
  163. package/src/lib/evolution/browser-quarantine-retention-scheduler.js +207 -0
  164. package/src/lib/evolution/browser-quarantined-download-executor.js +525 -0
  165. package/src/lib/evolution/browser-tab-open-action-authority.js +491 -0
  166. package/src/lib/evolution/browser-vision-action-authority.js +444 -0
  167. package/src/lib/evolution/browser-vision-observation-authority.js +304 -0
  168. package/src/lib/evolution/evolution-deployment-loader.js +202 -1
  169. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +5 -0
  170. package/src/lib/evolution/evolution-eval-gate.js +2 -1
  171. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +71 -9
  172. package/src/lib/evolution/evolution-eval-process-supervisor.js +276 -9
  173. package/src/lib/evolution/evolution-workbench-metrics.js +81 -21
  174. package/src/lib/evolution/pm-exploration-benchmark.js +747 -0
  175. package/src/lib/evolution/pm-exploration-budget-executor.js +106 -9
  176. package/src/lib/evolution/pm-exploration-egress-authority.js +382 -0
  177. package/src/lib/evolution/pm-exploration-evidence-bundle.js +149 -44
  178. package/src/lib/evolution/pm-exploration-execution-host.js +1254 -8
  179. package/src/lib/evolution/pm-exploration-process-grader.js +458 -0
  180. package/src/lib/evolution/pm-exploration-process-reviewer.js +456 -0
  181. package/src/lib/evolution/pm-exploration-process-runner.js +500 -0
  182. package/src/lib/evolution/pm-exploration-receipts.js +211 -11
  183. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +465 -46
  184. package/src/lib/evolution/pm-exploration-transition-committer.js +185 -34
  185. package/src/lib/evolution/skill-outcome-index-authority.js +7 -3
  186. package/src/lib/governance-coverage.js +1 -1
  187. package/src/lib/headless-manifest.js +1 -1
  188. package/src/lib/protocol-replay.js +1 -1
  189. package/src/lib/skill-outcome-transcript-authority.js +45 -5
  190. package/src/runtime/agent-core.js +17 -0
  191. package/src/assets/web-panel/assets/ChatBubbleRenderer-Cf3LLgDc.js +0 -1
  192. package/src/assets/web-panel/assets/Logs-ZtS98jCm.js +0 -2
  193. package/src/assets/web-panel/assets/MarkdownRenderer-CTsYo9NN.js +0 -1
  194. package/src/assets/web-panel/assets/PdhVaultBrowser-DqaO6wgH.js +0 -7
  195. package/src/assets/web-panel/assets/SpeechSettings-D4FA9KYI.js +0 -1
  196. package/src/assets/web-panel/assets/devWarning-D60SbiD-.js +0 -1
  197. package/src/assets/web-panel/assets/index-C0yR4_7h.js +0 -1
  198. package/src/assets/web-panel/assets/index-D4xuvo03.js +0 -1
@@ -142,6 +142,8 @@ export async function executePmExplorationBudgetedOperation({
142
142
  operation,
143
143
  allowedToolIds = [],
144
144
  invokeTool = null,
145
+ retrieveMemory = null,
146
+ invokeModel = null,
145
147
  parentSignal = null,
146
148
  now = performance.now.bind(performance),
147
149
  setTimer = setTimeout,
@@ -166,6 +168,22 @@ export async function executePmExplorationBudgetedOperation({
166
168
  (typeof invokeTool !== "function" || isProxy(invokeTool))
167
169
  )
168
170
  throw new TypeError("PM exploration tool broker must be a direct function");
171
+ if (
172
+ retrieveMemory !== null &&
173
+ (typeof retrieveMemory !== "function" || isProxy(retrieveMemory))
174
+ ) {
175
+ throw new TypeError(
176
+ "PM exploration memory broker must be a direct function",
177
+ );
178
+ }
179
+ if (
180
+ invokeModel !== null &&
181
+ (typeof invokeModel !== "function" || isProxy(invokeModel))
182
+ ) {
183
+ throw new TypeError(
184
+ "PM exploration model broker must be a direct function",
185
+ );
186
+ }
169
187
  if (!Array.isArray(allowedToolIds) || isProxy(allowedToolIds))
170
188
  throw new TypeError("allowedToolIds must be an array");
171
189
  const toolIds = new Set();
@@ -212,20 +230,35 @@ export async function executePmExplorationBudgetedOperation({
212
230
  controller.signal.reason ?? new PmExplorationBudgetError(stoppedReason)
213
231
  );
214
232
  };
233
+ const reserveExternalCall = (unavailableReason, broker) => {
234
+ assertOpen();
235
+ totals.toolCalls += 1;
236
+ if (totals.toolCalls > maximum.toolCalls) {
237
+ stop("max-tool-calls");
238
+ throw controller.signal.reason;
239
+ }
240
+ if (broker === null) {
241
+ stop(unavailableReason);
242
+ throw controller.signal.reason;
243
+ }
244
+ };
245
+ const recordTokenUsage = (count) => {
246
+ const delta = integer(count, "token count");
247
+ if (!Number.isSafeInteger(totals.tokens + delta))
248
+ throw new TypeError("token total exceeds the safe integer range");
249
+ totals.tokens += delta;
250
+ if (totals.tokens > maximum.tokens) {
251
+ stop("max-tokens");
252
+ throw controller.signal.reason;
253
+ }
254
+ return totals.tokens;
255
+ };
215
256
 
216
257
  const runtime = Object.freeze({
217
258
  signal: controller.signal,
218
259
  recordTokens(count) {
219
260
  assertOpen();
220
- const delta = integer(count, "token count");
221
- if (!Number.isSafeInteger(totals.tokens + delta))
222
- throw new TypeError("token total exceeds the safe integer range");
223
- totals.tokens += delta;
224
- if (totals.tokens > maximum.tokens) {
225
- stop("max-tokens");
226
- throw controller.signal.reason;
227
- }
228
- return totals.tokens;
261
+ return recordTokenUsage(count);
229
262
  },
230
263
  async invokeTool(toolId, input) {
231
264
  assertOpen();
@@ -258,6 +291,70 @@ export async function executePmExplorationBudgetedOperation({
258
291
  activeTools -= 1;
259
292
  }
260
293
  },
294
+ async retrieveMemory(request) {
295
+ reserveExternalCall("memory-broker-unavailable", retrieveMemory);
296
+ const safeRequest = copyJson(request, "memory retrieval request");
297
+ activeTools += 1;
298
+ try {
299
+ const output = await retrieveMemory(
300
+ Object.freeze({
301
+ request: safeRequest,
302
+ remainingTokens: maximum.tokens - totals.tokens,
303
+ signal: controller.signal,
304
+ }),
305
+ );
306
+ assertOpen();
307
+ return copyJson(output, "memory retrieval output");
308
+ } catch (error) {
309
+ stop("memory-broker-rejected");
310
+ throw controller.signal.reason ?? error;
311
+ } finally {
312
+ activeTools -= 1;
313
+ }
314
+ },
315
+ async invokeModel(request) {
316
+ reserveExternalCall("model-broker-unavailable", invokeModel);
317
+ const safeRequest = copyJson(request, "model egress request");
318
+ activeTools += 1;
319
+ try {
320
+ const result = await invokeModel(
321
+ Object.freeze({
322
+ request: safeRequest,
323
+ remainingTokens: maximum.tokens - totals.tokens,
324
+ signal: controller.signal,
325
+ }),
326
+ );
327
+ assertOpen();
328
+ exact(result, ["output", "usage"], "model broker result");
329
+ exact(
330
+ result.usage,
331
+ ["inputTokens", "outputTokens"],
332
+ "model broker usage",
333
+ );
334
+ const inputTokens = integer(
335
+ result.usage.inputTokens,
336
+ "model broker inputTokens",
337
+ );
338
+ const outputTokens = integer(
339
+ result.usage.outputTokens,
340
+ "model broker outputTokens",
341
+ );
342
+ if (!Number.isSafeInteger(inputTokens + outputTokens))
343
+ throw new TypeError(
344
+ "model broker token usage exceeds the safe integer range",
345
+ );
346
+ recordTokenUsage(inputTokens + outputTokens);
347
+ return Object.freeze({
348
+ output: copyJson(result.output, "model broker output"),
349
+ usage: Object.freeze({ inputTokens, outputTokens }),
350
+ });
351
+ } catch (error) {
352
+ stop("model-broker-rejected");
353
+ throw controller.signal.reason ?? error;
354
+ } finally {
355
+ activeTools -= 1;
356
+ }
357
+ },
261
358
  snapshot() {
262
359
  const current = Number(now());
263
360
  if (!Number.isFinite(current) || current < startedAt)
@@ -0,0 +1,382 @@
1
+ import { createHash } from "node:crypto";
2
+ import { isProxy } from "node:util/types";
3
+
4
+ export const PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA =
5
+ "chainlesschain.pm-exploration-egress-authority/v1";
6
+ export const PM_EXPLORATION_MEMORY_RETRIEVAL_REQUEST_SCHEMA =
7
+ "chainlesschain.pm-exploration-memory-retrieval-request/v1";
8
+ export const PM_EXPLORATION_MODEL_EGRESS_REQUEST_SCHEMA =
9
+ "chainlesschain.pm-exploration-model-egress-request/v1";
10
+
11
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
12
+ const ID = /^[a-z][a-z0-9]*(?:[._:@/-][a-z0-9]+)*$/u;
13
+ const AUTHORITIES = new WeakMap();
14
+
15
+ function canonical(value) {
16
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
17
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
18
+ return `{${Object.keys(value)
19
+ .sort()
20
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
21
+ .join(",")}}`;
22
+ }
23
+
24
+ function hash(domain, value) {
25
+ return `sha256:${createHash("sha256")
26
+ .update(domain)
27
+ .update("\0")
28
+ .update(canonical(value))
29
+ .digest("hex")}`;
30
+ }
31
+
32
+ function exact(value, keys, label) {
33
+ if (
34
+ !value ||
35
+ typeof value !== "object" ||
36
+ Array.isArray(value) ||
37
+ isProxy(value) ||
38
+ Object.getPrototypeOf(value) !== Object.prototype
39
+ ) {
40
+ throw new TypeError(`${label} must be a plain object`);
41
+ }
42
+ const actual = Reflect.ownKeys(value);
43
+ if (
44
+ actual.length !== keys.length ||
45
+ actual.some((key) => {
46
+ const field = Object.getOwnPropertyDescriptor(value, key);
47
+ return (
48
+ typeof key !== "string" ||
49
+ !keys.includes(key) ||
50
+ !field ||
51
+ !field.enumerable ||
52
+ !("value" in field)
53
+ );
54
+ })
55
+ ) {
56
+ throw new TypeError(`${label} has unexpected or accessor fields`);
57
+ }
58
+ }
59
+
60
+ function identifier(value, label) {
61
+ if (typeof value !== "string" || value.length > 256 || !ID.test(value))
62
+ throw new TypeError(`${label} is invalid`);
63
+ return value;
64
+ }
65
+
66
+ function digest(value, label) {
67
+ if (typeof value !== "string" || !DIGEST.test(value))
68
+ throw new TypeError(`${label} must be a sha256 digest`);
69
+ return value;
70
+ }
71
+
72
+ function integer(value, label, minimum = 0, maximum = Number.MAX_SAFE_INTEGER) {
73
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
74
+ throw new TypeError(`${label} is outside its allowed range`);
75
+ return value;
76
+ }
77
+
78
+ function copyJson(
79
+ value,
80
+ label,
81
+ context = { bytes: 0, nodes: 0, seen: new WeakSet() },
82
+ ) {
83
+ if (
84
+ value === null ||
85
+ typeof value === "string" ||
86
+ typeof value === "boolean"
87
+ ) {
88
+ context.bytes += Buffer.byteLength(JSON.stringify(value));
89
+ if (context.bytes > 1024 * 1024)
90
+ throw new TypeError(`${label} exceeds its byte bound`);
91
+ return value;
92
+ }
93
+ if (typeof value === "number" && Number.isFinite(value)) return value;
94
+ if (
95
+ !value ||
96
+ typeof value !== "object" ||
97
+ isProxy(value) ||
98
+ context.seen.has(value) ||
99
+ context.nodes >= 20_000
100
+ ) {
101
+ throw new TypeError(`${label} must be bounded acyclic JSON data`);
102
+ }
103
+ context.seen.add(value);
104
+ context.nodes += 1;
105
+ if (Array.isArray(value)) {
106
+ if (
107
+ Object.getPrototypeOf(value) !== Array.prototype ||
108
+ Reflect.ownKeys(value).length !== value.length + 1
109
+ ) {
110
+ throw new TypeError(`${label} must be a dense plain array`);
111
+ }
112
+ const result = [];
113
+ for (let index = 0; index < value.length; index += 1) {
114
+ if (!Object.hasOwn(value, index))
115
+ throw new TypeError(`${label} cannot contain holes`);
116
+ result.push(copyJson(value[index], label, context));
117
+ }
118
+ context.seen.delete(value);
119
+ return result;
120
+ }
121
+ if (Object.getPrototypeOf(value) !== Object.prototype)
122
+ throw new TypeError(`${label} must use the default object prototype`);
123
+ const result = {};
124
+ for (const key of Reflect.ownKeys(value)) {
125
+ const field = Object.getOwnPropertyDescriptor(value, key);
126
+ if (
127
+ typeof key !== "string" ||
128
+ !field ||
129
+ !field.enumerable ||
130
+ !("value" in field)
131
+ ) {
132
+ throw new TypeError(`${label} contains a symbol or accessor`);
133
+ }
134
+ context.bytes += Buffer.byteLength(key);
135
+ if (context.bytes > 1024 * 1024)
136
+ throw new TypeError(`${label} exceeds its byte bound`);
137
+ result[key] = copyJson(field.value, label, context);
138
+ }
139
+ context.seen.delete(value);
140
+ return result;
141
+ }
142
+
143
+ function freezeJson(value) {
144
+ if (!value || typeof value !== "object" || Object.isFrozen(value))
145
+ return value;
146
+ for (const entry of Object.values(value)) freezeJson(entry);
147
+ return Object.freeze(value);
148
+ }
149
+
150
+ function authorityKind(value) {
151
+ if (!["memory-retrieval", "model-egress"].includes(value))
152
+ throw new TypeError("PM exploration egress authority kind is invalid");
153
+ return value;
154
+ }
155
+
156
+ function createAuthority(options, kind, handlerKey) {
157
+ exact(
158
+ options,
159
+ [
160
+ "authorityId",
161
+ "revision",
162
+ "handlerArtifactDigest",
163
+ "policyDigest",
164
+ handlerKey,
165
+ ],
166
+ `PM exploration ${kind} authority options`,
167
+ );
168
+ const handler = options[handlerKey];
169
+ if (typeof handler !== "function" || isProxy(handler))
170
+ throw new TypeError(`PM exploration ${kind} handler must be direct`);
171
+ const core = Object.freeze({
172
+ schema: PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA,
173
+ kind: authorityKind(kind),
174
+ authorityId: identifier(options.authorityId, "egress authorityId"),
175
+ revision: integer(options.revision, "egress authority revision", 1),
176
+ handlerArtifactDigest: digest(
177
+ options.handlerArtifactDigest,
178
+ "egress handlerArtifactDigest",
179
+ ),
180
+ policyDigest: digest(options.policyDigest, "egress policyDigest"),
181
+ });
182
+ const authority = Object.freeze({});
183
+ AUTHORITIES.set(authority, {
184
+ descriptor: Object.freeze({
185
+ ...core,
186
+ authorityDigest: hash(PM_EXPLORATION_EGRESS_AUTHORITY_SCHEMA, core),
187
+ }),
188
+ handler,
189
+ });
190
+ return authority;
191
+ }
192
+
193
+ export function createPmExplorationMemoryRetrievalAuthority(options = {}) {
194
+ return createAuthority(options, "memory-retrieval", "retrieve");
195
+ }
196
+
197
+ export function createPmExplorationModelEgressAuthority(options = {}) {
198
+ return createAuthority(options, "model-egress", "invoke");
199
+ }
200
+
201
+ export function inspectPmExplorationEgressAuthority(value) {
202
+ const binding = AUTHORITIES.get(value);
203
+ if (!binding)
204
+ throw new TypeError(
205
+ "a branded PM exploration egress authority is required",
206
+ );
207
+ return binding.descriptor;
208
+ }
209
+
210
+ function invocationContext(value) {
211
+ exact(
212
+ value,
213
+ [
214
+ "planDigest",
215
+ "environmentDigest",
216
+ "executionManifestDigest",
217
+ "roundId",
218
+ "stage",
219
+ "branchId",
220
+ "taskId",
221
+ "inputMemoryDigest",
222
+ ],
223
+ "PM exploration egress invocation context",
224
+ );
225
+ if (!["broad", "deep"].includes(value.stage))
226
+ throw new TypeError("PM exploration egress stage is invalid");
227
+ if (value.stage === "broad") identifier(value.branchId, "egress branchId");
228
+ else if (value.branchId !== null)
229
+ throw new TypeError("Deep egress context cannot name a branch");
230
+ return Object.freeze({
231
+ planDigest: digest(value.planDigest, "egress planDigest"),
232
+ environmentDigest: digest(
233
+ value.environmentDigest,
234
+ "egress environmentDigest",
235
+ ),
236
+ executionManifestDigest: digest(
237
+ value.executionManifestDigest,
238
+ "egress executionManifestDigest",
239
+ ),
240
+ roundId: identifier(value.roundId, "egress roundId"),
241
+ stage: value.stage,
242
+ branchId: value.branchId,
243
+ taskId: identifier(value.taskId, "egress taskId"),
244
+ inputMemoryDigest: digest(
245
+ value.inputMemoryDigest,
246
+ "egress inputMemoryDigest",
247
+ ),
248
+ });
249
+ }
250
+
251
+ function runtimeContext(value, label) {
252
+ exact(value, ["signal", "remainingTokens"], label);
253
+ if (!(value.signal instanceof AbortSignal))
254
+ throw new TypeError(`${label}.signal must be an AbortSignal`);
255
+ return Object.freeze({
256
+ signal: value.signal,
257
+ remainingTokens: integer(value.remainingTokens, `${label}.remainingTokens`),
258
+ });
259
+ }
260
+
261
+ export async function retrievePmExplorationMemory(
262
+ authorityValue,
263
+ contextInput,
264
+ requestInput,
265
+ runtimeInput,
266
+ ) {
267
+ const binding = AUTHORITIES.get(authorityValue);
268
+ if (!binding || binding.descriptor.kind !== "memory-retrieval")
269
+ throw new TypeError(
270
+ "a branded PM exploration memory retrieval authority is required",
271
+ );
272
+ const context = invocationContext(contextInput);
273
+ exact(
274
+ requestInput,
275
+ ["memoryDigest", "query"],
276
+ "PM exploration memory retrieval request",
277
+ );
278
+ const memoryDigest = digest(
279
+ requestInput.memoryDigest,
280
+ "memory retrieval memoryDigest",
281
+ );
282
+ if (memoryDigest !== context.inputMemoryDigest)
283
+ throw new Error(
284
+ "PM exploration memory retrieval escaped its round snapshot",
285
+ );
286
+ const requestCore = freezeJson({
287
+ schema: PM_EXPLORATION_MEMORY_RETRIEVAL_REQUEST_SCHEMA,
288
+ authorityDigest: binding.descriptor.authorityDigest,
289
+ ...context,
290
+ memoryDigest,
291
+ query: copyJson(requestInput.query, "memory retrieval query"),
292
+ });
293
+ const request = Object.freeze({
294
+ ...requestCore,
295
+ requestDigest: hash(
296
+ PM_EXPLORATION_MEMORY_RETRIEVAL_REQUEST_SCHEMA,
297
+ requestCore,
298
+ ),
299
+ });
300
+ const runtime = runtimeContext(runtimeInput, "memory retrieval runtime");
301
+ const output = await binding.handler(request, runtime);
302
+ if (runtime.signal.aborted)
303
+ throw runtime.signal.reason ?? new Error("memory retrieval was aborted");
304
+ return freezeJson(copyJson(output, "memory retrieval output"));
305
+ }
306
+
307
+ export async function invokePmExplorationModelEgress(
308
+ authorityValue,
309
+ contextInput,
310
+ requestInput,
311
+ runtimeInput,
312
+ ) {
313
+ const binding = AUTHORITIES.get(authorityValue);
314
+ if (!binding || binding.descriptor.kind !== "model-egress")
315
+ throw new TypeError(
316
+ "a branded PM exploration model egress authority is required",
317
+ );
318
+ const context = invocationContext(contextInput);
319
+ exact(
320
+ requestInput,
321
+ ["purpose", "input", "maxOutputTokens"],
322
+ "PM exploration model egress request",
323
+ );
324
+ const runtime = runtimeContext(runtimeInput, "model egress runtime");
325
+ const maxOutputTokens = integer(
326
+ requestInput.maxOutputTokens,
327
+ "model egress maxOutputTokens",
328
+ 1,
329
+ 1_000_000,
330
+ );
331
+ if (maxOutputTokens > runtime.remainingTokens)
332
+ throw new Error(
333
+ "PM exploration model request exceeds its remaining budget",
334
+ );
335
+ const requestCore = freezeJson({
336
+ schema: PM_EXPLORATION_MODEL_EGRESS_REQUEST_SCHEMA,
337
+ authorityDigest: binding.descriptor.authorityDigest,
338
+ ...context,
339
+ purpose: identifier(requestInput.purpose, "model egress purpose"),
340
+ input: copyJson(requestInput.input, "model egress input"),
341
+ maxOutputTokens,
342
+ remainingTokens: runtime.remainingTokens,
343
+ });
344
+ const request = Object.freeze({
345
+ ...requestCore,
346
+ requestDigest: hash(
347
+ PM_EXPLORATION_MODEL_EGRESS_REQUEST_SCHEMA,
348
+ requestCore,
349
+ ),
350
+ });
351
+ const result = await binding.handler(request, runtime);
352
+ if (runtime.signal.aborted)
353
+ throw runtime.signal.reason ?? new Error("model egress was aborted");
354
+ exact(result, ["output", "usage"], "PM exploration model egress result");
355
+ exact(
356
+ result.usage,
357
+ ["inputTokens", "outputTokens"],
358
+ "PM exploration model egress usage",
359
+ );
360
+ const inputTokens = integer(
361
+ result.usage.inputTokens,
362
+ "model egress inputTokens",
363
+ );
364
+ const outputTokens = integer(
365
+ result.usage.outputTokens,
366
+ "model egress outputTokens",
367
+ );
368
+ if (
369
+ !Number.isSafeInteger(inputTokens + outputTokens) ||
370
+ inputTokens + outputTokens > runtime.remainingTokens ||
371
+ outputTokens > maxOutputTokens
372
+ ) {
373
+ throw new Error("PM exploration model usage exceeds its authorized budget");
374
+ }
375
+ return freezeJson({
376
+ output: copyJson(result.output, "model egress output"),
377
+ usage: {
378
+ inputTokens,
379
+ outputTokens,
380
+ },
381
+ });
382
+ }