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,181 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KeyFileSchema = exports.StreamRecordSchema = exports.TraceSchema = exports.AdapterDeclarationSchema = exports.AdapterManifestSchema = exports.ProcessSchema = exports.EventSchema = exports.CoverageSchema = exports.NoticeSchema = exports.OriginSchema = exports.SiteSchema = exports.ValueSchema = exports.MAX_PROCESSES = exports.MAX_EVENTS = exports.MAX_ARTIFACT_BYTES = exports.SCHEMA_VERSION = exports.TOOL_VERSION = void 0;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
exports.TOOL_VERSION = '0.3.0';
|
|
6
|
+
exports.SCHEMA_VERSION = 'configtrace/2';
|
|
7
|
+
exports.MAX_ARTIFACT_BYTES = 64 * 1024 * 1024;
|
|
8
|
+
exports.MAX_EVENTS = 100_000;
|
|
9
|
+
exports.MAX_PROCESSES = 64;
|
|
10
|
+
const id = zod_1.z.string().regex(/^[A-Za-z0-9_-]{1,80}$/);
|
|
11
|
+
const text = zod_1.z.string().max(512);
|
|
12
|
+
const token = zod_1.z.string().regex(/^[a-f0-9]{64}$/);
|
|
13
|
+
exports.ValueSchema = zod_1.z.discriminatedUnion('state', [
|
|
14
|
+
zod_1.z.object({ state: zod_1.z.literal('present'), token, empty: zod_1.z.boolean().optional() }).strict(),
|
|
15
|
+
zod_1.z.object({ state: zod_1.z.literal('missing') }).strict(),
|
|
16
|
+
zod_1.z.object({ state: zod_1.z.literal('omitted') }).strict(),
|
|
17
|
+
]);
|
|
18
|
+
exports.SiteSchema = zod_1.z.object({
|
|
19
|
+
file: text, line: zod_1.z.number().int().positive().optional(),
|
|
20
|
+
column: zod_1.z.number().int().positive().optional(),
|
|
21
|
+
mapping: zod_1.z.enum(['source-map', 'generated', 'unavailable']),
|
|
22
|
+
}).strict();
|
|
23
|
+
exports.OriginSchema = zod_1.z.object({
|
|
24
|
+
kind: zod_1.z.enum(['startup', 'runtime', 'dotenv', 'native-env', 'adapter', 'unknown']),
|
|
25
|
+
confidence: zod_1.z.enum(['observed', 'derived', 'inferred', 'unknown']),
|
|
26
|
+
file: text.optional(), adapterId: id.optional(),
|
|
27
|
+
}).strict();
|
|
28
|
+
exports.NoticeSchema = zod_1.z.enum([
|
|
29
|
+
'startup_history_unknown', 'native_access_unobserved', 'workers_unsupported',
|
|
30
|
+
'original_reference_bypass', 'environment_replaced', 'early_preloads_possible',
|
|
31
|
+
'events_dropped', 'event_limit', 'byte_limit', 'key_limit', 'recorder_failed', 'missing_footer',
|
|
32
|
+
'invalid_stream', 'process_limit', 'aggregate_limit', 'child_outlived_root',
|
|
33
|
+
'children_disabled', 'children_opt_in', 'child_depth_limit', 'child_count_limit',
|
|
34
|
+
'child_shape_unsupported', 'child_shell_or_non_node', 'child_detached',
|
|
35
|
+
'sync_children_unobserved', 'dotenv_not_seen', 'dotenv_attached',
|
|
36
|
+
'dotenv_version_unverified', 'dotenv_custom_target', 'dotenv_source_unknown',
|
|
37
|
+
'dotenv_options_unsupported', 'dotenv_eager_load', 'adapter_failed',
|
|
38
|
+
'source_maps_opt_in', 'source_maps_requested', 'source_map_unavailable',
|
|
39
|
+
'custom_adapter_loaded', 'capture_unverified', 'metadata_scrubbed',
|
|
40
|
+
'comparison_removed', 'loader_details_removed', 'call_sites_removed',
|
|
41
|
+
'native_env_attached', 'native_env_disabled', 'native_env_unavailable', 'native_env_early',
|
|
42
|
+
'native_env_candidates_inferred', 'native_env_candidates_unavailable', 'native_env_file_changed',
|
|
43
|
+
'workers_opt_in', 'workers_disabled', 'worker_attached', 'worker_shared_env',
|
|
44
|
+
'worker_shape_unsupported', 'worker_depth_limit', 'worker_count_limit', 'worker_unconfirmed',
|
|
45
|
+
'worker_outlived_root', 'adapter_manifest_unverified', 'failure_boundary_recorded',
|
|
46
|
+
]);
|
|
47
|
+
exports.CoverageSchema = zod_1.z.object({
|
|
48
|
+
feature: zod_1.z.enum(['environment', 'startup', 'dotenv', 'source-maps', 'children', 'native', 'native-env', 'workers', 'adapters']),
|
|
49
|
+
status: zod_1.z.enum(['active', 'limited', 'not-observed', 'unsupported']),
|
|
50
|
+
reasons: zod_1.z.array(exports.NoticeSchema).max(64),
|
|
51
|
+
}).strict();
|
|
52
|
+
exports.EventSchema = zod_1.z.object({
|
|
53
|
+
id: zod_1.z.string().regex(/^[A-Za-z0-9_:-]{1,100}$/),
|
|
54
|
+
processId: id,
|
|
55
|
+
seq: zod_1.z.number().int().nonnegative(),
|
|
56
|
+
at: zod_1.z.number().finite().nonnegative(),
|
|
57
|
+
operation: zod_1.z.enum(['baseline', 'read', 'write', 'delete', 'candidate', 'skip', 'load', 'child-spawn', 'worker-spawn', 'boundary']),
|
|
58
|
+
key: zod_1.z.string().max(128).optional(),
|
|
59
|
+
value: exports.ValueSchema.optional(),
|
|
60
|
+
before: exports.ValueSchema.optional(),
|
|
61
|
+
candidate: exports.ValueSchema.optional(),
|
|
62
|
+
site: exports.SiteSchema.optional(),
|
|
63
|
+
origin: exports.OriginSchema.optional(),
|
|
64
|
+
causedBy: zod_1.z.string().max(100).optional(),
|
|
65
|
+
purpose: zod_1.z.enum(['application', 'loader']).optional(),
|
|
66
|
+
outcome: zod_1.z.enum(['applied', 'not-applied', 'read-success', 'read-failed', 'spawned', 'spawn-failed', 'declared']).optional(),
|
|
67
|
+
childId: id.optional(),
|
|
68
|
+
environmentMode: zod_1.z.enum(['copied', 'explicit', 'shared', 'unknown']).optional(),
|
|
69
|
+
phase: zod_1.z.enum(['startup', 'runtime']).optional(),
|
|
70
|
+
loaderMethod: zod_1.z.enum(['process.loadEnvFile', '--env-file', '--env-file-if-exists']).optional(),
|
|
71
|
+
boundaryKind: zod_1.z.enum(['manual', 'uncaught-exception']).optional(),
|
|
72
|
+
}).strict().superRefine((event, ctx) => {
|
|
73
|
+
if (!['load', 'child-spawn', 'worker-spawn', 'boundary'].includes(event.operation) && (!event.key || !event.value)) {
|
|
74
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Key operations require a key and masked value' });
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
exports.ProcessSchema = zod_1.z.object({
|
|
78
|
+
id, parentId: id.optional(), role: zod_1.z.enum(['root', 'child', 'worker']),
|
|
79
|
+
threadId: zod_1.z.number().int().nonnegative().optional(),
|
|
80
|
+
environmentMode: zod_1.z.enum(['copied', 'explicit', 'shared', 'unknown']).optional(),
|
|
81
|
+
caseMode: zod_1.z.enum(['sensitive', 'insensitive']).optional(),
|
|
82
|
+
pid: zod_1.z.number().int().positive().nullable(), ppid: zod_1.z.number().int().nonnegative().nullable(),
|
|
83
|
+
node: zod_1.z.string().max(32), platform: zod_1.z.string().max(32),
|
|
84
|
+
entry: text, startedAt: zod_1.z.string().max(40).optional(),
|
|
85
|
+
ended: zod_1.z.boolean(), exitCode: zod_1.z.number().int().nullable(),
|
|
86
|
+
eventsDropped: zod_1.z.number().int().nonnegative(),
|
|
87
|
+
}).strict();
|
|
88
|
+
exports.AdapterManifestSchema = zod_1.z.object({
|
|
89
|
+
id, supportedVersions: zod_1.z.string().max(160),
|
|
90
|
+
capabilities: zod_1.z.array(zod_1.z.string().max(100)).max(16),
|
|
91
|
+
evidenceTypes: zod_1.z.array(zod_1.z.string().max(64)).max(16),
|
|
92
|
+
knownBypasses: zod_1.z.array(zod_1.z.string().max(256)).max(16),
|
|
93
|
+
confidenceRules: zod_1.z.array(zod_1.z.string().max(256)).max(16),
|
|
94
|
+
}).strict();
|
|
95
|
+
exports.AdapterDeclarationSchema = zod_1.z.object({
|
|
96
|
+
processId: id, manifest: exports.AdapterManifestSchema,
|
|
97
|
+
installedVersion: zod_1.z.string().max(80).optional(),
|
|
98
|
+
validation: zod_1.z.literal('unverified'),
|
|
99
|
+
}).strict();
|
|
100
|
+
exports.TraceSchema = zod_1.z.object({
|
|
101
|
+
schemaVersion: zod_1.z.enum(['configtrace/1', 'configtrace/2']), toolVersion: zod_1.z.enum(['0.2.0', '0.3.0']),
|
|
102
|
+
id,
|
|
103
|
+
comparison: zod_1.z.object({
|
|
104
|
+
domainId: id, mode: zod_1.z.enum(['hmac-sha256', 'export-hmac', 'none']),
|
|
105
|
+
}).strict(),
|
|
106
|
+
capture: zod_1.z.object({
|
|
107
|
+
status: zod_1.z.enum(['complete', 'partial', 'failed']),
|
|
108
|
+
watch: zod_1.z.array(zod_1.z.string().max(128)).max(256),
|
|
109
|
+
caseMode: zod_1.z.enum(['sensitive', 'insensitive']),
|
|
110
|
+
maxEventsPerProcess: zod_1.z.number().int().positive().max(exports.MAX_EVENTS),
|
|
111
|
+
notices: zod_1.z.array(exports.NoticeSchema).max(128),
|
|
112
|
+
}).strict(),
|
|
113
|
+
result: zod_1.z.object({
|
|
114
|
+
exitCode: zod_1.z.number().int().nullable(), signal: zod_1.z.string().max(32).nullable(),
|
|
115
|
+
}).strict(),
|
|
116
|
+
processes: zod_1.z.array(exports.ProcessSchema).max(exports.MAX_PROCESSES),
|
|
117
|
+
coverage: zod_1.z.array(exports.CoverageSchema).max(16),
|
|
118
|
+
events: zod_1.z.array(exports.EventSchema).max(exports.MAX_EVENTS),
|
|
119
|
+
exported: zod_1.z.boolean(),
|
|
120
|
+
adapters: zod_1.z.array(exports.AdapterDeclarationSchema).max(512).optional(),
|
|
121
|
+
}).strict().superRefine((trace, ctx) => {
|
|
122
|
+
const processes = new Set(trace.processes.map(p => p.id));
|
|
123
|
+
const seen = new Map();
|
|
124
|
+
const sequence = new Map();
|
|
125
|
+
if (processes.size !== trace.processes.length) {
|
|
126
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Duplicate process identifier' });
|
|
127
|
+
}
|
|
128
|
+
if (trace.processes.filter(p => p.role === 'root').length > 1) {
|
|
129
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Multiple root processes' });
|
|
130
|
+
}
|
|
131
|
+
const byId = new Map(trace.processes.map(p => [p.id, p]));
|
|
132
|
+
for (const p of trace.processes) {
|
|
133
|
+
const ancestors = new Set([p.id]);
|
|
134
|
+
let parent = p.parentId;
|
|
135
|
+
while (parent) {
|
|
136
|
+
if (ancestors.has(parent)) {
|
|
137
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Cyclic process ancestry' });
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
ancestors.add(parent);
|
|
141
|
+
parent = byId.get(parent)?.parentId;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
for (const a of trace.adapters || [])
|
|
145
|
+
if (!processes.has(a.processId)) {
|
|
146
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Adapter process is absent' });
|
|
147
|
+
}
|
|
148
|
+
for (const e of trace.events) {
|
|
149
|
+
if (!processes.has(e.processId) || seen.has(e.id) || e.seq <= (sequence.get(e.processId) ?? -1)) {
|
|
150
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Invalid event identity or sequence' });
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
if (['child-spawn', 'worker-spawn'].includes(e.operation) && e.childId) {
|
|
154
|
+
const child = byId.get(e.childId);
|
|
155
|
+
if (child && (child.parentId !== e.processId || child.role !== (e.operation === 'worker-spawn' ? 'worker' : 'child'))) {
|
|
156
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Spawn evidence contradicts execution-context ancestry' });
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (e.causedBy) {
|
|
161
|
+
const cause = seen.get(e.causedBy);
|
|
162
|
+
if (!cause || cause.processId !== e.processId || cause.key !== e.key) {
|
|
163
|
+
ctx.addIssue({ code: zod_1.z.ZodIssueCode.custom, message: 'Invalid evidence link' });
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
seen.set(e.id, e);
|
|
168
|
+
sequence.set(e.processId, e.seq);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
exports.StreamRecordSchema = zod_1.z.discriminatedUnion('type', [
|
|
172
|
+
zod_1.z.object({ type: zod_1.z.literal('start'), process: exports.ProcessSchema }).strict(),
|
|
173
|
+
zod_1.z.object({ type: zod_1.z.literal('event'), event: exports.EventSchema }).strict(),
|
|
174
|
+
zod_1.z.object({ type: zod_1.z.literal('adapter'), declaration: exports.AdapterDeclarationSchema }).strict(),
|
|
175
|
+
zod_1.z.object({ type: zod_1.z.literal('notice'), notice: exports.NoticeSchema }).strict(),
|
|
176
|
+
zod_1.z.object({ type: zod_1.z.literal('end'), exitCode: zod_1.z.number().int(), eventsDropped: zod_1.z.number().int().nonnegative() }).strict(),
|
|
177
|
+
]);
|
|
178
|
+
exports.KeyFileSchema = zod_1.z.object({
|
|
179
|
+
version: zod_1.z.literal(1), domainId: id, secret: token,
|
|
180
|
+
}).strict();
|
|
181
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/demo.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function createDemo(destination?: string): Promise<string>;
|
package/dist/demo.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
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.createDemo = createDemo;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const node_module_1 = require("node:module");
|
|
10
|
+
const launcher_1 = require("./launcher");
|
|
11
|
+
const io_1 = require("./core/io");
|
|
12
|
+
const privacy_1 = require("./core/privacy");
|
|
13
|
+
const html_1 = require("./report/html");
|
|
14
|
+
const analyze_1 = require("./core/analyze");
|
|
15
|
+
async function createDemo(destination) {
|
|
16
|
+
const root = destination ? node_path_1.default.resolve(destination) : node_path_1.default.resolve('.configtrace', `demo-${Date.now()}`);
|
|
17
|
+
let dotenv;
|
|
18
|
+
try {
|
|
19
|
+
dotenv = (0, node_module_1.createRequire)(__filename).resolve('dotenv');
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
throw new io_1.UserError('The demo needs dotenv. Run npm install in the ConfigTrace source checkout first.');
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
node_fs_1.default.mkdirSync(node_path_1.default.dirname(root), { recursive: true, mode: 0o700 });
|
|
26
|
+
node_fs_1.default.mkdirSync(root, { mode: 0o700 });
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new io_1.UserError('The demo output must be a new writable directory.');
|
|
30
|
+
}
|
|
31
|
+
(0, io_1.writeNew)(node_path_1.default.join(root, 'sample.env'), 'DATABASE_URL=postgres://demo:synthetic-only@localhost/new\n');
|
|
32
|
+
(0, io_1.writeNew)(node_path_1.default.join(root, 'app.cjs'), `const dotenv = require(${JSON.stringify(dotenv)});\ndotenv.config({ path: require('node:path').join(__dirname, 'sample.env'), quiet: true });\nconst value = process.env.DATABASE_URL;\nconsole.log(value.endsWith('/old') ? 'Using the stale synthetic database.' : 'Using the intended synthetic database.');\n`);
|
|
33
|
+
const keyFile = node_path_1.default.join(root, 'pair.key.json');
|
|
34
|
+
(0, privacy_1.writeComparisonKey)(keyFile);
|
|
35
|
+
const baseEnv = { ...process.env };
|
|
36
|
+
for (const name of Object.keys(baseEnv))
|
|
37
|
+
if (name.toUpperCase() === 'DATABASE_URL')
|
|
38
|
+
delete baseEnv[name];
|
|
39
|
+
const common = { command: [process.execPath, node_path_1.default.join(root, 'app.cjs')], cwd: root, watch: ['DATABASE_URL'], keyFile };
|
|
40
|
+
const bad = await (0, launcher_1.run)({ ...common, env: { ...baseEnv, DATABASE_URL: 'postgres://demo:synthetic-only@localhost/old' }, out: node_path_1.default.join(root, 'bad.ct.json') });
|
|
41
|
+
const good = await (0, launcher_1.run)({ ...common, env: baseEnv, out: node_path_1.default.join(root, 'good.ct.json') });
|
|
42
|
+
(0, io_1.writeNew)(node_path_1.default.join(root, 'comparison.html'), (0, html_1.renderDiffHtml)(bad.trace, good.trace, (0, analyze_1.diffTraces)(bad.trace, good.trace)));
|
|
43
|
+
return root;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=demo.js.map
|
package/dist/demo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo.js","sourceRoot":"","sources":["../src/demo.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export { run, type RunOptions, type RunResult } from './launcher';
|
|
2
|
+
export { readTrace, writeTrace, UserError } from './core/io';
|
|
3
|
+
export { TraceSchema, EventSchema, ValueSchema, SCHEMA_VERSION, TOOL_VERSION } from './core/schema';
|
|
4
|
+
export type { Trace, Observation, SafeValue, Origin, Coverage, ProcessInfo, ComparisonKey } from './core/schema';
|
|
5
|
+
export { createComparisonKey, writeComparisonKey, readComparisonKey } from './core/privacy';
|
|
6
|
+
export { evidenceFor, explainText, diffTraces, diffText, compareValue } from './core/analyze';
|
|
7
|
+
export type { TraceDiff, KeyEvidence, Equality, DiffRow } from './core/analyze';
|
|
8
|
+
export { renderTraceHtml, renderDiffHtml } from './report/html';
|
|
9
|
+
export { readExportPolicy, sanitizeTraces, exportArtifacts, ExportPolicySchema, type ExportPolicy } from './core/export';
|
|
10
|
+
export { getActiveRecorder, type ConfigTraceAdapter, type AdapterContext } from './runtime/api';
|
|
11
|
+
export { buildProvenance } from './analysis/provenance';
|
|
12
|
+
export type { ProvenanceGraph, ProvenanceNode, ProvenanceEdge, ProvenanceOptions, EvidenceConfidence } from './analysis/provenance';
|
|
13
|
+
export { diagnoseTraces, diagnosisText } from './analysis/diagnose';
|
|
14
|
+
export type { Diagnosis, DiagnosisFinding, DiagnosisOptions } from './analysis/diagnose';
|
|
15
|
+
export { verifyTrace, verificationText, readVerificationPolicy, VerificationPolicySchema } from './analysis/policy';
|
|
16
|
+
export type { VerificationPolicy, VerificationResult, VerificationCheck } from './analysis/policy';
|
|
17
|
+
export { analyzeHistory, readHistory, addHistory, historyText } from './analysis/history';
|
|
18
|
+
export type { HistoryAnalysis, HistoryEntry, DriftChange } from './analysis/history';
|
|
19
|
+
export { adapterCatalog, DOTENV_MANIFEST, NATIVE_ENV_MANIFEST } from './adapters/registry';
|
|
20
|
+
export { AdapterManifestSchema } from './core/schema';
|
|
21
|
+
export type { AdapterManifest, AdapterDeclaration } from './core/schema';
|
|
22
|
+
export { markFailureBoundary } from './runtime/api';
|
|
23
|
+
export { EvidenceMcpServer, loadAuthorizedTraces, serveMcp } from './agent/server';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.serveMcp = exports.loadAuthorizedTraces = exports.EvidenceMcpServer = exports.markFailureBoundary = exports.AdapterManifestSchema = exports.NATIVE_ENV_MANIFEST = exports.DOTENV_MANIFEST = exports.adapterCatalog = exports.historyText = exports.addHistory = exports.readHistory = exports.analyzeHistory = exports.VerificationPolicySchema = exports.readVerificationPolicy = exports.verificationText = exports.verifyTrace = exports.diagnosisText = exports.diagnoseTraces = exports.buildProvenance = exports.getActiveRecorder = exports.ExportPolicySchema = exports.exportArtifacts = exports.sanitizeTraces = exports.readExportPolicy = exports.renderDiffHtml = exports.renderTraceHtml = exports.compareValue = exports.diffText = exports.diffTraces = exports.explainText = exports.evidenceFor = exports.readComparisonKey = exports.writeComparisonKey = exports.createComparisonKey = exports.TOOL_VERSION = exports.SCHEMA_VERSION = exports.ValueSchema = exports.EventSchema = exports.TraceSchema = exports.UserError = exports.writeTrace = exports.readTrace = exports.run = void 0;
|
|
4
|
+
var launcher_1 = require("./launcher");
|
|
5
|
+
Object.defineProperty(exports, "run", { enumerable: true, get: function () { return launcher_1.run; } });
|
|
6
|
+
var io_1 = require("./core/io");
|
|
7
|
+
Object.defineProperty(exports, "readTrace", { enumerable: true, get: function () { return io_1.readTrace; } });
|
|
8
|
+
Object.defineProperty(exports, "writeTrace", { enumerable: true, get: function () { return io_1.writeTrace; } });
|
|
9
|
+
Object.defineProperty(exports, "UserError", { enumerable: true, get: function () { return io_1.UserError; } });
|
|
10
|
+
var schema_1 = require("./core/schema");
|
|
11
|
+
Object.defineProperty(exports, "TraceSchema", { enumerable: true, get: function () { return schema_1.TraceSchema; } });
|
|
12
|
+
Object.defineProperty(exports, "EventSchema", { enumerable: true, get: function () { return schema_1.EventSchema; } });
|
|
13
|
+
Object.defineProperty(exports, "ValueSchema", { enumerable: true, get: function () { return schema_1.ValueSchema; } });
|
|
14
|
+
Object.defineProperty(exports, "SCHEMA_VERSION", { enumerable: true, get: function () { return schema_1.SCHEMA_VERSION; } });
|
|
15
|
+
Object.defineProperty(exports, "TOOL_VERSION", { enumerable: true, get: function () { return schema_1.TOOL_VERSION; } });
|
|
16
|
+
var privacy_1 = require("./core/privacy");
|
|
17
|
+
Object.defineProperty(exports, "createComparisonKey", { enumerable: true, get: function () { return privacy_1.createComparisonKey; } });
|
|
18
|
+
Object.defineProperty(exports, "writeComparisonKey", { enumerable: true, get: function () { return privacy_1.writeComparisonKey; } });
|
|
19
|
+
Object.defineProperty(exports, "readComparisonKey", { enumerable: true, get: function () { return privacy_1.readComparisonKey; } });
|
|
20
|
+
var analyze_1 = require("./core/analyze");
|
|
21
|
+
Object.defineProperty(exports, "evidenceFor", { enumerable: true, get: function () { return analyze_1.evidenceFor; } });
|
|
22
|
+
Object.defineProperty(exports, "explainText", { enumerable: true, get: function () { return analyze_1.explainText; } });
|
|
23
|
+
Object.defineProperty(exports, "diffTraces", { enumerable: true, get: function () { return analyze_1.diffTraces; } });
|
|
24
|
+
Object.defineProperty(exports, "diffText", { enumerable: true, get: function () { return analyze_1.diffText; } });
|
|
25
|
+
Object.defineProperty(exports, "compareValue", { enumerable: true, get: function () { return analyze_1.compareValue; } });
|
|
26
|
+
var html_1 = require("./report/html");
|
|
27
|
+
Object.defineProperty(exports, "renderTraceHtml", { enumerable: true, get: function () { return html_1.renderTraceHtml; } });
|
|
28
|
+
Object.defineProperty(exports, "renderDiffHtml", { enumerable: true, get: function () { return html_1.renderDiffHtml; } });
|
|
29
|
+
var export_1 = require("./core/export");
|
|
30
|
+
Object.defineProperty(exports, "readExportPolicy", { enumerable: true, get: function () { return export_1.readExportPolicy; } });
|
|
31
|
+
Object.defineProperty(exports, "sanitizeTraces", { enumerable: true, get: function () { return export_1.sanitizeTraces; } });
|
|
32
|
+
Object.defineProperty(exports, "exportArtifacts", { enumerable: true, get: function () { return export_1.exportArtifacts; } });
|
|
33
|
+
Object.defineProperty(exports, "ExportPolicySchema", { enumerable: true, get: function () { return export_1.ExportPolicySchema; } });
|
|
34
|
+
var api_1 = require("./runtime/api");
|
|
35
|
+
Object.defineProperty(exports, "getActiveRecorder", { enumerable: true, get: function () { return api_1.getActiveRecorder; } });
|
|
36
|
+
var provenance_1 = require("./analysis/provenance");
|
|
37
|
+
Object.defineProperty(exports, "buildProvenance", { enumerable: true, get: function () { return provenance_1.buildProvenance; } });
|
|
38
|
+
var diagnose_1 = require("./analysis/diagnose");
|
|
39
|
+
Object.defineProperty(exports, "diagnoseTraces", { enumerable: true, get: function () { return diagnose_1.diagnoseTraces; } });
|
|
40
|
+
Object.defineProperty(exports, "diagnosisText", { enumerable: true, get: function () { return diagnose_1.diagnosisText; } });
|
|
41
|
+
var policy_1 = require("./analysis/policy");
|
|
42
|
+
Object.defineProperty(exports, "verifyTrace", { enumerable: true, get: function () { return policy_1.verifyTrace; } });
|
|
43
|
+
Object.defineProperty(exports, "verificationText", { enumerable: true, get: function () { return policy_1.verificationText; } });
|
|
44
|
+
Object.defineProperty(exports, "readVerificationPolicy", { enumerable: true, get: function () { return policy_1.readVerificationPolicy; } });
|
|
45
|
+
Object.defineProperty(exports, "VerificationPolicySchema", { enumerable: true, get: function () { return policy_1.VerificationPolicySchema; } });
|
|
46
|
+
var history_1 = require("./analysis/history");
|
|
47
|
+
Object.defineProperty(exports, "analyzeHistory", { enumerable: true, get: function () { return history_1.analyzeHistory; } });
|
|
48
|
+
Object.defineProperty(exports, "readHistory", { enumerable: true, get: function () { return history_1.readHistory; } });
|
|
49
|
+
Object.defineProperty(exports, "addHistory", { enumerable: true, get: function () { return history_1.addHistory; } });
|
|
50
|
+
Object.defineProperty(exports, "historyText", { enumerable: true, get: function () { return history_1.historyText; } });
|
|
51
|
+
var registry_1 = require("./adapters/registry");
|
|
52
|
+
Object.defineProperty(exports, "adapterCatalog", { enumerable: true, get: function () { return registry_1.adapterCatalog; } });
|
|
53
|
+
Object.defineProperty(exports, "DOTENV_MANIFEST", { enumerable: true, get: function () { return registry_1.DOTENV_MANIFEST; } });
|
|
54
|
+
Object.defineProperty(exports, "NATIVE_ENV_MANIFEST", { enumerable: true, get: function () { return registry_1.NATIVE_ENV_MANIFEST; } });
|
|
55
|
+
var schema_2 = require("./core/schema");
|
|
56
|
+
Object.defineProperty(exports, "AdapterManifestSchema", { enumerable: true, get: function () { return schema_2.AdapterManifestSchema; } });
|
|
57
|
+
var api_2 = require("./runtime/api");
|
|
58
|
+
Object.defineProperty(exports, "markFailureBoundary", { enumerable: true, get: function () { return api_2.markFailureBoundary; } });
|
|
59
|
+
var server_1 = require("./agent/server");
|
|
60
|
+
Object.defineProperty(exports, "EvidenceMcpServer", { enumerable: true, get: function () { return server_1.EvidenceMcpServer; } });
|
|
61
|
+
Object.defineProperty(exports, "loadAuthorizedTraces", { enumerable: true, get: function () { return server_1.loadAuthorizedTraces; } });
|
|
62
|
+
Object.defineProperty(exports, "serveMcp", { enumerable: true, get: function () { return server_1.serveMcp; } });
|
|
63
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,uCAAkE;AAAzD,+FAAA,GAAG,OAAA;AACZ,gCAA6D;AAApD,+FAAA,SAAS,OAAA;AAAE,gGAAA,UAAU,OAAA;AAAE,+FAAA,SAAS,OAAA;AACzC,wCAAoG;AAA3F,qGAAA,WAAW,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,qGAAA,WAAW,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,sGAAA,YAAY,OAAA;AAE5E,0CAA4F;AAAnF,8GAAA,mBAAmB,OAAA;AAAE,6GAAA,kBAAkB,OAAA;AAAE,4GAAA,iBAAiB,OAAA;AACnE,0CAA8F;AAArF,sGAAA,WAAW,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,mGAAA,QAAQ,OAAA;AAAE,uGAAA,YAAY,OAAA;AAErE,sCAAgE;AAAvD,uGAAA,eAAe,OAAA;AAAE,sGAAA,cAAc,OAAA;AACxC,wCAAyH;AAAhH,0GAAA,gBAAgB,OAAA;AAAE,wGAAA,cAAc,OAAA;AAAE,yGAAA,eAAe,OAAA;AAAE,4GAAA,kBAAkB,OAAA;AAC9E,qCAAgG;AAAvF,wGAAA,iBAAiB,OAAA;AAC1B,oDAAwD;AAA/C,6GAAA,eAAe,OAAA;AAExB,gDAAoE;AAA3D,0GAAA,cAAc,OAAA;AAAE,yGAAA,aAAa,OAAA;AAEtC,4CAAoH;AAA3G,qGAAA,WAAW,OAAA;AAAE,0GAAA,gBAAgB,OAAA;AAAE,gHAAA,sBAAsB,OAAA;AAAE,kHAAA,wBAAwB,OAAA;AAExF,8CAA0F;AAAjF,yGAAA,cAAc,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,qGAAA,UAAU,OAAA;AAAE,sGAAA,WAAW,OAAA;AAE7D,gDAA2F;AAAlF,0GAAA,cAAc,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAC7D,wCAAsD;AAA7C,+GAAA,qBAAqB,OAAA;AAE9B,qCAAoD;AAA3C,0GAAA,mBAAmB,OAAA;AAC5B,yCAAmF;AAA1E,2GAAA,iBAAiB,OAAA;AAAE,8GAAA,oBAAoB,OAAA;AAAE,kGAAA,QAAQ,OAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Trace } from './core/schema';
|
|
2
|
+
export interface RunOptions {
|
|
3
|
+
command: string[];
|
|
4
|
+
watch: string[];
|
|
5
|
+
out: string;
|
|
6
|
+
cwd?: string;
|
|
7
|
+
keyFile?: string;
|
|
8
|
+
compareWith?: string;
|
|
9
|
+
children?: boolean;
|
|
10
|
+
workers?: boolean;
|
|
11
|
+
maxWorkers?: number;
|
|
12
|
+
nativeEnv?: boolean;
|
|
13
|
+
sourceMaps?: boolean;
|
|
14
|
+
dotenv?: boolean;
|
|
15
|
+
maxEvents?: number;
|
|
16
|
+
childDrainMs?: number;
|
|
17
|
+
adapters?: string[];
|
|
18
|
+
/** SDK/demo only: values remain in the launched process environment, never in metadata. */
|
|
19
|
+
env?: NodeJS.ProcessEnv;
|
|
20
|
+
}
|
|
21
|
+
export interface RunResult {
|
|
22
|
+
trace: Trace;
|
|
23
|
+
exitCode: number | null;
|
|
24
|
+
signal: NodeJS.Signals | null;
|
|
25
|
+
artifactWritten: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare function run(options: RunOptions): Promise<RunResult>;
|
package/dist/launcher.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
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.run = run;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const node_child_process_1 = require("node:child_process");
|
|
11
|
+
const privacy_1 = require("./core/privacy");
|
|
12
|
+
const io_1 = require("./core/io");
|
|
13
|
+
const collect_1 = require("./core/collect");
|
|
14
|
+
const schema_1 = require("./core/schema");
|
|
15
|
+
async function run(options) {
|
|
16
|
+
const watch = (0, privacy_1.parseWatch)(options.watch);
|
|
17
|
+
const root = node_path_1.default.resolve(options.cwd || process.cwd());
|
|
18
|
+
const out = node_path_1.default.resolve(options.out);
|
|
19
|
+
const [command, ...args] = options.command;
|
|
20
|
+
if (!command || !(command === process.execPath || /^(node|node\.exe)$/i.test(command))) {
|
|
21
|
+
throw new io_1.UserError('Run a direct Node command after --, for example: -- node app.mjs. Shell and npm wrappers are not supported.');
|
|
22
|
+
}
|
|
23
|
+
if (node_fs_1.default.existsSync(out))
|
|
24
|
+
throw new io_1.UserError('Output already exists. Choose a new --out path.', 74);
|
|
25
|
+
if (!node_fs_1.default.existsSync(root) || !node_fs_1.default.statSync(root).isDirectory())
|
|
26
|
+
throw new io_1.UserError('The working directory does not exist.');
|
|
27
|
+
const maxEvents = options.maxEvents ?? 5000;
|
|
28
|
+
const maxWorkers = options.maxWorkers ?? 16;
|
|
29
|
+
if (!Number.isInteger(maxWorkers) || maxWorkers < 1 || maxWorkers > 32)
|
|
30
|
+
throw new io_1.UserError('--max-workers must be an integer between 1 and 32.');
|
|
31
|
+
const drain = options.childDrainMs ?? 500;
|
|
32
|
+
if (!Number.isInteger(maxEvents) || maxEvents < 10 || maxEvents > 100000)
|
|
33
|
+
throw new io_1.UserError('--max-events must be an integer between 10 and 100000.');
|
|
34
|
+
if (!Number.isInteger(drain) || drain < 0 || drain > 5000)
|
|
35
|
+
throw new io_1.UserError('--child-drain-ms must be an integer between 0 and 5000.');
|
|
36
|
+
if ((options.adapters || []).length > 8)
|
|
37
|
+
throw new io_1.UserError('At most eight trusted local adapters may be selected.');
|
|
38
|
+
const key = options.keyFile ? (0, privacy_1.readComparisonKey)(node_path_1.default.resolve(options.keyFile)) : (0, privacy_1.createComparisonKey)();
|
|
39
|
+
if (options.compareWith) {
|
|
40
|
+
if (!options.keyFile)
|
|
41
|
+
throw new io_1.UserError('--compare-with requires the original --key file; the artifact cannot recover its secret.');
|
|
42
|
+
const previous = (0, io_1.readTrace)(options.compareWith);
|
|
43
|
+
if (previous.comparison.mode !== 'hmac-sha256' || previous.comparison.domainId !== key.domainId)
|
|
44
|
+
throw new io_1.UserError('Comparison key does not match the earlier run.', 65);
|
|
45
|
+
}
|
|
46
|
+
const directory = node_fs_1.default.mkdtempSync(node_path_1.default.join(node_os_1.default.tmpdir(), 'configtrace-'));
|
|
47
|
+
if (process.platform !== 'win32')
|
|
48
|
+
node_fs_1.default.chmodSync(directory, 0o700);
|
|
49
|
+
const config = {
|
|
50
|
+
runId: (0, io_1.uniqueId)('r'), directory, root, rootId: (0, io_1.uniqueId)('p'), watch, comparison: key,
|
|
51
|
+
maxEvents, maxBytes: 8 * 1024 * 1024, children: !!options.children,
|
|
52
|
+
workers: !!options.workers, maxWorkers, nativeEnv: options.nativeEnv !== false,
|
|
53
|
+
maxDepth: 4, maxChildren: 16, sourceMaps: !!options.sourceMaps,
|
|
54
|
+
dotenv: options.dotenv !== false, adapters: (options.adapters || []).map(p => node_path_1.default.resolve(p)),
|
|
55
|
+
preloadPath: node_path_1.default.resolve(__dirname, 'runtime/preload.js'), configPath: node_path_1.default.join(directory, 'session.json'),
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
(0, io_1.writeNew)(config.configPath, JSON.stringify(config));
|
|
59
|
+
const env = { ...(options.env || process.env) };
|
|
60
|
+
for (const key of Object.keys(env))
|
|
61
|
+
if (key.toUpperCase().startsWith('__CONFIGTRACE_'))
|
|
62
|
+
delete env[key];
|
|
63
|
+
env.__CONFIGTRACE_CONFIG = config.configPath;
|
|
64
|
+
env.__CONFIGTRACE_INSTANCE = config.rootId;
|
|
65
|
+
env.__CONFIGTRACE_DEPTH = '0';
|
|
66
|
+
const launchArgs = ['--require', config.preloadPath, ...(config.sourceMaps ? ['--enable-source-maps'] : []), ...args];
|
|
67
|
+
const result = await new Promise((resolve, reject) => {
|
|
68
|
+
const child = (0, node_child_process_1.spawn)(command, launchArgs, { cwd: root, env, stdio: 'inherit', shell: false });
|
|
69
|
+
const forwarders = new Map();
|
|
70
|
+
const clear = () => { for (const [signal, fn] of forwarders)
|
|
71
|
+
process.removeListener(signal, fn); };
|
|
72
|
+
for (const signal of ['SIGINT', 'SIGTERM', 'SIGHUP']) {
|
|
73
|
+
const fn = () => { if (child.exitCode === null && child.signalCode === null) {
|
|
74
|
+
try {
|
|
75
|
+
child.kill(signal);
|
|
76
|
+
}
|
|
77
|
+
catch { /* process already ended */ }
|
|
78
|
+
} };
|
|
79
|
+
forwarders.set(signal, fn);
|
|
80
|
+
process.on(signal, fn);
|
|
81
|
+
}
|
|
82
|
+
child.once('error', () => { clear(); reject(new io_1.UserError('Unable to launch Node. Check the executable and permissions.', 126)); });
|
|
83
|
+
child.once('close', (exitCode, signal) => { clear(); resolve({ exitCode, signal }); });
|
|
84
|
+
});
|
|
85
|
+
// Bounded drain, not an indefinite wait for children or daemon processes.
|
|
86
|
+
if ((config.children || config.workers) && drain)
|
|
87
|
+
await new Promise(resolve => setTimeout(resolve, drain));
|
|
88
|
+
let trace;
|
|
89
|
+
try {
|
|
90
|
+
trace = (0, collect_1.collectTrace)(config, result);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// An internal collection failure must not overwrite a completed application's outcome.
|
|
94
|
+
const notices = ['capture_unverified', 'recorder_failed'];
|
|
95
|
+
trace = {
|
|
96
|
+
schemaVersion: schema_1.SCHEMA_VERSION, toolVersion: schema_1.TOOL_VERSION, id: config.runId,
|
|
97
|
+
comparison: { domainId: config.comparison.domainId, mode: 'hmac-sha256' },
|
|
98
|
+
capture: { status: 'failed', watch, caseMode: process.platform === 'win32' ? 'insensitive' : 'sensitive',
|
|
99
|
+
maxEventsPerProcess: maxEvents, notices },
|
|
100
|
+
result, processes: [], events: [], coverage: (0, collect_1.coverageFor)(notices), exported: false,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
let artifactWritten = true;
|
|
104
|
+
try {
|
|
105
|
+
(0, io_1.writeTrace)(out, trace);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
artifactWritten = false;
|
|
109
|
+
trace.capture.status = 'failed';
|
|
110
|
+
trace.capture.notices = [...new Set([...trace.capture.notices, 'recorder_failed'])];
|
|
111
|
+
}
|
|
112
|
+
return { trace, ...result, artifactWritten };
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
// Includes the ephemeral session secret. User-supplied pair-key files are never deleted.
|
|
116
|
+
try {
|
|
117
|
+
node_fs_1.default.rmSync(directory, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
catch { /* restrictive temp directory; OS cleanup may be needed */ }
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../src/launcher.ts"],"names":[],"mappings":";;;;;AA+BA,kBA8EC;AA7GD,sDAAyB;AACzB,sDAAyB;AACzB,0DAA6B;AAC7B,2DAA2C;AAC3C,4CAAoF;AACpF,kCAAiF;AACjF,4CAA2D;AAC3D,0CAAsF;AAwB/E,KAAK,UAAU,GAAG,CAAC,OAAmB;IAC3C,MAAM,KAAK,GAAG,IAAA,oBAAU,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAC3C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACvF,MAAM,IAAI,cAAS,CAAC,6GAA6G,CAAC,CAAC;IACrI,CAAC;IACD,IAAI,iBAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,cAAS,CAAC,iDAAiD,EAAE,EAAE,CAAC,CAAC;IACnG,IAAI,CAAC,iBAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,cAAS,CAAC,uCAAuC,CAAC,CAAC;IAC3H,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,IAAI,UAAU,GAAG,EAAE;QAAE,MAAM,IAAI,cAAS,CAAC,oDAAoD,CAAC,CAAC;IAClJ,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,EAAE,IAAI,SAAS,GAAG,MAAM;QAAE,MAAM,IAAI,cAAS,CAAC,wDAAwD,CAAC,CAAC;IACxJ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI;QAAE,MAAM,IAAI,cAAS,CAAC,yDAAyD,CAAC,CAAC;IAC1I,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,cAAS,CAAC,uDAAuD,CAAC,CAAC;IACtH,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,IAAA,2BAAiB,EAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,6BAAmB,GAAE,CAAC;IACvG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,MAAM,IAAI,cAAS,CAAC,0FAA0F,CAAC,CAAC;QACtI,MAAM,QAAQ,GAAG,IAAA,cAAS,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,aAAa,IAAI,QAAQ,CAAC,UAAU,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ;YAAE,MAAM,IAAI,cAAS,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;IAC7K,CAAC;IACD,MAAM,SAAS,GAAG,iBAAE,CAAC,WAAW,CAAC,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAAE,iBAAE,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjE,MAAM,MAAM,GAAkB;QAC5B,KAAK,EAAE,IAAA,aAAQ,EAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,IAAA,aAAQ,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG;QACpF,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ;QAClE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK;QAC9E,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU;QAC9D,MAAM,EAAE,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9F,WAAW,EAAE,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,UAAU,EAAE,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC;KAC7G,CAAC;IACF,IAAI,CAAC;QACH,IAAA,aAAQ,EAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,MAAM,GAAG,GAAsB,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACnE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACxG,GAAG,CAAC,oBAAoB,GAAG,MAAM,CAAC,UAAU,CAAC;QAC7C,GAAG,CAAC,sBAAsB,GAAG,MAAM,CAAC,MAAM,CAAC;QAC3C,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAC9B,MAAM,UAAU,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACtH,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAA6D,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC/G,MAAM,KAAK,GAAG,IAAA,0BAAK,EAAC,OAAO,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7F,MAAM,UAAU,GAAG,IAAI,GAAG,EAA8B,CAAC;YACzD,MAAM,KAAK,GAAG,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,UAAU;gBAAE,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACnG,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,EAAE,CAAC;gBAC9D,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;oBAAC,IAAI,CAAC;wBAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAAC,CAAC;oBAAC,MAAM,CAAC,CAAC,2BAA2B,CAAC,CAAC;gBAAC,CAAC,CAAC,CAAC,CAAC;gBACrJ,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,cAAS,CAAC,8DAA8D,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzF,CAAC,CAAC,CAAC;QACH,0EAA0E;QAC1E,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK;YAAE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;QAC3G,IAAI,KAAY,CAAC;QACjB,IAAI,CAAC;YAAC,KAAK,GAAG,IAAA,sBAAY,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAC7C,MAAM,CAAC;YACL,uFAAuF;YACvF,MAAM,OAAO,GAAa,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;YACpE,KAAK,GAAG;gBACN,aAAa,EAAE,uBAAc,EAAE,WAAW,EAAE,qBAAY,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK;gBAC1E,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAa,EAAE;gBACzE,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;oBACtG,mBAAmB,EAAE,SAAS,EAAE,OAAO,EAAE;gBAC3C,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAA,qBAAW,EAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK;aACnF,CAAC;QACJ,CAAC;QACD,IAAI,eAAe,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC;YAAC,IAAA,eAAU,EAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAAC,CAAC;QAC/B,MAAM,CAAC;YACL,eAAe,GAAG,KAAK,CAAC;YAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;YACzD,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,iBAA0B,CAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,eAAe,EAAE,CAAC;IAC/C,CAAC;YAAS,CAAC;QACT,yFAAyF;QACzF,IAAI,CAAC;YAAC,iBAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;IACtI,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Trace } from '../core/schema';
|
|
2
|
+
import { type TraceDiff } from '../core/analyze';
|
|
3
|
+
export declare function escapeHtml(value: unknown): string;
|
|
4
|
+
export declare function renderTraceHtml(trace: Trace): string;
|
|
5
|
+
export declare function renderDiffHtml(left: Trace, right: Trace, diff?: TraceDiff): string;
|