chainlesschain 0.166.68 → 0.166.70

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 (177) hide show
  1. package/README.md +24 -5
  2. package/package.json +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-CXkSNOGY.js → AIOps-BBxGVjAo.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-ysMR6gTs.js → ActionButton-SrT9X1LG.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-WGZ0sWuw.js → Analytics-D0MPWFct.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-Cs2iRlQG.js → AppLayout-DlmlYhUp.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-5IdfxWz0.js → Artifacts-BzLV8tLT.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-U9V434QX.js → Audit-BWfARNeo.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-BvFwxPlC.js → BackgroundAgents-AT_lu-OI.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-C9yTr9hO.js → Backup-6pH5UJRI.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-BdsSwUgE.js → BaseInput-CccGGr8I.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-BB_2oBgH.js → Chat-B6aQ-lXU.js} +6 -6
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-cKmA5EAa.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-v6M5m7dK.js → Checkbox-Dc_dMjlV.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-CtouWSIz.js → Codegen-CHm0YK-0.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-CqQJ4ORW.js → Col-IaBwOtml.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-BO__QCOy.js → Community-U5N0EakJ.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-D0Kq4xlH.js → Compact-D6bK2hw-.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BSLKKBjA.js → Compliance-B0G1zA62.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-VsujXW5o.js → Cowork-BvJxGzAT.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-j8DbLGi5.js → Cron-N5JOZWe9.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-DWpYH1yN.js → Crosschain-CgnzS-_7.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-mLaRxLQh.js → DID-BTMEilVf.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-Cff033Jr.js → Dashboard-Bc-1wTPH.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-B1Upt6fP.js → Dropdown-DfJLRkz2.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-CPtb8joV.js → EmailListRenderer-DOkzpgap.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-CVh4Uv4g.js → EvolutionSettings-23ZdCcyg.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-CrD1PhbF.js → FamilyGuardDashboard-mBhA1oWh.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-ftxrvqW5.js → Federation-C9Kmj_hs.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-9O80slC1.js → FormItemContext-CeU7fnW_.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DaYvYIj9.js → GenericCardRenderer-s-QOculU.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-BKZh0YE5.js → Git-BbePEFdx.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-vWbN873j.js → Governance-PnVQJUn7.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-BN6RR-l8.js → Inference-sCcd1Foj.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-x49x9m7Q.js → KnowledgeGraph-DdM6cJOh.js} +1 -1
  36. package/src/assets/web-panel/assets/Logs-Dznmdibo.js +2 -0
  37. package/src/assets/web-panel/assets/MarkdownRenderer-nFgRqRUW.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-DpPu6XQp.js → Marketplace-DQ76qwhE.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-BR0ksiax.js → McpTools-CZqTYtmV.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-BXznJ5-C.js → Memory-CWtnaJCd.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-BHSOpfv7.js → MobileBridge-C3Ngpr63.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-DdWmgIup.js → MobileProjects-CpJPlABd.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-D9Rk_IGT.js → Mtc-CKL_fDu2.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit--i8q1lKc.js → MtcAudit-CIDSj87F.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BHnNG7R9.js → Multisig-BoLpIo5g.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Duo1ij2_.js → NLProgramming-CWJX8SH5.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-B44Le73p.js → Notes-CdGvaOEe.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-C3oy_7Gf.js → NotificationSettings-C067lOY0.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-Da_73SI5.js → OrderTableRenderer-Bkdj8JZF.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-ChsSwKxT.js → Organization-CwhP3jqH.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-DR5G_cCn.js → Overflow-Ks7pF8mI.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-yfaobqow.js → P2P-BytzAo-_.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-f7PUa-As.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-DhinFvtE.js → Permissions-DYgQYc6c.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CfeNVic1.js → PersonalDataHub-xa4C85B5.js} +3 -3
  56. package/src/assets/web-panel/assets/{Pipeline-CGKO26Nk.js → Pipeline-Ci4P4D_9.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CxxfYEJh.js → Privacy-Bc0i4kUv.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-CZsaAab9.js → ProjectInit-BNQNNbq1.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-BUm_6clQ.js → ProjectSettings-C9a52UVV.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-DoqbdOhN.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-D28VqPja.js → Providers-aqNSVXqu.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-Cj200vUb.js → QrScannerModal-BhiK-alo.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-BGpnEiam.js → QuickAsk-DqiqZt1A.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-Ix79Tpni.js → Recommend-c0WOkaCq.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BdGAFbIk.js → RemoteSession-Cf_4L-X3.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-B1Lis0Wk.js → Reputation-BVFrZQ_z.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-Ba_okwOW.js → Row-CZ1AwkDl.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-DDbEuI-m.js → RssFeed--WyTTgfC.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-D89wAkMy.js → Search-BgxZ24St.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CJKCKAU-.js → Security-DVkmHsXI.js} +2 -2
  71. package/src/assets/web-panel/assets/{Services-mitEc1XV.js → Services-CTZQQWlI.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CnBjLDfX.js → Skeleton-DWwUMTlS.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-DSzDYvH3.js → Skills-D6iyc72U.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-CglJ_4p3.js → Sla-ChMCfgKV.js} +1 -1
  75. package/src/assets/web-panel/assets/SpeechSettings-CtwWxhK7.js +1 -0
  76. package/src/assets/web-panel/assets/{SyncSettings-Cq7o6fmr.js → SyncSettings-DAbLxMOM.js} +2 -2
  77. package/src/assets/web-panel/assets/Tasks-Dvm355ug.js +1 -0
  78. package/src/assets/web-panel/assets/{Templates-bY0wSbQM.js → Templates-Dig8IEP-.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-BAyyl0qX.js → Tenant-DeR5U47w.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BGBhSpqc.js → Terminal-CHXg-gsD.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BvW5lXYz.js → TimelineRenderer-Bi4GJgwI.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-Ua_LIx8-.js → Tokens-D6ubE4ut.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BGwb2KL1.js → Trigger-CUQI4HlL.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-CD2IEHvj.js → Trust-CgTAWXd7.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-D5LetK6P.js → UkeySign-R2bAawIX.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-oP7ehFgR.js → VideoEditing-46u-3sdP.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BBtu4-xa.js → Wallet-DdrACErK.js} +2 -2
  88. package/src/assets/web-panel/assets/{WebAuthn-iSPRU4Ht.js → WebAuthn-Cq266Ihg.js} +2 -2
  89. package/src/assets/web-panel/assets/{WorkflowEditor-DuEDhQmB.js → WorkflowEditor-DV0ES1wc.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-DGDgqvvm.js → chat-D5xy9-vl.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-DGQMWa1-.js → colors-BBs5Knx_.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-COVznBL4.js → compact-item-BuFzMOeP.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DIxVeHXI.js → createContext-D6gC8UX1.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-jGzCD1Og.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DkxZO3E9.js → hasIn-kBeod51t.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DV0H83eS.js → index-43tYtngc.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BAL2p7YC.js → index-8LcW9fNg.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BgM-3a1w.js → index-AVkVBAgT.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BQm7ntcn.js → index-B9sYKnfE.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BOTshZNx.js → index-BEipvyo3.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CV0KnNqR.js → index-BJtaYRSM.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-b2_M6o20.js → index-BNgGahh_.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-jo7DbU0w.js → index-BPfLeT9D.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CpZxDiVK.js → index-BrmMhNQe.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BBw2MLIe.js → index-C61TSHk7.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-usmG13jq.js → index-C9RbA1u6.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DaWQSp5a.js → index-CDc8ZBhw.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-b_0qTo8O.js → index-CSR6G5y_.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Ci34vbh0.js → index-Cc0nr-mJ.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-vXrktF3e.js → index-CdXTYNGI.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-C3bN6751.js → index-CoF4d2sR.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DU1ArKl5.js → index-Cy8WOPIM.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-BY6MSbWT.js → index-D5w7mVUz.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CcNGQWum.js → index-D8i4RtvF.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DDwPBGdA.js → index-D8vRjV35.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BY9Ossof.js → index-DLO3EJ28.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BHH95jcm.js → index-DP74sxrD.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bv0_u0ze.js → index-DT8dVo6h.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CNRRrP3-.js → index-DVY9bZaC.js} +1 -1
  120. package/src/assets/web-panel/assets/index-DVuuRGW6.js +1 -0
  121. package/src/assets/web-panel/assets/{index-BAlrovUm.js → index-DWpwO1tg.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-ZcqTvPnt.js → index-Db_4IGgr.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-dfYkGovV.js → index-DiEf8pdZ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C3XeNS82.js → index-DjJD0ItG.js} +3 -3
  125. package/src/assets/web-panel/assets/index-DjkHUbjO.js +1 -0
  126. package/src/assets/web-panel/assets/{index-BUqwlzc8.js → index-DkcAtMWM.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CyMHF2Bi.js → index-Dn4FQfDW.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-2JZizEPc.js → index-DuFsuweQ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DmduvOYT.js → index-WMRvzqet.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Cligb-Dl.js → index-Xmeq1989.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-ECoDhyH3.js → index-ZMxLi0bZ.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CokrhbY2.js → index-_j1YrDlh.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-ClQVcrFt.js → index-qXVSh34h.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-0ToBFsvW.js → index-slOdrjUJ.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-CkSeiBwL.js → initDefaultProps-CdcTIUHj.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-CSzhDP0s.js → motion-DMIDKmqt.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-mgCt4iC6.js → move-DRq4Pk0-.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-BEZBLcKt.js → mtc-parser-SYFo5WKx.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-BsHctMEr.js → omit-B_X6VxfU.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-1BHamnGW.js → pickAttrs-DnuDKnw_.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow--Vb4Bd7l.js → placementArrow-DBFRmoTN.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DD33SqCm.js → responsiveObserve-BaUVjf33.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-DfrLtxgK.js → slide-rLCDXDVC.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-D9Pe_gXW.js → statusUtils-CzNprwdC.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-0NY5iMun.js → styleChecker-DsaDdSa9.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DSsZstwg.js → useFlexGapSupport-BKHgNy2p.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-BU8HyH59.js → useFs-C_OQYo_E.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-D_xttink.js → usePersonalDataHub-CiGRKQ5k.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-39VhX2lM.js → vnode-C9-ch6HP.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-D5KQ8Pks.js → zoom-HoUcoyA4.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/agent.js +84 -0
  154. package/src/data/changelog.json +26 -0
  155. package/src/lib/decision-layer/benchmark.js +164 -0
  156. package/src/lib/decision-layer/contracts.js +377 -0
  157. package/src/lib/decision-layer/provider-authority.js +44 -0
  158. package/src/lib/decision-layer/runtime.js +238 -0
  159. package/src/lib/decision-layer/typesafe-provider.js +74 -0
  160. package/src/lib/evolution/evolution-deployment-loader.js +39 -0
  161. package/src/lib/evolution/skill-writer-inventory-manifest.js +0 -39
  162. package/src/lib/evolution/volcengine-function-execution-authority.js +2949 -0
  163. package/src/lib/evolution/volcengine-function-process-executor.js +615 -0
  164. package/src/lib/evolution/volcengine-function-replay-store.js +836 -0
  165. package/src/lib/evolution/volcengine-function-revocation-status-floor-store.js +480 -0
  166. package/src/runtime/agent-core.js +49 -0
  167. package/src/runtime/headless-runner.js +79 -0
  168. package/src/assets/web-panel/assets/ChatBubbleRenderer-Bpf1hDUl.js +0 -1
  169. package/src/assets/web-panel/assets/Logs-Co2EPLsJ.js +0 -2
  170. package/src/assets/web-panel/assets/MarkdownRenderer-D7wIB-c7.js +0 -1
  171. package/src/assets/web-panel/assets/PdhVaultBrowser-DgimH6Jp.js +0 -7
  172. package/src/assets/web-panel/assets/Projects-Capr8bVq.js +0 -1
  173. package/src/assets/web-panel/assets/SpeechSettings-BicWJS7f.js +0 -1
  174. package/src/assets/web-panel/assets/Tasks-DOxFOBpU.js +0 -1
  175. package/src/assets/web-panel/assets/devWarning-CjR9h-Z_.js +0 -1
  176. package/src/assets/web-panel/assets/index-D_nxBMX5.js +0 -1
  177. package/src/assets/web-panel/assets/index-z_cTUMX-.js +0 -1
@@ -0,0 +1,480 @@
1
+ import { createHash } from "node:crypto";
2
+ import path from "node:path";
3
+ import { types } from "node:util";
4
+
5
+ import { createEvolutionLedgerFileManifestHeadBackend } from "./evolution-ledger-file-manifest-head-store.js";
6
+
7
+ export const VOLCENGINE_FUNCTION_REVOCATION_STATUS_FLOOR_STORE_SCHEMA =
8
+ "chainlesschain.volcengine-function-revocation-status-floor-store/v1";
9
+ export const VOLCENGINE_FUNCTION_REVOCATION_STATUS_FLOOR_MODE =
10
+ "cross-process-exclusive-file-fsync";
11
+ export const VOLCENGINE_FUNCTION_REVOCATION_STATUS_SNAPSHOT_SCHEMA =
12
+ "chainlesschain.volcengine-function-revocation-status-snapshot/v1";
13
+ export const VOLCENGINE_FUNCTION_REVOCATION_STATUS_ACK_SCHEMA =
14
+ "chainlesschain.volcengine-function-revocation-status-ack/v1";
15
+
16
+ const STATE_SCHEMA =
17
+ "chainlesschain.volcengine-function-revocation-status-floor-state/v1";
18
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
19
+ const ID = /^[^\p{Cc}]{1,512}$/u;
20
+ const stores = new WeakMap();
21
+
22
+ function canonical(value) {
23
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
24
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
25
+ return `{${Object.keys(value)
26
+ .sort()
27
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
28
+ .join(",")}}`;
29
+ }
30
+
31
+ function digest(domain, value) {
32
+ return `sha256:${createHash("sha256")
33
+ .update(`${domain}\0`)
34
+ .update(canonical(value))
35
+ .digest("hex")}`;
36
+ }
37
+
38
+ function exactData(value, keys, label) {
39
+ if (
40
+ !value ||
41
+ typeof value !== "object" ||
42
+ Array.isArray(value) ||
43
+ types.isProxy(value) ||
44
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||
45
+ Reflect.ownKeys(value).length !== keys.length ||
46
+ keys.some((key) => {
47
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
48
+ return !descriptor?.enumerable || !Object.hasOwn(descriptor, "value");
49
+ })
50
+ ) {
51
+ throw new TypeError(`${label} has unexpected or accessor fields`);
52
+ }
53
+ }
54
+
55
+ function ownData(owner, name, label) {
56
+ const descriptor = Object.getOwnPropertyDescriptor(owner, name);
57
+ if (!descriptor || !Object.hasOwn(descriptor, "value")) {
58
+ throw new TypeError(`${label} must be plain data`);
59
+ }
60
+ return descriptor.value;
61
+ }
62
+
63
+ function normalizeDirectory(value) {
64
+ if (typeof value !== "string" || value.trim() === "") {
65
+ throw new TypeError(
66
+ "Volcengine function revocation status floor directory is invalid",
67
+ );
68
+ }
69
+ return path.resolve(value);
70
+ }
71
+
72
+ export function digestVolcengineFunctionRevocationStatusFloorRoot(value) {
73
+ return digest(
74
+ "chainlesschain.volcengine-function-revocation-status-floor-root/v1",
75
+ normalizeDirectory(value),
76
+ );
77
+ }
78
+
79
+ function normalizeDescriptor(value) {
80
+ exactData(
81
+ value,
82
+ [
83
+ "schema",
84
+ "storeId",
85
+ "tenantId",
86
+ "handlerArtifactDigest",
87
+ "revocationAuthorityId",
88
+ "trustRootDigest",
89
+ "stateRootDigest",
90
+ "mode",
91
+ ],
92
+ "Volcengine function revocation status floor store descriptor",
93
+ );
94
+ const descriptor = Object.freeze({
95
+ schema: ownData(
96
+ value,
97
+ "schema",
98
+ "Volcengine function revocation status floor store schema",
99
+ ),
100
+ storeId: ownData(
101
+ value,
102
+ "storeId",
103
+ "Volcengine function revocation status floor store identifier",
104
+ ),
105
+ tenantId: ownData(
106
+ value,
107
+ "tenantId",
108
+ "Volcengine function revocation status floor store tenant",
109
+ ),
110
+ handlerArtifactDigest: ownData(
111
+ value,
112
+ "handlerArtifactDigest",
113
+ "Volcengine function revocation status floor store artifact digest",
114
+ ),
115
+ revocationAuthorityId: ownData(
116
+ value,
117
+ "revocationAuthorityId",
118
+ "Volcengine function revocation status floor store authority",
119
+ ),
120
+ trustRootDigest: ownData(
121
+ value,
122
+ "trustRootDigest",
123
+ "Volcengine function revocation status floor store trust root",
124
+ ),
125
+ stateRootDigest: ownData(
126
+ value,
127
+ "stateRootDigest",
128
+ "Volcengine function revocation status floor state root",
129
+ ),
130
+ mode: ownData(
131
+ value,
132
+ "mode",
133
+ "Volcengine function revocation status floor store mode",
134
+ ),
135
+ });
136
+ if (
137
+ descriptor.schema !==
138
+ VOLCENGINE_FUNCTION_REVOCATION_STATUS_FLOOR_STORE_SCHEMA ||
139
+ !ID.test(descriptor.storeId) ||
140
+ !ID.test(descriptor.tenantId) ||
141
+ !DIGEST.test(descriptor.handlerArtifactDigest) ||
142
+ !ID.test(descriptor.revocationAuthorityId) ||
143
+ !DIGEST.test(descriptor.trustRootDigest) ||
144
+ !DIGEST.test(descriptor.stateRootDigest) ||
145
+ descriptor.mode !== VOLCENGINE_FUNCTION_REVOCATION_STATUS_FLOOR_MODE
146
+ ) {
147
+ throw new TypeError(
148
+ "Volcengine function revocation status floor store descriptor is invalid",
149
+ );
150
+ }
151
+ return descriptor;
152
+ }
153
+
154
+ export function digestVolcengineFunctionRevocationStatusFloorStoreDescriptor(
155
+ value,
156
+ ) {
157
+ return digest(
158
+ VOLCENGINE_FUNCTION_REVOCATION_STATUS_FLOOR_STORE_SCHEMA,
159
+ normalizeDescriptor(value),
160
+ );
161
+ }
162
+
163
+ function normalizeSnapshot(value, descriptor) {
164
+ exactData(
165
+ value,
166
+ [
167
+ "schema",
168
+ "storeId",
169
+ "tenantId",
170
+ "handlerArtifactDigest",
171
+ "revocationAuthorityId",
172
+ "trustRootDigest",
173
+ "revision",
174
+ "snapshotDigest",
175
+ "issuedAt",
176
+ "nextUpdate",
177
+ ],
178
+ "Volcengine function revocation status snapshot",
179
+ );
180
+ const snapshot = Object.freeze({
181
+ schema: ownData(
182
+ value,
183
+ "schema",
184
+ "Volcengine function revocation status snapshot schema",
185
+ ),
186
+ storeId: ownData(
187
+ value,
188
+ "storeId",
189
+ "Volcengine function revocation status snapshot store",
190
+ ),
191
+ tenantId: ownData(
192
+ value,
193
+ "tenantId",
194
+ "Volcengine function revocation status snapshot tenant",
195
+ ),
196
+ handlerArtifactDigest: ownData(
197
+ value,
198
+ "handlerArtifactDigest",
199
+ "Volcengine function revocation status snapshot artifact digest",
200
+ ),
201
+ revocationAuthorityId: ownData(
202
+ value,
203
+ "revocationAuthorityId",
204
+ "Volcengine function revocation status snapshot authority",
205
+ ),
206
+ trustRootDigest: ownData(
207
+ value,
208
+ "trustRootDigest",
209
+ "Volcengine function revocation status snapshot trust root",
210
+ ),
211
+ revision: ownData(
212
+ value,
213
+ "revision",
214
+ "Volcengine function revocation status snapshot revision",
215
+ ),
216
+ snapshotDigest: ownData(
217
+ value,
218
+ "snapshotDigest",
219
+ "Volcengine function revocation status snapshot digest",
220
+ ),
221
+ issuedAt: ownData(
222
+ value,
223
+ "issuedAt",
224
+ "Volcengine function revocation status snapshot issue time",
225
+ ),
226
+ nextUpdate: ownData(
227
+ value,
228
+ "nextUpdate",
229
+ "Volcengine function revocation status snapshot next update",
230
+ ),
231
+ });
232
+ const issuedAtMs = Date.parse(snapshot.issuedAt);
233
+ const nextUpdateMs = Date.parse(snapshot.nextUpdate);
234
+ if (
235
+ snapshot.schema !== VOLCENGINE_FUNCTION_REVOCATION_STATUS_SNAPSHOT_SCHEMA ||
236
+ snapshot.storeId !== descriptor.storeId ||
237
+ snapshot.tenantId !== descriptor.tenantId ||
238
+ snapshot.handlerArtifactDigest !== descriptor.handlerArtifactDigest ||
239
+ snapshot.revocationAuthorityId !== descriptor.revocationAuthorityId ||
240
+ snapshot.trustRootDigest !== descriptor.trustRootDigest ||
241
+ !Number.isSafeInteger(snapshot.revision) ||
242
+ snapshot.revision < 1 ||
243
+ !DIGEST.test(snapshot.snapshotDigest) ||
244
+ !Number.isFinite(issuedAtMs) ||
245
+ new Date(issuedAtMs).toISOString() !== snapshot.issuedAt ||
246
+ !Number.isFinite(nextUpdateMs) ||
247
+ new Date(nextUpdateMs).toISOString() !== snapshot.nextUpdate ||
248
+ nextUpdateMs <= issuedAtMs
249
+ ) {
250
+ throw new TypeError(
251
+ "Volcengine function revocation status snapshot is invalid",
252
+ );
253
+ }
254
+ return snapshot;
255
+ }
256
+
257
+ function normalizeState(value, descriptorDigest) {
258
+ if (value === null) return null;
259
+ exactData(
260
+ value,
261
+ [
262
+ "schema",
263
+ "descriptorDigest",
264
+ "revision",
265
+ "snapshotDigest",
266
+ "issuedAt",
267
+ "nextUpdate",
268
+ "headDigest",
269
+ ],
270
+ "Volcengine function revocation status floor state",
271
+ );
272
+ const core = Object.freeze({
273
+ schema: ownData(
274
+ value,
275
+ "schema",
276
+ "Volcengine function revocation status floor state schema",
277
+ ),
278
+ descriptorDigest: ownData(
279
+ value,
280
+ "descriptorDigest",
281
+ "Volcengine function revocation status floor descriptor digest",
282
+ ),
283
+ revision: ownData(
284
+ value,
285
+ "revision",
286
+ "Volcengine function revocation status floor revision",
287
+ ),
288
+ snapshotDigest: ownData(
289
+ value,
290
+ "snapshotDigest",
291
+ "Volcengine function revocation status floor snapshot digest",
292
+ ),
293
+ issuedAt: ownData(
294
+ value,
295
+ "issuedAt",
296
+ "Volcengine function revocation status floor issue time",
297
+ ),
298
+ nextUpdate: ownData(
299
+ value,
300
+ "nextUpdate",
301
+ "Volcengine function revocation status floor next update",
302
+ ),
303
+ });
304
+ const headDigest = ownData(
305
+ value,
306
+ "headDigest",
307
+ "Volcengine function revocation status floor head digest",
308
+ );
309
+ const issuedAtMs = Date.parse(core.issuedAt);
310
+ const nextUpdateMs = Date.parse(core.nextUpdate);
311
+ if (
312
+ core.schema !== STATE_SCHEMA ||
313
+ core.descriptorDigest !== descriptorDigest ||
314
+ !Number.isSafeInteger(core.revision) ||
315
+ core.revision < 1 ||
316
+ !DIGEST.test(core.snapshotDigest) ||
317
+ !Number.isFinite(issuedAtMs) ||
318
+ new Date(issuedAtMs).toISOString() !== core.issuedAt ||
319
+ !Number.isFinite(nextUpdateMs) ||
320
+ new Date(nextUpdateMs).toISOString() !== core.nextUpdate ||
321
+ nextUpdateMs <= issuedAtMs ||
322
+ headDigest !== digest(STATE_SCHEMA, core)
323
+ ) {
324
+ throw new Error(
325
+ "Volcengine function revocation status floor state is invalid",
326
+ );
327
+ }
328
+ return Object.freeze({ ...core, headDigest });
329
+ }
330
+
331
+ function rollbackError(received, floor) {
332
+ const error = new Error(
333
+ `Volcengine function revocation signer status rollback rejected: received ${received}, floor ${floor}`,
334
+ );
335
+ error.code = "CC_VOLCENGINE_FUNCTION_REVOCATION_STATUS_ROLLBACK";
336
+ return error;
337
+ }
338
+
339
+ export function createVolcengineFunctionRevocationStatusFloorStore(options) {
340
+ exactData(
341
+ options,
342
+ ["descriptor", "directoryPath"],
343
+ "Volcengine function revocation status floor store",
344
+ );
345
+ const descriptor = normalizeDescriptor(
346
+ ownData(
347
+ options,
348
+ "descriptor",
349
+ "Volcengine function revocation status floor store descriptor",
350
+ ),
351
+ );
352
+ const directoryPath = normalizeDirectory(
353
+ ownData(
354
+ options,
355
+ "directoryPath",
356
+ "Volcengine function revocation status floor directory",
357
+ ),
358
+ );
359
+ if (
360
+ descriptor.stateRootDigest !==
361
+ digestVolcengineFunctionRevocationStatusFloorRoot(directoryPath)
362
+ ) {
363
+ throw new TypeError(
364
+ "Volcengine function revocation status floor state root does not match descriptor",
365
+ );
366
+ }
367
+ const descriptorDigest = digest(
368
+ VOLCENGINE_FUNCTION_REVOCATION_STATUS_FLOOR_STORE_SCHEMA,
369
+ descriptor,
370
+ );
371
+ const backend = createEvolutionLedgerFileManifestHeadBackend({
372
+ directoryPath,
373
+ });
374
+ const store = Object.freeze({});
375
+ stores.set(store, { backend, descriptor, descriptorDigest });
376
+ return store;
377
+ }
378
+
379
+ export function inspectVolcengineFunctionRevocationStatusFloorStore(value) {
380
+ const captured = stores.get(value);
381
+ if (!captured) {
382
+ throw new TypeError(
383
+ "A branded Volcengine function revocation status floor store is required",
384
+ );
385
+ }
386
+ return Object.freeze({
387
+ descriptor: captured.descriptor,
388
+ descriptorDigest: captured.descriptorDigest,
389
+ });
390
+ }
391
+
392
+ export function captureVolcengineFunctionRevocationStatusFloorStore(value) {
393
+ const captured = stores.get(value);
394
+ if (!captured) {
395
+ throw new TypeError(
396
+ "A branded Volcengine function revocation status floor store is required",
397
+ );
398
+ }
399
+ const read = () =>
400
+ normalizeState(captured.backend.load(), captured.descriptorDigest);
401
+ return Object.freeze({
402
+ descriptor: captured.descriptor,
403
+ descriptorDigest: captured.descriptorDigest,
404
+ readFloor: read,
405
+ acceptSnapshot(input) {
406
+ const snapshot = normalizeSnapshot(input, captured.descriptor);
407
+ for (let attempt = 0; attempt < 16; attempt += 1) {
408
+ const current = read();
409
+ if (current && snapshot.revision < current.revision) {
410
+ throw rollbackError(snapshot.revision, current.revision);
411
+ }
412
+ if (current && snapshot.revision === current.revision) {
413
+ if (snapshot.snapshotDigest !== current.snapshotDigest) {
414
+ throw new Error(
415
+ "Volcengine function revocation signer status conflicts at the current revision",
416
+ );
417
+ }
418
+ return Object.freeze({
419
+ schema: VOLCENGINE_FUNCTION_REVOCATION_STATUS_ACK_SCHEMA,
420
+ storeId: captured.descriptor.storeId,
421
+ revision: current.revision,
422
+ snapshotDigest: current.snapshotDigest,
423
+ headDigest: current.headDigest,
424
+ durable: true,
425
+ readbackVerified: true,
426
+ });
427
+ }
428
+ if (
429
+ current &&
430
+ Date.parse(snapshot.issuedAt) <= Date.parse(current.issuedAt)
431
+ ) {
432
+ throw new Error(
433
+ "Volcengine function revocation signer status issue time did not advance",
434
+ );
435
+ }
436
+ const core = Object.freeze({
437
+ schema: STATE_SCHEMA,
438
+ descriptorDigest: captured.descriptorDigest,
439
+ revision: snapshot.revision,
440
+ snapshotDigest: snapshot.snapshotDigest,
441
+ issuedAt: snapshot.issuedAt,
442
+ nextUpdate: snapshot.nextUpdate,
443
+ });
444
+ const next = Object.freeze({
445
+ ...core,
446
+ headDigest: digest(STATE_SCHEMA, core),
447
+ });
448
+ const result = captured.backend.compareAndSet({
449
+ expectedHeadDigest: current?.headDigest ?? null,
450
+ nextHead: next,
451
+ });
452
+ if (!result.committed) continue;
453
+ const confirmed = normalizeState(
454
+ result.head,
455
+ captured.descriptorDigest,
456
+ );
457
+ if (
458
+ confirmed.revision !== snapshot.revision ||
459
+ confirmed.snapshotDigest !== snapshot.snapshotDigest
460
+ ) {
461
+ throw new Error(
462
+ "Volcengine function revocation status floor durable readback differs",
463
+ );
464
+ }
465
+ return Object.freeze({
466
+ schema: VOLCENGINE_FUNCTION_REVOCATION_STATUS_ACK_SCHEMA,
467
+ storeId: captured.descriptor.storeId,
468
+ revision: confirmed.revision,
469
+ snapshotDigest: confirmed.snapshotDigest,
470
+ headDigest: confirmed.headDigest,
471
+ durable: true,
472
+ readbackVerified: true,
473
+ });
474
+ }
475
+ throw new Error(
476
+ "Volcengine function revocation status floor contention did not settle",
477
+ );
478
+ },
479
+ });
480
+ }
@@ -86,6 +86,7 @@ import {
86
86
  import { getPlanModeManager } from "../lib/plan-mode.js";
87
87
  import { CLISkillLoader } from "../lib/skill-loader.js";
88
88
  import { routeSkillDescriptors } from "../lib/skill-retrieval-router.js";
89
+ import { captureSkillDecisionRuntime } from "../lib/decision-layer/runtime.js";
89
90
  import { resolveSkillOutcomeAuthority } from "../lib/skill-outcome-authority.js";
90
91
  import {
91
92
  captureSkillVectorAuthority,
@@ -3629,6 +3630,7 @@ export async function executeTool(name, args, context = {}) {
3629
3630
  skillAllowlist: context.skillAllowlist ?? null,
3630
3631
  skillOutcomeIndex: context.skillOutcomeIndex,
3631
3632
  skillVectorAuthority: context.skillVectorAuthority,
3633
+ skillDecisionRuntime: context.skillDecisionRuntime,
3632
3634
  skillRuntimeAdmission: context.skillRuntimeAdmission,
3633
3635
  skillRuntimeAdmissionRequired: context.skillRuntimeAdmissionRequired,
3634
3636
  skillRetrievalRevocationReader: context.skillRetrievalRevocationReader,
@@ -5184,6 +5186,7 @@ async function executeToolInner(
5184
5186
  skillAllowlist = null,
5185
5187
  skillOutcomeIndex,
5186
5188
  skillVectorAuthority,
5189
+ skillDecisionRuntime,
5187
5190
  skillRuntimeAdmission,
5188
5191
  skillRuntimeAdmissionRequired = false,
5189
5192
  skillRetrievalRevocationReader,
@@ -8622,6 +8625,45 @@ async function executeToolInner(
8622
8625
  skills = routing.candidates
8623
8626
  .map(({ digest }) => byDigest.get(digest))
8624
8627
  .filter(Boolean);
8628
+ const decisionRuntime =
8629
+ skillDecisionRuntime == null
8630
+ ? null
8631
+ : captureSkillDecisionRuntime(skillDecisionRuntime);
8632
+ if (decisionRuntime !== null && routing.candidates.length > 0) {
8633
+ const decision = await decisionRuntime.suggest({
8634
+ query: args.query,
8635
+ candidates: routing.candidates.slice(0, 5).map((candidate) => {
8636
+ const descriptor = byDigest.get(candidate.digest);
8637
+ return {
8638
+ id: candidate.id,
8639
+ displayName: candidate.displayName,
8640
+ description: descriptor?.description || candidate.displayName,
8641
+ category: candidate.category,
8642
+ digest: candidate.digest,
8643
+ tags: Array.isArray(descriptor?.tags) ? descriptor.tags : [],
8644
+ };
8645
+ }),
8646
+ turnId: turnId || toolCallId || "list-skills",
8647
+ contextRevision: "skill-routing-v1",
8648
+ signal,
8649
+ });
8650
+ if (decision.visible) {
8651
+ routing = Object.freeze({
8652
+ ...routing,
8653
+ decisionSuggestion: Object.freeze({
8654
+ schema: decision.schema,
8655
+ decisionId: decision.decisionId,
8656
+ status: decision.status,
8657
+ reasonCode: decision.reasonCode,
8658
+ selectedDigest: decision.selectedDigest,
8659
+ selectedSkillId: decision.selectedSkillId,
8660
+ needsSkillProbability: decision.needsSkillProbability,
8661
+ choiceConfidence: decision.choiceConfidence,
8662
+ receiptRef: decision.receiptRef,
8663
+ }),
8664
+ });
8665
+ }
8666
+ }
8625
8667
  }
8626
8668
  skillLoader.recordDescriptorUse?.(skills, {
8627
8669
  sessionId,
@@ -8641,6 +8683,9 @@ async function executeToolInner(
8641
8683
  vectorAuthority:
8642
8684
  vector?.evidence ?? unavailableSkillVectorEvidence(),
8643
8685
  outcomeAuthority: outcomeAuthority.evidence,
8686
+ ...(routing.decisionSuggestion
8687
+ ? { decisionSuggestion: routing.decisionSuggestion }
8688
+ : {}),
8644
8689
  },
8645
8690
  }
8646
8691
  : {}),
@@ -14029,6 +14074,10 @@ export async function* agentLoop(messages, options) {
14029
14074
  : _defaultSkillLoader),
14030
14075
  skillOutcomeIndex: options.skillOutcomeIndex,
14031
14076
  skillVectorAuthority: options.skillVectorAuthority,
14077
+ skillDecisionRuntime:
14078
+ options.skillDecisionRuntime == null
14079
+ ? null
14080
+ : captureSkillDecisionRuntime(options.skillDecisionRuntime),
14032
14081
  skillRuntimeAdmission: options.skillRuntimeAdmission,
14033
14082
  skillRuntimeAdmissionRequired: options.skillRuntimeAdmissionRequired,
14034
14083
  skillRetrievalRevocationReader: options.skillRetrievalRevocationReader,
@@ -217,6 +217,9 @@ import {
217
217
  } from "../lib/runtime-usage-ledger.js";
218
218
  import { runMeteredDirectModelCall } from "../lib/direct-model-usage.js";
219
219
  import { resolveTeamMessageToolBundle } from "../lib/agent-team/team-message-tools.js";
220
+ import { normalizeDecisionMode } from "../lib/decision-layer/contracts.js";
221
+ import { createSkillDecisionRuntime } from "../lib/decision-layer/runtime.js";
222
+ import { createTypeSafeDecisionProvider } from "../lib/decision-layer/typesafe-provider.js";
220
223
 
221
224
  /**
222
225
  * Normalize a public --permission-mode spelling to the canonical internal mode.
@@ -248,6 +251,38 @@ export function validateHeadlessInvocationOptions(options = {}) {
248
251
  );
249
252
  }
250
253
  normalizePermissionMode(options.permissionMode);
254
+ resolveHeadlessSkillDecisionOptions(options);
255
+ }
256
+
257
+ /** Normalize the opt-in Jev Skill-routing experiment without acquiring egress. */
258
+ export function resolveHeadlessSkillDecisionOptions(options = {}) {
259
+ let mode;
260
+ try {
261
+ mode = normalizeDecisionMode(options.decisionMode || "off");
262
+ } catch {
263
+ throw new Error(
264
+ `Invalid --decision-mode "${options.decisionMode}". Expected one of: off, shadow, suggest`,
265
+ );
266
+ }
267
+ const timeoutMs =
268
+ options.decisionTimeoutMs === undefined
269
+ ? 800
270
+ : Number(options.decisionTimeoutMs);
271
+ if (
272
+ !Number.isSafeInteger(timeoutMs) ||
273
+ timeoutMs < 50 ||
274
+ timeoutMs > 30_000
275
+ ) {
276
+ throw new Error(
277
+ "Invalid --decision-timeout-ms. Expected an integer from 50 to 30000",
278
+ );
279
+ }
280
+ return Object.freeze({
281
+ mode,
282
+ model: options.decisionModel || "jev-latest",
283
+ baseUrl: options.decisionBaseUrl || "https://api.typesafe.ai",
284
+ timeoutMs,
285
+ });
251
286
  }
252
287
 
253
288
  /**
@@ -488,6 +523,7 @@ async function withHeadlessSessionHostLease(options, deps, task) {
488
523
  `Invalid --output-format "${outputFormat}". Expected one of: ${VALID_OUTPUT_FORMATS.join(", ")}`,
489
524
  );
490
525
  }
526
+ const skillDecision = resolveHeadlessSkillDecisionOptions(options);
491
527
  let resolution = null;
492
528
  let lease = null;
493
529
  let budgetRoot = null;
@@ -518,6 +554,21 @@ async function withHeadlessSessionHostLease(options, deps, task) {
518
554
  },
519
555
  `headless-${Date.now()}-${process.pid}`,
520
556
  );
557
+ if (skillDecision.mode !== "off" && !resolution.persist) {
558
+ throw new Error(
559
+ "--decision-mode shadow/suggest requires a durable session; use --session/--resume/--continue and do not use --ephemeral",
560
+ );
561
+ }
562
+ if (
563
+ skillDecision.mode !== "off" &&
564
+ !deps.decisionProvider &&
565
+ !options.decisionApiKey &&
566
+ !process.env.TYPESAFE_API_KEY
567
+ ) {
568
+ throw new Error(
569
+ "TYPESAFE_API_KEY is required when --decision-mode is shadow or suggest",
570
+ );
571
+ }
521
572
  const authoritySessionId =
522
573
  resolution.resumeId ||
523
574
  (resolution.persist ? resolution.sessionId : null);
@@ -2386,6 +2437,33 @@ async function runAgentHeadlessInWorkspace(
2386
2437
  }
2387
2438
  };
2388
2439
 
2440
+ const skillDecisionOptions = resolveHeadlessSkillDecisionOptions(options);
2441
+ let skillDecisionRuntime = null;
2442
+ if (skillDecisionOptions.mode !== "off") {
2443
+ const decisionProvider =
2444
+ deps.decisionProvider ||
2445
+ createTypeSafeDecisionProvider({
2446
+ apiKey: options.decisionApiKey || process.env.TYPESAFE_API_KEY,
2447
+ baseUrl: skillDecisionOptions.baseUrl,
2448
+ model: skillDecisionOptions.model,
2449
+ ...(deps.decisionFetch ? { fetchImpl: deps.decisionFetch } : {}),
2450
+ });
2451
+ const persistDecisionEvent = (type, data) =>
2452
+ persistRuntimeLedgerWrite(() => store.appendEvent(sessionId, type, data));
2453
+ skillDecisionRuntime = createSkillDecisionRuntime({
2454
+ mode: skillDecisionOptions.mode,
2455
+ tenantId:
2456
+ options.decisionTenantId || evolutionIngress?.tenantId || "cli-local",
2457
+ sessionId,
2458
+ provider: decisionProvider,
2459
+ persist: persistDecisionEvent,
2460
+ observe: (observation) =>
2461
+ persistDecisionEvent("skill_decision_observation", observation),
2462
+ sessionBudget: options.sessionBudget || null,
2463
+ timeoutMs: skillDecisionOptions.timeoutMs,
2464
+ });
2465
+ }
2466
+
2389
2467
  // Subagent internals may contain prompts and tool results. The public
2390
2468
  // stream exposes only stable lifecycle/progress metadata, and only with the
2391
2469
  // explicit --include-hook-events opt-in.
@@ -2513,6 +2591,7 @@ async function runAgentHeadlessInWorkspace(
2513
2591
  apiKey,
2514
2592
  cwd,
2515
2593
  skillLoader: _runtimeSkillLoader,
2594
+ ...(skillDecisionRuntime === null ? {} : { skillDecisionRuntime }),
2516
2595
  ...captureSkillRuntimeDependencies(options, evolutionIngress?.tenantId),
2517
2596
  ...(skillOutcomeIndex === null ? {} : { skillOutcomeIndex }),
2518
2597
  ...(skillVectorAuthority === null ? {} : { skillVectorAuthority }),
@@ -1 +0,0 @@
1
- import{I as v,P as u,J as S,U as s,R as a,S as y,K as x,Q as C,V as w,_ as B,b as n}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-C3XeNS82.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=n(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=n(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=n(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=n(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),m=n(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),f=String(e.getMonth()+1).padStart(2,"0"),g=String(e.getDate()).padStart(2,"0"),b=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${f}-${g} ${b}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:m,computed:n};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},T={class:"bubble"},q={class:"meta"},M={class:"actor"},R={class:"time"},V={class:"body"};function j(c,d,t,r,i,l){const o=v("a-tag");return u(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[s("div",T,[s("div",q,[s("span",M,a(r.actorLabel),1),s("span",R,a(r.formattedTime),1)]),s("div",V,a(r.messageText),1),t.event.source.adapter?(u(),y(o,{key:0,class:"src",color:r.adapterColor},{default:x(()=>[C(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const z=k(N,[["render",j],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-ejxnqz/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{z as default};