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.
- package/README.md +24 -5
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-CXkSNOGY.js → AIOps-BBxGVjAo.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-ysMR6gTs.js → ActionButton-SrT9X1LG.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-WGZ0sWuw.js → Analytics-D0MPWFct.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-Cs2iRlQG.js → AppLayout-DlmlYhUp.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-5IdfxWz0.js → Artifacts-BzLV8tLT.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-U9V434QX.js → Audit-BWfARNeo.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BvFwxPlC.js → BackgroundAgents-AT_lu-OI.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-C9yTr9hO.js → Backup-6pH5UJRI.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BdsSwUgE.js → BaseInput-CccGGr8I.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BB_2oBgH.js → Chat-B6aQ-lXU.js} +6 -6
- package/src/assets/web-panel/assets/ChatBubbleRenderer-cKmA5EAa.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-v6M5m7dK.js → Checkbox-Dc_dMjlV.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-CtouWSIz.js → Codegen-CHm0YK-0.js} +1 -1
- package/src/assets/web-panel/assets/{Col-CqQJ4ORW.js → Col-IaBwOtml.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BO__QCOy.js → Community-U5N0EakJ.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-D0Kq4xlH.js → Compact-D6bK2hw-.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-BSLKKBjA.js → Compliance-B0G1zA62.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-VsujXW5o.js → Cowork-BvJxGzAT.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-j8DbLGi5.js → Cron-N5JOZWe9.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DWpYH1yN.js → Crosschain-CgnzS-_7.js} +1 -1
- package/src/assets/web-panel/assets/{DID-mLaRxLQh.js → DID-BTMEilVf.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-Cff033Jr.js → Dashboard-Bc-1wTPH.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-B1Upt6fP.js → Dropdown-DfJLRkz2.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CPtb8joV.js → EmailListRenderer-DOkzpgap.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-CVh4Uv4g.js → EvolutionSettings-23ZdCcyg.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-CrD1PhbF.js → FamilyGuardDashboard-mBhA1oWh.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-ftxrvqW5.js → Federation-C9Kmj_hs.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-9O80slC1.js → FormItemContext-CeU7fnW_.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DaYvYIj9.js → GenericCardRenderer-s-QOculU.js} +1 -1
- package/src/assets/web-panel/assets/{Git-BKZh0YE5.js → Git-BbePEFdx.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-vWbN873j.js → Governance-PnVQJUn7.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BN6RR-l8.js → Inference-sCcd1Foj.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-x49x9m7Q.js → KnowledgeGraph-DdM6cJOh.js} +1 -1
- package/src/assets/web-panel/assets/Logs-Dznmdibo.js +2 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-nFgRqRUW.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-DpPu6XQp.js → Marketplace-DQ76qwhE.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BR0ksiax.js → McpTools-CZqTYtmV.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BXznJ5-C.js → Memory-CWtnaJCd.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BHSOpfv7.js → MobileBridge-C3Ngpr63.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DdWmgIup.js → MobileProjects-CpJPlABd.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-D9Rk_IGT.js → Mtc-CKL_fDu2.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit--i8q1lKc.js → MtcAudit-CIDSj87F.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BHnNG7R9.js → Multisig-BoLpIo5g.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Duo1ij2_.js → NLProgramming-CWJX8SH5.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-B44Le73p.js → Notes-CdGvaOEe.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-C3oy_7Gf.js → NotificationSettings-C067lOY0.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-Da_73SI5.js → OrderTableRenderer-Bkdj8JZF.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-ChsSwKxT.js → Organization-CwhP3jqH.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DR5G_cCn.js → Overflow-Ks7pF8mI.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-yfaobqow.js → P2P-BytzAo-_.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-f7PUa-As.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-DhinFvtE.js → Permissions-DYgQYc6c.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CfeNVic1.js → PersonalDataHub-xa4C85B5.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-CGKO26Nk.js → Pipeline-Ci4P4D_9.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CxxfYEJh.js → Privacy-Bc0i4kUv.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CZsaAab9.js → ProjectInit-BNQNNbq1.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BUm_6clQ.js → ProjectSettings-C9a52UVV.js} +2 -2
- package/src/assets/web-panel/assets/Projects-DoqbdOhN.js +1 -0
- package/src/assets/web-panel/assets/{Providers-D28VqPja.js → Providers-aqNSVXqu.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-Cj200vUb.js → QrScannerModal-BhiK-alo.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BGpnEiam.js → QuickAsk-DqiqZt1A.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Ix79Tpni.js → Recommend-c0WOkaCq.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BdGAFbIk.js → RemoteSession-Cf_4L-X3.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-B1Lis0Wk.js → Reputation-BVFrZQ_z.js} +1 -1
- package/src/assets/web-panel/assets/{Row-Ba_okwOW.js → Row-CZ1AwkDl.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DDbEuI-m.js → RssFeed--WyTTgfC.js} +3 -3
- package/src/assets/web-panel/assets/{Search-D89wAkMy.js → Search-BgxZ24St.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CJKCKAU-.js → Security-DVkmHsXI.js} +2 -2
- package/src/assets/web-panel/assets/{Services-mitEc1XV.js → Services-CTZQQWlI.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CnBjLDfX.js → Skeleton-DWwUMTlS.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DSzDYvH3.js → Skills-D6iyc72U.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CglJ_4p3.js → Sla-ChMCfgKV.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-CtwWxhK7.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-Cq7o6fmr.js → SyncSettings-DAbLxMOM.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-Dvm355ug.js +1 -0
- package/src/assets/web-panel/assets/{Templates-bY0wSbQM.js → Templates-Dig8IEP-.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BAyyl0qX.js → Tenant-DeR5U47w.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BGBhSpqc.js → Terminal-CHXg-gsD.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-BvW5lXYz.js → TimelineRenderer-Bi4GJgwI.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Ua_LIx8-.js → Tokens-D6ubE4ut.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BGwb2KL1.js → Trigger-CUQI4HlL.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CD2IEHvj.js → Trust-CgTAWXd7.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-D5LetK6P.js → UkeySign-R2bAawIX.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-oP7ehFgR.js → VideoEditing-46u-3sdP.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BBtu4-xa.js → Wallet-DdrACErK.js} +2 -2
- package/src/assets/web-panel/assets/{WebAuthn-iSPRU4Ht.js → WebAuthn-Cq266Ihg.js} +2 -2
- package/src/assets/web-panel/assets/{WorkflowEditor-DuEDhQmB.js → WorkflowEditor-DV0ES1wc.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DGDgqvvm.js → chat-D5xy9-vl.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DGQMWa1-.js → colors-BBs5Knx_.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-COVznBL4.js → compact-item-BuFzMOeP.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DIxVeHXI.js → createContext-D6gC8UX1.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-jGzCD1Og.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-DkxZO3E9.js → hasIn-kBeod51t.js} +1 -1
- package/src/assets/web-panel/assets/{index-DV0H83eS.js → index-43tYtngc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BAL2p7YC.js → index-8LcW9fNg.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgM-3a1w.js → index-AVkVBAgT.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQm7ntcn.js → index-B9sYKnfE.js} +1 -1
- package/src/assets/web-panel/assets/{index-BOTshZNx.js → index-BEipvyo3.js} +1 -1
- package/src/assets/web-panel/assets/{index-CV0KnNqR.js → index-BJtaYRSM.js} +1 -1
- package/src/assets/web-panel/assets/{index-b2_M6o20.js → index-BNgGahh_.js} +1 -1
- package/src/assets/web-panel/assets/{index-jo7DbU0w.js → index-BPfLeT9D.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpZxDiVK.js → index-BrmMhNQe.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBw2MLIe.js → index-C61TSHk7.js} +1 -1
- package/src/assets/web-panel/assets/{index-usmG13jq.js → index-C9RbA1u6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaWQSp5a.js → index-CDc8ZBhw.js} +1 -1
- package/src/assets/web-panel/assets/{index-b_0qTo8O.js → index-CSR6G5y_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ci34vbh0.js → index-Cc0nr-mJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-vXrktF3e.js → index-CdXTYNGI.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3bN6751.js → index-CoF4d2sR.js} +1 -1
- package/src/assets/web-panel/assets/{index-DU1ArKl5.js → index-Cy8WOPIM.js} +1 -1
- package/src/assets/web-panel/assets/{index-BY6MSbWT.js → index-D5w7mVUz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CcNGQWum.js → index-D8i4RtvF.js} +1 -1
- package/src/assets/web-panel/assets/{index-DDwPBGdA.js → index-D8vRjV35.js} +1 -1
- package/src/assets/web-panel/assets/{index-BY9Ossof.js → index-DLO3EJ28.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHH95jcm.js → index-DP74sxrD.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bv0_u0ze.js → index-DT8dVo6h.js} +1 -1
- package/src/assets/web-panel/assets/{index-CNRRrP3-.js → index-DVY9bZaC.js} +1 -1
- package/src/assets/web-panel/assets/index-DVuuRGW6.js +1 -0
- package/src/assets/web-panel/assets/{index-BAlrovUm.js → index-DWpwO1tg.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZcqTvPnt.js → index-Db_4IGgr.js} +1 -1
- package/src/assets/web-panel/assets/{index-dfYkGovV.js → index-DiEf8pdZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-C3XeNS82.js → index-DjJD0ItG.js} +3 -3
- package/src/assets/web-panel/assets/index-DjkHUbjO.js +1 -0
- package/src/assets/web-panel/assets/{index-BUqwlzc8.js → index-DkcAtMWM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyMHF2Bi.js → index-Dn4FQfDW.js} +1 -1
- package/src/assets/web-panel/assets/{index-2JZizEPc.js → index-DuFsuweQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmduvOYT.js → index-WMRvzqet.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cligb-Dl.js → index-Xmeq1989.js} +1 -1
- package/src/assets/web-panel/assets/{index-ECoDhyH3.js → index-ZMxLi0bZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CokrhbY2.js → index-_j1YrDlh.js} +1 -1
- package/src/assets/web-panel/assets/{index-ClQVcrFt.js → index-qXVSh34h.js} +1 -1
- package/src/assets/web-panel/assets/{index-0ToBFsvW.js → index-slOdrjUJ.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-CkSeiBwL.js → initDefaultProps-CdcTIUHj.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CSzhDP0s.js → motion-DMIDKmqt.js} +1 -1
- package/src/assets/web-panel/assets/{move-mgCt4iC6.js → move-DRq4Pk0-.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-BEZBLcKt.js → mtc-parser-SYFo5WKx.js} +1 -1
- package/src/assets/web-panel/assets/{omit-BsHctMEr.js → omit-B_X6VxfU.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-1BHamnGW.js → pickAttrs-DnuDKnw_.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow--Vb4Bd7l.js → placementArrow-DBFRmoTN.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DD33SqCm.js → responsiveObserve-BaUVjf33.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DfrLtxgK.js → slide-rLCDXDVC.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-D9Pe_gXW.js → statusUtils-CzNprwdC.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-0NY5iMun.js → styleChecker-DsaDdSa9.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DSsZstwg.js → useFlexGapSupport-BKHgNy2p.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BU8HyH59.js → useFs-C_OQYo_E.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-D_xttink.js → usePersonalDataHub-CiGRKQ5k.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-39VhX2lM.js → vnode-C9-ch6HP.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-D5KQ8Pks.js → zoom-HoUcoyA4.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agent.js +84 -0
- package/src/data/changelog.json +26 -0
- package/src/lib/decision-layer/benchmark.js +164 -0
- package/src/lib/decision-layer/contracts.js +377 -0
- package/src/lib/decision-layer/provider-authority.js +44 -0
- package/src/lib/decision-layer/runtime.js +238 -0
- package/src/lib/decision-layer/typesafe-provider.js +74 -0
- package/src/lib/evolution/evolution-deployment-loader.js +39 -0
- package/src/lib/evolution/skill-writer-inventory-manifest.js +0 -39
- package/src/lib/evolution/volcengine-function-execution-authority.js +2949 -0
- package/src/lib/evolution/volcengine-function-process-executor.js +615 -0
- package/src/lib/evolution/volcengine-function-replay-store.js +836 -0
- package/src/lib/evolution/volcengine-function-revocation-status-floor-store.js +480 -0
- package/src/runtime/agent-core.js +49 -0
- package/src/runtime/headless-runner.js +79 -0
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Bpf1hDUl.js +0 -1
- package/src/assets/web-panel/assets/Logs-Co2EPLsJ.js +0 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-D7wIB-c7.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-DgimH6Jp.js +0 -7
- package/src/assets/web-panel/assets/Projects-Capr8bVq.js +0 -1
- package/src/assets/web-panel/assets/SpeechSettings-BicWJS7f.js +0 -1
- package/src/assets/web-panel/assets/Tasks-DOxFOBpU.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CjR9h-Z_.js +0 -1
- package/src/assets/web-panel/assets/index-D_nxBMX5.js +0 -1
- 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};
|