@principles/core 1.124.0 → 1.126.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 +2 -2
- 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 +17 -30
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +3 -8
- 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/pain-to-principle-service.d.ts +1 -0
- package/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
- package/dist/runtime-v2/pain-to-principle-service.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":""}
|