chainlesschain 0.166.92 → 0.166.94
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 +16 -7
- package/package.json +3 -3
- 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-C74YzqwJ.js → AIOps-CzxfrB7_.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-TFef1hOE.js → ActionButton-6a4WFIb0.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-CYsWpkkU.js → Analytics-O3Hv5QVR.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CFf9kjwu.js → AppLayout-D96Jtyrz.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-TQqa94YO.js → Artifacts-BxbCrGsv.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-B79ayqfS.js → Audit-Dvhj3ev4.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-pjkHfLP9.js → BackgroundAgents-zgrU13eK.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CE6A-t_r.js → Backup-B3ePsQ8z.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-CwcgWMBY.js → BaseInput-CemgxVZi.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-BIkDNesY.js → Chat-BNxuigZo.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-DgaokYts.js → ChatBubbleRenderer-DE73IMLf.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-MbypIy5V.js → Checkbox-BvHaZkOM.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-DiFHWDnt.js → Codegen--DNXNLnq.js} +1 -1
- package/src/assets/web-panel/assets/{Col-BNMlYMso.js → Col-C8xvHu-3.js} +1 -1
- package/src/assets/web-panel/assets/{Community-B3HVyHOX.js → Community-v19Cxqtl.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-C7hlAubb.js → Compact-BdQ659sW.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-PaXZu6sE.js → Compliance-CE0-97Ph.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-BGiojbm-.js → Cowork-YCuhzIZE.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-Bmr-1QAx.js → Cron-C5xa6iEB.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BwUvWCVd.js → Crosschain-CmsyQp8f.js} +1 -1
- package/src/assets/web-panel/assets/{DID-k_4QZocW.js → DID-FY-oN652.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-_ieRo2C5.js → Dashboard-CFJD_yB7.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DYHh6T27.js → Dropdown-QM5qyalT.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-BNlQcWQX.js → EmailListRenderer-BbA-SPX0.js} +1 -1
- package/src/assets/web-panel/assets/{EvolutionSettings-DIkZ6U2D.js → EvolutionSettings-BGH3oR71.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-Dq7qSr0P.js → FamilyGuardDashboard-C4s2LeR4.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-C64e3Cbx.js → Federation-Cfb8190f.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-D-GE2vUa.js → FormItemContext-DFVYcD2A.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-DO3B2gis.js → GenericCardRenderer-CU-yqT1M.js} +1 -1
- package/src/assets/web-panel/assets/{Git-0ETirIQH.js → Git-tYiQuWYO.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-C9fnRygX.js → Governance-DRH8tKKy.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-CLJ9RTsK.js → Inference-v2GbRYb4.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-D3C_GxrN.js → KnowledgeGraph-B5Ff0wSA.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-C5ctGbkN.js → Logs-mcHQsQZC.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-Ce-eWK3j.js → MarkdownRenderer-rk-aXvLV.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-GF_t6hJ_.js → Marketplace-LUstH49t.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-BGsGzgQs.js → McpTools-kFFP54H9.js} +2 -2
- package/src/assets/web-panel/assets/{Memory-CcrY2A0j.js → Memory--KBUL4b_.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-Bi4T0RlS.js → MobileBridge-CQL_xVyD.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-DoIR8HA0.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-DL77Vf-k.js → Mtc-BrUPLX-C.js} +6 -6
- package/src/assets/web-panel/assets/{MtcAudit-CDy_Uswb.js → MtcAudit-46jjW0Ne.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-DL0BAO_c.js → Multisig-3XX8crha.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-B-woh5IR.js → NLProgramming-C53SRk52.js} +1 -1
- package/src/assets/web-panel/assets/Notes-RxpNEOb6.js +7 -0
- package/src/assets/web-panel/assets/{NotificationSettings-BqPPMuAP.js → NotificationSettings-C2R6A0rD.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Bhhp4H-K.js +1 -0
- package/src/assets/web-panel/assets/{Organization-B1gX8jlr.js → Organization-B48YmG99.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-CeMxuUZy.js → Overflow-BYPoJ7Qo.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-B5aIRWwJ.js → P2P-CI9F_5Xz.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-6rYgejd4.js → PdhVaultBrowser-C50vLFTe.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CqCp2SIl.js → Permissions-CKMhcV4D.js} +3 -3
- package/src/assets/web-panel/assets/{PersonalDataHub-BsA7DJWW.js → PersonalDataHub-CFwVht-l.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-CiW6HeZh.js → Pipeline-BQliRCrn.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-DckUOLYq.js → Privacy-z-9F-MIF.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-CZppOOYR.js → ProjectInit-DAuaSe48.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-B9QPzhDU.js → ProjectSettings-BpCCZLAx.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-BErjjGha.js → Projects-CguDJz4k.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DehU6Qiz.js → Providers-DOXv8vOy.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-E1SUvv1m.js → QrScannerModal-BiMsPToH.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-COWFxyH3.js → QuickAsk-Dxjfq39w.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-D26pWKxX.js → Recommend-Y5kQ_a2f.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DCOIaId3.js → RemoteSession-BSIDk0es.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-DT_AHGAR.js → Reputation-BLjwaybi.js} +1 -1
- package/src/assets/web-panel/assets/{Row-B50S-1nl.js → Row-7geSc2GW.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BaBnHg3Q.js → RssFeed-BophPGWk.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BVdnLuuS.js → Search-iBXsRvIQ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BnacH74J.js → Security-sM5aX0dn.js} +4 -4
- package/src/assets/web-panel/assets/{Services-CxM08Zch.js → Services-8n708_pG.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DE7CIc1N.js → Skeleton-D2rl_ikr.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CGI0SJmf.js → Skills-DJpknGnz.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DpEzPcqc.js → Sla-mA8eEXRj.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-CTmnmMHn.js → SpeechSettings-BVrmiTgd.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-Dxgrd9hd.js → SyncSettings-Cd-KRX72.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-CW4slS0A.js → Tasks-DYAvmen_.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DxvGWDgB.js → Templates-DPdlYX7S.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-_Q0o2tNK.js → Tenant-wfSNgGDT.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-BTZn8pow.js → Terminal-BqJDIQEC.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-CauL0KFe.js → TimelineRenderer-eeuMKufC.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CDoM2qeT.js → Tokens-DW9xE5CY.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-B-QYGEU7.js → Trigger-BBniBnCp.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BD6XJHT-.js → Trust-C7fZAxYI.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-x4TFwCy0.js → UkeySign-X_cT1LN_.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-t3imBK_0.js → VideoEditing-C95qSEAg.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-BCfkWwNC.js → Wallet-_Y76V1eI.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-WH314Mdm.js → WebAuthn-CUpi7QWI.js} +5 -5
- package/src/assets/web-panel/assets/{WorkflowEditor-jUlcjrUg.js → WorkflowEditor-CdTwu4JZ.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Dg3VASTL.js → chat-D2hW7s3x.js} +1 -1
- package/src/assets/web-panel/assets/{colors-BNvmBRKE.js → colors-Cxes7tn4.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-BGOfoqf4.js → compact-item-BuLnefA8.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BNQeqKAs.js → createContext-DSJr7jrZ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-BHLx7Ctv.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-Bg3AjCrq.js → hasIn-CPtCYTi-.js} +1 -1
- package/src/assets/web-panel/assets/{index-2D04Zltx.js → index--J0mLXrw.js} +3 -3
- package/src/assets/web-panel/assets/{index-COol3xfA.js → index--gm5GIKK.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcCnO0RU.js → index-5Vtfy09g.js} +1 -1
- package/src/assets/web-panel/assets/{index-fOwii3LP.js → index-B5GXCqB0.js} +1 -1
- package/src/assets/web-panel/assets/{index-OUFoxUgH.js → index-BC-FDx0Y.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bkz1tgFR.js → index-BDaNLJss.js} +1 -1
- package/src/assets/web-panel/assets/{index-DLwEXRrb.js → index-BOKMxs4C.js} +1 -1
- package/src/assets/web-panel/assets/{index-BBCMulQ-.js → index-BOXgWdJY.js} +1 -1
- package/src/assets/web-panel/assets/{index-B_JmInC0.js → index-BSHkOFqM.js} +1 -1
- package/src/assets/web-panel/assets/{index-pVdQieac.js → index-B_mChW9O.js} +1 -1
- package/src/assets/web-panel/assets/{index-BmTacaQV.js → index-Bq-CMI2h.js} +1 -1
- package/src/assets/web-panel/assets/{index-Wo0f2iqb.js → index-BudaM8zA.js} +1 -1
- package/src/assets/web-panel/assets/{index-B--0QM0S.js → index-C2qdbxEw.js} +1 -1
- package/src/assets/web-panel/assets/{index-BaPvEvB4.js → index-C6jDeixf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dkp-okWa.js → index-C88mhge1.js} +1 -1
- package/src/assets/web-panel/assets/{index-BSNhW95G.js → index-C8xMmdFz.js} +1 -1
- package/src/assets/web-panel/assets/{index-7QJUWemf.js → index-CCI2rS5G.js} +1 -1
- package/src/assets/web-panel/assets/{index-xzaUx19r.js → index-CFTO4avR.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cbp-wp-U.js → index-CVgzXcvk.js} +1 -1
- package/src/assets/web-panel/assets/{index-Co_LnCWD.js → index-C_RLdbKl.js} +1 -1
- package/src/assets/web-panel/assets/{index-CY8cRKHR.js → index-CighFQgt.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0mgngoB.js → index-CmV_i-tY.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZD5Kd8tx.js → index-Ct9hZUrk.js} +1 -1
- package/src/assets/web-panel/assets/{index-uH2LnAs_.js → index-D4YILZTK.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCFZN66A.js → index-DDSmCL8t.js} +1 -1
- package/src/assets/web-panel/assets/{index-DYn5DnDk.js → index-DFSJeXBu.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cx2EXRfr.js → index-DGIumCxN.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6UqK83L.js → index-DIkV-pwg.js} +1 -1
- package/src/assets/web-panel/assets/{index-DO0VlNtc.js → index-DTtVX2yD.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_O2ZjPk.js → index-Dz6h62uC.js} +1 -1
- package/src/assets/web-panel/assets/{index-D-mSvCQK.js → index-PyLgXmQZ.js} +1 -1
- package/src/assets/web-panel/assets/index-V4IYxvvE.js +1 -0
- package/src/assets/web-panel/assets/{index--I3UF5t1.js → index-_AYMw6sF.js} +1 -1
- package/src/assets/web-panel/assets/{index-hG7jXGEW.js → index-ePTIQg1n.js} +1 -1
- package/src/assets/web-panel/assets/{index-60AnjUTX.js → index-f1fHG0MC.js} +1 -1
- package/src/assets/web-panel/assets/{index-DS04wRll.js → index-lOl7QbP4.js} +1 -1
- package/src/assets/web-panel/assets/{index-DF_FKSVH.js → index-vsUYvuDU.js} +1 -1
- package/src/assets/web-panel/assets/index-y4vqXg0S.js +1 -0
- package/src/assets/web-panel/assets/{index-D072oLjp.js → index-ystQEkV4.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-B8PN9AxJ.js → initDefaultProps-CAxtYUKo.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BHivfw5Q.js → motion-CgPmr4vy.js} +1 -1
- package/src/assets/web-panel/assets/{move-B0QU5nDd.js → move-XGK3_B35.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DRwRM3PE.js → mtc-parser-C6Vfqz8e.js} +1 -1
- package/src/assets/web-panel/assets/{omit-SHt2rV2p.js → omit-DquSN-3H.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CcmDlEb2.js → pickAttrs-BH-ir5eD.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-DYatmXDS.js → placementArrow-Drf-QXk8.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B7qrsXq5.js → responsiveObserve-BUBMbJsH.js} +1 -1
- package/src/assets/web-panel/assets/{slide-BRGhlOWd.js → slide-BCqinMKC.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-CT-7NXsQ.js → statusUtils-CAp3-0Ss.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-rZdw_Yyp.js → styleChecker-DIuQh0dB.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-D8YNIP4P.js → useFlexGapSupport-CWXPAfZR.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-B8pt0Gu-.js → useFs-905ulWWY.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-VMmYM1tt.js → usePersonalDataHub-DajnovG6.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-UNDuoPoq.js → vnode-BE_Yg3pz.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-dN-u667S.js → zoom-BLndEna7.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/data/changelog.json +26 -0
- package/src/lib/artifact-store.js +51 -3
- package/src/lib/bounded-artifact-file-read.js +131 -0
- package/src/lib/evolution/evolution-artifact-ports.js +209 -129
- package/src/lib/evolution/rrsi-history-ledger-adapter.js +25 -0
- package/src/lib/evolution/rrsi-installation-route-contracts.js +275 -0
- package/src/lib/evolution/rrsi-installation-route-reader.js +282 -0
- package/src/lib/evolution/rrsi-observed-text-index.js +978 -0
- package/src/lib/evolution/rrsi-registry-runtime-policy.js +648 -0
- package/src/lib/evolution/rrsi-registry-store-policy.js +95 -15
- package/src/lib/evolution/rrsi-tenant-index-anchor-contracts.js +223 -0
- package/src/lib/evolution/rrsi-tenant-index-anchor-history.js +157 -0
- package/src/lib/evolution/skill-release-registry.js +20 -5
- package/src/lib/process-execution-broker/windows-native-evaluator-capabilities.js +291 -30
- package/src/lib/process-execution-broker/windows-native-evaluator.js +247 -28
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +140 -6
- package/src/lib/remote-read-loop-guard.js +227 -24
- package/src/lib/settings-loader.cjs +10 -1
- package/src/lib/task-progress-tracker.js +6 -1
- package/src/lib/with-file-lock.js +86 -16
- package/src/runtime/agent-core.js +71 -23
- package/src/assets/web-panel/assets/MobileProjects-DvjEGyvf.js +0 -1
- package/src/assets/web-panel/assets/Notes-CEFVCxk7.js +0 -7
- package/src/assets/web-panel/assets/OrderTableRenderer-GUKQ1xwp.js +0 -1
- package/src/assets/web-panel/assets/devWarning-B7_ypN1G.js +0 -1
- package/src/assets/web-panel/assets/index-B-jSKJK6.js +0 -1
- package/src/assets/web-panel/assets/index-P4FXZJqI.js +0 -1
|
@@ -5,6 +5,10 @@ import { createHash } from "node:crypto";
|
|
|
5
5
|
import { createWindowsNativeEvaluator } from "./windows-native-evaluator.js";
|
|
6
6
|
|
|
7
7
|
const SCHEMA = "chainlesschain.windows-native-evaluator-capabilities/v1";
|
|
8
|
+
const ISOLATED_SCHEMA =
|
|
9
|
+
"chainlesschain.windows-native-evaluator-capabilities/v2";
|
|
10
|
+
const PROBE_SCHEMA =
|
|
11
|
+
"chainlesschain.windows-native-evaluator-capability-probe/v2";
|
|
8
12
|
const PREFIX = "CC_NATIVE_CAPABILITIES:";
|
|
9
13
|
const HASH = /^sha256:[a-f0-9]{64}$/u;
|
|
10
14
|
const JOURNAL_FILE = "capability-journal.jsonl";
|
|
@@ -18,6 +22,15 @@ const PROBES = [
|
|
|
18
22
|
"child-pipe-stdio",
|
|
19
23
|
"child-fork-ipc",
|
|
20
24
|
];
|
|
25
|
+
const BROKER_FILES = [
|
|
26
|
+
"windows-native-evaluator-capabilities.js",
|
|
27
|
+
"windows-native-evaluator.js",
|
|
28
|
+
"index.js",
|
|
29
|
+
"platform-sandbox.js",
|
|
30
|
+
"windows-sandbox.cs",
|
|
31
|
+
"windows-sandbox-helper.exe",
|
|
32
|
+
"windows-sandbox-helper.dll",
|
|
33
|
+
];
|
|
21
34
|
const sha256 = (value) =>
|
|
22
35
|
`sha256:${createHash("sha256").update(value).digest("hex")}`;
|
|
23
36
|
const requireCondition = (condition, message) => {
|
|
@@ -36,7 +49,7 @@ const FIXTURES = Object.freeze({
|
|
|
36
49
|
"anchor.txt": "private-native-capability-input\n",
|
|
37
50
|
});
|
|
38
51
|
|
|
39
|
-
function checkSource(probeTimeoutMs) {
|
|
52
|
+
function checkSource(probeTimeoutMs, probeId) {
|
|
40
53
|
return `
|
|
41
54
|
const fs=require('node:fs');
|
|
42
55
|
const journalFd=fs.openSync(process.argv[3]+'/'+${JSON.stringify(JOURNAL_FILE)},'wx',0o600);
|
|
@@ -53,11 +66,18 @@ const path=require('node:path'),os=require('node:os');
|
|
|
53
66
|
const crypto=require('node:crypto'),cp=require('node:child_process');
|
|
54
67
|
const {pathToFileURL}=require('node:url'),{Worker}=require('node:worker_threads');
|
|
55
68
|
const workspace=process.argv[2],scratch=process.argv[3],timeout=${probeTimeoutMs};
|
|
69
|
+
const probeId=${JSON.stringify(probeId)};
|
|
70
|
+
const inheritedKeys=Object.keys(process.env).sort();
|
|
71
|
+
const credentialKeys=inheritedKeys.filter(key=>/TOKEN|SECRET|PASSWORD|CREDENTIAL|API_KEY|AUTHORIZATION/i.test(key));
|
|
72
|
+
const derived={TMP:path.join(scratch,'tmp'),TEMP:path.join(scratch,'tmp'),HOME:path.join(scratch,'home'),USERPROFILE:path.join(scratch,'home'),APPDATA:path.join(scratch,'home','AppData','Roaming'),LOCALAPPDATA:path.join(scratch,'home','AppData','Local')};
|
|
73
|
+
for(const directory of new Set(Object.values(derived)))fs.mkdirSync(directory,{recursive:true});
|
|
74
|
+
for(const [key,value]of Object.entries(derived))process.env[key]=value;
|
|
56
75
|
const observations=[];
|
|
57
76
|
const hash=value=>'sha256:'+crypto.createHash('sha256').update(value).digest('hex');
|
|
58
77
|
journal('initialization-settled');
|
|
59
78
|
function settled(value){journal('settled',{id:value.id,observation:value});observations.push(value);}
|
|
60
79
|
function observe(id,operation){
|
|
80
|
+
if(id!==probeId)return Promise.resolve();
|
|
61
81
|
const start=Date.now();
|
|
62
82
|
journal('started',{id});
|
|
63
83
|
return Promise.resolve().then(operation).then(value=>{
|
|
@@ -82,11 +102,6 @@ function asyncProbe(create,valid){
|
|
|
82
102
|
}
|
|
83
103
|
(async()=>{
|
|
84
104
|
await observe('scratch-environment',()=>{
|
|
85
|
-
const inheritedKeys=Object.keys(process.env).sort();
|
|
86
|
-
const credentialKeys=inheritedKeys.filter(key=>/TOKEN|SECRET|PASSWORD|CREDENTIAL|API_KEY|AUTHORIZATION/i.test(key));
|
|
87
|
-
const derived={TMP:path.join(scratch,'tmp'),TEMP:path.join(scratch,'tmp'),HOME:path.join(scratch,'home'),USERPROFILE:path.join(scratch,'home'),APPDATA:path.join(scratch,'home','AppData','Roaming'),LOCALAPPDATA:path.join(scratch,'home','AppData','Local')};
|
|
88
|
-
for(const directory of new Set(Object.values(derived)))fs.mkdirSync(directory,{recursive:true});
|
|
89
|
-
for(const [key,value]of Object.entries(derived))process.env[key]=value;
|
|
90
105
|
const proofs=[];
|
|
91
106
|
for(const [key,value]of Object.entries(derived)){const file=path.join(value,key+'.txt');fs.writeFileSync(file,key,{flag:'wx'});proofs.push({key,path:value,value:fs.readFileSync(file,'utf8')});}
|
|
92
107
|
const details={credentialKeys,inheritedKeys,derived,proofs,tmpdir:os.tmpdir(),homedir:os.homedir(),credentialsAbsent:credentialKeys.length===0,nodeOptionsAbsent:!Object.hasOwn(process.env,'NODE_OPTIONS')};
|
|
@@ -117,12 +132,12 @@ function asyncProbe(create,valid){
|
|
|
117
132
|
});
|
|
118
133
|
await observe('child-fork-ipc',()=>asyncProbe(()=>cp.fork(path.join(workspace,'fork-probe.cjs'),[],{execArgv:['--preserve-symlinks','--preserve-symlinks-main'],windowsHide:true,stdio:['inherit','inherit','inherit','ipc']}),value=>value?.marker==='native-fork-ok'&&Number.isSafeInteger(value.pid)&&value.pid!==process.pid));
|
|
119
134
|
journal('completed');
|
|
120
|
-
process.stdout.write(${JSON.stringify(PREFIX)}+JSON.stringify({version:
|
|
135
|
+
process.stdout.write(${JSON.stringify(PREFIX)}+JSON.stringify({version:2,probeId,pid:process.pid,workspace,scratch,observations})+'\\n');
|
|
121
136
|
})().catch(error=>{console.error(error.stack||error);process.exitCode=74;}).finally(()=>fs.closeSync(journalFd));
|
|
122
137
|
`;
|
|
123
138
|
}
|
|
124
139
|
|
|
125
|
-
function validateJournal(report, complete) {
|
|
140
|
+
function validateJournal(report, complete, probes = PROBES) {
|
|
126
141
|
const artifact = report.journal;
|
|
127
142
|
if (!artifact) {
|
|
128
143
|
requireCondition(!complete, "completed target omitted its journal");
|
|
@@ -141,7 +156,7 @@ function validateJournal(report, complete) {
|
|
|
141
156
|
const expected = [
|
|
142
157
|
{ event: "initialization-started" },
|
|
143
158
|
{ event: "initialization-settled" },
|
|
144
|
-
...
|
|
159
|
+
...probes.flatMap((id) => [
|
|
145
160
|
{ event: "started", id },
|
|
146
161
|
{ event: "settled", id },
|
|
147
162
|
]),
|
|
@@ -317,7 +332,37 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
|
|
|
317
332
|
report,
|
|
318
333
|
{ allowPartial = false } = {},
|
|
319
334
|
) {
|
|
335
|
+
if (report?.schema === ISOLATED_SCHEMA) {
|
|
336
|
+
const validation = validateIsolatedReport(report, { allowPartial });
|
|
337
|
+
requireCondition(
|
|
338
|
+
report.diagnosticCompleted === validation.diagnosticCompleted,
|
|
339
|
+
"aggregate completion summary changed",
|
|
340
|
+
);
|
|
341
|
+
return validation;
|
|
342
|
+
}
|
|
320
343
|
requireCondition(report?.schema === SCHEMA, "unknown report schema");
|
|
344
|
+
return validateProbeReport(report, { allowPartial });
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
function validateProbeReport(report, { allowPartial = false } = {}) {
|
|
348
|
+
const isolated = report.schema === PROBE_SCHEMA;
|
|
349
|
+
const probes = isolated ? [report.probeId] : PROBES;
|
|
350
|
+
if (isolated) {
|
|
351
|
+
requireCondition(PROBES.includes(report.probeId), "unknown isolated probe");
|
|
352
|
+
requireCondition(
|
|
353
|
+
report.checkSourceSha256 ===
|
|
354
|
+
sha256(checkSource(report.probeTimeoutMs, report.probeId)),
|
|
355
|
+
"isolated probe source binding mismatch",
|
|
356
|
+
);
|
|
357
|
+
requireCondition(
|
|
358
|
+
report.stage?.root === report.manifest?.root &&
|
|
359
|
+
report.stage?.workspace === report.manifest?.workspace &&
|
|
360
|
+
report.stage?.scratch === report.manifest?.scratch &&
|
|
361
|
+
Number.isSafeInteger(report.settlement?.targetPid) &&
|
|
362
|
+
report.settlement.targetPid > 0,
|
|
363
|
+
"isolated stage or target identity mismatch",
|
|
364
|
+
);
|
|
365
|
+
}
|
|
321
366
|
requireCondition(
|
|
322
367
|
report.formalSample === false &&
|
|
323
368
|
report.providerAssessed === false &&
|
|
@@ -369,7 +414,7 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
|
|
|
369
414
|
? "target execution timed out; native cleanup confirmed"
|
|
370
415
|
: "target execution incomplete; native cleanup confirmed",
|
|
371
416
|
);
|
|
372
|
-
const journal = validateJournal(report, false);
|
|
417
|
+
const journal = validateJournal(report, false, probes);
|
|
373
418
|
return {
|
|
374
419
|
diagnosticCompleted: false,
|
|
375
420
|
allCapabilitiesSupported: false,
|
|
@@ -389,7 +434,8 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
|
|
|
389
434
|
);
|
|
390
435
|
const target = JSON.parse(lines[0].slice(PREFIX.length));
|
|
391
436
|
requireCondition(
|
|
392
|
-
target.version === 1 &&
|
|
437
|
+
target.version === (isolated ? 2 : 1) &&
|
|
438
|
+
(!isolated || target.probeId === report.probeId) &&
|
|
393
439
|
Number.isSafeInteger(target.pid) &&
|
|
394
440
|
target.pid > 0 &&
|
|
395
441
|
target.pid === report.settlement.targetPid &&
|
|
@@ -399,7 +445,7 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
|
|
|
399
445
|
target.scratch === report.stage.scratch &&
|
|
400
446
|
Array.isArray(target.observations) &&
|
|
401
447
|
JSON.stringify(target.observations.map((item) => item.id)) ===
|
|
402
|
-
JSON.stringify(
|
|
448
|
+
JSON.stringify(probes),
|
|
403
449
|
"target identity or probe sequence mismatch",
|
|
404
450
|
);
|
|
405
451
|
for (const observation of target.observations) {
|
|
@@ -540,10 +586,11 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
|
|
|
540
586
|
"report observations differ from raw output",
|
|
541
587
|
);
|
|
542
588
|
requireCondition(
|
|
543
|
-
|
|
589
|
+
!probes.includes("scratch-environment") ||
|
|
590
|
+
target.observations[0].status === "supported",
|
|
544
591
|
"scratch environment or credential isolation failed",
|
|
545
592
|
);
|
|
546
|
-
const journal = validateJournal(report, true);
|
|
593
|
+
const journal = validateJournal(report, true, probes);
|
|
547
594
|
requireCondition(
|
|
548
595
|
JSON.stringify(
|
|
549
596
|
journal.records
|
|
@@ -568,10 +615,13 @@ export function validateWindowsNativeEvaluatorCapabilitiesReport(
|
|
|
568
615
|
* evidenceDirectory, when supplied, must be a new directory. A failed native
|
|
569
616
|
* settlement retains its stage; there is no unsandboxed fallback or provider.
|
|
570
617
|
*/
|
|
571
|
-
|
|
618
|
+
async function runIsolatedProbe({
|
|
572
619
|
wallTimeMs = 15000,
|
|
573
620
|
probeTimeoutMs = 1200,
|
|
574
621
|
evidenceDirectory,
|
|
622
|
+
probeId,
|
|
623
|
+
usedStages,
|
|
624
|
+
expectedBrokerFiles,
|
|
575
625
|
} = {}) {
|
|
576
626
|
requireCondition(process.platform === "win32", "Windows host required");
|
|
577
627
|
requireCondition(
|
|
@@ -599,7 +649,8 @@ export async function runWindowsNativeEvaluatorCapabilities({
|
|
|
599
649
|
const sourceIdentity = fs.lstatSync(sourceRoot, { bigint: true });
|
|
600
650
|
let evaluator;
|
|
601
651
|
const report = {
|
|
602
|
-
schema:
|
|
652
|
+
schema: PROBE_SCHEMA,
|
|
653
|
+
probeId,
|
|
603
654
|
startedAt: new Date().toISOString(),
|
|
604
655
|
platform: process.platform,
|
|
605
656
|
osRelease: os.release(),
|
|
@@ -621,21 +672,19 @@ export async function runWindowsNativeEvaluatorCapabilities({
|
|
|
621
672
|
brokerFiles: [],
|
|
622
673
|
};
|
|
623
674
|
try {
|
|
624
|
-
report.brokerFiles =
|
|
625
|
-
"windows-native-evaluator-capabilities.js",
|
|
626
|
-
"windows-native-evaluator.js",
|
|
627
|
-
"index.js",
|
|
628
|
-
"platform-sandbox.js",
|
|
629
|
-
"windows-sandbox.cs",
|
|
630
|
-
"windows-sandbox-helper.exe",
|
|
631
|
-
"windows-sandbox-helper.dll",
|
|
632
|
-
].map((name) => ({
|
|
675
|
+
report.brokerFiles = BROKER_FILES.map((name) => ({
|
|
633
676
|
name,
|
|
634
677
|
sha256: sha256(fs.readFileSync(new URL(name, import.meta.url))),
|
|
635
678
|
}));
|
|
679
|
+
requireCondition(
|
|
680
|
+
!expectedBrokerFiles ||
|
|
681
|
+
JSON.stringify(report.brokerFiles) ===
|
|
682
|
+
JSON.stringify(expectedBrokerFiles),
|
|
683
|
+
"broker source or binary changed before isolated probe issuance",
|
|
684
|
+
);
|
|
636
685
|
for (const [name, bytes] of Object.entries(FIXTURES))
|
|
637
686
|
fs.writeFileSync(path.join(sourceRoot, name), bytes, { flag: "wx" });
|
|
638
|
-
const source = checkSource(probeTimeoutMs);
|
|
687
|
+
const source = checkSource(probeTimeoutMs, probeId);
|
|
639
688
|
report.checkSourceSha256 = sha256(source);
|
|
640
689
|
evaluator = createWindowsNativeEvaluator({
|
|
641
690
|
sourceRoot,
|
|
@@ -650,6 +699,12 @@ export async function runWindowsNativeEvaluatorCapabilities({
|
|
|
650
699
|
scratch: evaluator.manifest.scratch,
|
|
651
700
|
};
|
|
652
701
|
report.manifest = evaluator.manifest;
|
|
702
|
+
const stageKey = path.win32.normalize(evaluator.root).toLowerCase();
|
|
703
|
+
requireCondition(
|
|
704
|
+
!usedStages.has(stageKey),
|
|
705
|
+
"isolated probe stage was reused",
|
|
706
|
+
);
|
|
707
|
+
usedStages.add(stageKey);
|
|
653
708
|
const outcome = await evaluator.execute();
|
|
654
709
|
report.settlement = outcome.receipt;
|
|
655
710
|
const { result } = outcome;
|
|
@@ -671,10 +726,7 @@ export async function runWindowsNativeEvaluatorCapabilities({
|
|
|
671
726
|
.find((value) => value.startsWith(PREFIX));
|
|
672
727
|
if (line)
|
|
673
728
|
report.observations = JSON.parse(line.slice(PREFIX.length)).observations;
|
|
674
|
-
report.validation =
|
|
675
|
-
report,
|
|
676
|
-
{ allowPartial: true },
|
|
677
|
-
);
|
|
729
|
+
report.validation = validateProbeReport(report, { allowPartial: true });
|
|
678
730
|
requireCondition(
|
|
679
731
|
report.brokerFiles.every(
|
|
680
732
|
({ name, sha256: expected }) =>
|
|
@@ -682,6 +734,7 @@ export async function runWindowsNativeEvaluatorCapabilities({
|
|
|
682
734
|
),
|
|
683
735
|
"broker source or binary changed during probe execution",
|
|
684
736
|
);
|
|
737
|
+
report.integrityConfirmed = true;
|
|
685
738
|
report.diagnosticCompleted = report.validation.diagnosticCompleted;
|
|
686
739
|
if (!report.diagnosticCompleted) {
|
|
687
740
|
report.failureKind = report.validation.failureKind;
|
|
@@ -755,3 +808,211 @@ export async function runWindowsNativeEvaluatorCapabilities({
|
|
|
755
808
|
}
|
|
756
809
|
return report;
|
|
757
810
|
}
|
|
811
|
+
|
|
812
|
+
function validateIsolatedReport(report, { allowPartial }) {
|
|
813
|
+
const hostFields = ["platform", "architecture", "nodeVersion", "osRelease"];
|
|
814
|
+
requireCondition(
|
|
815
|
+
report.platform === "win32" &&
|
|
816
|
+
hostFields.every(
|
|
817
|
+
(key) => typeof report[key] === "string" && report[key].length > 0,
|
|
818
|
+
),
|
|
819
|
+
"isolated host/runtime identity missing",
|
|
820
|
+
);
|
|
821
|
+
requireCondition(
|
|
822
|
+
report.formalSample === false &&
|
|
823
|
+
report.providerAssessed === false &&
|
|
824
|
+
report.fullReviewPackAssessed === false,
|
|
825
|
+
"diagnostic scope changed",
|
|
826
|
+
);
|
|
827
|
+
requireCondition(
|
|
828
|
+
Array.isArray(report.runs) &&
|
|
829
|
+
report.runs.length === PROBES.length &&
|
|
830
|
+
JSON.stringify(report.runs.map((run) => run.probeId)) ===
|
|
831
|
+
JSON.stringify(PROBES),
|
|
832
|
+
"isolated probe sequence incomplete or changed",
|
|
833
|
+
);
|
|
834
|
+
const stages = new Set(),
|
|
835
|
+
manifests = new Set();
|
|
836
|
+
const expectedRuntime = report.runs[0].manifest?.runtime;
|
|
837
|
+
const probeResults = report.runs.map((run) => {
|
|
838
|
+
requireCondition(
|
|
839
|
+
run.schema === PROBE_SCHEMA,
|
|
840
|
+
"unknown isolated probe schema",
|
|
841
|
+
);
|
|
842
|
+
requireCondition(
|
|
843
|
+
hostFields.every((key) => run[key] === report[key]),
|
|
844
|
+
"isolated host/runtime identity changed",
|
|
845
|
+
);
|
|
846
|
+
const runtime = run.manifest?.runtime;
|
|
847
|
+
requireCondition(
|
|
848
|
+
runtime &&
|
|
849
|
+
/^[a-f0-9]{64}$/u.test(runtime.sha256) &&
|
|
850
|
+
Number.isSafeInteger(runtime.bytes) &&
|
|
851
|
+
runtime.bytes > 0 &&
|
|
852
|
+
runtime.sha256 === expectedRuntime?.sha256 &&
|
|
853
|
+
runtime.bytes === expectedRuntime?.bytes,
|
|
854
|
+
"isolated runtime bytes or digest changed",
|
|
855
|
+
);
|
|
856
|
+
requireCondition(
|
|
857
|
+
run.wallTimeMs === report.wallTimeMs &&
|
|
858
|
+
run.probeTimeoutMs === report.probeTimeoutMs &&
|
|
859
|
+
run.manifest.wallTimeMs === report.wallTimeMs &&
|
|
860
|
+
run.integrityConfirmed === true &&
|
|
861
|
+
!run.cleanupError &&
|
|
862
|
+
!run.sourceRetained &&
|
|
863
|
+
JSON.stringify(run.brokerFiles) ===
|
|
864
|
+
JSON.stringify(report.runs[0].brokerFiles),
|
|
865
|
+
"isolated probe integrity or limits changed",
|
|
866
|
+
);
|
|
867
|
+
requireCondition(
|
|
868
|
+
JSON.stringify(run.brokerFiles.map((file) => file.name)) ===
|
|
869
|
+
JSON.stringify(BROKER_FILES) &&
|
|
870
|
+
run.brokerFiles.every((file) => HASH.test(file.sha256)) &&
|
|
871
|
+
JSON.stringify(run.sourceFiles) ===
|
|
872
|
+
JSON.stringify(
|
|
873
|
+
Object.entries(FIXTURES).map(([name, bytes]) => ({
|
|
874
|
+
name,
|
|
875
|
+
bytes: Buffer.byteLength(bytes),
|
|
876
|
+
sha256: sha256(bytes),
|
|
877
|
+
})),
|
|
878
|
+
),
|
|
879
|
+
"isolated broker or fixture hashes missing or changed",
|
|
880
|
+
);
|
|
881
|
+
const key = path.win32.normalize(run.stage.root).toLowerCase();
|
|
882
|
+
requireCondition(
|
|
883
|
+
!stages.has(key) && !manifests.has(run.manifestDigest),
|
|
884
|
+
"isolated probe stage or manifest was reused",
|
|
885
|
+
);
|
|
886
|
+
stages.add(key);
|
|
887
|
+
manifests.add(run.manifestDigest);
|
|
888
|
+
const validation = validateProbeReport(run, { allowPartial });
|
|
889
|
+
requireCondition(
|
|
890
|
+
run.diagnosticCompleted === validation.diagnosticCompleted,
|
|
891
|
+
"isolated completion summary changed",
|
|
892
|
+
);
|
|
893
|
+
return {
|
|
894
|
+
id: run.probeId,
|
|
895
|
+
diagnosticCompleted: validation.diagnosticCompleted,
|
|
896
|
+
status: validation.diagnosticCompleted
|
|
897
|
+
? validation.capabilities[run.probeId]
|
|
898
|
+
: validation.failureKind === "execution-timeout"
|
|
899
|
+
? "timed-out"
|
|
900
|
+
: "failed",
|
|
901
|
+
cleanupConfirmed: true,
|
|
902
|
+
lastPhase: validation.journal.lastPhase,
|
|
903
|
+
};
|
|
904
|
+
});
|
|
905
|
+
const diagnosticCompleted = probeResults.every(
|
|
906
|
+
(probe) => probe.diagnosticCompleted,
|
|
907
|
+
);
|
|
908
|
+
return {
|
|
909
|
+
diagnosticCompleted,
|
|
910
|
+
allCapabilitiesSupported:
|
|
911
|
+
diagnosticCompleted &&
|
|
912
|
+
probeResults.every((probe) => probe.status === "supported"),
|
|
913
|
+
capabilities: diagnosticCompleted
|
|
914
|
+
? Object.fromEntries(
|
|
915
|
+
probeResults.map((probe) => [probe.id, probe.status]),
|
|
916
|
+
)
|
|
917
|
+
: {},
|
|
918
|
+
probeResults,
|
|
919
|
+
cleanupConfirmed: true,
|
|
920
|
+
...(diagnosticCompleted
|
|
921
|
+
? {}
|
|
922
|
+
: { failureKind: "isolated-probe-incomplete" }),
|
|
923
|
+
};
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
/** Each probe consumes a fresh AppContainer policy and Job. A native timeout can
|
|
927
|
+
* continue only after the per-Job settlement and bounded evidence validate.
|
|
928
|
+
* An integrity/cleanup failure stops the sequence before another policy issues.
|
|
929
|
+
*/
|
|
930
|
+
export async function runWindowsNativeEvaluatorCapabilities({
|
|
931
|
+
wallTimeMs = 15000,
|
|
932
|
+
probeTimeoutMs = 1200,
|
|
933
|
+
evidenceDirectory,
|
|
934
|
+
} = {}) {
|
|
935
|
+
requireCondition(process.platform === "win32", "Windows host required");
|
|
936
|
+
requireCondition(
|
|
937
|
+
Number.isSafeInteger(probeTimeoutMs) &&
|
|
938
|
+
probeTimeoutMs >= 100 &&
|
|
939
|
+
probeTimeoutMs <= 5000 &&
|
|
940
|
+
Number.isSafeInteger(wallTimeMs) &&
|
|
941
|
+
wallTimeMs >= probeTimeoutMs * 5 + 3000 &&
|
|
942
|
+
wallTimeMs <= 60000,
|
|
943
|
+
"invalid bounded diagnostic deadlines",
|
|
944
|
+
);
|
|
945
|
+
if (evidenceDirectory) {
|
|
946
|
+
requireCondition(
|
|
947
|
+
path.isAbsolute(evidenceDirectory),
|
|
948
|
+
"absolute evidence path required",
|
|
949
|
+
);
|
|
950
|
+
fs.mkdirSync(evidenceDirectory, { mode: 0o700 });
|
|
951
|
+
}
|
|
952
|
+
const report = {
|
|
953
|
+
schema: ISOLATED_SCHEMA,
|
|
954
|
+
startedAt: new Date().toISOString(),
|
|
955
|
+
platform: process.platform,
|
|
956
|
+
osRelease: os.release(),
|
|
957
|
+
nodeVersion: process.version,
|
|
958
|
+
architecture: process.arch,
|
|
959
|
+
formalSample: false,
|
|
960
|
+
providerAssessed: false,
|
|
961
|
+
fullReviewPackAssessed: false,
|
|
962
|
+
wallTimeMs,
|
|
963
|
+
probeTimeoutMs,
|
|
964
|
+
diagnosticCompleted: false,
|
|
965
|
+
stageRetained: false,
|
|
966
|
+
runs: [],
|
|
967
|
+
};
|
|
968
|
+
const usedStages = new Set();
|
|
969
|
+
try {
|
|
970
|
+
for (const probeId of PROBES) {
|
|
971
|
+
const run = await runIsolatedProbe({
|
|
972
|
+
wallTimeMs,
|
|
973
|
+
probeTimeoutMs,
|
|
974
|
+
probeId,
|
|
975
|
+
usedStages,
|
|
976
|
+
expectedBrokerFiles: report.runs[0]?.brokerFiles,
|
|
977
|
+
evidenceDirectory: evidenceDirectory
|
|
978
|
+
? path.join(evidenceDirectory, probeId)
|
|
979
|
+
: undefined,
|
|
980
|
+
});
|
|
981
|
+
report.runs.push(run);
|
|
982
|
+
report.stageRetained ||= run.stageRetained;
|
|
983
|
+
if (!run.integrityConfirmed || run.cleanupError || run.sourceRetained) {
|
|
984
|
+
report.failureKind = run.failureKind || "diagnostic-incomplete";
|
|
985
|
+
report.retentionReason = run.retentionReason;
|
|
986
|
+
report.error = run.error || run.cleanupError || run.sourceCleanupError;
|
|
987
|
+
report.stoppedAfter = probeId;
|
|
988
|
+
break;
|
|
989
|
+
}
|
|
990
|
+
requireCondition(
|
|
991
|
+
JSON.stringify(run.brokerFiles) ===
|
|
992
|
+
JSON.stringify(report.runs[0].brokerFiles),
|
|
993
|
+
"broker source or binary changed between isolated probes",
|
|
994
|
+
);
|
|
995
|
+
}
|
|
996
|
+
if (report.runs.length === PROBES.length && !report.stoppedAfter) {
|
|
997
|
+
report.validation = validateIsolatedReport(report, {
|
|
998
|
+
allowPartial: true,
|
|
999
|
+
});
|
|
1000
|
+
report.diagnosticCompleted = report.validation.diagnosticCompleted;
|
|
1001
|
+
if (!report.diagnosticCompleted) {
|
|
1002
|
+
report.failureKind = report.validation.failureKind;
|
|
1003
|
+
report.retentionReason = "diagnostic-incomplete";
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
} catch (error) {
|
|
1007
|
+
report.error = String(error.stack || error);
|
|
1008
|
+
report.failureKind ||= "diagnostic-incomplete";
|
|
1009
|
+
}
|
|
1010
|
+
report.finishedAt = new Date().toISOString();
|
|
1011
|
+
if (evidenceDirectory)
|
|
1012
|
+
fs.writeFileSync(
|
|
1013
|
+
path.join(evidenceDirectory, "report.json"),
|
|
1014
|
+
`${JSON.stringify(report, null, 2)}\n`,
|
|
1015
|
+
{ flag: "wx" },
|
|
1016
|
+
);
|
|
1017
|
+
return report;
|
|
1018
|
+
}
|