configproof 0.3.0
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/LICENSE +21 -0
- package/README.md +217 -0
- package/dist/adapters/dotenv.d.ts +3 -0
- package/dist/adapters/dotenv.js +277 -0
- package/dist/adapters/dotenv.js.map +1 -0
- package/dist/adapters/native-env.d.ts +7 -0
- package/dist/adapters/native-env.js +196 -0
- package/dist/adapters/native-env.js.map +1 -0
- package/dist/adapters/registry.d.ts +7 -0
- package/dist/adapters/registry.js +30 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/agent/server.d.ts +15 -0
- package/dist/agent/server.js +254 -0
- package/dist/agent/server.js.map +1 -0
- package/dist/analysis/diagnose.d.ts +64 -0
- package/dist/analysis/diagnose.js +142 -0
- package/dist/analysis/diagnose.js.map +1 -0
- package/dist/analysis/history.d.ts +52 -0
- package/dist/analysis/history.js +119 -0
- package/dist/analysis/history.js.map +1 -0
- package/dist/analysis/policy.d.ts +161 -0
- package/dist/analysis/policy.js +192 -0
- package/dist/analysis/policy.js.map +1 -0
- package/dist/analysis/provenance.d.ts +45 -0
- package/dist/analysis/provenance.js +144 -0
- package/dist/analysis/provenance.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +286 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/analyze.d.ts +46 -0
- package/dist/core/analyze.js +168 -0
- package/dist/core/analyze.js.map +1 -0
- package/dist/core/collect.d.ts +5 -0
- package/dist/core/collect.js +147 -0
- package/dist/core/collect.js.map +1 -0
- package/dist/core/export.d.ts +53 -0
- package/dist/core/export.js +155 -0
- package/dist/core/export.js.map +1 -0
- package/dist/core/io.d.ts +13 -0
- package/dist/core/io.js +100 -0
- package/dist/core/io.js.map +1 -0
- package/dist/core/privacy.d.ts +25 -0
- package/dist/core/privacy.js +113 -0
- package/dist/core/privacy.js.map +1 -0
- package/dist/core/schema.d.ts +2149 -0
- package/dist/core/schema.js +181 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/demo.d.ts +1 -0
- package/dist/demo.js +45 -0
- package/dist/demo.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/launcher.d.ts +27 -0
- package/dist/launcher.js +122 -0
- package/dist/launcher.js.map +1 -0
- package/dist/report/html.d.ts +5 -0
- package/dist/report/html.js +109 -0
- package/dist/report/html.js.map +1 -0
- package/dist/runtime/api.d.ts +44 -0
- package/dist/runtime/api.js +29 -0
- package/dist/runtime/api.js.map +1 -0
- package/dist/runtime/callsite.d.ts +3 -0
- package/dist/runtime/callsite.js +61 -0
- package/dist/runtime/callsite.js.map +1 -0
- package/dist/runtime/children.d.ts +8 -0
- package/dist/runtime/children.js +69 -0
- package/dist/runtime/children.js.map +1 -0
- package/dist/runtime/environment.d.ts +3 -0
- package/dist/runtime/environment.js +53 -0
- package/dist/runtime/environment.js.map +1 -0
- package/dist/runtime/preload.d.ts +1 -0
- package/dist/runtime/preload.js +117 -0
- package/dist/runtime/preload.js.map +1 -0
- package/dist/runtime/recorder.d.ts +59 -0
- package/dist/runtime/recorder.js +254 -0
- package/dist/runtime/recorder.js.map +1 -0
- package/dist/runtime/workers.d.ts +12 -0
- package/dist/runtime/workers.js +127 -0
- package/dist/runtime/workers.js.map +1 -0
- package/docs/ARCHITECTURE.md +54 -0
- package/docs/COMPATIBILITY.md +24 -0
- package/docs/PRIVACY.md +17 -0
- package/docs/VALIDATION.md +42 -0
- package/fixtures/bypass/app.cjs +6 -0
- package/fixtures/bypass/early.cjs +2 -0
- package/fixtures/child-process/child.cjs +2 -0
- package/fixtures/child-process/parent.cjs +5 -0
- package/fixtures/custom-target/app.cjs +4 -0
- package/fixtures/custom-target/sample.env +1 -0
- package/fixtures/esm/app.mjs +5 -0
- package/fixtures/exit-code/app.cjs +4 -0
- package/fixtures/failure-boundary/app.cjs +7 -0
- package/fixtures/load-order/app.cjs +9 -0
- package/fixtures/load-order/first.env +1 -0
- package/fixtures/load-order/second.env +1 -0
- package/fixtures/manifest.json +16 -0
- package/fixtures/native-env/app.cjs +6 -0
- package/fixtures/native-env/failure.cjs +4 -0
- package/fixtures/native-env/sample.env +1 -0
- package/fixtures/native-env/startup.cjs +2 -0
- package/fixtures/runtime-mutation/app.cjs +12 -0
- package/fixtures/source-map/input.ts +5 -0
- package/fixtures/source-map/tsconfig.json +7 -0
- package/fixtures/stale-inheritance/app.cjs +4 -0
- package/fixtures/stale-inheritance/sample.env +1 -0
- package/fixtures/v03-manifest.json +32 -0
- package/fixtures/worker/parent.cjs +3 -0
- package/fixtures/worker/worker.cjs +2 -0
- package/fixtures/worker-modes/parent.cjs +17 -0
- package/fixtures/worker-modes/worker.cjs +4 -0
- package/package.json +64 -0
- package/policies/configtrace-policy.yaml +23 -0
- package/policies/issue-share.yaml +12 -0
- package/policies/minimal.yaml +8 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escapeHtml = escapeHtml;
|
|
4
|
+
exports.renderTraceHtml = renderTraceHtml;
|
|
5
|
+
exports.renderDiffHtml = renderDiffHtml;
|
|
6
|
+
const provenance_1 = require("../analysis/provenance");
|
|
7
|
+
const diagnose_1 = require("../analysis/diagnose");
|
|
8
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
|
+
const analyze_1 = require("../core/analyze");
|
|
10
|
+
const DISPLAY_LIMIT = 2000;
|
|
11
|
+
function escapeHtml(value) {
|
|
12
|
+
return String(value ?? '').replace(/[&<>"']/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c]));
|
|
13
|
+
}
|
|
14
|
+
const css = `
|
|
15
|
+
:root{color-scheme:light;--paper:#f5f2eb;--ink:#252927;--muted:#626961;--line:#d6d6ca;--accent:#934726;--green:#28594c;--wash:#e9ece4}
|
|
16
|
+
*{box-sizing:border-box}body{margin:0;background:var(--paper);color:var(--ink);font:15px/1.55 system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}
|
|
17
|
+
a{color:var(--green)}header{border-bottom:3px solid var(--ink);padding:28px 5vw 22px;display:flex;gap:28px;justify-content:space-between;align-items:flex-end}
|
|
18
|
+
.wordmark{font:700 14px ui-monospace,monospace;letter-spacing:.12em}.edition{font:12px ui-monospace,monospace;color:var(--muted);text-align:right}h1{font-size:clamp(30px,5vw,56px);line-height:1.08;letter-spacing:-.04em;margin:24px 0 8px;font-weight:650}h2{font-size:20px;letter-spacing:-.02em}h3{font-size:16px;margin:0}p{margin:8px 0 16px}.subtitle{max-width:70ch;color:var(--muted)}main{max-width:1420px;margin:auto;padding:28px 5vw 72px}.notice{border-left:4px solid var(--accent);padding:12px 18px;background:#eee6d9;margin:0 0 24px}.muted{color:var(--muted)}.small{font-size:12px}.mono,code,time{font-family:ui-monospace,SFMono-Regular,Consolas,monospace;overflow-wrap:anywhere}.stats{display:flex;flex-wrap:wrap;gap:0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);margin:20px 0}.stat{padding:15px 28px 15px 0;min-width:130px}.stat strong{display:block;font-size:24px}.stat span{text-transform:uppercase;font:10px ui-monospace,monospace;letter-spacing:.12em}.badge{display:inline-block;padding:3px 8px;border:1px solid var(--line);font:11px ui-monospace,monospace;text-transform:uppercase;white-space:nowrap}.badge.partial,.badge.failed,.different{color:var(--accent)}.same{color:var(--green)}.incomparable,.not-observed{color:var(--muted)}.toolbar{display:flex;gap:15px;align-items:center;flex-wrap:wrap;margin:22px 0}input,select,button{font:inherit;background:transparent;border:1px solid var(--line);color:var(--ink);border-radius:2px;padding:9px 12px}input{min-width:220px;flex:1}input:focus,select:focus,button:focus{outline:2px solid var(--green);outline-offset:3px}button{cursor:pointer}.keys{display:flex;gap:7px;flex-wrap:wrap;margin:12px 0 24px}.keys button{font:12px ui-monospace,monospace;padding:6px 9px}.section-head{display:flex;align-items:center;justify-content:space-between;gap:20px;border-bottom:1px solid var(--ink);margin-top:32px}details.process{border-bottom:1px solid var(--line)}summary{cursor:pointer;padding:15px 0;font-weight:600;overflow-wrap:anywhere}.timeline{list-style:none;margin:0;padding:0 0 10px 22px;border-left:1px solid var(--line)}.event{position:relative;padding:13px 0 13px 14px;border-bottom:1px solid var(--line)}.event:before{content:"";width:7px;height:7px;background:var(--ink);position:absolute;left:-26px;top:24px}.event[data-op="write"]:before,.event[data-op="skip"]:before{background:var(--accent)}.event-top{display:flex;gap:12px;align-items:baseline;flex-wrap:wrap}.event-top time{font-size:11px;color:var(--muted);min-width:105px}.event-key{font-weight:650}.event-body{margin:5px 0 0 118px;font-size:13px}.event-body div{overflow-wrap:anywhere}.coverage{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:0 25px}.coverage article{padding:16px 0;border-bottom:1px solid var(--line)}.coverage .reasons{font-size:12px;color:var(--muted);margin-top:8px}table{width:100%;border-collapse:collapse;text-align:left;font-size:13px}th{font:11px ui-monospace,monospace;text-transform:uppercase;letter-spacing:.06em;padding:12px 10px;border-bottom:2px solid var(--ink)}td{padding:14px 10px;border-bottom:1px solid var(--line);vertical-align:top;overflow-wrap:anywhere}.table-wrap{overflow:auto}td:first-child{font-family:ui-monospace,monospace;min-width:170px}.pair{display:grid;grid-template-columns:1fr 1fr;gap:24px}.pair section{min-width:0}.pair .timeline{padding-left:13px}.pair .event:before{left:-17px}.pair .event-body{margin-left:0}.foot{border-top:1px solid var(--ink);padding-top:16px;margin-top:36px;color:var(--muted);font-size:12px}.caveat{margin:8px 0;color:var(--muted)}[hidden]{display:none!important}@media(max-width:700px){header{align-items:flex-start}.edition{max-width:115px}main{padding-left:5vw;padding-right:5vw}.event-body{margin-left:0}.event-top time{min-width:90px}.pair{grid-template-columns:1fr}.stat{min-width:100px;padding-right:16px}.timeline{padding-left:14px}.event:before{left:-18px}}@media print{.toolbar,.keys{display:none}body{background:white}details{display:block}.event{break-inside:avoid}header{padding:10px 0}main{padding:10px 0}a{text-decoration:none}.pair{display:block}}
|
|
19
|
+
.views{display:flex;gap:8px;margin:22px 0}.views button[aria-pressed="true"]{background:var(--ink);color:var(--paper)}
|
|
20
|
+
.graph-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(235px,1fr));gap:12px;margin:20px 0}.graph-node{border:1px solid var(--line);padding:14px;background:#fffdf7;min-width:0;overflow-wrap:anywhere}.graph-node h3{font:600 13px ui-monospace,monospace;margin:8px 0}.graph-node[data-confidence="unknown"]{border-style:dashed}.graph-node:target,.event:target{outline:3px solid var(--accent);outline-offset:3px}.graph-edge a{overflow-wrap:anywhere}.scorecard{border-top:2px solid var(--ink);padding:16px 0}.scorecard ol{margin:10px 0;padding-left:22px}.stage{font:11px ui-monospace,monospace;text-transform:uppercase;letter-spacing:.1em}.confidence-key{display:flex;gap:12px;flex-wrap:wrap;font-size:12px;color:var(--muted)}
|
|
21
|
+
|
|
22
|
+
`;
|
|
23
|
+
const script = `
|
|
24
|
+
(()=>{const q=document.getElementById('search'),op=document.getElementById('operation'),proc=document.getElementById('context'),count=document.getElementById('visible-count');
|
|
25
|
+
const items=Array.from(document.querySelectorAll('.event,.graph-node'));
|
|
26
|
+
function view(name){for(const panel of document.querySelectorAll('[data-panel]'))panel.hidden=panel.dataset.panel!==name;for(const button of document.querySelectorAll('[data-view]'))button.setAttribute('aria-pressed',String(button.dataset.view===name));}
|
|
27
|
+
function filter(){const term=(q?q.value:'').trim().toLowerCase(),operation=op?op.value:'',process=proc?proc.value:'';let n=0;
|
|
28
|
+
for(const item of items){const visible=(!term||(item.dataset.search||'').includes(term))&&(!operation||!item.dataset.op||item.dataset.op===operation)&&(!process||item.dataset.process===process);item.hidden=!visible;if(visible&&item.classList.contains('event'))n++;}
|
|
29
|
+
for(const edge of document.querySelectorAll('.graph-edge')){const a=document.getElementById(edge.dataset.from),b=document.getElementById(edge.dataset.to);edge.hidden=!(a&&b&&!a.hidden&&!b.hidden);}
|
|
30
|
+
if(count)count.textContent=n+' rendered timeline events match';if(term||process)for(const d of document.querySelectorAll('details.process'))d.open=true;}
|
|
31
|
+
for(const element of [q,op,proc])if(element)element.addEventListener(element===q?'input':'change',filter);
|
|
32
|
+
for(const button of document.querySelectorAll('[data-key]'))button.addEventListener('click',()=>{if(q){q.value=button.dataset.key||'';filter();q.focus();}});
|
|
33
|
+
for(const button of document.querySelectorAll('[data-view]'))button.addEventListener('click',()=>view(button.dataset.view));
|
|
34
|
+
for(const link of document.querySelectorAll('[data-jump]'))link.addEventListener('click',()=>{view(link.dataset.jump);if(q)q.value='';if(op)op.value='';if(proc)proc.value='';filter();for(const d of document.querySelectorAll('details.process'))d.open=true;});
|
|
35
|
+
filter();})();
|
|
36
|
+
`;
|
|
37
|
+
function shell(title, subtitle, body) {
|
|
38
|
+
const styleHash = (0, node_crypto_1.createHash)('sha256').update(css).digest('base64');
|
|
39
|
+
const scriptHash = (0, node_crypto_1.createHash)('sha256').update(script).digest('base64');
|
|
40
|
+
const csp = `default-src 'none'; script-src 'sha256-${scriptHash}'; style-src 'sha256-${styleHash}'; base-uri 'none'; form-action 'none'; connect-src 'none'`;
|
|
41
|
+
return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><meta http-equiv="Content-Security-Policy" content="${escapeHtml(csp)}"><meta name="referrer" content="no-referrer"><title>${escapeHtml(title)} · ConfigTrace</title><style>${css}</style></head><body><header><div><div class="wordmark">CONFIGTRACE / EVIDENCE FILE</div><h1>${escapeHtml(title)}</h1><p class="subtitle">${escapeHtml(subtitle)}</p></div><div class="edition">CT—03<br>LOCAL / OFFLINE<br>NO RAW VALUES</div></header><main>${body}<footer class="foot">ConfigTrace 0.3.0 · A complete stream is not complete runtime coverage. Matching observations support an inference, not universal provenance. Review paths and key names before sharing. No external assets, scripts, fonts, or network requests.</footer></main><script>${script}</script></body></html>`;
|
|
42
|
+
}
|
|
43
|
+
function badge(status) { return `<span class="badge ${escapeHtml(status)}">${escapeHtml(status)}</span>`; }
|
|
44
|
+
function equality(status) { return `<span class="mono ${escapeHtml(status)}">${escapeHtml(status)}</span>`; }
|
|
45
|
+
function labels() {
|
|
46
|
+
const seen = new Map();
|
|
47
|
+
return (value, key, domain) => {
|
|
48
|
+
if (!value || value.state !== 'present')
|
|
49
|
+
return (0, analyze_1.valueLabel)(value);
|
|
50
|
+
const identity = JSON.stringify([domain, key, value.token]);
|
|
51
|
+
if (!seen.has(identity))
|
|
52
|
+
seen.set(identity, `V${String(seen.size + 1).padStart(2, '0')}`);
|
|
53
|
+
return `${seen.get(identity)} · ${value.empty ? 'empty · ' : ''}masked`;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function timeline(events, domain, label, graphIds = new Set(), prefix = '') {
|
|
57
|
+
return `<ol class="timeline">${events.map(e => {
|
|
58
|
+
const search = [e.key, e.operation, e.processId, (0, analyze_1.siteLabel)(e), (0, analyze_1.originLabel)(e)].join(' ').toLowerCase();
|
|
59
|
+
return `<li class="event" id="event${prefix}-${escapeHtml(e.id)}" data-process="${escapeHtml(e.processId)}" data-op="${escapeHtml(e.operation)}" data-search="${escapeHtml(search)}"><div class="event-top"><time>+${e.at.toFixed(3)} ms</time>${badge(e.operation)}<span class="event-key mono">${escapeHtml(e.key || (e.operation === 'load' ? 'loader observation' : e.operation === 'boundary' ? 'failure boundary' : 'execution context boundary'))}</span><span class="mono small">${escapeHtml(label(e.value, e.key || '', domain))}</span></div><div class="event-body"><div>${escapeHtml((0, analyze_1.originLabel)(e))}${e.outcome ? ' · ' + escapeHtml(e.outcome) : ''}</div><div class="mono muted">${escapeHtml((0, analyze_1.siteLabel)(e))}</div>${e.candidate ? `<div>Candidate: <span class="mono">${escapeHtml(label(e.candidate, e.key || '', domain))}</span></div>` : ''}${e.causedBy ? `<div class="small muted">Inferred link to ${escapeHtml(e.causedBy)}</div>` : ''}${graphIds.has(`event:${e.id}`) ? `<a class="small" data-jump="provenance" href="#node-event:${escapeHtml(e.id)}">View provenance node</a>` : ''}${e.childId ? `<div class="small mono">Child ${escapeHtml(e.childId)}</div>` : ''}</div></li>`;
|
|
60
|
+
}).join('')}</ol>`;
|
|
61
|
+
}
|
|
62
|
+
function coverage(trace) {
|
|
63
|
+
return `<div class="section-head"><h2>Observation boundaries</h2><span class="small muted">Not a coverage percentage</span></div><div class="coverage">${trace.coverage.map(c => `<article><h3>${escapeHtml(c.feature)} ${badge(c.status)}</h3><div class="reasons mono">${c.reasons.map(x => escapeHtml(x.replace(/_/g, ' '))).join('<br>') || 'No adapter observation recorded.'}</div></article>`).join('')}</div>`;
|
|
64
|
+
}
|
|
65
|
+
function toolbar(trace) {
|
|
66
|
+
return `<div class="toolbar"><label for="search">Find evidence</label><input id="search" type="search" placeholder="Key, file, process, or origin" autocomplete="off"><label for="operation" class="small">Operation</label><select id="operation"><option value="">All</option>${['baseline', 'read', 'write', 'delete', 'candidate', 'skip', 'load', 'child-spawn', 'worker-spawn', 'boundary'].map(x => `<option>${x}</option>`).join('')}</select>${trace ? `<label for="context" class="small">Context</label><select id="context"><option value="">All processes / Workers</option>${trace.processes.map(p => `<option value="${escapeHtml(p.id)}">${escapeHtml(p.role)} / ${escapeHtml(p.id)}${p.threadId !== undefined ? ' / thread ' + p.threadId : ''}</option>`).join('')}</select>` : ''}<output id="visible-count" class="small muted" aria-live="polite"></output></div>`;
|
|
67
|
+
}
|
|
68
|
+
function graphPanel(graph, trace, shown) {
|
|
69
|
+
const nodes = new Map(graph.nodes.map(n => [n.id, n]));
|
|
70
|
+
const operations = new Map(trace.events.map(e => [e.id, e.operation]));
|
|
71
|
+
return `<section data-panel="provenance" hidden><div class="section-head"><h2>Provenance DAG</h2><span class="small">${graph.nodes.length} nodes / ${graph.edges.length} links</span></div>
|
|
72
|
+
<p class="muted">Explore evidence nodes and typed links. Source-file nodes and read-site nodes are distinct. Filter by key or execution context, then jump to the same event in the timeline.</p>
|
|
73
|
+
${graph.truncated ? '<p class="notice">The graph reached its display limit. Use the graph CLI/API with a key/process filter for a focused graph; the complete trace remains in JSON.</p>' : ''}
|
|
74
|
+
<div class="confidence-key"><span>Observed: captured operation</span><span>Derived: deterministic transformation</span><span>Inferred: supported relationship</span><span>Unknown: unavailable history</span></div>
|
|
75
|
+
<div class="graph-grid">${graph.nodes.map(n => `<article class="graph-node" id="node-${escapeHtml(n.id)}" data-confidence="${escapeHtml(n.confidence)}" data-process="${escapeHtml(n.processId || '')}" data-op="${escapeHtml(n.eventId ? operations.get(n.eventId) || '' : '')}" data-search="${escapeHtml([n.label, n.key, n.processId, n.kind].join(' ').toLowerCase())}"><div class="stage">${escapeHtml(n.kind)}</div><h3>${escapeHtml(n.label)}</h3>${badge(n.confidence)}${n.state ? `<p class="small mono">${escapeHtml(n.state)}${n.empty ? ' / empty' : ''}</p>` : ''}${n.eventId && shown.has(n.eventId) ? `<p><a class="small" data-jump="timeline" href="#event-${escapeHtml(n.eventId)}">Timeline #${n.seq}</a></p>` : ''}</article>`).join('')}</div>
|
|
76
|
+
<details open><summary>Evidence relationships</summary><div class="table-wrap"><table><thead><tr><th>From</th><th>Relationship</th><th>To</th><th>Confidence</th></tr></thead><tbody>${graph.edges.map(e => `<tr class="graph-edge" data-from="node-${escapeHtml(e.from)}" data-to="node-${escapeHtml(e.to)}"><td><a href="#node-${escapeHtml(e.from)}">${escapeHtml(nodes.get(e.from)?.label)}</a></td><td>${escapeHtml(e.relation)}</td><td><a href="#node-${escapeHtml(e.to)}">${escapeHtml(nodes.get(e.to)?.label)}</a></td><td>${badge(e.confidence)}</td></tr>`).join('')}</tbody></table></div></details>
|
|
77
|
+
${graph.caveats.map(c => `<p class="caveat small">${escapeHtml(c)}</p>`).join('')}</section>`;
|
|
78
|
+
}
|
|
79
|
+
function renderTraceHtml(trace) {
|
|
80
|
+
const keys = [...new Set(trace.events.flatMap(e => e.key ? [e.key] : []))].sort();
|
|
81
|
+
const shown = trace.events.slice(0, DISPLAY_LIMIT);
|
|
82
|
+
const graph = (0, provenance_1.buildProvenance)(trace, { allProcesses: true, maxNodes: 1600, maxEdges: 4000 });
|
|
83
|
+
const graphIds = new Set(graph.nodes.map(n => n.id));
|
|
84
|
+
const label = labels();
|
|
85
|
+
const body = `<div class="notice"><strong>${escapeHtml(trace.capture.status.toUpperCase())} CAPTURE.</strong> Stream completeness is not universal visibility. Values are masked equality classes, not raw strings.</div>
|
|
86
|
+
<div class="stats"><div class="stat"><strong>${keys.length}</strong><span>Observed keys</span></div><div class="stat"><strong>${trace.events.length}</strong><span>Events retained</span></div><div class="stat"><strong>${trace.processes.length}</strong><span>Execution contexts</span></div><div class="stat"><strong>${escapeHtml(trace.result.signal || String(trace.result.exitCode ?? 'unknown'))}</strong><span>Application outcome</span></div></div>
|
|
87
|
+
${toolbar(trace)}<div class="keys">${keys.slice(0, 80).map(k => `<button type="button" data-key="${escapeHtml(k)}">${escapeHtml(k)}</button>`).join('')}</div>
|
|
88
|
+
<nav class="views" aria-label="Evidence view"><button type="button" data-view="timeline" aria-pressed="true">Timeline</button><button type="button" data-view="provenance" aria-pressed="false">Provenance DAG</button></nav>
|
|
89
|
+
<section data-panel="timeline">${shown.length < trace.events.length ? `<p class="notice">Display limit: ${shown.length} / ${trace.events.length} events. Filtering applies to rendered entries, not undisplayed JSON.</p>` : ''}
|
|
90
|
+
<div class="section-head"><h2>Runtime timeline</h2><span class="small muted">Context-local order / no shared causal clock</span></div>
|
|
91
|
+
${trace.processes.map((p, i) => `<details class="process" ${i === 0 ? 'open' : ''}><summary>${escapeHtml(p.role.toUpperCase())} / ${escapeHtml(p.entry)} <span class="small mono muted">${escapeHtml(p.id)}</span> ${badge(p.ended ? 'ended' : 'incomplete')}</summary><p class="small muted">${escapeHtml(p.node)} / ${escapeHtml(p.platform)}${p.threadId !== undefined ? ' / thread ' + p.threadId : ''}${p.environmentMode ? ' / env ' + escapeHtml(p.environmentMode) : ''} / ${p.eventsDropped} event(s) dropped</p>${timeline(shown.filter(e => e.processId === p.id), trace.comparison.domainId, label, graphIds)}</details>`).join('')}</section>
|
|
92
|
+
${graphPanel(graph, trace, new Set(shown.map(e => e.id)))}
|
|
93
|
+
${coverage(trace)}<details><summary>Capture notices and adapter declarations</summary><p class="small mono">${trace.capture.notices.map(x => escapeHtml(x.replace(/_/g, ' '))).join('<br>')}</p>${(trace.adapters || []).map(a => `<p class="small">${escapeHtml(a.manifest.id)} / ${escapeHtml(a.installedVersion || 'version unavailable')} / ${escapeHtml(a.processId)} / validation: unverified</p>`).join('')}</details>`;
|
|
94
|
+
return shell('Follow the evidence.', 'Configuration sources, mutations, application reads, and the boundaries of what was observed.', body);
|
|
95
|
+
}
|
|
96
|
+
function renderDiffHtml(left, right, diff = (0, analyze_1.diffTraces)(left, right)) {
|
|
97
|
+
const label = labels();
|
|
98
|
+
const diagnosis = (0, diagnose_1.diagnoseTraces)(left, right, { leftProcess: diff.leftProcess, rightProcess: diff.rightProcess, limit: 5 });
|
|
99
|
+
const ranked = `<section class="scorecard"><h2>Strongest observed divergences</h2><p class="muted">${escapeHtml(diagnosis.conclusion)}</p>${diagnosis.findings.map(f => `<article><h3>${escapeHtml(f.key)} ${badge(f.confidence)}</h3><p class="small">${f.reasons.map(escapeHtml).join(' ')}</p></article>`).join('')}</section>`;
|
|
100
|
+
const rows = diff.rows.map(r => `<tr><td>${escapeHtml(r.key)}</td><td>${equality(r.startup)}</td><td>${equality(r.lastRead)}</td><td>${equality(r.readSequence)}</td><td>${r.left.reads.length} → ${r.right.reads.length}</td><td>${escapeHtml(r.changes.join(', ') || 'No difference established')}</td></tr>`).join('');
|
|
101
|
+
const evidence = diff.rows.slice(0, 100).map(r => `<details><summary>${escapeHtml(r.key)} / paired evidence</summary><p class="small">Origins: ${escapeHtml((0, analyze_1.originLabel)(r.left.lastRead))} → ${escapeHtml((0, analyze_1.originLabel)(r.right.lastRead))}</p><div class="pair"><section><h3>RUN A</h3>${timeline(r.left.events.slice(0, 40), left.comparison.domainId, label, new Set(), '-a')}</section><section><h3>RUN B</h3>${timeline(r.right.events.slice(0, 40), right.comparison.domainId, label, new Set(), '-b')}</section></div><p class="small muted">Showing up to 40 events per side. ${r.left.events.length} / ${r.right.events.length} retained for this key. Sequence equality: ${escapeHtml(r.readSequence)}.</p></details>`).join('');
|
|
102
|
+
const body = `<div class="notice"><strong>${diff.sameDomain ? 'SHARED COMPARISON DOMAIN' : 'UNRELATED DOMAINS — VALUE EQUALITY UNKNOWN'}</strong><br>Compare captured evidence, not a claim that either execution was fully observed.</div>
|
|
103
|
+
<div class="stats"><div class="stat"><strong>${diff.rows.length}</strong><span>Keys compared</span></div><div class="stat"><strong>${diff.rows.filter(r => r.changes.length).length}</strong><span>Evidence differences</span></div><div class="stat"><strong>${diff.coverageChanged ? 'Changed' : 'Same manifest'}</strong><span>Coverage declarations</span></div></div>
|
|
104
|
+
${ranked}${toolbar()}<p class="small mono">A: ${escapeHtml(diff.leftProcess || 'not observed')} · B: ${escapeHtml(diff.rightProcess || 'not observed')}</p><div class="table-wrap"><table><thead><tr><th>Key</th><th>At preload</th><th>Last read</th><th>Read sequence</th><th>Read count</th><th>What changed</th></tr></thead><tbody>${rows}</tbody></table></div>
|
|
105
|
+
<div class="section-head"><h2>Read the difference.</h2><span class="small muted">Event presence is not causality</span></div>${diff.rows.length > 100 ? '<p class="notice">Detail display limit: the first 100 keys are expanded below. The summary table and source artifacts include the remaining keys.</p>' : ''}${evidence}
|
|
106
|
+
<div class="section-head"><h2>Interpretation limits</h2></div>${diff.caveats.map(c => `<p class="caveat">${escapeHtml(c)}</p>`).join('')}${coverage(left)}${coverage(right)}`;
|
|
107
|
+
return shell('Two runs. One question.', 'What changed in the recorded configuration evidence between execution A and execution B?', body);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { AdapterManifest } from '../core/schema';
|
|
2
|
+
import type { Recorder } from './recorder';
|
|
3
|
+
export interface RuntimeConfig {
|
|
4
|
+
runId: string;
|
|
5
|
+
directory: string;
|
|
6
|
+
root: string;
|
|
7
|
+
rootId: string;
|
|
8
|
+
watch: string[];
|
|
9
|
+
comparison: {
|
|
10
|
+
version: 1;
|
|
11
|
+
domainId: string;
|
|
12
|
+
secret: string;
|
|
13
|
+
};
|
|
14
|
+
maxEvents: number;
|
|
15
|
+
maxBytes: number;
|
|
16
|
+
children: boolean;
|
|
17
|
+
workers: boolean;
|
|
18
|
+
maxWorkers: number;
|
|
19
|
+
nativeEnv: boolean;
|
|
20
|
+
maxDepth: number;
|
|
21
|
+
maxChildren: number;
|
|
22
|
+
sourceMaps: boolean;
|
|
23
|
+
dotenv: boolean;
|
|
24
|
+
adapters: string[];
|
|
25
|
+
preloadPath: string;
|
|
26
|
+
configPath: string;
|
|
27
|
+
}
|
|
28
|
+
export interface AdapterContext {
|
|
29
|
+
/** All value-bearing observations pass through the recorder's in-memory fingerprint boundary. */
|
|
30
|
+
recorder: Recorder;
|
|
31
|
+
originalEnv: NodeJS.ProcessEnv;
|
|
32
|
+
root: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ConfigTraceAdapter {
|
|
35
|
+
id: string;
|
|
36
|
+
manifest?: AdapterManifest;
|
|
37
|
+
/** Synchronous install. Return a cleanup function; never start telemetry or persist raw values. */
|
|
38
|
+
install(context: AdapterContext): void | (() => void);
|
|
39
|
+
}
|
|
40
|
+
export declare const ACTIVE_RECORDER: unique symbol;
|
|
41
|
+
export declare function getActiveRecorder(): Recorder | undefined;
|
|
42
|
+
export declare function registerAdapter(adapter: ConfigTraceAdapter, context: AdapterContext): () => void;
|
|
43
|
+
/** Record an explicit failure boundary without capturing messages, exceptions, or arguments. */
|
|
44
|
+
export declare function markFailureBoundary(): string | undefined;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ACTIVE_RECORDER = void 0;
|
|
4
|
+
exports.getActiveRecorder = getActiveRecorder;
|
|
5
|
+
exports.registerAdapter = registerAdapter;
|
|
6
|
+
exports.markFailureBoundary = markFailureBoundary;
|
|
7
|
+
exports.ACTIVE_RECORDER = Symbol.for('configtrace.active-recorder');
|
|
8
|
+
function getActiveRecorder() {
|
|
9
|
+
return globalThis[exports.ACTIVE_RECORDER];
|
|
10
|
+
}
|
|
11
|
+
function registerAdapter(adapter, context) {
|
|
12
|
+
if (!adapter || !/^[a-z0-9][a-z0-9-]{0,63}$/.test(adapter.id) || typeof adapter.install !== 'function') {
|
|
13
|
+
throw new Error('Invalid ConfigTrace adapter contract');
|
|
14
|
+
}
|
|
15
|
+
if (adapter.manifest && adapter.manifest.id !== adapter.id)
|
|
16
|
+
throw new Error('Adapter and manifest identifiers must agree');
|
|
17
|
+
const dispose = adapter.install(context);
|
|
18
|
+
if (adapter.manifest)
|
|
19
|
+
context.recorder.declareAdapter(adapter.manifest);
|
|
20
|
+
else
|
|
21
|
+
context.recorder.notice('adapter_manifest_unverified');
|
|
22
|
+
context.recorder.notice('custom_adapter_loaded');
|
|
23
|
+
return typeof dispose === 'function' ? dispose : () => { };
|
|
24
|
+
}
|
|
25
|
+
/** Record an explicit failure boundary without capturing messages, exceptions, or arguments. */
|
|
26
|
+
function markFailureBoundary() {
|
|
27
|
+
return getActiveRecorder()?.boundary('manual')?.id;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/runtime/api.ts"],"names":[],"mappings":";;;AAuCA,8CAEC;AACD,0CAUC;AAGD,kDAEC;AAnBY,QAAA,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AACzE,SAAgB,iBAAiB;IAC/B,OAAQ,UAAkD,CAAC,uBAAe,CAAC,CAAC;AAC9E,CAAC;AACD,SAAgB,eAAe,CAAC,OAA2B,EAAE,OAAuB;IAClF,IAAI,CAAC,OAAO,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAC3H,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;;QACnE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC;IAC5D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;IACjD,OAAO,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;AAC5D,CAAC;AAED,gGAAgG;AAChG,SAAgB,mBAAmB;IACjC,OAAO,iBAAiB,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.captureSite = captureSite;
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const node_url_1 = require("node:url");
|
|
9
|
+
const node_module_1 = require("node:module");
|
|
10
|
+
const ownRoot = node_path_1.default.resolve(__dirname, '..') + node_path_1.default.sep;
|
|
11
|
+
function captureSite(scrubber, sourceMaps) {
|
|
12
|
+
const prepare = Error.prepareStackTrace;
|
|
13
|
+
const limit = Error.stackTraceLimit;
|
|
14
|
+
try {
|
|
15
|
+
Error.stackTraceLimit = 40;
|
|
16
|
+
Error.prepareStackTrace = (_error, stack) => stack;
|
|
17
|
+
const holder = {};
|
|
18
|
+
Error.captureStackTrace(holder, captureSite);
|
|
19
|
+
const stack = holder.stack;
|
|
20
|
+
for (const frame of stack) {
|
|
21
|
+
let file = frame.getFileName();
|
|
22
|
+
if (!file)
|
|
23
|
+
continue;
|
|
24
|
+
if (file.startsWith('file://')) {
|
|
25
|
+
try {
|
|
26
|
+
file = (0, node_url_1.fileURLToPath)(file);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
if (file.startsWith('node:') || file.startsWith('internal/') || file.startsWith(ownRoot) || /[/\\]node_modules[/\\]dotenv[/\\]/.test(file))
|
|
33
|
+
continue;
|
|
34
|
+
const line = frame.getLineNumber() ?? undefined;
|
|
35
|
+
const column = frame.getColumnNumber() ?? undefined;
|
|
36
|
+
if (sourceMaps && line && column) {
|
|
37
|
+
try {
|
|
38
|
+
const entry = (0, node_module_1.findSourceMap)(file)?.findEntry(line - 1, column - 1);
|
|
39
|
+
if (entry && 'originalSource' in entry && 'originalLine' in entry && 'originalColumn' in entry
|
|
40
|
+
&& typeof entry.originalSource === 'string' && typeof entry.originalLine === 'number' && entry.originalLine >= 0) {
|
|
41
|
+
let original = entry.originalSource;
|
|
42
|
+
if (!original.startsWith('file://') && !node_path_1.default.isAbsolute(original))
|
|
43
|
+
original = node_path_1.default.resolve(node_path_1.default.dirname(file), original);
|
|
44
|
+
return { file: scrubber.scrub(original), line: entry.originalLine + 1, column: typeof entry.originalColumn === 'number' && entry.originalColumn >= 0 ? entry.originalColumn + 1 : undefined, mapping: 'source-map' };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch { /* Missing/malformed source maps never block the application. */ }
|
|
48
|
+
}
|
|
49
|
+
return { file: scrubber.scrub(file), line, column, mapping: sourceMaps ? 'unavailable' : 'generated' };
|
|
50
|
+
}
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
Error.prepareStackTrace = prepare;
|
|
58
|
+
Error.stackTraceLimit = limit;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=callsite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"callsite.js","sourceRoot":"","sources":["../../src/runtime/callsite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Recorder } from './recorder';
|
|
2
|
+
/**
|
|
3
|
+
* One contained normalized-spawn hook catches async spawn, execFile and fork, including
|
|
4
|
+
* promisified execFile, without rewriting their public overloads or callback contracts.
|
|
5
|
+
* This is a PRIVATE Node boundary: shape checks and the unverified support matrix matter.
|
|
6
|
+
* Sync launches, shell commands, detached processes and Workers are not injected.
|
|
7
|
+
*/
|
|
8
|
+
export declare function installChildren(recorder: Recorder, depth: number): () => void;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.installChildren = installChildren;
|
|
7
|
+
const node_child_process_1 = require("node:child_process");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const io_1 = require("../core/io");
|
|
10
|
+
/**
|
|
11
|
+
* One contained normalized-spawn hook catches async spawn, execFile and fork, including
|
|
12
|
+
* promisified execFile, without rewriting their public overloads or callback contracts.
|
|
13
|
+
* This is a PRIVATE Node boundary: shape checks and the unverified support matrix matter.
|
|
14
|
+
* Sync launches, shell commands, detached processes and Workers are not injected.
|
|
15
|
+
*/
|
|
16
|
+
function installChildren(recorder, depth) {
|
|
17
|
+
const proto = node_child_process_1.ChildProcess.prototype;
|
|
18
|
+
const original = proto.spawn;
|
|
19
|
+
let count = 0;
|
|
20
|
+
recorder.notice('sync_children_unobserved');
|
|
21
|
+
if (typeof original !== 'function') {
|
|
22
|
+
recorder.notice('child_shape_unsupported');
|
|
23
|
+
return () => { };
|
|
24
|
+
}
|
|
25
|
+
const hook = function (options) {
|
|
26
|
+
if (!options || typeof options.file !== 'string' || !Array.isArray(options.args) || !options.args.length || !options.args.every(x => typeof x === 'string') || !Array.isArray(options.envPairs) || !options.envPairs.every(x => typeof x === 'string')) {
|
|
27
|
+
recorder.notice('child_shape_unsupported');
|
|
28
|
+
return Reflect.apply(original, this, [options]);
|
|
29
|
+
}
|
|
30
|
+
const isNode = options.file === process.execPath || /^(node|node\.exe)$/i.test(options.file);
|
|
31
|
+
let reason;
|
|
32
|
+
if (!isNode)
|
|
33
|
+
reason = 'child_shell_or_non_node';
|
|
34
|
+
else if (options.detached)
|
|
35
|
+
reason = 'child_detached';
|
|
36
|
+
else if (!recorder.config.children)
|
|
37
|
+
reason = 'children_disabled';
|
|
38
|
+
else if (depth >= recorder.config.maxDepth)
|
|
39
|
+
reason = 'child_depth_limit';
|
|
40
|
+
else if (count >= recorder.config.maxChildren)
|
|
41
|
+
reason = 'child_count_limit';
|
|
42
|
+
if (reason) {
|
|
43
|
+
recorder.notice(reason);
|
|
44
|
+
return Reflect.apply(original, this, [options]);
|
|
45
|
+
}
|
|
46
|
+
count++;
|
|
47
|
+
const childId = (0, io_1.uniqueId)('p');
|
|
48
|
+
const envPairs = options.envPairs.filter(pair => !pair.toUpperCase().startsWith('__CONFIGTRACE_'));
|
|
49
|
+
envPairs.push(`__CONFIGTRACE_CONFIG=${recorder.config.configPath}`, `__CONFIGTRACE_INSTANCE=${childId}`, `__CONFIGTRACE_PARENT=${recorder.process.id}`, `__CONFIGTRACE_DEPTH=${depth + 1}`);
|
|
50
|
+
// A fork may already inherit our preload through execArgv. require caching prevents a second install.
|
|
51
|
+
const args = [...options.args];
|
|
52
|
+
const preload = node_path_1.default.resolve(recorder.config.preloadPath);
|
|
53
|
+
args.splice(1, 0, '--require', preload, ...(recorder.config.sourceMaps ? ['--enable-source-maps'] : []));
|
|
54
|
+
const prepared = { ...options, args, envPairs };
|
|
55
|
+
try {
|
|
56
|
+
const result = recorder.suppress(() => Reflect.apply(original, this, [prepared]));
|
|
57
|
+
recorder.child(childId, this.pid ? 'spawned' : 'spawn-failed');
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
recorder.child(childId, 'spawn-failed');
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
proto.spawn = hook;
|
|
66
|
+
return () => { if (proto.spawn === hook)
|
|
67
|
+
proto.spawn = original; };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"children.js","sourceRoot":"","sources":["../../src/runtime/children.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.installEnvironment = installEnvironment;
|
|
4
|
+
/** Delegate to the exotic original object: do not emulate Node's coercion or descriptors. */
|
|
5
|
+
function installEnvironment(recorder, original) {
|
|
6
|
+
const proxy = new Proxy(original, {
|
|
7
|
+
get(target, key) {
|
|
8
|
+
const value = Reflect.get(target, key, target);
|
|
9
|
+
if (typeof key === 'string' && (typeof value === 'string' || value === undefined))
|
|
10
|
+
recorder.observe('read', key, value);
|
|
11
|
+
return value;
|
|
12
|
+
},
|
|
13
|
+
set(target, key, value) {
|
|
14
|
+
const interested = !recorder.suppressed && recorder.watch.matches(key);
|
|
15
|
+
const before = interested ? Reflect.get(target, key, target) : undefined;
|
|
16
|
+
const result = Reflect.set(target, key, value, target);
|
|
17
|
+
if (result && interested && typeof key === 'string') {
|
|
18
|
+
recorder.observe('write', key, Reflect.get(target, key, target), { before, hasBefore: true, outcome: 'applied' });
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
},
|
|
22
|
+
deleteProperty(target, key) {
|
|
23
|
+
const interested = !recorder.suppressed && recorder.watch.matches(key);
|
|
24
|
+
const before = interested ? Reflect.get(target, key, target) : undefined;
|
|
25
|
+
const result = Reflect.deleteProperty(target, key);
|
|
26
|
+
if (result && interested && typeof key === 'string')
|
|
27
|
+
recorder.observe('delete', key, Reflect.get(target, key, target), { before, hasBefore: true });
|
|
28
|
+
return result;
|
|
29
|
+
},
|
|
30
|
+
defineProperty(target, key, descriptor) {
|
|
31
|
+
const interested = !recorder.suppressed && recorder.watch.matches(key);
|
|
32
|
+
const before = interested ? Reflect.get(target, key, target) : undefined;
|
|
33
|
+
const result = Reflect.defineProperty(target, key, descriptor);
|
|
34
|
+
if (result && interested && typeof key === 'string')
|
|
35
|
+
recorder.observe('write', key, Reflect.get(target, key, target), { before, hasBefore: true, outcome: 'applied' });
|
|
36
|
+
return result;
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
process.env = proxy;
|
|
40
|
+
const baseline = new Set([...recorder.watch.exact(), ...Object.keys(original).filter(k => recorder.watch.matches(k))]);
|
|
41
|
+
for (const key of baseline)
|
|
42
|
+
recorder.observe('baseline', key, original[key]);
|
|
43
|
+
recorder.notice('startup_history_unknown');
|
|
44
|
+
recorder.notice('original_reference_bypass');
|
|
45
|
+
recorder.notice('native_access_unobserved');
|
|
46
|
+
return () => {
|
|
47
|
+
if (process.env !== proxy)
|
|
48
|
+
recorder.notice('environment_replaced');
|
|
49
|
+
else
|
|
50
|
+
process.env = original;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/runtime/environment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
7
|
+
const node_worker_threads_1 = require("node:worker_threads");
|
|
8
|
+
const zod_1 = require("zod");
|
|
9
|
+
const schema_1 = require("../core/schema");
|
|
10
|
+
const io_1 = require("../core/io");
|
|
11
|
+
const recorder_1 = require("./recorder");
|
|
12
|
+
const environment_1 = require("./environment");
|
|
13
|
+
const dotenv_1 = require("../adapters/dotenv");
|
|
14
|
+
const children_1 = require("./children");
|
|
15
|
+
const native_env_1 = require("../adapters/native-env");
|
|
16
|
+
const workers_1 = require("./workers");
|
|
17
|
+
const api_1 = require("./api");
|
|
18
|
+
const SessionSchema = zod_1.z.object({
|
|
19
|
+
runId: zod_1.z.string().regex(/^[A-Za-z0-9_-]+$/), directory: zod_1.z.string().max(4096), root: zod_1.z.string().max(4096),
|
|
20
|
+
rootId: zod_1.z.string().regex(/^[A-Za-z0-9_-]+$/), watch: zod_1.z.array(zod_1.z.string().max(128)).min(1).max(64),
|
|
21
|
+
comparison: schema_1.KeyFileSchema, maxEvents: zod_1.z.number().int().min(10).max(100000),
|
|
22
|
+
maxBytes: zod_1.z.number().int().min(16384).max(8 * 1024 * 1024),
|
|
23
|
+
workers: zod_1.z.boolean(), maxWorkers: zod_1.z.number().int().min(1).max(32), nativeEnv: zod_1.z.boolean(),
|
|
24
|
+
children: zod_1.z.boolean(), maxDepth: zod_1.z.number().int().min(0).max(4), maxChildren: zod_1.z.number().int().min(1).max(16),
|
|
25
|
+
sourceMaps: zod_1.z.boolean(), dotenv: zod_1.z.boolean(), adapters: zod_1.z.array(zod_1.z.string().max(4096)).max(8),
|
|
26
|
+
preloadPath: zod_1.z.string().max(4096), configPath: zod_1.z.string().max(4096),
|
|
27
|
+
}).strict();
|
|
28
|
+
function start() {
|
|
29
|
+
const registry = globalThis;
|
|
30
|
+
if (node_worker_threads_1.isInternalThread || registry[api_1.ACTIVE_RECORDER])
|
|
31
|
+
return;
|
|
32
|
+
const originalEnv = process.env;
|
|
33
|
+
const worker = !node_worker_threads_1.isMainThread ? (0, workers_1.takeWorkerSession)() : undefined;
|
|
34
|
+
if (!node_worker_threads_1.isMainThread && !worker)
|
|
35
|
+
return;
|
|
36
|
+
const configPath = worker?.configPath || originalEnv.__CONFIGTRACE_CONFIG;
|
|
37
|
+
if (!configPath)
|
|
38
|
+
return; // A fork/Worker can inherit --require without a trace session.
|
|
39
|
+
const instanceId = worker?.id || originalEnv.__CONFIGTRACE_INSTANCE;
|
|
40
|
+
const parentId = worker?.parentId || originalEnv.__CONFIGTRACE_PARENT;
|
|
41
|
+
const depth = worker?.depth ?? Number(originalEnv.__CONFIGTRACE_DEPTH || '0');
|
|
42
|
+
if (node_worker_threads_1.isMainThread)
|
|
43
|
+
for (const key of ['__CONFIGTRACE_CONFIG', '__CONFIGTRACE_INSTANCE', '__CONFIGTRACE_PARENT', '__CONFIGTRACE_DEPTH'])
|
|
44
|
+
delete originalEnv[key];
|
|
45
|
+
let recorder;
|
|
46
|
+
const cleanups = [];
|
|
47
|
+
try {
|
|
48
|
+
const config = SessionSchema.parse(JSON.parse((0, io_1.readBounded)(configPath, 65536)));
|
|
49
|
+
const id = instanceId || config.rootId;
|
|
50
|
+
if (!/^[A-Za-z0-9_-]{1,80}$/.test(id) || (parentId && !/^[A-Za-z0-9_-]{1,80}$/.test(parentId)) || !Number.isInteger(depth) || depth < 0 || depth > 4)
|
|
51
|
+
return;
|
|
52
|
+
recorder = new recorder_1.Recorder(config, id, parentId, worker ? { threadId: node_worker_threads_1.threadId, environmentMode: worker.environmentMode } : undefined);
|
|
53
|
+
const active = recorder;
|
|
54
|
+
registry[api_1.ACTIVE_RECORDER] = active;
|
|
55
|
+
active.notice('capture_unverified');
|
|
56
|
+
active.notice('early_preloads_possible');
|
|
57
|
+
if (worker)
|
|
58
|
+
active.notice('worker_attached');
|
|
59
|
+
if (worker?.environmentMode === 'shared')
|
|
60
|
+
active.notice('worker_shared_env');
|
|
61
|
+
active.notice(config.sourceMaps ? 'source_maps_requested' : 'source_maps_opt_in');
|
|
62
|
+
active.notice(config.children ? 'children_opt_in' : 'children_disabled');
|
|
63
|
+
cleanups.push((0, environment_1.installEnvironment)(active, originalEnv));
|
|
64
|
+
cleanups.push((0, children_1.installChildren)(active, depth));
|
|
65
|
+
cleanups.push((0, workers_1.installWorkers)(active, depth));
|
|
66
|
+
if (config.nativeEnv)
|
|
67
|
+
cleanups.push((0, native_env_1.installNativeEnv)({ recorder: active, originalEnv, root: config.root }));
|
|
68
|
+
else
|
|
69
|
+
active.notice('native_env_disabled');
|
|
70
|
+
const onFailure = () => { active.boundary('uncaught-exception'); };
|
|
71
|
+
process.on('uncaughtExceptionMonitor', onFailure);
|
|
72
|
+
cleanups.push(() => { process.removeListener('uncaughtExceptionMonitor', onFailure); });
|
|
73
|
+
if (config.dotenv)
|
|
74
|
+
cleanups.push((0, dotenv_1.installDotenv)({ recorder: active, originalEnv, root: config.root }));
|
|
75
|
+
for (const adapterPath of config.adapters) {
|
|
76
|
+
try {
|
|
77
|
+
const loaded = active.suppress(() => require(adapterPath));
|
|
78
|
+
const adapter = 'default' in loaded ? loaded.default : loaded;
|
|
79
|
+
cleanups.push((0, api_1.registerAdapter)(adapter, { recorder: active, originalEnv, root: config.root }));
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
active.notice('adapter_failed');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
process.once('exit', code => {
|
|
86
|
+
active.suppress(() => {
|
|
87
|
+
for (const cleanup of cleanups.reverse()) {
|
|
88
|
+
try {
|
|
89
|
+
cleanup();
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
active.notice('adapter_failed');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
active.finish(code);
|
|
97
|
+
delete registry[api_1.ACTIVE_RECORDER];
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
recorder?.notice('recorder_failed');
|
|
102
|
+
for (const cleanup of cleanups.reverse()) {
|
|
103
|
+
try {
|
|
104
|
+
cleanup();
|
|
105
|
+
}
|
|
106
|
+
catch { /* no raw error logging */ }
|
|
107
|
+
}
|
|
108
|
+
recorder?.finish(0);
|
|
109
|
+
delete registry[api_1.ACTIVE_RECORDER];
|
|
110
|
+
try {
|
|
111
|
+
node_fs_1.default.writeSync(2, '[configtrace] Recorder unavailable; application continues without full evidence.\n');
|
|
112
|
+
}
|
|
113
|
+
catch { /* stdio may be closed */ }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
start();
|
|
117
|
+
//# sourceMappingURL=preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preload.js","sourceRoot":"","sources":["../../src/runtime/preload.ts"],"names":[],"mappings":"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"}
|