chainlesschain 0.166.82 → 0.166.83
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/package.json +1 -1
- package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
- package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-DMzLSUWK.js → AIOps-D5a4i3N7.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CgnA23oA.js → ActionButton-DxsRk5n1.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CtXmm8Qe.js → Analytics-D-7EvH4S.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-C5RIh5jA.js → AppLayout-DDEWVr-d.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-DM525zx0.js → Artifacts-CAlJAjRB.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-ChBx6f2l.js → Audit-tuaWDOAM.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BBHDxCda.js → BackgroundAgents-CIwRFJ50.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-B-qzCAoM.js → Backup-CpBepJlH.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-C5yoIWAD.js → BaseInput-eKguCzQc.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-NmTrci9a.js → Chat-CFrUfXDV.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-pPuUDG2V.js → ChatBubbleRenderer-DaRtY87l.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-KdFSU3vd.js → Checkbox-o5FEn6a1.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-L__BOv_4.js → Codegen-Dih8HogC.js} +1 -1
- package/src/assets/web-panel/assets/{Col-Dfuw4IQV.js → Col-D5r-6WZe.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BRlEhSbx.js → Community-jeQ6bGey.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-D7dRkv8n.js → Compact-CEP7QsWp.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CdlFYNR3.js → Compliance-B8NydOHd.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-Ey7ksHq4.js → Cowork-Bmi1zuPy.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DBH__wGJ.js → Cron-BAL9bwSp.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D3nu9dw7.js → Crosschain-D8WUi2dS.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DS6vZBNv.js → DID-CQCkYcLY.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-DwFRk2T0.js → Dashboard-DogXg6kh.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D7b73q3I.js → Dropdown-BJBJyQJn.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-DPNaVH36.js → EmailListRenderer-CxPWquJx.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-BEsOtdpf.js → EvolutionSettings-BijH1x8G.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-ijSqsSsF.js → FamilyGuardDashboard-DStwf-00.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C0BOzPDh.js → Federation-LU9_sNxC.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DkF5NoAg.js → FormItemContext-DNfWhj7P.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DQsMcyJj.js → GenericCardRenderer-DWYsPjzk.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DQRt88PU.js → Git-CA0O9ulB.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DIjPmDN8.js → Governance-ECShL7BJ.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BWMFtT7i.js → Inference-9GA2542e.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-M7TfkUVl.js → KnowledgeGraph-nC5mTbEH.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-BZv9Z6BY.js → Logs-B7IqgnDy.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BqlqrJkY.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Crd9MYHg.js → Marketplace-CEr0suM8.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-C37yOQV0.js → McpTools-DhTPQKOE.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BBsijJCd.js → Memory-mHRZP1w4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CiXIQCju.js → MobileBridge-BNfX6Rdo.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C0KSvQm5.js → MobileProjects-8zG8f5li.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-C0XaQsOY.js → Mtc-CzkV3wsn.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-DPqggKhw.js → MtcAudit-DWYljJik.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Bie0ZVHe.js → Multisig-kHgtvZY_.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-BbuJlQ5b.js → NLProgramming-56uQiPiY.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-CgqrJV8w.js → Notes-DxGOZqRf.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-CusdZEQl.js → NotificationSettings-DabaCpmo.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-B7RrCvCQ.js → OrderTableRenderer-SzeQNlGT.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-BnFpz3bb.js → Organization-D9gnPpK2.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-C_4_HyyZ.js → Overflow-Cqp_bXm4.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D0KpHxeg.js → P2P-DTeK-r0G.js} +2 -2
- package/src/assets/web-panel/assets/PdhVaultBrowser-CsjG85GT.js +7 -0
- package/src/assets/web-panel/assets/{Permissions-D2LxL66N.js → Permissions-B4ofZq3j.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CvSNIxt0.js → PersonalDataHub-Cvas5cYd.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-rUl-SM7V.js → Pipeline-Er3wmAew.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-BD8cWSNd.js → Privacy-DMFYeZox.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-RM7J4X2F.js → ProjectInit-DaVaYPy0.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BIH38RsB.js → ProjectSettings-dPx5q2Ac.js} +2 -2
- package/src/assets/web-panel/assets/Projects-N0JNeCui.js +1 -0
- package/src/assets/web-panel/assets/{Providers-B9Kja2RK.js → Providers-BPQo_gQa.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-ByDKowTD.js → QrScannerModal-CD-sEsWh.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DqEN1QOE.js → QuickAsk-LOKRJiN_.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-CLrYwNiv.js → Recommend-BwPXqcWy.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DyDltVPC.js → RemoteSession-BjotndxF.js} +3 -3
- package/src/assets/web-panel/assets/{Reputation-BfP8rJ1-.js → Reputation-BlZ2gcbU.js} +1 -1
- package/src/assets/web-panel/assets/{Row-BpnP6r1H.js → Row-D399HM-d.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CBNI1lCN.js → RssFeed-C7H-ibnY.js} +2 -2
- package/src/assets/web-panel/assets/{Search-CLjrM-xj.js → Search-CNHCVmM1.js} +1 -1
- package/src/assets/web-panel/assets/{Security-dRXtg-Mq.js → Security-C70eDGYY.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DAHCtOHL.js → Services-6xfq9G-H.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-D11Jgtur.js → Skeleton-BbY2zeZV.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-DchvTO4k.js → Skills-DYtyZ7_6.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-BFOc2SbL.js → Sla-CkWcl5OH.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Dud1xDd2.js → SpeechSettings-CiknYk2P.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CILfsA2S.js → SyncSettings-D-8JVip4.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-C6Qrah_5.js → Tasks-B2KnR9XC.js} +1 -1
- package/src/assets/web-panel/assets/{Templates--puiHyCR.js → Templates-CipXkOE-.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-cz5vITz_.js → Tenant-DbwgIMmx.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-YRs75Gz8.js → Terminal-OtCriHEE.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C5myb_QZ.js → TimelineRenderer-B9LU5qrl.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Bk60iMIj.js → Tokens-B4iFVxvH.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-BAb-Fd4z.js → Trigger-BegM2v8q.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BlqwmpEB.js → Trust-COkqnnFj.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-C6jvuF-7.js → UkeySign-BzqKPChj.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-7zbsdQUj.js → VideoEditing-D-F2XL3C.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BAouk_kp.js → Wallet-22PzRY9T.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-BQapv504.js → WebAuthn-eSMq_qtz.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-ChUXM-Qx.js → WorkflowEditor-BvdAakpq.js} +1 -1
- package/src/assets/web-panel/assets/{chat-7B6U8zgJ.js → chat-C6jhpF7E.js} +1 -1
- package/src/assets/web-panel/assets/{colors-C8UqaLpe.js → colors-BbbW2Pfv.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-x47giTCj.js → compact-item-CVFeLTqt.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-D6ZwjgaZ.js → createContext-DS0m7NZc.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-D50gzPS9.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Cv3d9-Bu.js → hasIn-DVouP0t6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVBG0Jqz.js → index--AdzSlH7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXIUyx4U.js → index-54aHB4FL.js} +1 -1
- package/src/assets/web-panel/assets/{index-WhoNHp50.js → index-8QbwhE3i.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dv5E07PZ.js → index-B5JRIZXi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTBkdyLk.js → index-B8a_c_qZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtBUgc0G.js → index-BE_u-rXr.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMPk5D1m.js → index-BOOsA080.js} +1 -1
- package/src/assets/web-panel/assets/{index-jgN2e0Oy.js → index-BXw6ivB8.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUtcWTSe.js → index-BaUah6TO.js} +1 -1
- package/src/assets/web-panel/assets/{index-DD-V-N_m.js → index-Be12HoCS.js} +3 -3
- package/src/assets/web-panel/assets/{index-CaPZ_8kP.js → index-BhvnNFfd.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1ElqYDD.js → index-BrIv7C9a.js} +1 -1
- package/src/assets/web-panel/assets/{index-CrGQsbpb.js → index-BvCgzl0X.js} +1 -1
- package/src/assets/web-panel/assets/{index-D4ZHX6wo.js → index-Bw-ZGQCH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CXG6yiAf.js → index-BwZnPiFd.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ce666S9v.js → index-BwozzG6k.js} +1 -1
- package/src/assets/web-panel/assets/{index-BTisPSqa.js → index-ByLsH9CL.js} +1 -1
- package/src/assets/web-panel/assets/{index-dbM4QvQZ.js → index-BzL3LWFX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CUUgXcPh.js → index-C4xmLgLa.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dc0hePXV.js → index-C6q2MkIG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiVEatgH.js → index-C74emdKD.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGxo1YH0.js → index-CIg4nqyp.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cc2bhSuI.js → index-CIk7mg6G.js} +1 -1
- package/src/assets/web-panel/assets/{index-BM-NYjej.js → index-CPS8E-J6.js} +1 -1
- package/src/assets/web-panel/assets/index-CgensV-n.js +1 -0
- package/src/assets/web-panel/assets/{index-D9lFBkS4.js → index-CkdYB0_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQ0-ny-o.js → index-CpTbnbUI.js} +1 -1
- package/src/assets/web-panel/assets/index-Ctkf06Z_.js +1 -0
- package/src/assets/web-panel/assets/{index-Cc6jr0Yb.js → index-CwYFDMn_.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLHnYXVa.js → index-DGYX17YW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DvoMGeL9.js → index-DR6TDz5H.js} +1 -1
- package/src/assets/web-panel/assets/{index-EDWA9JL1.js → index-DUBkae39.js} +1 -1
- package/src/assets/web-panel/assets/{index-yYdCdtY1.js → index-DotRL126.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cbf4RqOd.js → index-DpReoAGb.js} +1 -1
- package/src/assets/web-panel/assets/{index-N9hNOl1i.js → index-Ds4wbrgk.js} +1 -1
- package/src/assets/web-panel/assets/{index-IVelXaiQ.js → index-DuVjTDcW.js} +1 -1
- package/src/assets/web-panel/assets/{index-BUzw-kDo.js → index-JeJqXbUU.js} +1 -1
- package/src/assets/web-panel/assets/{index-nogjrcQE.js → index-SdFkCtiC.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7Dorc7r.js → index-eaXEQFuP.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DkKS5xtR.js → initDefaultProps-CB5cUnQ5.js} +1 -1
- package/src/assets/web-panel/assets/{motion-CU-zBUIg.js → motion-bn_fWhQV.js} +1 -1
- package/src/assets/web-panel/assets/{move-zBE0VEd4.js → move-DY4-Odtu.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B9WyO1je.js → mtc-parser-B5l5mjoh.js} +1 -1
- package/src/assets/web-panel/assets/{omit-6sCoBNTL.js → omit-rJ-Ci8CW.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DDRv_sFc.js → pickAttrs-BMwGJd6C.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-Cy_CBDw5.js → placementArrow-CaiQyGXG.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-CIczLq9K.js → responsiveObserve-DQTO5wDH.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DFfZCvnG.js → slide-Dg6ZDtbz.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-DW-0HUl-.js → statusUtils-bvjrktKc.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-BPYaBorP.js → styleChecker-C1geIU_x.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-DYPoOaZc.js → useFlexGapSupport-BzU3RJRi.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-ODUEWR17.js → useFs-B7l6OwLe.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-CstUt15X.js → usePersonalDataHub-BYF1L_8x.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-D2GW8xCL.js → vnode-6c2GVkT-.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-Bz6GoDwq.js → zoom-BYAY6QeD.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +21 -10
- package/src/data/changelog.json +26 -0
- package/src/gateways/ws/session-protocol.js +19 -5
- package/src/gateways/ws/ws-agent-handler.js +6 -0
- package/src/gateways/ws/ws-session-gateway.js +133 -21
- package/src/lib/agent-execution-policy.js +177 -0
- package/src/lib/authority-launch-environment.js +99 -0
- package/src/lib/claude-project-auto-memory.js +7 -30
- package/src/lib/evolution/volcengine-function-replay-store.js +38 -28
- package/src/lib/host-tool-policy-authority.js +151 -0
- package/src/lib/permission-authority.js +67 -5
- package/src/lib/plugin-runtime/settings.js +9 -1
- package/src/lib/sandbox-egress-authority-monitor.js +3 -2
- package/src/lib/session-manager.js +20 -5
- package/src/lib/settings-loader.cjs +175 -19
- package/src/lib/settings-source-observation.cjs +270 -0
- package/src/lib/sub-agent-context.js +36 -18
- package/src/lib/unattended-action-policy.js +456 -38
- package/src/repl/agent-repl.js +43 -15
- package/src/repl/repl-tool-executor.js +39 -0
- package/src/runtime/agent-core.js +272 -5
- package/src/runtime/agent-runtime.js +15 -3
- package/src/runtime/headless-runner.js +13 -4
- package/src/runtime/headless-stream.js +9 -0
- package/src/runtime/policies/agent-policy.js +5 -4
- package/src/assets/web-panel/assets/MarkdownRenderer-D5NZGdg3.js +0 -1
- package/src/assets/web-panel/assets/PdhVaultBrowser-Cfd_C9nc.js +0 -7
- package/src/assets/web-panel/assets/Projects-CTgx3Fxc.js +0 -1
- package/src/assets/web-panel/assets/devWarning-BFfV5AtN.js +0 -1
- package/src/assets/web-panel/assets/index-DUz_bv5i.js +0 -1
- package/src/assets/web-panel/assets/index-rQ59l7GO.js +0 -1
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Read-only settings observations for a future persistent authority protocol.
|
|
5
|
+
* Only Node builtins: CJS readers must not materialize a require(ESM) bridge.
|
|
6
|
+
*
|
|
7
|
+
* These checks detect ordinary replacement and in-place edits. Path-based Node
|
|
8
|
+
* APIs do not prevent an adversarial parent swap-and-restore between checks.
|
|
9
|
+
* No observation is a generation, registration, or permission grant.
|
|
10
|
+
*/
|
|
11
|
+
const fsDefault = require("node:fs");
|
|
12
|
+
const path = require("node:path");
|
|
13
|
+
const { createHash } = require("node:crypto");
|
|
14
|
+
const { TextDecoder } = require("node:util");
|
|
15
|
+
|
|
16
|
+
const MAX_SETTINGS_SOURCE_BYTES = 1024 * 1024;
|
|
17
|
+
const MAX_SETTINGS_SOURCES = 64;
|
|
18
|
+
const FILE_FIELDS = [
|
|
19
|
+
"dev",
|
|
20
|
+
"ino",
|
|
21
|
+
"mode",
|
|
22
|
+
"nlink",
|
|
23
|
+
"size",
|
|
24
|
+
"mtimeNs",
|
|
25
|
+
"ctimeNs",
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
function failure(code, cause = null) {
|
|
29
|
+
const error = new Error(
|
|
30
|
+
"Settings source observation is unavailable",
|
|
31
|
+
cause ? { cause } : undefined,
|
|
32
|
+
);
|
|
33
|
+
error.name = "SettingsSourceObservationError";
|
|
34
|
+
error.code = code;
|
|
35
|
+
return error;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function sameFields(left, right, fields) {
|
|
39
|
+
return fields.every(
|
|
40
|
+
(field) =>
|
|
41
|
+
left[field] !== undefined &&
|
|
42
|
+
right[field] !== undefined &&
|
|
43
|
+
left[field] === right[field],
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function pathIdentity(value) {
|
|
48
|
+
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function lstatOrMissing(fs, file) {
|
|
52
|
+
try {
|
|
53
|
+
return fs.lstatSync(file, { bigint: true });
|
|
54
|
+
} catch (cause) {
|
|
55
|
+
if (cause?.code === "ENOENT") return null;
|
|
56
|
+
if (cause?.code === "ENOTDIR")
|
|
57
|
+
throw failure("CC_SETTINGS_SOURCE_UNSAFE", cause);
|
|
58
|
+
throw cause;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function assertRegularFile(stat) {
|
|
63
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.nlink !== 1n) {
|
|
64
|
+
throw failure("CC_SETTINGS_SOURCE_UNSAFE");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function freezeJson(value) {
|
|
69
|
+
const pending = [value];
|
|
70
|
+
while (pending.length) {
|
|
71
|
+
const current = pending.pop();
|
|
72
|
+
if (!current || typeof current !== "object") continue;
|
|
73
|
+
for (const child of Object.values(current)) pending.push(child);
|
|
74
|
+
Object.freeze(current);
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function inspect(file, fs, maxBytes) {
|
|
80
|
+
const logicalPath = path.resolve(file);
|
|
81
|
+
const entry = lstatOrMissing(fs, logicalPath);
|
|
82
|
+
if (entry) assertRegularFile(entry);
|
|
83
|
+
|
|
84
|
+
// Preserve absent candidates too, including a missing .claude directory.
|
|
85
|
+
let logicalParent = path.dirname(logicalPath);
|
|
86
|
+
const remaining = [path.basename(logicalPath)];
|
|
87
|
+
while (!lstatOrMissing(fs, logicalParent)) {
|
|
88
|
+
const next = path.dirname(logicalParent);
|
|
89
|
+
if (next === logicalParent) throw failure("CC_SETTINGS_SOURCE_UNAVAILABLE");
|
|
90
|
+
remaining.unshift(path.basename(logicalParent));
|
|
91
|
+
logicalParent = next;
|
|
92
|
+
}
|
|
93
|
+
const canonicalParent = fs.realpathSync(logicalParent);
|
|
94
|
+
const physicalPath = path.join(canonicalParent, ...remaining);
|
|
95
|
+
const flags =
|
|
96
|
+
(fs.constants?.O_RDONLY ?? fsDefault.constants.O_RDONLY) |
|
|
97
|
+
(fs.constants?.O_NOFOLLOW ?? fsDefault.constants.O_NOFOLLOW ?? 0) |
|
|
98
|
+
(fs.constants?.O_NONBLOCK ?? fsDefault.constants.O_NONBLOCK ?? 0);
|
|
99
|
+
const descriptors = [];
|
|
100
|
+
function open(filePath) {
|
|
101
|
+
const fd = fs.openSync(filePath, flags);
|
|
102
|
+
descriptors.push(fd);
|
|
103
|
+
return fd;
|
|
104
|
+
}
|
|
105
|
+
function verifyParent(original) {
|
|
106
|
+
if (
|
|
107
|
+
pathIdentity(fs.realpathSync(logicalParent)) !==
|
|
108
|
+
pathIdentity(canonicalParent)
|
|
109
|
+
) {
|
|
110
|
+
throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
111
|
+
}
|
|
112
|
+
const current = fs.fstatSync(open(canonicalParent), { bigint: true });
|
|
113
|
+
if (
|
|
114
|
+
!current.isDirectory() ||
|
|
115
|
+
!sameFields(original, current, ["dev", "ino", "mode"])
|
|
116
|
+
) {
|
|
117
|
+
throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function readOpenedSource() {
|
|
122
|
+
// Comparing opened handles avoids Node 22.12 Windows path-stat's projected
|
|
123
|
+
// zero device; both identities come from the same API and real volume.
|
|
124
|
+
const parent = fs.fstatSync(open(canonicalParent), { bigint: true });
|
|
125
|
+
if (!parent.isDirectory()) throw failure("CC_SETTINGS_SOURCE_UNSAFE");
|
|
126
|
+
const common = {
|
|
127
|
+
logicalPath,
|
|
128
|
+
physicalPath,
|
|
129
|
+
nearestExistingParent: canonicalParent,
|
|
130
|
+
remainingPath: path.join(...remaining),
|
|
131
|
+
parentIdentity: Object.freeze({
|
|
132
|
+
dev: String(parent.dev),
|
|
133
|
+
ino: String(parent.ino),
|
|
134
|
+
}),
|
|
135
|
+
};
|
|
136
|
+
if (!entry) {
|
|
137
|
+
if (lstatOrMissing(fs, logicalPath))
|
|
138
|
+
throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
139
|
+
verifyParent(parent);
|
|
140
|
+
if (lstatOrMissing(fs, path.join(logicalParent, remaining[0])))
|
|
141
|
+
throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
142
|
+
if (lstatOrMissing(fs, physicalPath))
|
|
143
|
+
throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
144
|
+
return Object.freeze({
|
|
145
|
+
...common,
|
|
146
|
+
exists: false,
|
|
147
|
+
byteLength: 0,
|
|
148
|
+
digest: null,
|
|
149
|
+
settings: null,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const fd = open(physicalPath);
|
|
154
|
+
const before = fs.fstatSync(fd, { bigint: true });
|
|
155
|
+
assertRegularFile(before);
|
|
156
|
+
if (before.size > BigInt(maxBytes))
|
|
157
|
+
throw failure("CC_SETTINGS_SOURCE_TOO_LARGE");
|
|
158
|
+
const buffer = Buffer.alloc(maxBytes + 1);
|
|
159
|
+
let length = 0;
|
|
160
|
+
for (;;) {
|
|
161
|
+
const count = fs.readSync(
|
|
162
|
+
fd,
|
|
163
|
+
buffer,
|
|
164
|
+
length,
|
|
165
|
+
buffer.length - length,
|
|
166
|
+
length,
|
|
167
|
+
);
|
|
168
|
+
if (!count) break;
|
|
169
|
+
length += count;
|
|
170
|
+
if (length > maxBytes) throw failure("CC_SETTINGS_SOURCE_TOO_LARGE");
|
|
171
|
+
}
|
|
172
|
+
const after = fs.fstatSync(fd, { bigint: true });
|
|
173
|
+
if (
|
|
174
|
+
!sameFields(before, after, FILE_FIELDS) ||
|
|
175
|
+
BigInt(length) !== after.size
|
|
176
|
+
) {
|
|
177
|
+
throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
178
|
+
}
|
|
179
|
+
const finalEntry = lstatOrMissing(fs, logicalPath);
|
|
180
|
+
if (!finalEntry) throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
181
|
+
assertRegularFile(finalEntry);
|
|
182
|
+
const reopened = fs.fstatSync(open(physicalPath), { bigint: true });
|
|
183
|
+
if (!sameFields(before, reopened, FILE_FIELDS))
|
|
184
|
+
throw failure("CC_SETTINGS_SOURCE_CHANGED");
|
|
185
|
+
verifyParent(parent);
|
|
186
|
+
const bytes = buffer.subarray(0, length);
|
|
187
|
+
let settings;
|
|
188
|
+
try {
|
|
189
|
+
const text = new TextDecoder("utf-8", {
|
|
190
|
+
fatal: true,
|
|
191
|
+
ignoreBOM: true,
|
|
192
|
+
}).decode(bytes);
|
|
193
|
+
settings = JSON.parse(text);
|
|
194
|
+
if (!settings || typeof settings !== "object" || Array.isArray(settings))
|
|
195
|
+
throw new TypeError("Settings must be an object");
|
|
196
|
+
} catch (cause) {
|
|
197
|
+
throw failure("CC_SETTINGS_SOURCE_INVALID", cause);
|
|
198
|
+
}
|
|
199
|
+
return Object.freeze({
|
|
200
|
+
...common,
|
|
201
|
+
exists: true,
|
|
202
|
+
byteLength: length,
|
|
203
|
+
digest: createHash("sha256").update(bytes).digest("hex"),
|
|
204
|
+
settings: freezeJson(settings),
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
let result;
|
|
208
|
+
let bodyError = null;
|
|
209
|
+
let bodyThrew = false;
|
|
210
|
+
let closeError = null;
|
|
211
|
+
try {
|
|
212
|
+
result = readOpenedSource();
|
|
213
|
+
} catch (cause) {
|
|
214
|
+
bodyThrew = true;
|
|
215
|
+
bodyError = cause;
|
|
216
|
+
} finally {
|
|
217
|
+
for (const fd of descriptors.reverse()) {
|
|
218
|
+
try {
|
|
219
|
+
fs.closeSync(fd);
|
|
220
|
+
} catch (cause) {
|
|
221
|
+
closeError ??= cause;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if (bodyThrew) throw bodyError;
|
|
226
|
+
if (closeError) throw closeError;
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function observeSettingsSource(
|
|
231
|
+
file,
|
|
232
|
+
{ fs = fsDefault, maxBytes = MAX_SETTINGS_SOURCE_BYTES } = {},
|
|
233
|
+
) {
|
|
234
|
+
if (typeof file !== "string" || !file || file.includes("\0"))
|
|
235
|
+
throw new TypeError("A settings source path is required");
|
|
236
|
+
if (
|
|
237
|
+
!Number.isSafeInteger(maxBytes) ||
|
|
238
|
+
maxBytes < 1 ||
|
|
239
|
+
maxBytes > MAX_SETTINGS_SOURCE_BYTES
|
|
240
|
+
)
|
|
241
|
+
throw new TypeError("Settings source byte limit is invalid");
|
|
242
|
+
try {
|
|
243
|
+
return inspect(file, fs, maxBytes);
|
|
244
|
+
} catch (cause) {
|
|
245
|
+
if (cause?.name === "SettingsSourceObservationError") throw cause;
|
|
246
|
+
throw failure("CC_SETTINGS_SOURCE_UNAVAILABLE", cause);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
function observeSettingsSources(files, options = {}) {
|
|
251
|
+
if (!Array.isArray(files) || files.length > MAX_SETTINGS_SOURCES)
|
|
252
|
+
throw new TypeError("Settings source list must be bounded");
|
|
253
|
+
// Resolve every input before the first filesystem operation; later chdir
|
|
254
|
+
// cannot change where a remaining relative candidate is inspected.
|
|
255
|
+
const resolved = files.map((file) => {
|
|
256
|
+
if (typeof file !== "string" || !file || file.includes("\0"))
|
|
257
|
+
throw new TypeError("A settings source path is required");
|
|
258
|
+
return path.resolve(file);
|
|
259
|
+
});
|
|
260
|
+
return Object.freeze(
|
|
261
|
+
resolved.map((file) => observeSettingsSource(file, options)),
|
|
262
|
+
);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
module.exports = {
|
|
266
|
+
MAX_SETTINGS_SOURCE_BYTES,
|
|
267
|
+
MAX_SETTINGS_SOURCES,
|
|
268
|
+
observeSettingsSource,
|
|
269
|
+
observeSettingsSources,
|
|
270
|
+
};
|
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import crypto from "crypto";
|
|
12
|
+
import {
|
|
13
|
+
captureAgentExecutionPolicy,
|
|
14
|
+
resolveAgentToolSelection,
|
|
15
|
+
} from "./agent-execution-policy.js";
|
|
12
16
|
import { CLIContextEngineering } from "./cli-context-engineering.js";
|
|
13
17
|
import {
|
|
14
18
|
agentLoop,
|
|
@@ -206,7 +210,12 @@ export class SubAgentContext {
|
|
|
206
210
|
this.taskProgressTracker = options.taskProgressTracker || null;
|
|
207
211
|
this.tokenBudget = options.tokenBudget || null;
|
|
208
212
|
this.inheritedContext = options.inheritedContext || null;
|
|
209
|
-
|
|
213
|
+
const executionPolicy = captureAgentExecutionPolicy(options);
|
|
214
|
+
const toolSelection = resolveAgentToolSelection(executionPolicy);
|
|
215
|
+
Object.defineProperty(this, "allowedTools", {
|
|
216
|
+
value: toolSelection.enabledToolNames, // null = all; [] = none
|
|
217
|
+
enumerable: true,
|
|
218
|
+
});
|
|
210
219
|
this.depth = options.depth || 1; // nesting level (parent main loop = 0)
|
|
211
220
|
// Shared run-wide TOTAL-sub-agent counter (one object across the whole tree)
|
|
212
221
|
// so this sub-agent's own spawns draw from the same breadth pool.
|
|
@@ -218,7 +227,10 @@ export class SubAgentContext {
|
|
|
218
227
|
// Optional session-level Extension Tier admission policy. Keep it as an
|
|
219
228
|
// explicit inherited capability so child loops cannot silently bypass the
|
|
220
229
|
// parent's admission decision.
|
|
221
|
-
this
|
|
230
|
+
Object.defineProperty(this, "toolAdmission", {
|
|
231
|
+
value: executionPolicy.toolAdmission,
|
|
232
|
+
enumerable: true,
|
|
233
|
+
});
|
|
222
234
|
// Skill capability INTERSECT: null = unrestricted; a list (possibly empty)
|
|
223
235
|
// restricts run_skill/list_skills in this context's loop to those skills.
|
|
224
236
|
this.skillAllowlist =
|
|
@@ -374,14 +386,11 @@ export class SubAgentContext {
|
|
|
374
386
|
permissionRules: options.permissionRules || null,
|
|
375
387
|
permissionRulesProvider: options.permissionRulesProvider || null,
|
|
376
388
|
hostManagedToolPolicy: options.hostManagedToolPolicy || null,
|
|
389
|
+
hostManagedToolPolicyAuthority:
|
|
390
|
+
options.hostManagedToolPolicyAuthority || null,
|
|
377
391
|
planManager: options.planManager || null,
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
? Object.freeze([...options.additionalDirectories])
|
|
381
|
-
: null,
|
|
382
|
-
shellPolicyOverrides: options.shellPolicyOverrides || null,
|
|
383
|
-
classifyAllShell: options.classifyAllShell === true,
|
|
384
|
-
unattendedActionPolicy: options.unattendedActionPolicy || null,
|
|
392
|
+
...executionPolicy,
|
|
393
|
+
disabledTools: toolSelection.disabledTools,
|
|
385
394
|
});
|
|
386
395
|
|
|
387
396
|
// Build isolated system prompt
|
|
@@ -409,6 +418,8 @@ export class SubAgentContext {
|
|
|
409
418
|
* @returns {Promise<{ summary: string, artifacts: Array, tokenCount: number, toolsUsed: string[], iterationCount: number }>}
|
|
410
419
|
*/
|
|
411
420
|
async run(userPrompt, loopOptions = {}) {
|
|
421
|
+
const executionPolicy = captureAgentExecutionPolicy(loopOptions);
|
|
422
|
+
loopOptions = { ...loopOptions, ...executionPolicy };
|
|
412
423
|
if (this.status !== "active") {
|
|
413
424
|
throw new Error(
|
|
414
425
|
`SubAgentContext ${this.id} is not active (status: ${this.status})`,
|
|
@@ -663,10 +674,14 @@ export class SubAgentContext {
|
|
|
663
674
|
// Re-apply tighten-only capability fields after loopOptions. In particular,
|
|
664
675
|
// [] must survive as deny-all and cannot be replaced by a worktree/direct
|
|
665
676
|
// runner override.
|
|
666
|
-
|
|
667
|
-
|
|
677
|
+
const selectionPolicy = captureAgentExecutionPolicy(options);
|
|
678
|
+
const toolSelection = resolveAgentToolSelection(
|
|
679
|
+
selectionPolicy,
|
|
680
|
+
this.allowedTools,
|
|
681
|
+
);
|
|
682
|
+
options.enabledToolNames = toolSelection.enabledToolNames;
|
|
683
|
+
if (Array.isArray(toolSelection.enabledToolNames))
|
|
668
684
|
options.exactToolNames = true;
|
|
669
|
-
}
|
|
670
685
|
options.subAgentContract = this.subAgentContract;
|
|
671
686
|
options.sessionBudget = this.sessionBudget;
|
|
672
687
|
options.hostResourceBudget = this.hostResourceBudget;
|
|
@@ -697,14 +712,17 @@ export class SubAgentContext {
|
|
|
697
712
|
if (authority.hostManagedToolPolicy) {
|
|
698
713
|
options.hostManagedToolPolicy = authority.hostManagedToolPolicy;
|
|
699
714
|
}
|
|
715
|
+
if (authority.hostManagedToolPolicyAuthority) {
|
|
716
|
+
options.hostManagedToolPolicyAuthority =
|
|
717
|
+
authority.hostManagedToolPolicyAuthority;
|
|
718
|
+
}
|
|
700
719
|
if (authority.planManager) options.planManager = authority.planManager;
|
|
701
720
|
if (authority.sandbox) options.sandbox = authority.sandbox;
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
}
|
|
721
|
+
options.additionalDirectories = authority.additionalDirectories || [];
|
|
722
|
+
options.shellPolicyOverrides = authority.shellPolicyOverrides;
|
|
723
|
+
options.disabledTools = Object.freeze([
|
|
724
|
+
...new Set([...authority.disabledTools, ...toolSelection.disabledTools]),
|
|
725
|
+
]);
|
|
708
726
|
if (authority.classifyAllShell) options.classifyAllShell = true;
|
|
709
727
|
if (authority.unattendedActionPolicy) {
|
|
710
728
|
options.unattendedActionPolicy = authority.unattendedActionPolicy;
|