@principles/core 1.124.0 → 1.125.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__/architecture-regression.test.js +5 -1
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js +115 -21
- package/dist/runtime-v2/__tests__/attack-e2e-pipeline-smoke.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/golden-path-diagnostician-e2e.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-bridge-retried.test.js +7 -6
- package/dist/runtime-v2/__tests__/pain-signal-bridge-retried.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-bridge-short-circuit.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/pain-signal-bridge-workspace-dir.test.js.map +1 -1
- package/dist/runtime-v2/cli/diagnose.d.ts +2 -2
- package/dist/runtime-v2/cli/diagnose.d.ts.map +1 -1
- package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js +3 -3
- package/dist/runtime-v2/config/__tests__/pd-config-contract.test.js.map +1 -1
- package/dist/runtime-v2/config/pd-config-defaults.js +3 -3
- package/dist/runtime-v2/config/pd-config-defaults.js.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts +1 -64
- package/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
- package/dist/runtime-v2/diagnostician-prompt-builder.js +0 -186
- package/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +13 -7
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +3 -3
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +8 -7
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +8 -5
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +108 -105
- package/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/runnerkind-seam.test.js +3 -3
- package/dist/runtime-v2/internalization/__tests__/runnerkind-seam.test.js.map +1 -1
- package/dist/runtime-v2/internalization/split-diagnostician-runner.d.ts.map +1 -1
- package/dist/runtime-v2/internalization/split-diagnostician-runner.js +121 -52
- package/dist/runtime-v2/internalization/split-diagnostician-runner.js.map +1 -1
- package/dist/runtime-v2/observer/__tests__/empathy-observer.real-e2e.test.js +28 -21
- package/dist/runtime-v2/observer/__tests__/empathy-observer.real-e2e.test.js.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts +10 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
- package/dist/runtime-v2/pain-signal-runtime-factory.js +42 -40
- package/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
- package/dist/runtime-v2/runner/__tests__/diagnose.test.js.map +1 -1
- package/package.json +1 -1
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.d.ts +0 -2
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.d.ts.map +0 -1
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.js +0 -122
- package/dist/runtime-v2/__tests__/diagnostician-core-grounding.test.js.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.d.ts +0 -2
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.js +0 -169
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.integration.test.js.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.d.ts +0 -2
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.d.ts.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js +0 -462
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-builder.test.js.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts +0 -13
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.d.ts.map +0 -1
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js +0 -97
- package/dist/runtime-v2/diagnostician/__tests__/diagnostician-prompt-language.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.js +0 -378
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js +0 -682
- package/dist/runtime-v2/runner/__tests__/diagnostician-runner.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.js +0 -286
- package/dist/runtime-v2/runner/__tests__/diagnostician-telemetry.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.js +0 -320
- package/dist/runtime-v2/runner/__tests__/dual-track-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.js +0 -261
- package/dist/runtime-v2/runner/__tests__/lease-expiration-recovery.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.js +0 -405
- package/dist/runtime-v2/runner/__tests__/m5-05-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.js +0 -347
- package/dist/runtime-v2/runner/__tests__/m6-06-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.js +0 -186
- package/dist/runtime-v2/runner/__tests__/m6-06-legacy.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.js +0 -355
- package/dist/runtime-v2/runner/__tests__/m6-06-real-path.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.js +0 -486
- package/dist/runtime-v2/runner/__tests__/m8-02-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.js +0 -171
- package/dist/runtime-v2/runner/__tests__/m9-adapter-integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.js +0 -175
- package/dist/runtime-v2/runner/__tests__/m9-e2e.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.js +0 -276
- package/dist/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.js +0 -272
- package/dist/runtime-v2/runner/__tests__/retry-wait-recovery.integration.test.js.map +0 -1
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.d.ts +0 -2
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.d.ts.map +0 -1
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.js +0 -67
- package/dist/runtime-v2/runner/__tests__/start-run-input.test.js.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner-options.d.ts +0 -57
- package/dist/runtime-v2/runner/diagnostician-runner-options.d.ts.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner-options.js +0 -21
- package/dist/runtime-v2/runner/diagnostician-runner-options.js.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner.d.ts +0 -89
- package/dist/runtime-v2/runner/diagnostician-runner.d.ts.map +0 -1
- package/dist/runtime-v2/runner/diagnostician-runner.js +0 -470
- package/dist/runtime-v2/runner/diagnostician-runner.js.map +0 -1
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E m9-adapter-integration — PiAiRuntimeAdapter + DiagnosticianRunner integration.
|
|
3
|
-
*
|
|
4
|
-
* Verifies PiAiRuntimeAdapter integrates correctly with DiagnosticianRunner.
|
|
5
|
-
* Tests pain → task → run → DiagnosticianOutputV1 artifact → candidate records.
|
|
6
|
-
* Does NOT go through PainSignalBridge or ledger (plan 01 scope).
|
|
7
|
-
*
|
|
8
|
-
* Uses module-level vi.mock('@mariozechner/pi-ai') — real PiAiRuntimeAdapter
|
|
9
|
-
* code runs, only LLM API calls are intercepted.
|
|
10
|
-
*/
|
|
11
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
12
|
-
import * as fs from 'fs';
|
|
13
|
-
import * as path from 'path';
|
|
14
|
-
import * as os from 'os';
|
|
15
|
-
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
16
|
-
import { SqliteContextAssembler } from '../../store/context/sqlite-context-assembler.js';
|
|
17
|
-
import { SqliteHistoryQuery } from '../../store/history/sqlite-history-query.js';
|
|
18
|
-
import { StoreEventEmitter } from '../../store/event-emitter.js';
|
|
19
|
-
import { DiagnosticianRunner } from '../diagnostician-runner.js';
|
|
20
|
-
import { PassThroughValidator } from '../diagnostician-validator.js';
|
|
21
|
-
import { SqliteDiagnosticianCommitter } from '../../store/commit/diagnostician-committer.js';
|
|
22
|
-
// ── Module mock (MUST be before imports) ──────────────────────────────────────
|
|
23
|
-
vi.mock('@mariozechner/pi-ai', () => ({
|
|
24
|
-
getModel: vi.fn(),
|
|
25
|
-
getProviders: vi.fn(() => ['openrouter', 'anthropic', 'openai']),
|
|
26
|
-
completeSimple: vi.fn(),
|
|
27
|
-
}));
|
|
28
|
-
import { getModel, completeSimple } from '@mariozechner/pi-ai';
|
|
29
|
-
import { PiAiRuntimeAdapter } from '../../adapter/pi-ai-runtime-adapter.js';
|
|
30
|
-
const mockComplete = completeSimple;
|
|
31
|
-
const mockGetModel = getModel;
|
|
32
|
-
// ── Test fixtures ──────────────────────────────────────────────────────────────
|
|
33
|
-
function makeAssistantMessage(text, overrides = {}) {
|
|
34
|
-
return {
|
|
35
|
-
content: [{ type: 'text', text }],
|
|
36
|
-
role: 'assistant',
|
|
37
|
-
stopReason: 'stop',
|
|
38
|
-
api: 'openai-completions',
|
|
39
|
-
provider: 'openrouter',
|
|
40
|
-
model: 'anthropic/claude-sonnet-4',
|
|
41
|
-
usage: { input: 10, output: 5, cacheRead: 0, cacheWrite: 0, totalTokens: 15, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
|
|
42
|
-
timestamp: Date.now(),
|
|
43
|
-
...overrides,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
function makeDiagnosticianOutputWithCandidates(_taskId) {
|
|
47
|
-
return {
|
|
48
|
-
valid: true,
|
|
49
|
-
diagnosisId: `diag-m9-adapter-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
50
|
-
summary: 'E2E m9-04 adapter integration test diagnosis summary',
|
|
51
|
-
rootCause: 'E2E m9-04 root cause — adapter integration test',
|
|
52
|
-
violatedPrinciples: [],
|
|
53
|
-
evidence: [{ sourceRef: 'test', note: 'E2E test evidence' }],
|
|
54
|
-
recommendations: [
|
|
55
|
-
{ kind: 'principle', description: 'Always validate tool arguments before execution to prevent silent failures' },
|
|
56
|
-
{ kind: 'principle', description: 'Log all tool invocations with argument summaries for traceability' },
|
|
57
|
-
{ kind: 'rule', description: 'Use schema validation for external inputs' },
|
|
58
|
-
],
|
|
59
|
-
confidence: 0.92,
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
const VALID_DIAGNOSIS = {
|
|
63
|
-
valid: true,
|
|
64
|
-
diagnosisId: 'diag-adapter-integration-1',
|
|
65
|
-
taskId: 'task-adapter-integration-1',
|
|
66
|
-
summary: 'Adapter integration test summary',
|
|
67
|
-
rootCause: 'Adapter integration root cause',
|
|
68
|
-
violatedPrinciples: [],
|
|
69
|
-
evidence: [{ sourceRef: 'test', note: 'E2E test evidence' }],
|
|
70
|
-
recommendations: [],
|
|
71
|
-
confidence: 0.9,
|
|
72
|
-
};
|
|
73
|
-
// ── Test setup ─────────────────────────────────────────────────────────────────
|
|
74
|
-
const TMP_ROOT = path.join(os.tmpdir(), `pd-e2e-m9-adapter-integration-${process.pid}`);
|
|
75
|
-
describe('E2E m9-adapter-integration — PiAiRuntimeAdapter + DiagnosticianRunner', () => {
|
|
76
|
-
// eslint-disable-next-line @typescript-eslint/init-declarations
|
|
77
|
-
let testDir;
|
|
78
|
-
// eslint-disable-next-line @typescript-eslint/init-declarations
|
|
79
|
-
let stateManager;
|
|
80
|
-
// eslint-disable-next-line @typescript-eslint/init-declarations
|
|
81
|
-
let sqliteConn;
|
|
82
|
-
// eslint-disable-next-line @typescript-eslint/init-declarations
|
|
83
|
-
let contextAssembler;
|
|
84
|
-
// eslint-disable-next-line @typescript-eslint/init-declarations
|
|
85
|
-
let historyQuery;
|
|
86
|
-
// eslint-disable-next-line @typescript-eslint/init-declarations
|
|
87
|
-
let eventEmitter;
|
|
88
|
-
beforeEach(async () => {
|
|
89
|
-
testDir = path.join(TMP_ROOT, `e2e-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
90
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
91
|
-
stateManager = new RuntimeStateManager({ workspaceDir: testDir });
|
|
92
|
-
await stateManager.initialize();
|
|
93
|
-
sqliteConn = stateManager.connection;
|
|
94
|
-
historyQuery = new SqliteHistoryQuery(sqliteConn);
|
|
95
|
-
const taskStore = stateManager.taskStore;
|
|
96
|
-
const runStore = stateManager.runStore;
|
|
97
|
-
contextAssembler = new SqliteContextAssembler(taskStore, historyQuery, runStore);
|
|
98
|
-
eventEmitter = new StoreEventEmitter();
|
|
99
|
-
vi.clearAllMocks();
|
|
100
|
-
process.env.TEST_API_KEY = 'test-key-123';
|
|
101
|
-
mockGetModel.mockReturnValue({ id: 'anthropic/claude-sonnet-4' });
|
|
102
|
-
mockComplete.mockResolvedValue(makeAssistantMessage(JSON.stringify(VALID_DIAGNOSIS)));
|
|
103
|
-
});
|
|
104
|
-
afterEach(() => {
|
|
105
|
-
stateManager.close();
|
|
106
|
-
try {
|
|
107
|
-
fs.rmSync(TMP_ROOT, { recursive: true, force: true });
|
|
108
|
-
}
|
|
109
|
-
catch {
|
|
110
|
-
// ignore Windows cleanup errors
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
function createRunner(runtimeAdapter) {
|
|
114
|
-
const committer = new SqliteDiagnosticianCommitter(sqliteConn);
|
|
115
|
-
return new DiagnosticianRunner({
|
|
116
|
-
stateManager,
|
|
117
|
-
contextAssembler,
|
|
118
|
-
runtimeAdapter,
|
|
119
|
-
eventEmitter,
|
|
120
|
-
validator: new PassThroughValidator(),
|
|
121
|
-
committer,
|
|
122
|
-
}, {
|
|
123
|
-
owner: 'e2e-m9-adapter-integration',
|
|
124
|
-
runtimeKind: 'pi-ai',
|
|
125
|
-
pollIntervalMs: 50,
|
|
126
|
-
timeoutMs: 5000,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
130
|
-
// TEST: PiAiRuntimeAdapter + DiagnosticianRunner full chain
|
|
131
|
-
// ═══════════════════════════════════════════════════════════════════════════
|
|
132
|
-
it('PiAiRuntimeAdapter + DiagnosticianRunner: full chain task → artifact → candidates', async () => {
|
|
133
|
-
const taskId = 'diagnosis_test-pain-m9-adapter-01';
|
|
134
|
-
// Create task via stateManager (bridge would normally do this)
|
|
135
|
-
await stateManager.createTask({
|
|
136
|
-
taskId,
|
|
137
|
-
taskKind: 'diagnostician',
|
|
138
|
-
status: 'pending',
|
|
139
|
-
attemptCount: 0,
|
|
140
|
-
maxAttempts: 3,
|
|
141
|
-
});
|
|
142
|
-
// Configure mock to return diagnosis with candidates
|
|
143
|
-
const output = makeDiagnosticianOutputWithCandidates(taskId);
|
|
144
|
-
mockComplete.mockResolvedValueOnce(makeAssistantMessage(JSON.stringify(output)));
|
|
145
|
-
// Create adapter and runner
|
|
146
|
-
const adapter = new PiAiRuntimeAdapter({
|
|
147
|
-
provider: 'openrouter',
|
|
148
|
-
model: 'anthropic/claude-sonnet-4',
|
|
149
|
-
apiKeyEnv: 'TEST_API_KEY',
|
|
150
|
-
maxRetries: 0,
|
|
151
|
-
timeoutMs: 60_000,
|
|
152
|
-
outputPathStrategy: 'free_form_only',
|
|
153
|
-
});
|
|
154
|
-
const runner = createRunner(adapter);
|
|
155
|
-
const result = await runner.run(taskId);
|
|
156
|
-
// Assert runner succeeded
|
|
157
|
-
expect(result.status).toBe('succeeded');
|
|
158
|
-
expect(result.contextHash).toBeDefined();
|
|
159
|
-
// Assert artifact was written
|
|
160
|
-
const db = sqliteConn.getDb();
|
|
161
|
-
const artifacts = db.prepare('SELECT * FROM artifacts WHERE task_id = ?').all(taskId);
|
|
162
|
-
expect(artifacts).toHaveLength(1);
|
|
163
|
-
const artifact = artifacts[0];
|
|
164
|
-
expect(artifact.artifact_kind).toBe('diagnostician_output');
|
|
165
|
-
// Assert >= 2 candidate records were created
|
|
166
|
-
const artifactId = artifact.artifact_id;
|
|
167
|
-
const candidates = db.prepare('SELECT * FROM principle_candidates WHERE artifact_id = ?').all(artifactId);
|
|
168
|
-
expect(candidates.length).toBeGreaterThanOrEqual(2);
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
//# sourceMappingURL=m9-adapter-integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"m9-adapter-integration.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/m9-adapter-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"m9-e2e.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/m9-e2e.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* E2E m9 — PainSignalBridge + PiAiRuntimeAdapter full chain.
|
|
3
|
-
* Pain → task → run → DiagnosticianOutputV1 artifact → candidates → ledger probation entry.
|
|
4
|
-
* Idempotency: same painId twice produces no duplicate candidates/ledger entries.
|
|
5
|
-
* Uses vi.mock('@mariozechner/pi-ai') — real adapter code, only LLM calls intercepted.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
8
|
-
import * as fs from 'fs';
|
|
9
|
-
import * as path from 'path';
|
|
10
|
-
import * as os from 'os';
|
|
11
|
-
import { RuntimeStateManager } from '../../store/runtime-state-manager.js';
|
|
12
|
-
import { SqliteContextAssembler } from '../../store/context/sqlite-context-assembler.js';
|
|
13
|
-
import { SqliteHistoryQuery } from '../../store/history/sqlite-history-query.js';
|
|
14
|
-
import { StoreEventEmitter } from '../../store/event-emitter.js';
|
|
15
|
-
import { DiagnosticianRunner } from '../diagnostician-runner.js';
|
|
16
|
-
import { PassThroughValidator } from '../diagnostician-validator.js';
|
|
17
|
-
import { SqliteDiagnosticianCommitter } from '../../store/commit/diagnostician-committer.js';
|
|
18
|
-
import { PainSignalBridge } from '../../pain-signal-bridge.js';
|
|
19
|
-
import { CandidateIntakeService } from '../../candidate-intake-service.js';
|
|
20
|
-
vi.mock('@mariozechner/pi-ai', () => ({
|
|
21
|
-
getModel: vi.fn(),
|
|
22
|
-
getProviders: vi.fn(() => ['openrouter', 'anthropic', 'openai']),
|
|
23
|
-
completeSimple: vi.fn(),
|
|
24
|
-
}));
|
|
25
|
-
import { getModel, completeSimple } from '@mariozechner/pi-ai';
|
|
26
|
-
import { PiAiRuntimeAdapter } from '../../adapter/pi-ai-runtime-adapter.js';
|
|
27
|
-
const mockComplete = completeSimple;
|
|
28
|
-
const mockGetModel = getModel;
|
|
29
|
-
// ── In-memory ledger adapter ──────────────────────────────────────────────────
|
|
30
|
-
class InMemoryLedgerAdapter {
|
|
31
|
-
entries = new Map();
|
|
32
|
-
writeProbationEntry(entry) {
|
|
33
|
-
const candidateId = this.#extractCandidateId(entry.sourceRef);
|
|
34
|
-
const existing = this.existsForCandidate(candidateId);
|
|
35
|
-
if (existing)
|
|
36
|
-
return existing;
|
|
37
|
-
this.entries.set(candidateId, entry);
|
|
38
|
-
return entry;
|
|
39
|
-
}
|
|
40
|
-
existsForCandidate(candidateId) { return this.entries.get(candidateId) ?? null; }
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
42
|
-
#extractCandidateId(sourceRef) { return sourceRef.startsWith('candidate://') ? sourceRef.slice('candidate://'.length) : sourceRef; }
|
|
43
|
-
}
|
|
44
|
-
// ── Fixtures ─────────────────────────────────────────────────────────────────
|
|
45
|
-
function makeAssistantMessage(text, overrides = {}) {
|
|
46
|
-
return {
|
|
47
|
-
content: [{ type: 'text', text }],
|
|
48
|
-
role: 'assistant',
|
|
49
|
-
stopReason: 'stop',
|
|
50
|
-
api: 'openai-completions',
|
|
51
|
-
provider: 'openrouter',
|
|
52
|
-
model: 'anthropic/claude-sonnet-4',
|
|
53
|
-
usage: { input: 10, output: 5, cacheRead: 0, cacheWrite: 0, totalTokens: 15, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },
|
|
54
|
-
timestamp: Date.now(),
|
|
55
|
-
...overrides,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
function makeDiagnosticianOutputWithCandidates(_taskId) {
|
|
59
|
-
return {
|
|
60
|
-
valid: true,
|
|
61
|
-
diagnosisId: `diag-m9-e2e-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,
|
|
62
|
-
summary: 'E2E m9-04 full chain test diagnosis summary',
|
|
63
|
-
rootCause: 'E2E m9-04 full chain root cause — missing validation before tool call',
|
|
64
|
-
violatedPrinciples: [],
|
|
65
|
-
evidence: [{ sourceRef: 'test', note: 'E2E test evidence' }],
|
|
66
|
-
recommendations: [
|
|
67
|
-
{ kind: 'principle', description: 'Always validate tool arguments before execution to prevent silent failures' },
|
|
68
|
-
{ kind: 'principle', description: 'Log all tool invocations with argument summaries for traceability' },
|
|
69
|
-
{ kind: 'rule', description: 'Use schema validation for external inputs' },
|
|
70
|
-
],
|
|
71
|
-
confidence: 0.92,
|
|
72
|
-
};
|
|
73
|
-
}
|
|
74
|
-
// ── Test setup ─────────────────────────────────────────────────────────────────
|
|
75
|
-
const TMP_ROOT = path.join(os.tmpdir(), `pd-e2e-m9-${process.pid}`);
|
|
76
|
-
describe('E2E m9 — PainSignalBridge + PiAiRuntimeAdapter full chain', () => {
|
|
77
|
-
let testDir;
|
|
78
|
-
let stateManager;
|
|
79
|
-
let sqliteConn;
|
|
80
|
-
let contextAssembler;
|
|
81
|
-
let eventEmitter;
|
|
82
|
-
let ledgerAdapter;
|
|
83
|
-
let intakeService;
|
|
84
|
-
beforeEach(async () => {
|
|
85
|
-
testDir = path.join(TMP_ROOT, `e2e-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
86
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
87
|
-
stateManager = new RuntimeStateManager({ workspaceDir: testDir });
|
|
88
|
-
await stateManager.initialize();
|
|
89
|
-
sqliteConn = stateManager.connection;
|
|
90
|
-
const historyQuery = new SqliteHistoryQuery(sqliteConn);
|
|
91
|
-
const taskStore = stateManager.taskStore;
|
|
92
|
-
const runStore = stateManager.runStore;
|
|
93
|
-
contextAssembler = new SqliteContextAssembler(taskStore, historyQuery, runStore);
|
|
94
|
-
eventEmitter = new StoreEventEmitter();
|
|
95
|
-
ledgerAdapter = new InMemoryLedgerAdapter();
|
|
96
|
-
intakeService = new CandidateIntakeService({ stateManager, ledgerAdapter });
|
|
97
|
-
vi.clearAllMocks();
|
|
98
|
-
process.env.TEST_API_KEY = 'test-key-123';
|
|
99
|
-
mockGetModel.mockReturnValue({ id: 'anthropic/claude-sonnet-4' });
|
|
100
|
-
});
|
|
101
|
-
afterEach(() => {
|
|
102
|
-
stateManager.close();
|
|
103
|
-
try {
|
|
104
|
-
fs.rmSync(TMP_ROOT, { recursive: true, force: true });
|
|
105
|
-
}
|
|
106
|
-
catch { /* ignore */ }
|
|
107
|
-
});
|
|
108
|
-
function createRunner(runtimeAdapter) {
|
|
109
|
-
const committer = new SqliteDiagnosticianCommitter(sqliteConn);
|
|
110
|
-
return new DiagnosticianRunner({ stateManager, contextAssembler, runtimeAdapter, eventEmitter, validator: new PassThroughValidator(), committer }, { owner: 'e2e-m9-full-chain', runtimeKind: 'pi-ai', pollIntervalMs: 50, timeoutMs: 5000 });
|
|
111
|
-
}
|
|
112
|
-
function makePiAiAdapter() {
|
|
113
|
-
return new PiAiRuntimeAdapter({ provider: 'openrouter', model: 'anthropic/claude-sonnet-4', apiKeyEnv: 'TEST_API_KEY', maxRetries: 0, timeoutMs: 60_000, outputPathStrategy: 'free_form_only' });
|
|
114
|
-
}
|
|
115
|
-
// TEST 1: Full chain
|
|
116
|
-
it('full chain: pain → task → artifact → candidates → ledger probation entry via pi-ai', async () => {
|
|
117
|
-
const painId = 'test-pain-m9-e2e-01';
|
|
118
|
-
const expectedTaskId = `diagnosis_${painId}`;
|
|
119
|
-
const output = makeDiagnosticianOutputWithCandidates(expectedTaskId);
|
|
120
|
-
mockComplete.mockResolvedValueOnce(makeAssistantMessage(JSON.stringify(output)));
|
|
121
|
-
const bridge = new PainSignalBridge({
|
|
122
|
-
stateManager,
|
|
123
|
-
runner: createRunner(makePiAiAdapter()),
|
|
124
|
-
intakeService,
|
|
125
|
-
ledgerAdapter,
|
|
126
|
-
autoIntakeEnabled: true,
|
|
127
|
-
});
|
|
128
|
-
const result = await bridge.onPainDetected({ painId, painType: 'tool_failure', source: 'test', reason: 'test failure', evidence: [{ sourceRef: 'test', note: 'E2E test evidence' }] });
|
|
129
|
-
expect(result.status).toBe('succeeded');
|
|
130
|
-
expect(result.painId).toBe(painId);
|
|
131
|
-
expect(result.taskId).toBe(expectedTaskId);
|
|
132
|
-
expect(result.candidateIds.length).toBeGreaterThanOrEqual(1);
|
|
133
|
-
expect(result.ledgerEntryIds.length).toBeGreaterThanOrEqual(1);
|
|
134
|
-
const db = sqliteConn.getDb();
|
|
135
|
-
const artifacts = db.prepare('SELECT * FROM artifacts WHERE task_id = ?').all(expectedTaskId);
|
|
136
|
-
expect(artifacts).toHaveLength(1);
|
|
137
|
-
const artifact = artifacts[0];
|
|
138
|
-
expect(artifact.artifact_kind).toBe('diagnostician_output');
|
|
139
|
-
const candidates = db.prepare('SELECT * FROM principle_candidates WHERE task_id = ?').all(expectedTaskId);
|
|
140
|
-
expect(candidates.length).toBeGreaterThanOrEqual(1);
|
|
141
|
-
for (const row of candidates) {
|
|
142
|
-
const ledgerEntry = ledgerAdapter.existsForCandidate(row.candidate_id);
|
|
143
|
-
expect(ledgerEntry).not.toBeNull();
|
|
144
|
-
const entry = ledgerEntry;
|
|
145
|
-
expect(entry.status).toBe('probation');
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
// TEST 2: Idempotency
|
|
149
|
-
it('idempotency: same painId twice produces no duplicate candidates or ledger entries', async () => {
|
|
150
|
-
const painId = 'test-pain-m9-e2e-idempotent';
|
|
151
|
-
const expectedTaskId = `diagnosis_${painId}`;
|
|
152
|
-
const output = makeDiagnosticianOutputWithCandidates(expectedTaskId);
|
|
153
|
-
mockComplete.mockResolvedValueOnce(makeAssistantMessage(JSON.stringify(output)));
|
|
154
|
-
const bridge = new PainSignalBridge({
|
|
155
|
-
stateManager,
|
|
156
|
-
runner: createRunner(makePiAiAdapter()),
|
|
157
|
-
intakeService,
|
|
158
|
-
ledgerAdapter,
|
|
159
|
-
autoIntakeEnabled: true,
|
|
160
|
-
});
|
|
161
|
-
const result1 = await bridge.onPainDetected({ painId, painType: 'tool_failure', source: 'test', reason: 'test', evidence: [{ sourceRef: 'test', note: 'E2E test evidence' }] });
|
|
162
|
-
expect(result1.status).toBe('succeeded');
|
|
163
|
-
const db = sqliteConn.getDb();
|
|
164
|
-
const firstCandidates = db.prepare('SELECT * FROM principle_candidates WHERE task_id = ?').all(expectedTaskId);
|
|
165
|
-
const firstCandidateCount = firstCandidates.length;
|
|
166
|
-
const firstLedgerCount = result1.ledgerEntryIds.length;
|
|
167
|
-
// Second call — same painId, NOOP path (task already succeeded)
|
|
168
|
-
const result2 = await bridge.onPainDetected({ painId, painType: 'tool_failure', source: 'test', reason: 'test', evidence: [{ sourceRef: 'test', note: 'E2E test evidence' }] });
|
|
169
|
-
expect(result2.status).toBe('succeeded');
|
|
170
|
-
const secondCandidates = db.prepare('SELECT * FROM principle_candidates WHERE task_id = ?').all(expectedTaskId);
|
|
171
|
-
expect(secondCandidates.length).toBe(firstCandidateCount);
|
|
172
|
-
expect(result2.ledgerEntryIds.length).toBe(firstLedgerCount);
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
//# sourceMappingURL=m9-e2e.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"m9-e2e.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/m9-e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"max-attempts-exceeded.integration.test.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/max-attempts-exceeded.integration.test.ts"],"names":[],"mappings":""}
|