chainlesschain 0.162.174 → 0.162.175
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/web-panel/assets/{AIOps-Dcl-X1Hw.js → AIOps-DherW0Rh.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-ClMh9HzT.js → ActionButton-CDGfqt2Y.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DPj0rSQ5.js → Analytics-BYhkzdgD.js} +3 -3
- package/src/assets/web-panel/assets/AppLayout-cEKk1cpb.js +9 -0
- package/src/assets/web-panel/assets/{Artifacts-L8781rE8.js → Artifacts-_aXR3WWc.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CffB6WIP.js → Audit-CYAf-gY7.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-BkLhayyY.js → BackgroundAgents-D4Q20phR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-BQnwFI78.js → Backup-Cq0Tyk58.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-xuUGHQch.js → BaseInput-CPj_CdAv.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-feQXwWrg.js → Chat-BQ-Qq0es.js} +5 -5
- package/src/assets/web-panel/assets/ChatBubbleRenderer-Ci97vNTs.js +1 -0
- package/src/assets/web-panel/assets/{Checkbox-DVaIiUGW.js → Checkbox-rke6l3yg.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-D2kEnzeU.js → Codegen-DiacrIPq.js} +1 -1
- package/src/assets/web-panel/assets/{Col-azDoyusS.js → Col-Cx3BY-Up.js} +1 -1
- package/src/assets/web-panel/assets/{Community-OZdnPWM5.js → Community-DfmWiQy8.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-VDMvBN-C.js → Compact-DdQnpxy5.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-CPJ_zgQ1.js → Compliance-lzliOH_r.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-iRBwcsOA.js → Cowork-CYx4Un5k.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DrxrspUz.js → Cron-BGDcPFlo.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-D-rkAZXF.js → Crosschain-0_X5g2ri.js} +1 -1
- package/src/assets/web-panel/assets/{DID-5Pp1Xnmr.js → DID-C0PEf3Eu.js} +2 -2
- package/src/assets/web-panel/assets/Dashboard-DULQjQ58.js +3 -0
- package/src/assets/web-panel/assets/{Dropdown-BWj_E0Ie.js → Dropdown-DGRHRbW6.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BT-wgSEh.js → EmailListRenderer-ChX8XPwB.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-1PzH23pa.js → FamilyGuardDashboard-Dyq6IBNu.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BxMIXGC6.js → Federation-DH1NfAL2.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CyJobBln.js → FormItemContext-BN1I_uNi.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-YkjFuQTN.js → GenericCardRenderer-Dq_2UYpe.js} +1 -1
- package/src/assets/web-panel/assets/{Git-C2a98Wp_.js → Git-BAy1yvI2.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-DKL3Fl84.js → Governance-Db6Q2iSy.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BJ2cQC_3.js → Inference-0ub6yHcr.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DBAsOngt.js → KnowledgeGraph-DtLetM36.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-COt8g9LO.js → Logs-Bcoy7CUd.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-3Lfht1Fd.js → MarkdownRenderer-BfEMFAXf.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-C9Zk9Pb2.js → Marketplace-tt2rzwRR.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-DDWDFWPO.js → McpTools-BhOgX-MU.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-BRmVye_o.js → Memory-BJUxeWBL.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CppBbWpD.js → MobileBridge-BwUY2G9w.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-C4GKn1dH.js → MobileProjects-BLRfHhqi.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CcWpeGa6.js → Mtc-B2WMboOm.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-BcllEq0K.js → MtcAudit-8pNEXO63.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-BFD1CarL.js → Multisig-C1wm5a_1.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-QNXXYvjz.js → NLProgramming-C1QpKF7g.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-07YwgQVy.js → Notes-CiQUcxFu.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-bOccEInE.js → NotificationSettings-BblDPJ_x.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DlRi29WL.js → OrderTableRenderer-DRjYcPtb.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-CBaezzEr.js → Organization-Dp3VKB0X.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-Bl5NohFO.js → Overflow-Czx161m9.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CLMal9Aw.js → P2P-ClFi6wOs.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CGO0NITk.js → PdhVaultBrowser-CRweW0lz.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CPSw48E2.js → Permissions-BzcRoqTn.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-CDM5n134.js → PersonalDataHub-ChGTpNMd.js} +2 -2
- package/src/assets/web-panel/assets/{Pipeline-BdsqG7WV.js → Pipeline-BMOOpKWA.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-B6L4E-M7.js → Privacy-D0AZHObH.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DXPyZKRs.js → ProjectInit-yYFlZ6Ja.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-BrCC3xYT.js → ProjectSettings-DJNVuMQs.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BYmuHC2q.js → Projects-Br0rBWH1.js} +1 -1
- package/src/assets/web-panel/assets/Providers-zZRhNtSu.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-DkukgCrR.js → QrScannerModal-81NZOitV.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-D-htOrV8.js → QuickAsk-Dic2lCbJ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Bm7SIfzu.js → Recommend-Dh9iwViE.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-C9rP-iMc.js → RemoteSession-Bq9VYEFy.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-kGlUgbsl.js → Reputation-CxFZ-NbJ.js} +1 -1
- package/src/assets/web-panel/assets/{Row-PBupbbUA.js → Row-BVSLcaX2.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-njlwKUGK.js → RssFeed-BbC-5DOH.js} +3 -3
- package/src/assets/web-panel/assets/{Search-DLdEmgBw.js → Search-BfjZ1GCr.js} +1 -1
- package/src/assets/web-panel/assets/{Security-SXGPSHdu.js → Security-CVjhOV5r.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CuFGnNsb.js → Services-D45u-Aqe.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-CtUC0mDa.js → Skeleton-WkGoK4he.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-P1qgOVFn.js → Skills-D_jvQZcj.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CsppE8YV.js → Sla-Bf4QTF3E.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-Cq1oG56m.js → SpeechSettings-DVpZdbMN.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-DdKW6V-C.js → SyncSettings-DEEojoMS.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-BCc9san5.js → Tasks-DFwxpLIk.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CcHC1dMA.js → Templates-Bzl-9wY5.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CA4PqU22.js → Tenant-0khxUOB8.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Fj7ea0In.js → Terminal-DWGYhAYU.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-DHWTSvOy.js → TimelineRenderer-B0Y4LONc.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Ddz-P_yh.js → Tokens-DEE07SFh.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-ePmrmLZ1.js → Trigger-BM7xvA5z.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DmuK1CCE.js → Trust-Dv3ijvvZ.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-CqqBuRrT.js → UkeySign-B1-enmMt.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-BGlR3uWM.js → VideoEditing-DYiIPByd.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-Ba_Qx6Ga.js → Wallet-D-y374BQ.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-29neXKt2.js → WebAuthn-HBDjcUhi.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-lD0lR0UQ.js → WorkflowEditor-sKn4qTID.js} +1 -1
- package/src/assets/web-panel/assets/{chat-B3stH01u.js → chat-TVYhaBXj.js} +1 -1
- package/src/assets/web-panel/assets/{colors-Czly56MN.js → colors-DMADxY9v.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-C0TkbkAJ.js → compact-item-OftcHpO_.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BJmpSlf1.js → createContext-DW1zVUSN.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-CLOk6rdE.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-D1q-zw7u.js → hasIn-CaUathNp.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7sFKQ53.js → index--5UvwqH_.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dpz_7sf-.js → index-77kgkUgY.js} +1 -1
- package/src/assets/web-panel/assets/{index-DlvsSuBC.js → index-8YelceUU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpMIdPJ0.js → index-B-19mFhn.js} +1 -1
- package/src/assets/web-panel/assets/{index-BEt2-3x5.js → index-B52Ztt8Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQftlZn-.js → index-BBNg08cD.js} +3 -3
- package/src/assets/web-panel/assets/{index-upY9rkGZ.js → index-BEzLLVYd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BDHXx65P.js → index-BFVbDpqg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DmUta2lw.js → index-BJ1PjRY3.js} +1 -1
- package/src/assets/web-panel/assets/{index-z8ATo2aQ.js → index-BSp1Ofvx.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO8xOwxi.js → index-Bg-7FpaL.js} +1 -1
- package/src/assets/web-panel/assets/{index-DpGs96FC.js → index-BupSWDcl.js} +1 -1
- package/src/assets/web-panel/assets/{index-K4YaPDOn.js → index-BvRw4Fna.js} +1 -1
- package/src/assets/web-panel/assets/{index-B8KqsomG.js → index-C9JoaYSs.js} +1 -1
- package/src/assets/web-panel/assets/{index-8GKykbS4.js → index-CK-p7Hji.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dw3L_smW.js → index-CKNdnJRo.js} +1 -1
- package/src/assets/web-panel/assets/{index-DAhrn9EJ.js → index-CM8W07sc.js} +1 -1
- package/src/assets/web-panel/assets/index-CSgUfMTM.js +1 -0
- package/src/assets/web-panel/assets/{index-C1pOqU7D.js → index-CZXYI5LU.js} +1 -1
- package/src/assets/web-panel/assets/{index-DV-twjNO.js → index-CeCIYYG7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIF6XHIi.js → index-Cmdv6Dev.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cu_4HaUS.js → index-CpDtN0dl.js} +1 -1
- package/src/assets/web-panel/assets/{index-DRcQsPez.js → index-D63QVAiJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-B-kTvMq7.js → index-DAfT3EMd.js} +1 -1
- package/src/assets/web-panel/assets/{index-CHvPlzWJ.js → index-DHi634g9.js} +1 -1
- package/src/assets/web-panel/assets/{index-CgS8XUBU.js → index-DKjqFpYa.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZDUhX41Z.js → index-DWVZ3T0t.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVwJ3jht.js → index-DXcqvWBp.js} +1 -1
- package/src/assets/web-panel/assets/{index-CbvNJUwu.js → index-DYwwUKDg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DaqEHaCg.js → index-DZdT8nio.js} +1 -1
- package/src/assets/web-panel/assets/index-DliSZvAP.js +1 -0
- package/src/assets/web-panel/assets/{index-DBqAm8es.js → index-GUKz4Pv9.js} +1 -1
- package/src/assets/web-panel/assets/{index-ChESIe5r.js → index-Lr0MO-GU.js} +1 -1
- package/src/assets/web-panel/assets/{index-C27TnOoT.js → index-hXq7QRA_.js} +1 -1
- package/src/assets/web-panel/assets/{index-cPjWjvmW.js → index-iDmgT2Dg.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cf7Gr3NG.js → index-kdMl_0zL.js} +1 -1
- package/src/assets/web-panel/assets/{index-XWV8JWMc.js → index-pSVCBsG4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZeoKL6t.js → index-s-EnkUCn.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bm_-RKal.js → index-sm1sGIxW.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-QWEXi6-t.js → initDefaultProps-DdcKTlQR.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BfrQwvV1.js → motion-CL-hTBQj.js} +1 -1
- package/src/assets/web-panel/assets/{move-Dn7x0H9t.js → move-qYSAkxNG.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-F61D_TgE.js → mtc-parser-ZwRSZtRP.js} +1 -1
- package/src/assets/web-panel/assets/{omit-4SQZ39PF.js → omit-Bld-8ftI.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-C7DTe126.js → pickAttrs-DGHs-a9Z.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-40NeyzDK.js → placementArrow-DRQPMyI5.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-BiUJ6qWs.js → responsiveObserve-C5MJG_Yo.js} +1 -1
- package/src/assets/web-panel/assets/{slide-CacJTM3f.js → slide-VZ-fpZCD.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-K812HB-k.js → statusUtils-9ocfCyHk.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CKeHA2eM.js → styleChecker-B6QAwAN5.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-CKl4FqXF.js → useFlexGapSupport-Bq1twor3.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DPoiJjSZ.js → useFs-DKZq96tz.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-aHwBspmt.js → usePersonalDataHub-D0RmRVXf.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-DrA-GuCT.js → vnode-D6kEj_tt.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-G3LMswgy.js → zoom-2yfasoQf.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/agent.js +6 -2
- package/src/commands/background-session.js +103 -0
- package/src/esm-bridge.js +3 -0
- package/src/gateways/ws/ws-server.js +18 -2
- package/src/index.js +123 -55
- package/src/lazy-dispatch.js +86 -85
- package/src/lib/async-hook-supervisor.cjs +14 -2
- package/src/lib/background-interaction-resolver.js +71 -0
- package/src/lib/background-session-transport.js +59 -1
- package/src/lib/crash-reporter.js +6 -0
- package/src/lib/hook-manager.js +32 -4
- package/src/lib/ipc-attach-protocol.js +98 -0
- package/src/lib/process-execution-broker/credential-agent.js +275 -0
- package/src/lib/process-execution-broker/index.js +155 -6
- package/src/lib/process-execution-broker/platform-sandbox.js +351 -0
- package/src/lib/provenance-api.js +6 -0
- package/src/lib/proxy-bootstrap.js +19 -0
- package/src/lib/repl-rewind.js +9 -4
- package/src/lib/session-hooks.js +328 -473
- package/src/lib/session-telemetry-middleware.js +6 -0
- package/src/lib/trace-api.js +6 -0
- package/src/lib/update-notice.js +3 -43
- package/src/repl/agent-repl.js +39 -13
- package/src/workers/background-agent-worker.js +80 -1
- package/src/assets/web-panel/assets/AppLayout-7iSKDmlI.js +0 -9
- package/src/assets/web-panel/assets/ChatBubbleRenderer-DcbUHeGW.js +0 -1
- package/src/assets/web-panel/assets/Dashboard-BAKYNavw.js +0 -3
- package/src/assets/web-panel/assets/Providers-CbCe2eUl.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CDI8Sbaj.js +0 -1
- package/src/assets/web-panel/assets/index-96LBR96V.js +0 -1
- package/src/assets/web-panel/assets/index-DyQkiW24.js +0 -1
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Credential Agent — P0-1 requirement
|
|
3
|
+
*
|
|
4
|
+
* Secrets are never passed raw to child processes. Instead:
|
|
5
|
+
* - Environment variables are filtered (API keys, tokens stripped)
|
|
6
|
+
* - Credentials are injected via a proxy/agent at runtime
|
|
7
|
+
* - Audit log records credential usage without revealing values
|
|
8
|
+
* - Child processes request credentials through IPC channel
|
|
9
|
+
*
|
|
10
|
+
* References: Claude Code CredentialAgent pattern
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import os from "node:os";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
import fs from "node:fs";
|
|
16
|
+
import crypto from "node:crypto";
|
|
17
|
+
|
|
18
|
+
// Patterns for environment variables that contain secrets
|
|
19
|
+
const SENSITIVE_ENV_PATTERNS = [
|
|
20
|
+
/API[_-]?KEY/i,
|
|
21
|
+
/SECRET/i,
|
|
22
|
+
/TOKEN/i,
|
|
23
|
+
/PASSWORD/i,
|
|
24
|
+
/PASSWD/i,
|
|
25
|
+
/CREDENTIAL/i,
|
|
26
|
+
/PRIVATE[_-]?KEY/i,
|
|
27
|
+
/ACCESS[_-]?KEY/i,
|
|
28
|
+
/AUTH/i,
|
|
29
|
+
/COOKIE/i,
|
|
30
|
+
/SESSION/i,
|
|
31
|
+
/BEARER/i,
|
|
32
|
+
/WEBHOOK.*URL/i,
|
|
33
|
+
/DATABASE.*URL/i,
|
|
34
|
+
/DATABASE.*PASSWORD/i,
|
|
35
|
+
/REDIS.*PASSWORD/i,
|
|
36
|
+
/OPENAI/i,
|
|
37
|
+
/ANTHROPIC/i,
|
|
38
|
+
/VOLC/i,
|
|
39
|
+
/ZHIPU/i,
|
|
40
|
+
/GOOGLE.*API/i,
|
|
41
|
+
/AZURE.*KEY/i,
|
|
42
|
+
/AWS.*SECRET/i,
|
|
43
|
+
/GIT.*TOKEN/i,
|
|
44
|
+
/NPM.*TOKEN/i,
|
|
45
|
+
/GH_TOKEN/i,
|
|
46
|
+
/GITHUB_TOKEN/i,
|
|
47
|
+
/GITLAB_TOKEN/i,
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
// Keys that are always safe to pass through (non-sensitive)
|
|
51
|
+
const ENV_ALLOWLIST = new Set([
|
|
52
|
+
"PATH",
|
|
53
|
+
"HOME",
|
|
54
|
+
"USER",
|
|
55
|
+
"USERNAME",
|
|
56
|
+
"SHELL",
|
|
57
|
+
"LANG",
|
|
58
|
+
"LC_ALL",
|
|
59
|
+
"TERM",
|
|
60
|
+
"TMPDIR",
|
|
61
|
+
"TMP",
|
|
62
|
+
"TEMP",
|
|
63
|
+
"PWD",
|
|
64
|
+
"EDITOR",
|
|
65
|
+
"VISUAL",
|
|
66
|
+
"NODE_ENV",
|
|
67
|
+
"NODE_OPTIONS",
|
|
68
|
+
"npm_config_registry",
|
|
69
|
+
"npm_config_cache",
|
|
70
|
+
"NPM_CONFIG_REGISTRY",
|
|
71
|
+
"NPM_CONFIG_CACHE",
|
|
72
|
+
"DISPLAY",
|
|
73
|
+
"XDG_CONFIG_HOME",
|
|
74
|
+
"XDG_CACHE_HOME",
|
|
75
|
+
"XDG_DATA_HOME",
|
|
76
|
+
"APPDATA",
|
|
77
|
+
"LOCALAPPDATA",
|
|
78
|
+
"PROGRAMDATA",
|
|
79
|
+
"PROGRAMFILES",
|
|
80
|
+
"PROGRAMFILES(X86)",
|
|
81
|
+
"WINDIR",
|
|
82
|
+
"SYSTEMROOT",
|
|
83
|
+
"SYSTEMDRIVE",
|
|
84
|
+
"PROCESSOR_ARCHITECTURE",
|
|
85
|
+
"NUMBER_OF_PROCESSORS",
|
|
86
|
+
"COMPUTERNAME",
|
|
87
|
+
"LOGONSERVER",
|
|
88
|
+
"USERDOMAIN",
|
|
89
|
+
"USERPROFILE",
|
|
90
|
+
"HOMEDRIVE",
|
|
91
|
+
"HOMEPATH",
|
|
92
|
+
"PUBLIC",
|
|
93
|
+
"COMMONPROGRAMFILES",
|
|
94
|
+
"COMMONPROGRAMFILES(X86)",
|
|
95
|
+
"COMSPEC",
|
|
96
|
+
"PATHEXT",
|
|
97
|
+
"PSMODULEPATH",
|
|
98
|
+
"CHAINLESSCHAIN_HOME",
|
|
99
|
+
"CHAINLESSCHAIN_CONFIG_DIR",
|
|
100
|
+
]);
|
|
101
|
+
|
|
102
|
+
class CredentialAgent {
|
|
103
|
+
constructor() {
|
|
104
|
+
this._credentialStore = new Map();
|
|
105
|
+
this._accessLog = [];
|
|
106
|
+
this._agentId = crypto.randomUUID();
|
|
107
|
+
this._credentialProxyPath = null;
|
|
108
|
+
this._setupProxy();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
_setupProxy() {
|
|
112
|
+
// In a full implementation, we'd set up an IPC/UDS proxy
|
|
113
|
+
// For now, we track and filter
|
|
114
|
+
this._proxyReady = true;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Check if an env var key looks sensitive
|
|
119
|
+
*/
|
|
120
|
+
isSensitiveKey(key) {
|
|
121
|
+
if (ENV_ALLOWLIST.has(key)) return false;
|
|
122
|
+
return SENSITIVE_ENV_PATTERNS.some((pattern) => pattern.test(key));
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Strip sensitive environment variables from spawn options
|
|
127
|
+
* Returns filtered env and a list of redacted keys
|
|
128
|
+
*/
|
|
129
|
+
filterEnvironment(env = process.env) {
|
|
130
|
+
const safe = {};
|
|
131
|
+
const redacted = [];
|
|
132
|
+
|
|
133
|
+
for (const [key, value] of Object.entries(env)) {
|
|
134
|
+
if (this.isSensitiveKey(key)) {
|
|
135
|
+
// Store a masked reference instead of passing through
|
|
136
|
+
const refId = `cc-cred-${crypto.randomBytes(8).toString("hex")}`;
|
|
137
|
+
this._credentialStore.set(refId, { key, value, createdAt: Date.now() });
|
|
138
|
+
redacted.push({ key, refId });
|
|
139
|
+
// Pass the reference ID, child can request via proxy
|
|
140
|
+
safe[`CC_CRED_REF_${key}`] = refId;
|
|
141
|
+
} else {
|
|
142
|
+
safe[key] = value;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Set credential proxy endpoint for the child process
|
|
147
|
+
safe.CC_CREDENTIAL_AGENT_ID = this._agentId;
|
|
148
|
+
safe.CC_CREDENTIAL_PROXY = "builtin";
|
|
149
|
+
|
|
150
|
+
return { safeEnv: safe, redacted };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Sanitize command line arguments that might contain secrets
|
|
155
|
+
* (e.g., curl -H "Authorization: Bearer sk-xxx")
|
|
156
|
+
*/
|
|
157
|
+
sanitizeArgs(args = []) {
|
|
158
|
+
const sanitized = [];
|
|
159
|
+
const redacted = [];
|
|
160
|
+
|
|
161
|
+
for (let i = 0; i < args.length; i++) {
|
|
162
|
+
const arg = String(args[i]);
|
|
163
|
+
|
|
164
|
+
// Check for --token=xxx or --api-key xxx patterns
|
|
165
|
+
if (/^--[a-z-]*([Tt]oken|[Kk]ey|[Ss]ecret|[Pp]assword)=/i.test(arg)) {
|
|
166
|
+
sanitized.push(arg.replace(/=.*/, "=***REDACTED***"));
|
|
167
|
+
redacted.push({ index: i, pattern: "arg-with-secret" });
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Check for -H "Authorization: Bearer xxx"
|
|
172
|
+
if (arg === "-H" || /^--header$/i.test(arg)) {
|
|
173
|
+
sanitized.push(arg);
|
|
174
|
+
if (i + 1 < args.length) {
|
|
175
|
+
const nextArg = String(args[i + 1]);
|
|
176
|
+
if (/^(Authorization|X-API-Key|Cookie|Set-Cookie):/i.test(nextArg)) {
|
|
177
|
+
sanitized.push(`${nextArg.split(":")[0]}: ***REDACTED***`);
|
|
178
|
+
redacted.push({ index: i + 1, pattern: "header-with-secret" });
|
|
179
|
+
i++; // skip next
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
// Check for inline Bearer tokens
|
|
187
|
+
if (/Bearer\s+[A-Za-z0-9._-]{20,}/.test(arg)) {
|
|
188
|
+
sanitized.push(
|
|
189
|
+
arg.replace(/Bearer\s+[A-Za-z0-9._-]+/g, "Bearer ***REDACTED***"),
|
|
190
|
+
);
|
|
191
|
+
redacted.push({ index: i, pattern: "bearer-token-inline" });
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Check for sk- prefixed keys (OpenAI style)
|
|
196
|
+
if (/\bsk-[A-Za-z0-9]{20,}\b/.test(arg)) {
|
|
197
|
+
sanitized.push(
|
|
198
|
+
arg.replace(/\bsk-[A-Za-z0-9]{20,}\b/g, "sk-***REDACTED***"),
|
|
199
|
+
);
|
|
200
|
+
redacted.push({ index: i, pattern: "sk-key-inline" });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
sanitized.push(arg);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return { sanitizedArgs: sanitized, redacted };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Apply credential filtering to spawn options
|
|
212
|
+
*/
|
|
213
|
+
apply(spawnOptions) {
|
|
214
|
+
const env = spawnOptions.env || process.env;
|
|
215
|
+
const { safeEnv, redacted: envRedacted } = this.filterEnvironment(env);
|
|
216
|
+
spawnOptions.env = safeEnv;
|
|
217
|
+
|
|
218
|
+
const args = spawnOptions.args || [];
|
|
219
|
+
const { sanitizedArgs, redacted: argRedacted } = this.sanitizeArgs(args);
|
|
220
|
+
spawnOptions.args = sanitizedArgs;
|
|
221
|
+
|
|
222
|
+
// Record credential access audit
|
|
223
|
+
if (envRedacted.length > 0 || argRedacted.length > 0) {
|
|
224
|
+
this._accessLog.push({
|
|
225
|
+
timestamp: Date.now(),
|
|
226
|
+
origin: spawnOptions.origin || "unknown",
|
|
227
|
+
envRedacted: envRedacted.map((r) => r.key),
|
|
228
|
+
argRedacted: argRedacted.length,
|
|
229
|
+
command: spawnOptions.file || spawnOptions.command,
|
|
230
|
+
});
|
|
231
|
+
if (this._accessLog.length > 10000) this._accessLog.shift();
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
return spawnOptions;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Resolve a credential reference (called via IPC from child processes)
|
|
239
|
+
*/
|
|
240
|
+
resolveCredential(refId) {
|
|
241
|
+
const cred = this._credentialStore.get(refId);
|
|
242
|
+
if (!cred) return null;
|
|
243
|
+
// Log access
|
|
244
|
+
this._accessLog.push({
|
|
245
|
+
timestamp: Date.now(),
|
|
246
|
+
type: "resolve",
|
|
247
|
+
refId,
|
|
248
|
+
key: cred.key,
|
|
249
|
+
});
|
|
250
|
+
return cred.value;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Get credential agent info for status reporting
|
|
255
|
+
*/
|
|
256
|
+
getInfo() {
|
|
257
|
+
return {
|
|
258
|
+
agentId: this._agentId,
|
|
259
|
+
credentialsTracked: this._credentialStore.size,
|
|
260
|
+
accessCount: this._accessLog.length,
|
|
261
|
+
sensitivePatterns: SENSITIVE_ENV_PATTERNS.length,
|
|
262
|
+
allowlistSize: ENV_ALLOWLIST.size,
|
|
263
|
+
defaultOn: true,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const credentialAgent = new CredentialAgent();
|
|
269
|
+
export {
|
|
270
|
+
credentialAgent,
|
|
271
|
+
CredentialAgent,
|
|
272
|
+
SENSITIVE_ENV_PATTERNS,
|
|
273
|
+
ENV_ALLOWLIST,
|
|
274
|
+
};
|
|
275
|
+
export default credentialAgent;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Process Execution Broker —
|
|
2
|
+
* Process Execution Broker — P0-1 生产化
|
|
3
3
|
* 对应文档 §2.1 四层架构 Layer 1
|
|
4
4
|
*
|
|
5
5
|
* 统一拦截所有子进程执行:
|
|
6
6
|
* - M1: 所有子进程唯一入口,权限检查
|
|
7
|
-
* -
|
|
7
|
+
* - **P0-1**: 三平台原生沙箱 (macOS Seatbelt / Windows Job Object / Linux seccomp)
|
|
8
|
+
* - **P0-1**: 凭据代理 default-on(secrets 永远不裸传给子进程)
|
|
8
9
|
* - M3: 集成W3C trace context自动传播
|
|
9
10
|
* - M4: 自动写入Runtime Provenance Ledger (RPL)
|
|
10
11
|
* - M5: Hooks v2事件发射
|
|
@@ -25,12 +26,23 @@ import crypto from "node:crypto";
|
|
|
25
26
|
import os from "node:os";
|
|
26
27
|
import path from "node:path";
|
|
27
28
|
import fs from "node:fs";
|
|
29
|
+
import { createRequire } from "node:module";
|
|
30
|
+
|
|
31
|
+
const require = createRequire(import.meta.url);
|
|
32
|
+
|
|
33
|
+
// P0-1: 平台沙箱 + 凭据代理
|
|
34
|
+
// platform-sandbox.js exports: applySandbox, postSpawnSandbox
|
|
35
|
+
import {
|
|
36
|
+
applySandbox as _applySandbox,
|
|
37
|
+
postSpawnSandbox as _postSpawnSandbox,
|
|
38
|
+
} from "./platform-sandbox.js";
|
|
39
|
+
import { credentialAgent } from "./credential-agent.js";
|
|
28
40
|
|
|
29
41
|
// 延迟导入避免循环依赖
|
|
30
42
|
let _traceCtx = null;
|
|
31
43
|
let _rpl = null;
|
|
32
44
|
let _hooksV2 = null;
|
|
33
|
-
|
|
45
|
+
const _ipcBus = null;
|
|
34
46
|
|
|
35
47
|
function getTraceCtx() {
|
|
36
48
|
if (!_traceCtx) {
|
|
@@ -72,13 +84,29 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
72
84
|
this._permissionState = new Map();
|
|
73
85
|
this._defaultTimeout = 300000;
|
|
74
86
|
this._blocked = new Set(["rm -rf /", "format c:", "del /f /s /q *"]);
|
|
75
|
-
this._stats = {
|
|
87
|
+
this._stats = {
|
|
88
|
+
totalSpawned: 0,
|
|
89
|
+
allowed: 0,
|
|
90
|
+
denied: 0,
|
|
91
|
+
byOrigin: {},
|
|
92
|
+
sandboxed: 0,
|
|
93
|
+
credFiltered: 0,
|
|
94
|
+
};
|
|
76
95
|
this._logPath = path.join(
|
|
77
96
|
os.homedir(),
|
|
78
97
|
".chainlesschain",
|
|
79
98
|
"logs",
|
|
80
99
|
"process-audit.log",
|
|
81
100
|
);
|
|
101
|
+
|
|
102
|
+
// P0-1: Platform sandbox functions (applySandbox/postSpawnSandbox imported above)
|
|
103
|
+
// No instance needed — stateless functional API per platform
|
|
104
|
+
|
|
105
|
+
// P0-1: Credential filtering is default-on
|
|
106
|
+
this._credentialAgent = credentialAgent;
|
|
107
|
+
this._credentialFilteringEnabled = true;
|
|
108
|
+
this._sandboxEnabled = true;
|
|
109
|
+
|
|
82
110
|
this._ensureLogDir();
|
|
83
111
|
this._loadPermissions();
|
|
84
112
|
}
|
|
@@ -269,9 +297,77 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
269
297
|
spawnOpts.env.TRACEPARENT = traceCtx.traceparent;
|
|
270
298
|
}
|
|
271
299
|
|
|
300
|
+
// P0-1: Credential filtering (default-on) — strip secrets from env/args
|
|
301
|
+
const credInfo = { redacted: 0 };
|
|
302
|
+
if (this._credentialFilteringEnabled) {
|
|
303
|
+
const before = JSON.stringify(spawnOpts.env || {}).length;
|
|
304
|
+
const filtered = this._credentialAgent.apply({
|
|
305
|
+
...spawnOpts,
|
|
306
|
+
file: command,
|
|
307
|
+
args: args || [],
|
|
308
|
+
origin,
|
|
309
|
+
});
|
|
310
|
+
spawnOpts.env = filtered.env;
|
|
311
|
+
spawnOpts.args = filtered.args;
|
|
312
|
+
const after = JSON.stringify(spawnOpts.env).length;
|
|
313
|
+
credInfo.redacted = before > after ? 1 : 0;
|
|
314
|
+
if (credInfo.redacted) this._stats.credFiltered++;
|
|
315
|
+
auditEntry.credentialFiltered = !!credInfo.redacted;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// P0-1: Platform sandbox wrapping — apply macOS/Windows/Linux sandbox
|
|
319
|
+
const optsForSpawn = { ...spawnOpts };
|
|
320
|
+
let sandboxApplied = false;
|
|
321
|
+
let sandboxProfile = null;
|
|
322
|
+
if (this._platformSandboxEnabled) {
|
|
323
|
+
try {
|
|
324
|
+
const result = _applySandbox(
|
|
325
|
+
command,
|
|
326
|
+
args || [],
|
|
327
|
+
optsForSpawn,
|
|
328
|
+
"default",
|
|
329
|
+
);
|
|
330
|
+
if (result && result.applied) {
|
|
331
|
+
Object.assign(optsForSpawn, result.options || {});
|
|
332
|
+
if (result.command) command = result.command;
|
|
333
|
+
if (result.args) args = result.args;
|
|
334
|
+
sandboxApplied = true;
|
|
335
|
+
sandboxProfile = result.profile || null;
|
|
336
|
+
this._stats.sandboxed++;
|
|
337
|
+
}
|
|
338
|
+
auditEntry.sandboxed = sandboxApplied;
|
|
339
|
+
auditEntry.sandboxProfile = sandboxProfile;
|
|
340
|
+
} catch (sandboxErr) {
|
|
341
|
+
// Fail closed: if sandbox setup fails on strict, deny spawn
|
|
342
|
+
if (process.env.CC_SANDBOX_STRICT === "1") {
|
|
343
|
+
auditEntry.deniedReason = `sandbox-init-failed: ${sandboxErr.message}`;
|
|
344
|
+
this._auditLog.push(auditEntry);
|
|
345
|
+
const err = new Error(`Sandbox init failed: ${sandboxErr.message}`);
|
|
346
|
+
err.auditEntry = auditEntry;
|
|
347
|
+
throw err;
|
|
348
|
+
}
|
|
349
|
+
// Non-strict: warn but allow (development mode)
|
|
350
|
+
process.emitWarning(
|
|
351
|
+
`Sandbox init failed (continuing without): ${sandboxErr.message}`,
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
272
356
|
// Use native spawn from _native (set by patch-child-process.js)
|
|
273
357
|
const nativeSpawn = this._native?.spawn || nativeSpawn;
|
|
274
|
-
const proc = nativeSpawn(command, args,
|
|
358
|
+
const proc = nativeSpawn(command, args, optsForSpawn);
|
|
359
|
+
|
|
360
|
+
// P0-1: Post-spawn sandbox setup (Windows Job Object association, etc.)
|
|
361
|
+
if (sandboxApplied && proc.pid) {
|
|
362
|
+
try {
|
|
363
|
+
_postSpawnSandbox(proc, sandboxProfile);
|
|
364
|
+
} catch (postErr) {
|
|
365
|
+
process.emitWarning(
|
|
366
|
+
`Post-spawn sandbox setup failed: ${postErr.message}`,
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
275
371
|
auditEntry.pid = proc.pid;
|
|
276
372
|
this._recordAudit(auditEntry);
|
|
277
373
|
this._writeRplEntry(auditEntry, "started");
|
|
@@ -374,9 +470,62 @@ class ProcessExecutionBroker extends EventEmitter {
|
|
|
374
470
|
spawnOpts.env.TRACEPARENT = traceCtx.traceparent;
|
|
375
471
|
}
|
|
376
472
|
|
|
473
|
+
// P0-1: Credential filtering agent — strip secrets from env/args before spawn
|
|
474
|
+
if (this._credentialAgentEnabled) {
|
|
475
|
+
try {
|
|
476
|
+
const credInfo = credentialAgent.apply(spawnOpts, {
|
|
477
|
+
command,
|
|
478
|
+
args,
|
|
479
|
+
origin,
|
|
480
|
+
});
|
|
481
|
+
if (credInfo.redacted) this._stats.credFiltered++;
|
|
482
|
+
auditEntry.credentialFiltered = !!credInfo.redacted;
|
|
483
|
+
} catch (credErr) {
|
|
484
|
+
process.emitWarning(
|
|
485
|
+
`Credential agent apply failed: ${credErr.message}`,
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// P0-1: Platform sandbox wrapping (sync path)
|
|
491
|
+
const optsForSync = { ...spawnOpts };
|
|
492
|
+
let sandboxApplied = false;
|
|
493
|
+
let sandboxProfile = null;
|
|
494
|
+
if (this._platformSandboxEnabled) {
|
|
495
|
+
try {
|
|
496
|
+
const result = _applySandbox(
|
|
497
|
+
command,
|
|
498
|
+
args || [],
|
|
499
|
+
optsForSync,
|
|
500
|
+
"default",
|
|
501
|
+
);
|
|
502
|
+
if (result && result.applied) {
|
|
503
|
+
Object.assign(optsForSync, result.options || {});
|
|
504
|
+
if (result.command) command = result.command;
|
|
505
|
+
if (result.args) args = result.args;
|
|
506
|
+
sandboxApplied = true;
|
|
507
|
+
sandboxProfile = result.profile || null;
|
|
508
|
+
this._stats.sandboxed++;
|
|
509
|
+
}
|
|
510
|
+
auditEntry.sandboxed = sandboxApplied;
|
|
511
|
+
auditEntry.sandboxProfile = sandboxProfile;
|
|
512
|
+
} catch (sandboxErr) {
|
|
513
|
+
if (process.env.CC_SANDBOX_STRICT === "1") {
|
|
514
|
+
auditEntry.deniedReason = `sandbox-init-failed: ${sandboxErr.message}`;
|
|
515
|
+
this._recordAudit(auditEntry);
|
|
516
|
+
const err = new Error(`Sandbox init failed: ${sandboxErr.message}`);
|
|
517
|
+
err.auditEntry = auditEntry;
|
|
518
|
+
throw err;
|
|
519
|
+
}
|
|
520
|
+
process.emitWarning(
|
|
521
|
+
`Sandbox init failed (sync): ${sandboxErr.message}`,
|
|
522
|
+
);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
377
526
|
const nativeSpawnSync = this._native?.spawnSync || nativeSpawnSync;
|
|
378
527
|
try {
|
|
379
|
-
const result = nativeSpawnSync(command, args,
|
|
528
|
+
const result = nativeSpawnSync(command, args, optsForSync);
|
|
380
529
|
auditEntry.exitCode = result.status;
|
|
381
530
|
auditEntry.endTime = Date.now();
|
|
382
531
|
auditEntry.durationMs = auditEntry.endTime - startTime;
|