@principles/core 1.84.0 → 1.86.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/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js +52 -0
- package/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/telemetry-event.test.d.ts +2 -0
- package/dist/runtime-v2/__tests__/telemetry-event.test.d.ts.map +1 -0
- package/dist/runtime-v2/__tests__/telemetry-event.test.js +56 -0
- package/dist/runtime-v2/__tests__/telemetry-event.test.js.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.js +398 -0
- package/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.js.map +1 -0
- package/dist/runtime-v2/internalization/artificer-output.d.ts +3 -2
- package/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-output.js +40 -31
- package/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.d.ts +59 -38
- package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/artificer-runner.js +121 -395
- package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
- package/dist/runtime-v2/internalization/philosopher-output.d.ts +8 -2
- package/dist/runtime-v2/internalization/philosopher-output.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/philosopher-output.js +16 -11
- package/dist/runtime-v2/internalization/philosopher-output.js.map +1 -1
- package/dist/runtime-v2/internalization/philosopher-runner.d.ts +36 -55
- package/dist/runtime-v2/internalization/philosopher-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/philosopher-runner.js +117 -401
- package/dist/runtime-v2/internalization/philosopher-runner.js.map +1 -1
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js +22 -0
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-trust-boundary.test.js.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.js +5 -1
- package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/dist/telemetry-event.d.ts +2 -2
- package/dist/telemetry-event.d.ts.map +1 -1
- package/dist/telemetry-event.js +88 -0
- package/dist/telemetry-event.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PhilosopherRunner trust-boundary and behavior parity tests (PRI-new).
|
|
3
|
+
*
|
|
4
|
+
* Proves that after BasePeerRunner migration:
|
|
5
|
+
* 1. Malformed runtime payload never reaches typed hooks or artifact commit
|
|
6
|
+
* 2. Validation failure does not call success commit
|
|
7
|
+
* 3. Successful run creates expected artifact and marks task succeeded
|
|
8
|
+
* 4. Lease conflict is non-mutating
|
|
9
|
+
* 5. postFetchTransform receives untrusted data, checkLineageIntegrity receives validated output
|
|
10
|
+
*/
|
|
11
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
12
|
+
import { PhilosopherRunner } from '../philosopher-runner.js';
|
|
13
|
+
import { DefaultPhilosopherValidator } from '../philosopher-output.js';
|
|
14
|
+
import { MemoryPIArtifactStore } from '../pi-artifact-store.js';
|
|
15
|
+
import { PDRuntimeError } from '../../error-categories.js';
|
|
16
|
+
import { RunnerPhase } from '../../runner/runner-phase.js';
|
|
17
|
+
import { createPITaskDiagnosticJson } from '../pitask-metadata.js';
|
|
18
|
+
const DREAMER_TASK_ID = 'dreamer-tb-001';
|
|
19
|
+
const PHILOSOPHER_TASK_ID = 'philosopher-tb-001';
|
|
20
|
+
function makeDreamerArtifact() {
|
|
21
|
+
return {
|
|
22
|
+
artifactId: 'pi-art-dreamer-tb-001-run-001',
|
|
23
|
+
artifactKind: 'principle',
|
|
24
|
+
sourceTaskId: DREAMER_TASK_ID,
|
|
25
|
+
lineageArtifactIds: [],
|
|
26
|
+
validationStatus: 'pending',
|
|
27
|
+
contentJson: JSON.stringify({
|
|
28
|
+
valid: true,
|
|
29
|
+
taskId: DREAMER_TASK_ID,
|
|
30
|
+
candidates: [{
|
|
31
|
+
candidateIndex: 0,
|
|
32
|
+
badDecision: 'Ignored error handling',
|
|
33
|
+
betterDecision: 'Add try/catch',
|
|
34
|
+
rationale: 'Prevents unhandled rejections',
|
|
35
|
+
confidence: 0.85,
|
|
36
|
+
riskLevel: 'low',
|
|
37
|
+
strategicPerspective: 'reliability',
|
|
38
|
+
}],
|
|
39
|
+
contextRefs: [],
|
|
40
|
+
generatedAt: new Date().toISOString(),
|
|
41
|
+
}),
|
|
42
|
+
createdAt: new Date().toISOString(),
|
|
43
|
+
updatedAt: new Date().toISOString(),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function makePhilosopherOutput() {
|
|
47
|
+
return {
|
|
48
|
+
taskId: PHILOSOPHER_TASK_ID,
|
|
49
|
+
sourceDreamerArtifactId: 'pi-art-dreamer-tb-001-run-001',
|
|
50
|
+
thesis: 'Error handling should be systematic',
|
|
51
|
+
principleCandidate: {
|
|
52
|
+
title: 'Systematic Error Handling',
|
|
53
|
+
rationale: 'Uncaught errors cascade',
|
|
54
|
+
scope: 'All async operations',
|
|
55
|
+
confidence: 0.9,
|
|
56
|
+
},
|
|
57
|
+
risks: ['May add latency'],
|
|
58
|
+
generatedAt: new Date().toISOString(),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function makePhilosopherTask(overrides = {}) {
|
|
62
|
+
return {
|
|
63
|
+
taskId: PHILOSOPHER_TASK_ID,
|
|
64
|
+
taskKind: 'philosopher',
|
|
65
|
+
status: 'pending',
|
|
66
|
+
attemptCount: 0,
|
|
67
|
+
maxAttempts: 3,
|
|
68
|
+
createdAt: new Date().toISOString(),
|
|
69
|
+
updatedAt: new Date().toISOString(),
|
|
70
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
71
|
+
dependencyTaskIds: [DREAMER_TASK_ID],
|
|
72
|
+
channel: 'prompt',
|
|
73
|
+
timeoutMs: 300_000,
|
|
74
|
+
inputArtifactRefs: [{ artifactType: 'principle', ref: 'pi-art-dreamer-tb-001-run-001' }],
|
|
75
|
+
outputArtifactRefs: [],
|
|
76
|
+
}),
|
|
77
|
+
...overrides,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function makeDreamerTask() {
|
|
81
|
+
return {
|
|
82
|
+
taskId: DREAMER_TASK_ID,
|
|
83
|
+
taskKind: 'dreamer',
|
|
84
|
+
status: 'succeeded',
|
|
85
|
+
attemptCount: 1,
|
|
86
|
+
maxAttempts: 3,
|
|
87
|
+
resultRef: 'dreamer://run-001',
|
|
88
|
+
createdAt: new Date().toISOString(),
|
|
89
|
+
updatedAt: new Date().toISOString(),
|
|
90
|
+
diagnosticJson: createPITaskDiagnosticJson({
|
|
91
|
+
dependencyTaskIds: [],
|
|
92
|
+
channel: 'prompt',
|
|
93
|
+
timeoutMs: 300_000,
|
|
94
|
+
inputArtifactRefs: [],
|
|
95
|
+
outputArtifactRefs: [{ artifactType: 'principle', ref: 'pi-art-dreamer-tb-001-run-001' }],
|
|
96
|
+
}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
describe('PhilosopherRunner trust boundary (PRI-new)', () => {
|
|
100
|
+
let artifactStore;
|
|
101
|
+
beforeEach(() => {
|
|
102
|
+
artifactStore = new MemoryPIArtifactStore();
|
|
103
|
+
});
|
|
104
|
+
function createMockDeps(overrides = {}) {
|
|
105
|
+
const philosopherTask = makePhilosopherTask();
|
|
106
|
+
const dreamerTask = makeDreamerTask();
|
|
107
|
+
const stateManager = {
|
|
108
|
+
acquireLease: vi.fn().mockResolvedValue(philosopherTask),
|
|
109
|
+
getTask: vi.fn().mockImplementation((id) => {
|
|
110
|
+
if (id === PHILOSOPHER_TASK_ID)
|
|
111
|
+
return Promise.resolve(philosopherTask);
|
|
112
|
+
if (id === DREAMER_TASK_ID)
|
|
113
|
+
return Promise.resolve(dreamerTask);
|
|
114
|
+
return Promise.resolve(null);
|
|
115
|
+
}),
|
|
116
|
+
getRunsByTask: vi.fn().mockResolvedValue([{
|
|
117
|
+
runId: 'run-phil-tb-001',
|
|
118
|
+
taskId: PHILOSOPHER_TASK_ID,
|
|
119
|
+
runtimeKind: 'philosopher',
|
|
120
|
+
startedAt: new Date().toISOString(),
|
|
121
|
+
}]),
|
|
122
|
+
updateRunOutput: vi.fn().mockResolvedValue(undefined),
|
|
123
|
+
markTaskSucceeded: vi.fn().mockResolvedValue(undefined),
|
|
124
|
+
markTaskFailed: vi.fn().mockResolvedValue(undefined),
|
|
125
|
+
markTaskRetryWait: vi.fn().mockResolvedValue(undefined),
|
|
126
|
+
getRetryPolicy: vi.fn().mockReturnValue({ shouldRetry: () => false }),
|
|
127
|
+
};
|
|
128
|
+
const runHandle = { runId: 'run-phil-tb-001', runtimeKind: 'test-double', startedAt: new Date().toISOString() };
|
|
129
|
+
const succeededStatus = { status: 'succeeded', runId: 'run-phil-tb-001' };
|
|
130
|
+
const runtimeAdapter = {
|
|
131
|
+
startRun: vi.fn().mockResolvedValue(runHandle),
|
|
132
|
+
pollRun: vi.fn().mockResolvedValue(succeededStatus),
|
|
133
|
+
fetchOutput: vi.fn().mockResolvedValue({ payload: makePhilosopherOutput() }),
|
|
134
|
+
cancelRun: vi.fn().mockResolvedValue(undefined),
|
|
135
|
+
};
|
|
136
|
+
const eventEmitter = {
|
|
137
|
+
emitTelemetry: vi.fn(),
|
|
138
|
+
};
|
|
139
|
+
const validator = new DefaultPhilosopherValidator();
|
|
140
|
+
return {
|
|
141
|
+
stateManager,
|
|
142
|
+
runtimeAdapter,
|
|
143
|
+
eventEmitter,
|
|
144
|
+
validator,
|
|
145
|
+
artifactStore,
|
|
146
|
+
...overrides,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
it('malformed payload (non-object) does not write artifact or mark succeeded', async () => {
|
|
150
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
151
|
+
const deps = createMockDeps({ artifactStore });
|
|
152
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
153
|
+
payload: 'not-an-object',
|
|
154
|
+
});
|
|
155
|
+
const runner = new PhilosopherRunner(deps, {
|
|
156
|
+
owner: 'test',
|
|
157
|
+
runtimeKind: 'philosopher',
|
|
158
|
+
pollIntervalMs: 10,
|
|
159
|
+
timeoutMs: 1000,
|
|
160
|
+
});
|
|
161
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
162
|
+
expect(result.status).toBe('failed');
|
|
163
|
+
expect(deps.stateManager.markTaskSucceeded).not.toHaveBeenCalled();
|
|
164
|
+
const artifacts = await artifactStore.listBySourceTaskId(PHILOSOPHER_TASK_ID);
|
|
165
|
+
expect(artifacts).toHaveLength(0);
|
|
166
|
+
});
|
|
167
|
+
it('malformed payload (null) does not write artifact or mark succeeded', async () => {
|
|
168
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
169
|
+
const deps = createMockDeps({ artifactStore });
|
|
170
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
171
|
+
payload: null,
|
|
172
|
+
});
|
|
173
|
+
const runner = new PhilosopherRunner(deps, {
|
|
174
|
+
owner: 'test',
|
|
175
|
+
runtimeKind: 'philosopher',
|
|
176
|
+
pollIntervalMs: 10,
|
|
177
|
+
timeoutMs: 1000,
|
|
178
|
+
});
|
|
179
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
180
|
+
expect(result.status).toBe('failed');
|
|
181
|
+
expect(deps.stateManager.markTaskSucceeded).not.toHaveBeenCalled();
|
|
182
|
+
});
|
|
183
|
+
it('validation failure does not write artifact or mark succeeded', async () => {
|
|
184
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
185
|
+
const deps = createMockDeps({ artifactStore });
|
|
186
|
+
const invalidOutput = {
|
|
187
|
+
taskId: 'wrong-id',
|
|
188
|
+
sourceDreamerArtifactId: '',
|
|
189
|
+
thesis: '',
|
|
190
|
+
principleCandidate: { title: '', rationale: '', scope: '', confidence: 2.0 },
|
|
191
|
+
risks: 'not-array',
|
|
192
|
+
generatedAt: '',
|
|
193
|
+
};
|
|
194
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
195
|
+
payload: invalidOutput,
|
|
196
|
+
});
|
|
197
|
+
const runner = new PhilosopherRunner(deps, {
|
|
198
|
+
owner: 'test',
|
|
199
|
+
runtimeKind: 'philosopher',
|
|
200
|
+
pollIntervalMs: 10,
|
|
201
|
+
timeoutMs: 1000,
|
|
202
|
+
});
|
|
203
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
204
|
+
expect(result.status).toBe('failed');
|
|
205
|
+
expect(deps.stateManager.markTaskSucceeded).not.toHaveBeenCalled();
|
|
206
|
+
const artifacts = await artifactStore.listBySourceTaskId(PHILOSOPHER_TASK_ID);
|
|
207
|
+
expect(artifacts).toHaveLength(0);
|
|
208
|
+
});
|
|
209
|
+
it('valid output goes through full success path — artifact written and task succeeded', async () => {
|
|
210
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
211
|
+
const deps = createMockDeps({ artifactStore });
|
|
212
|
+
const runner = new PhilosopherRunner(deps, {
|
|
213
|
+
owner: 'test',
|
|
214
|
+
runtimeKind: 'philosopher',
|
|
215
|
+
pollIntervalMs: 10,
|
|
216
|
+
timeoutMs: 1000,
|
|
217
|
+
});
|
|
218
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
219
|
+
expect(result.status).toBe('succeeded');
|
|
220
|
+
expect(result.artifactId).toBeDefined();
|
|
221
|
+
expect(result.output).toBeDefined();
|
|
222
|
+
expect(result.output?.principleCandidate.title).toBe('Systematic Error Handling');
|
|
223
|
+
expect(runner.currentPhase).toBe(RunnerPhase.Completed);
|
|
224
|
+
expect(deps.stateManager.markTaskSucceeded).toHaveBeenCalledWith(PHILOSOPHER_TASK_ID, expect.stringContaining('philosopher://'));
|
|
225
|
+
const artifacts = await artifactStore.listBySourceTaskId(PHILOSOPHER_TASK_ID);
|
|
226
|
+
expect(artifacts).toHaveLength(1);
|
|
227
|
+
expect(artifacts[0]?.artifactKind).toBe('principle');
|
|
228
|
+
});
|
|
229
|
+
it('lease conflict does not mutate task state', async () => {
|
|
230
|
+
const deps = createMockDeps();
|
|
231
|
+
deps.stateManager.acquireLease = vi.fn().mockRejectedValue(new PDRuntimeError('lease_conflict', 'Another runner holds the lease'));
|
|
232
|
+
const runner = new PhilosopherRunner(deps, {
|
|
233
|
+
owner: 'test',
|
|
234
|
+
runtimeKind: 'philosopher',
|
|
235
|
+
pollIntervalMs: 10,
|
|
236
|
+
timeoutMs: 1000,
|
|
237
|
+
});
|
|
238
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
239
|
+
expect(result.status).toBe('failed');
|
|
240
|
+
expect(result.errorCategory).toBe('lease_conflict');
|
|
241
|
+
expect(deps.stateManager.markTaskFailed).not.toHaveBeenCalled();
|
|
242
|
+
expect(deps.stateManager.markTaskRetryWait).not.toHaveBeenCalled();
|
|
243
|
+
});
|
|
244
|
+
it('taskId mismatch in output fails validation loud', async () => {
|
|
245
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
246
|
+
const deps = createMockDeps({ artifactStore });
|
|
247
|
+
const mismatchedOutput = { ...makePhilosopherOutput(), taskId: 'wrong-task-id' };
|
|
248
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
249
|
+
payload: mismatchedOutput,
|
|
250
|
+
});
|
|
251
|
+
const runner = new PhilosopherRunner(deps, {
|
|
252
|
+
owner: 'test',
|
|
253
|
+
runtimeKind: 'philosopher',
|
|
254
|
+
pollIntervalMs: 10,
|
|
255
|
+
timeoutMs: 1000,
|
|
256
|
+
});
|
|
257
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
258
|
+
expect(result.status).toBe('failed');
|
|
259
|
+
// output_invalid is transient; retry policy says shouldRetry=false → max_attempts_exceeded
|
|
260
|
+
expect(result.errorCategory).toBe('max_attempts_exceeded');
|
|
261
|
+
expect(result.failureReason).toContain('taskId mismatch');
|
|
262
|
+
});
|
|
263
|
+
it('validation failure does not set phase to Completed', async () => {
|
|
264
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
265
|
+
const deps = createMockDeps({ artifactStore });
|
|
266
|
+
const invalidOutput = {
|
|
267
|
+
taskId: 'wrong-id',
|
|
268
|
+
sourceDreamerArtifactId: '',
|
|
269
|
+
thesis: '',
|
|
270
|
+
principleCandidate: { title: '', rationale: '', scope: '', confidence: 2.0 },
|
|
271
|
+
risks: 'not-array',
|
|
272
|
+
generatedAt: '',
|
|
273
|
+
};
|
|
274
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
275
|
+
payload: invalidOutput,
|
|
276
|
+
});
|
|
277
|
+
const runner = new PhilosopherRunner(deps, {
|
|
278
|
+
owner: 'test',
|
|
279
|
+
runtimeKind: 'philosopher',
|
|
280
|
+
pollIntervalMs: 10,
|
|
281
|
+
timeoutMs: 1000,
|
|
282
|
+
});
|
|
283
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
284
|
+
expect(result.status).toBe('failed');
|
|
285
|
+
expect(runner.currentPhase).not.toBe(RunnerPhase.Completed);
|
|
286
|
+
expect(runner.currentPhase).toBe(RunnerPhase.Failed);
|
|
287
|
+
});
|
|
288
|
+
it('postFetchTransform re-injects taskId when stripped — phase is Completed', async () => {
|
|
289
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
290
|
+
const deps = createMockDeps({ artifactStore });
|
|
291
|
+
// Simulate adapter stripping lineage fields (PRI-272)
|
|
292
|
+
const strippedOutput = { ...makePhilosopherOutput() };
|
|
293
|
+
delete strippedOutput.taskId;
|
|
294
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
295
|
+
payload: strippedOutput,
|
|
296
|
+
});
|
|
297
|
+
const runner = new PhilosopherRunner(deps, {
|
|
298
|
+
owner: 'test',
|
|
299
|
+
runtimeKind: 'philosopher',
|
|
300
|
+
pollIntervalMs: 10,
|
|
301
|
+
timeoutMs: 1000,
|
|
302
|
+
});
|
|
303
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
304
|
+
// postFetchTransform should re-inject taskId, then validation should pass
|
|
305
|
+
expect(result.status).toBe('succeeded');
|
|
306
|
+
expect(runner.currentPhase).toBe(RunnerPhase.Completed);
|
|
307
|
+
});
|
|
308
|
+
it('present-but-empty taskId fails validation (not silently corrected)', async () => {
|
|
309
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
310
|
+
const deps = createMockDeps({ artifactStore });
|
|
311
|
+
const emptyTaskIdOutput = { ...makePhilosopherOutput(), taskId: '' };
|
|
312
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
313
|
+
payload: emptyTaskIdOutput,
|
|
314
|
+
});
|
|
315
|
+
const runner = new PhilosopherRunner(deps, {
|
|
316
|
+
owner: 'test',
|
|
317
|
+
runtimeKind: 'philosopher',
|
|
318
|
+
pollIntervalMs: 10,
|
|
319
|
+
timeoutMs: 1000,
|
|
320
|
+
});
|
|
321
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
322
|
+
expect(result.status).toBe('failed');
|
|
323
|
+
// output_invalid is transient; retry policy says shouldRetry=false → max_attempts_exceeded
|
|
324
|
+
expect(result.errorCategory).toBe('max_attempts_exceeded');
|
|
325
|
+
// postFetchTransform should NOT overwrite present-but-empty taskId
|
|
326
|
+
expect(result.failureReason).toContain('taskId mismatch');
|
|
327
|
+
});
|
|
328
|
+
it('risks with non-string elements fails validation (ERR-005 Rule 4)', async () => {
|
|
329
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
330
|
+
const deps = createMockDeps({ artifactStore });
|
|
331
|
+
const badRisksOutput = { ...makePhilosopherOutput(), risks: [1, {}] };
|
|
332
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
333
|
+
payload: badRisksOutput,
|
|
334
|
+
});
|
|
335
|
+
const runner = new PhilosopherRunner(deps, {
|
|
336
|
+
owner: 'test',
|
|
337
|
+
runtimeKind: 'philosopher',
|
|
338
|
+
pollIntervalMs: 10,
|
|
339
|
+
timeoutMs: 1000,
|
|
340
|
+
});
|
|
341
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
342
|
+
expect(result.status).toBe('failed');
|
|
343
|
+
expect(result.failureReason).toContain('risks must contain only strings');
|
|
344
|
+
});
|
|
345
|
+
it('sourceDreamerArtifactId mismatch fails loud before artifact commit (ERR-004)', async () => {
|
|
346
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
347
|
+
const deps = createMockDeps({ artifactStore });
|
|
348
|
+
const mismatchedIdOutput = { ...makePhilosopherOutput(), sourceDreamerArtifactId: 'wrong-artifact-id' };
|
|
349
|
+
deps.runtimeAdapter.fetchOutput = vi.fn().mockResolvedValue({
|
|
350
|
+
payload: mismatchedIdOutput,
|
|
351
|
+
});
|
|
352
|
+
const runner = new PhilosopherRunner(deps, {
|
|
353
|
+
owner: 'test',
|
|
354
|
+
runtimeKind: 'philosopher',
|
|
355
|
+
pollIntervalMs: 10,
|
|
356
|
+
timeoutMs: 1000,
|
|
357
|
+
});
|
|
358
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
359
|
+
expect(result.status).toBe('failed');
|
|
360
|
+
expect(deps.stateManager.markTaskSucceeded).not.toHaveBeenCalled();
|
|
361
|
+
const artifacts = await artifactStore.listBySourceTaskId(PHILOSOPHER_TASK_ID);
|
|
362
|
+
expect(artifacts).toHaveLength(0);
|
|
363
|
+
});
|
|
364
|
+
it('invalid errorCategory from custom validator fails loud and does not leak through', async () => {
|
|
365
|
+
await artifactStore.upsertArtifact(makeDreamerArtifact());
|
|
366
|
+
// Custom validator returning an invalid errorCategory string
|
|
367
|
+
const rogueValidator = {
|
|
368
|
+
validate: vi.fn().mockResolvedValue({
|
|
369
|
+
valid: false,
|
|
370
|
+
errors: ['some validation error'],
|
|
371
|
+
errorCategory: 'not_a_real_category',
|
|
372
|
+
}),
|
|
373
|
+
};
|
|
374
|
+
const deps = createMockDeps({ artifactStore, validator: rogueValidator });
|
|
375
|
+
const runner = new PhilosopherRunner(deps, {
|
|
376
|
+
owner: 'test',
|
|
377
|
+
runtimeKind: 'philosopher',
|
|
378
|
+
pollIntervalMs: 10,
|
|
379
|
+
timeoutMs: 1000,
|
|
380
|
+
});
|
|
381
|
+
const result = await runner.run(PHILOSOPHER_TASK_ID);
|
|
382
|
+
expect(result.status).toBe('failed');
|
|
383
|
+
// The invalid category must NOT leak into result.errorCategory
|
|
384
|
+
expect(result.errorCategory).not.toBe('not_a_real_category');
|
|
385
|
+
// errorCategory should be a valid PDErrorCategory (output_invalid from the guard,
|
|
386
|
+
// then escalated by retryOrFail to max_attempts_exceeded since output_invalid is transient
|
|
387
|
+
// and retry policy returns shouldRetry=false)
|
|
388
|
+
expect(result.errorCategory).toBe('max_attempts_exceeded');
|
|
389
|
+
// failureReason must mention the invalid errorCategory
|
|
390
|
+
expect(result.failureReason).toContain('invalid errorCategory');
|
|
391
|
+
expect(result.failureReason).toContain('not_a_real_category');
|
|
392
|
+
// No artifact written, no task marked succeeded
|
|
393
|
+
expect(deps.stateManager.markTaskSucceeded).not.toHaveBeenCalled();
|
|
394
|
+
const artifacts = await artifactStore.listBySourceTaskId(PHILOSOPHER_TASK_ID);
|
|
395
|
+
expect(artifacts).toHaveLength(0);
|
|
396
|
+
});
|
|
397
|
+
});
|
|
398
|
+
//# sourceMappingURL=philosopher-runner-trust-boundary.test.js.map
|
package/dist/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"philosopher-runner-trust-boundary.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/internalization/__tests__/philosopher-runner-trust-boundary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,9 +59,10 @@ export interface ArtificerValidationResult {
|
|
|
59
59
|
readonly errorCategory?: string;
|
|
60
60
|
}
|
|
61
61
|
export interface ArtificerValidator {
|
|
62
|
-
|
|
62
|
+
/** Validate untrusted output. Accepts `unknown` — must perform runtime checks (ERR-001). */
|
|
63
|
+
validate(output: unknown, taskId: string, expectedSourceScribeArtifactId?: string): Promise<ArtificerValidationResult>;
|
|
63
64
|
}
|
|
64
65
|
export declare class DefaultArtificerValidator implements ArtificerValidator {
|
|
65
|
-
validate(output:
|
|
66
|
+
validate(output: unknown, taskId: string, expectedSourceScribeArtifactId?: string): Promise<ArtificerValidationResult>;
|
|
66
67
|
}
|
|
67
68
|
//# sourceMappingURL=artificer-output.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artificer-output.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/artificer-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,iCAAiC;;;;;;;EAO5C,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;EAIrC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAOlC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEzE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"artificer-output.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/artificer-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,kBAAkB,EAAE,2BAA2B,CAAC;IACzD,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,iCAAiC;;;;;;;EAO5C,CAAC;AAEH,eAAO,MAAM,0BAA0B;;;;EAIrC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;EAOlC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAEzE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,4FAA4F;IAC5F,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,8BAA8B,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACxH;AAMD,qBAAa,yBAA0B,YAAW,kBAAkB;IAE5D,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,8BAA8B,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;CA8E7H"}
|
|
@@ -20,79 +20,88 @@ export const ArtificerOutputV1Schema = Type.Object({
|
|
|
20
20
|
risks: Type.Array(Type.String()),
|
|
21
21
|
generatedAt: Type.String({ minLength: 1 }),
|
|
22
22
|
});
|
|
23
|
+
function isRecord(v) {
|
|
24
|
+
return v !== null && typeof v === 'object' && !Array.isArray(v);
|
|
25
|
+
}
|
|
23
26
|
export class DefaultArtificerValidator {
|
|
24
27
|
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
25
28
|
async validate(output, taskId, expectedSourceScribeArtifactId) {
|
|
26
29
|
const errors = [];
|
|
27
|
-
if (
|
|
30
|
+
if (!isRecord(output)) {
|
|
28
31
|
return { valid: false, errors: ['Output is not an object'], errorCategory: 'output_invalid' };
|
|
29
32
|
}
|
|
30
|
-
|
|
31
|
-
|
|
33
|
+
const rec = output;
|
|
34
|
+
if (!Object.hasOwn(rec, 'taskId') || rec.taskId !== taskId) {
|
|
35
|
+
errors.push(`taskId mismatch: expected ${taskId}, got ${String(rec.taskId)}`);
|
|
32
36
|
}
|
|
33
|
-
if (typeof
|
|
37
|
+
if (!Object.hasOwn(rec, 'sourceScribeArtifactId') || typeof rec.sourceScribeArtifactId !== 'string' || rec.sourceScribeArtifactId.trim() === '') {
|
|
34
38
|
errors.push('sourceScribeArtifactId must be non-empty string');
|
|
35
39
|
}
|
|
36
|
-
else if (expectedSourceScribeArtifactId &&
|
|
37
|
-
errors.push(`sourceScribeArtifactId mismatch: expected ${expectedSourceScribeArtifactId}, got ${
|
|
40
|
+
else if (expectedSourceScribeArtifactId && rec.sourceScribeArtifactId !== expectedSourceScribeArtifactId) {
|
|
41
|
+
errors.push(`sourceScribeArtifactId mismatch: expected ${expectedSourceScribeArtifactId}, got ${rec.sourceScribeArtifactId}`);
|
|
38
42
|
}
|
|
39
|
-
if (
|
|
43
|
+
if (!Object.hasOwn(rec, 'implementationPlan') || !isRecord(rec.implementationPlan)) {
|
|
40
44
|
errors.push('implementationPlan must be an object');
|
|
41
45
|
}
|
|
42
46
|
else {
|
|
43
|
-
const ip =
|
|
44
|
-
if (typeof ip.summary !== 'string' ||
|
|
47
|
+
const ip = rec.implementationPlan;
|
|
48
|
+
if (!Object.hasOwn(ip, 'summary') || typeof ip.summary !== 'string' || ip.summary.trim() === '')
|
|
45
49
|
errors.push('implementationPlan.summary must be non-empty string');
|
|
46
|
-
if (typeof ip.targetSurface !== 'string' ||
|
|
50
|
+
if (!Object.hasOwn(ip, 'targetSurface') || typeof ip.targetSurface !== 'string' || ip.targetSurface.trim() === '')
|
|
47
51
|
errors.push('implementationPlan.targetSurface must be non-empty string');
|
|
48
|
-
if (!Array.isArray(ip.changes))
|
|
52
|
+
if (!Object.hasOwn(ip, 'changes') || !Array.isArray(ip.changes))
|
|
49
53
|
errors.push('implementationPlan.changes must be an array');
|
|
50
|
-
else if (!ip.changes.every(e => typeof e === 'string'))
|
|
54
|
+
else if (!ip.changes.every((e) => typeof e === 'string'))
|
|
51
55
|
errors.push('implementationPlan.changes must be an array of strings');
|
|
52
|
-
if (!Array.isArray(ip.tests))
|
|
56
|
+
if (!Object.hasOwn(ip, 'tests') || !Array.isArray(ip.tests))
|
|
53
57
|
errors.push('implementationPlan.tests must be an array');
|
|
54
|
-
else if (!ip.tests.every(e => typeof e === 'string'))
|
|
58
|
+
else if (!ip.tests.every((e) => typeof e === 'string'))
|
|
55
59
|
errors.push('implementationPlan.tests must be an array of strings');
|
|
56
|
-
if (!Array.isArray(ip.rolloutNotes))
|
|
60
|
+
if (!Object.hasOwn(ip, 'rolloutNotes') || !Array.isArray(ip.rolloutNotes))
|
|
57
61
|
errors.push('implementationPlan.rolloutNotes must be an array');
|
|
58
|
-
else if (!ip.rolloutNotes.every(e => typeof e === 'string'))
|
|
62
|
+
else if (!ip.rolloutNotes.every((e) => typeof e === 'string'))
|
|
59
63
|
errors.push('implementationPlan.rolloutNotes must be an array of strings');
|
|
60
|
-
if (typeof ip.confidence !== 'number' || !Number.isFinite(ip.confidence))
|
|
64
|
+
if (!Object.hasOwn(ip, 'confidence') || typeof ip.confidence !== 'number' || !Number.isFinite(ip.confidence))
|
|
61
65
|
errors.push('implementationPlan.confidence must be number');
|
|
62
66
|
else if (ip.confidence < 0 || ip.confidence > 1)
|
|
63
67
|
errors.push('implementationPlan.confidence must be in [0, 1]');
|
|
64
68
|
}
|
|
65
|
-
if (
|
|
69
|
+
if (!Object.hasOwn(rec, 'sourceTrace') || !isRecord(rec.sourceTrace)) {
|
|
66
70
|
errors.push('sourceTrace must be an object');
|
|
67
71
|
}
|
|
68
72
|
else {
|
|
69
|
-
const st =
|
|
70
|
-
if (typeof st.scribeArtifactId !== 'string' ||
|
|
73
|
+
const st = rec.sourceTrace;
|
|
74
|
+
if (!Object.hasOwn(st, 'scribeArtifactId') || typeof st.scribeArtifactId !== 'string' || st.scribeArtifactId.trim() === '') {
|
|
71
75
|
errors.push('sourceTrace.scribeArtifactId must be non-empty string');
|
|
72
76
|
}
|
|
73
77
|
else if (expectedSourceScribeArtifactId && st.scribeArtifactId !== expectedSourceScribeArtifactId) {
|
|
74
78
|
errors.push(`sourceTrace.scribeArtifactId mismatch: expected ${expectedSourceScribeArtifactId}, got ${st.scribeArtifactId}`);
|
|
75
79
|
}
|
|
76
|
-
if (st
|
|
77
|
-
|
|
80
|
+
if (Object.hasOwn(st, 'philosopherArtifactId') && st.philosopherArtifactId !== undefined) {
|
|
81
|
+
if (typeof st.philosopherArtifactId !== 'string' || st.philosopherArtifactId.trim() === '') {
|
|
82
|
+
errors.push('sourceTrace.philosopherArtifactId must be non-empty string if present');
|
|
83
|
+
}
|
|
78
84
|
}
|
|
79
|
-
if (st
|
|
80
|
-
|
|
85
|
+
if (Object.hasOwn(st, 'dreamerArtifactId') && st.dreamerArtifactId !== undefined) {
|
|
86
|
+
if (typeof st.dreamerArtifactId !== 'string' || st.dreamerArtifactId.trim() === '') {
|
|
87
|
+
errors.push('sourceTrace.dreamerArtifactId must be non-empty string if present');
|
|
88
|
+
}
|
|
81
89
|
}
|
|
82
90
|
}
|
|
83
|
-
if (!Array.isArray(
|
|
91
|
+
if (!Object.hasOwn(rec, 'risks') || !Array.isArray(rec.risks)) {
|
|
84
92
|
errors.push('risks must be an array');
|
|
85
93
|
}
|
|
86
|
-
else if (!
|
|
94
|
+
else if (!rec.risks.every((e) => typeof e === 'string')) {
|
|
87
95
|
errors.push('risks must be an array of strings');
|
|
88
96
|
}
|
|
89
|
-
if (typeof
|
|
90
|
-
&&
|
|
91
|
-
&&
|
|
92
|
-
&&
|
|
97
|
+
if (typeof rec.sourceScribeArtifactId === 'string' && rec.sourceScribeArtifactId.trim() !== ''
|
|
98
|
+
&& isRecord(rec.sourceTrace)
|
|
99
|
+
&& Object.hasOwn(rec.sourceTrace, 'scribeArtifactId')
|
|
100
|
+
&& typeof rec.sourceTrace.scribeArtifactId === 'string'
|
|
101
|
+
&& rec.sourceScribeArtifactId !== rec.sourceTrace.scribeArtifactId) {
|
|
93
102
|
errors.push('sourceScribeArtifactId and sourceTrace.scribeArtifactId must match');
|
|
94
103
|
}
|
|
95
|
-
if (typeof
|
|
104
|
+
if (!Object.hasOwn(rec, 'generatedAt') || typeof rec.generatedAt !== 'string' || rec.generatedAt.trim() === '') {
|
|
96
105
|
errors.push('generatedAt must be non-empty string');
|
|
97
106
|
}
|
|
98
107
|
return errors.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artificer-output.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/artificer-output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AA0BtD,MAAM,CAAC,MAAM,iCAAiC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3D,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACtC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC5C,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAClC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACvC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,MAAM,CAAC;IACpD,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAC/C,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,MAAM,CAAC;IACjD,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACrC,sBAAsB,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACrD,kBAAkB,EAAE,iCAAiC;IACrD,WAAW,EAAE,0BAA0B;IACvC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;CAC3C,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"artificer-output.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/artificer-output.ts"],"names":[],"mappings":"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"}
|