@principles/core 1.236.0 → 1.237.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__/feedback/create-report.test.js +51 -0
- package/dist/runtime-v2/__tests__/feedback/create-report.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.js +1 -1
- package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.js.map +1 -1
- package/dist/runtime-v2/__tests__/feedback/render-markdown.test.js +1 -1
- package/dist/runtime-v2/__tests__/feedback/render-markdown.test.js.map +1 -1
- package/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js +109 -0
- package/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js.map +1 -1
- package/dist/runtime-v2/activation/activation-dispatcher.d.ts +11 -0
- package/dist/runtime-v2/activation/activation-dispatcher.d.ts.map +1 -1
- package/dist/runtime-v2/activation/activation-dispatcher.js +60 -6
- package/dist/runtime-v2/activation/activation-dispatcher.js.map +1 -1
- package/dist/runtime-v2/activation/activation-types.d.ts +4 -0
- package/dist/runtime-v2/activation/activation-types.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +34 -0
- 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 +5 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.d.ts +2 -0
- package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.d.ts.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.js +221 -0
- package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.js.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/mailto-url.test.d.ts +11 -0
- package/dist/runtime-v2/feedback/__tests__/mailto-url.test.d.ts.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/mailto-url.test.js +160 -0
- package/dist/runtime-v2/feedback/__tests__/mailto-url.test.js.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.d.ts +2 -0
- package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.d.ts.map +1 -0
- package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.js +342 -0
- package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.js.map +1 -0
- package/dist/runtime-v2/feedback/create-report.d.ts +7 -1
- package/dist/runtime-v2/feedback/create-report.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/create-report.js +65 -7
- package/dist/runtime-v2/feedback/create-report.js.map +1 -1
- package/dist/runtime-v2/feedback/feedback-types.d.ts +18 -1
- package/dist/runtime-v2/feedback/feedback-types.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/feedback-types.js +19 -12
- package/dist/runtime-v2/feedback/feedback-types.js.map +1 -1
- package/dist/runtime-v2/feedback/index.d.ts +3 -1
- package/dist/runtime-v2/feedback/index.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/index.js +7 -1
- package/dist/runtime-v2/feedback/index.js.map +1 -1
- package/dist/runtime-v2/feedback/pending-agent-draft-store.d.ts +106 -0
- package/dist/runtime-v2/feedback/pending-agent-draft-store.d.ts.map +1 -0
- package/dist/runtime-v2/feedback/pending-agent-draft-store.js +220 -0
- package/dist/runtime-v2/feedback/pending-agent-draft-store.js.map +1 -0
- package/dist/runtime-v2/feedback/privacy-preview.d.ts +16 -0
- package/dist/runtime-v2/feedback/privacy-preview.d.ts.map +1 -1
- package/dist/runtime-v2/feedback/privacy-preview.js +54 -0
- package/dist/runtime-v2/feedback/privacy-preview.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +5 -0
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +9 -0
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.d.ts +2 -0
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.d.ts.map +1 -0
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.js +459 -0
- package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.js.map +1 -0
- package/dist/runtime-v2/runner/base-peer-runner.d.ts +27 -0
- package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
- package/dist/runtime-v2/runner/base-peer-runner.js +138 -0
- package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
- package/dist/runtime-v2/runner/peer-runner-types.d.ts +9 -0
- package/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
- package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.d.ts +2 -0
- package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.d.ts.map +1 -0
- package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.js +225 -0
- package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.js.map +1 -0
- package/dist/runtime-v2/store/pain/index.d.ts +3 -0
- package/dist/runtime-v2/store/pain/index.d.ts.map +1 -0
- package/dist/runtime-v2/store/pain/index.js +2 -0
- package/dist/runtime-v2/store/pain/index.js.map +1 -0
- package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.d.ts +70 -0
- package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.d.ts.map +1 -0
- package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.js +154 -0
- package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.js.map +1 -0
- package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
- package/dist/runtime-v2/store/sqlite-connection.js +41 -0
- package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.d.ts +2 -0
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.d.ts.map +1 -0
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js +442 -0
- package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js.map +1 -0
- package/dist/runtime-v2/store/task/index.d.ts +1 -0
- package/dist/runtime-v2/store/task/index.d.ts.map +1 -1
- package/dist/runtime-v2/store/task/index.js.map +1 -1
- package/dist/runtime-v2/store/task/sqlite-task-store.d.ts +45 -0
- package/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
- package/dist/runtime-v2/store/task/sqlite-task-store.js +205 -0
- package/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
- package/dist/runtime-v2/store/task/task-types.d.ts +60 -0
- package/dist/runtime-v2/store/task/task-types.d.ts.map +1 -0
- package/dist/runtime-v2/store/task/task-types.js +2 -0
- package/dist/runtime-v2/store/task/task-types.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task 12: BasePeerRunner permanent-failure agentDraft injection tests.
|
|
3
|
+
*
|
|
4
|
+
* Verifies that when a peer runner reaches a permanent-failure terminal
|
|
5
|
+
* state (permanentErrorCategories hit in retryOrFail), it constructs an
|
|
6
|
+
* AgentDraftPayload from the failure context and writes it to
|
|
7
|
+
* pending_agent_drafts via the injected PendingAgentDraftStore. The write
|
|
8
|
+
* is best-effort: failures are observed via telemetry (rc-9) but never
|
|
9
|
+
* propagate, so the markFailed terminal-state contract is preserved.
|
|
10
|
+
*
|
|
11
|
+
* Scenarios covered (per Task 12 spec):
|
|
12
|
+
* 1. permanent error → pending_agent_drafts table contains exactly one row
|
|
13
|
+
* 2. permanent error → agentDraft.summary contains taskKind + errorCategory
|
|
14
|
+
* 3. permanent error → agentDraft.observedFailure contains redacted error message
|
|
15
|
+
* 4. permanent error → agentDraft.observedFailure does NOT contain raw paths
|
|
16
|
+
* (constructs an error containing `D:\Code\principles\secret`, asserts redacted)
|
|
17
|
+
* 5. retry-able error (non-permanent) → insertPendingDraft NOT called
|
|
18
|
+
* 6. repeated permanent failure on same taskId → idempotent (no duplicate row,
|
|
19
|
+
* but agentDraft is updated)
|
|
20
|
+
* 7. pendingAgentDraftStore not injected → no throw, markFailed completes normally
|
|
21
|
+
* 8. insertPendingDraft throws → does not break markFailed flow
|
|
22
|
+
*
|
|
23
|
+
* ERR entries considered:
|
|
24
|
+
* - EP-01 / ERR-001, ERR-005, ERR-013: diagnosticJson parsed as unknown,
|
|
25
|
+
* narrowed with typeof + Object.hasOwn. No `as` casts in production code
|
|
26
|
+
* under test; tests use `as` only for mock construction (mocks are
|
|
27
|
+
* trusted fixtures, not untrusted runtime data).
|
|
28
|
+
* - EP-03 / ERR-002: agentDraft injection failure emits telemetry with
|
|
29
|
+
* reason + nextAction (rc-9-no-silent-fallback).
|
|
30
|
+
* - EP-03 / ERR-074, ERR-089: every branch (store missing, insert !ok,
|
|
31
|
+
* insert throws) applies the SAME best-effort contract.
|
|
32
|
+
* - EP-05 / ERR-015: painId extracted fresh from ctx.task.diagnosticJson
|
|
33
|
+
* on each call, not cached.
|
|
34
|
+
* - EP-08 / ERR-003, ERR-024: redactAbsolutePaths / redactTokenLikeValues /
|
|
35
|
+
* redactEnvLikeValues applied to observedFailure BEFORE persist.
|
|
36
|
+
*
|
|
37
|
+
* @see packages/principles-core/src/runtime-v2/runner/base-peer-runner.ts (retryOrFail, injectAgentDraftOnPermanentFailure)
|
|
38
|
+
* @see packages/principles-core/src/runtime-v2/feedback/pending-agent-draft-store.ts
|
|
39
|
+
* @see packages/principles-core/src/runtime-v2/feedback/redact-sensitive.ts
|
|
40
|
+
*/
|
|
41
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
42
|
+
import * as path from 'node:path';
|
|
43
|
+
import * as os from 'node:os';
|
|
44
|
+
import * as fs from 'node:fs';
|
|
45
|
+
import { BasePeerRunner } from '../base-peer-runner.js';
|
|
46
|
+
import { SqliteConnection } from '../../store/sqlite-connection.js';
|
|
47
|
+
import { PendingAgentDraftStore } from '../../feedback/pending-agent-draft-store.js';
|
|
48
|
+
const TASK_ID = 'task-agent-draft-001';
|
|
49
|
+
function makeTask(overrides = {}) {
|
|
50
|
+
return {
|
|
51
|
+
taskId: TASK_ID,
|
|
52
|
+
taskKind: 'dreamer',
|
|
53
|
+
status: 'leased',
|
|
54
|
+
attemptCount: 1,
|
|
55
|
+
maxAttempts: 3,
|
|
56
|
+
createdAt: new Date().toISOString(),
|
|
57
|
+
updatedAt: new Date().toISOString(),
|
|
58
|
+
...overrides,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function createTestConnection() {
|
|
62
|
+
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-test-agent-draft-'));
|
|
63
|
+
return new SqliteConnection(tmpDir);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Test runner that exposes retryOrFail for direct testing.
|
|
67
|
+
* permanentErrorCategories includes 'input_invalid' and 'storage_unavailable'
|
|
68
|
+
* (both treated as permanent — never retried).
|
|
69
|
+
*/
|
|
70
|
+
class AgentDraftTestRunner extends BasePeerRunner {
|
|
71
|
+
constructor(deps) {
|
|
72
|
+
super(deps, { owner: 'test', runtimeKind: 'test-double' }, {
|
|
73
|
+
runnerName: 'test',
|
|
74
|
+
expectedTaskKind: 'dreamer',
|
|
75
|
+
defaultAgentId: 'test',
|
|
76
|
+
resultRefPrefix: 'test',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
80
|
+
get permanentErrorCategories() {
|
|
81
|
+
return new Set([
|
|
82
|
+
'storage_unavailable',
|
|
83
|
+
'workspace_invalid',
|
|
84
|
+
'capability_missing',
|
|
85
|
+
'cancelled',
|
|
86
|
+
'input_invalid',
|
|
87
|
+
'output_invalid',
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
91
|
+
async buildContext() {
|
|
92
|
+
return { contextHash: 'test-hash' };
|
|
93
|
+
}
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
95
|
+
async invokeRuntime() {
|
|
96
|
+
return { runId: 'run-001', runtimeKind: 'test-double', startedAt: new Date().toISOString() };
|
|
97
|
+
}
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this
|
|
99
|
+
async validateOutput() {
|
|
100
|
+
return { valid: true, errors: [] };
|
|
101
|
+
}
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/class-methods-use-this, @typescript-eslint/max-params
|
|
103
|
+
async succeedTask(taskId, runId, _output, task) {
|
|
104
|
+
return { status: 'succeeded', taskId, runId, attemptCount: task.attemptCount };
|
|
105
|
+
}
|
|
106
|
+
/** Expose protected retryOrFail for direct testing. */
|
|
107
|
+
async callRetryOrFail(ctx) {
|
|
108
|
+
return this.retryOrFail(ctx);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function createMockDeps(overrides) {
|
|
112
|
+
return {
|
|
113
|
+
stateManager: {
|
|
114
|
+
getRetryPolicy: vi.fn().mockReturnValue({
|
|
115
|
+
// Default: do NOT retry — so non-permanent errors flow to
|
|
116
|
+
// max_attempts_exceeded rather than retry_wait. Tests that need
|
|
117
|
+
// retry_wait override shouldRetry to true.
|
|
118
|
+
shouldRetry: vi.fn().mockReturnValue(false),
|
|
119
|
+
}),
|
|
120
|
+
markTaskFailed: vi.fn().mockResolvedValue({}),
|
|
121
|
+
markTaskRetryWait: vi.fn().mockResolvedValue({}),
|
|
122
|
+
markTaskSucceeded: vi.fn().mockResolvedValue({}),
|
|
123
|
+
updateRunOutput: vi.fn().mockResolvedValue({}),
|
|
124
|
+
},
|
|
125
|
+
runtimeAdapter: {},
|
|
126
|
+
eventEmitter: {
|
|
127
|
+
emitTelemetry: vi.fn(),
|
|
128
|
+
},
|
|
129
|
+
artifactStore: {},
|
|
130
|
+
...overrides,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function telemetryCalls(mock) {
|
|
134
|
+
return mock.mock.calls.map((call) => call[0]);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Narrow `T | null` to `T` after a preceding `expect(x).not.toBeNull()`.
|
|
138
|
+
* Replaces `x!.prop` (forbidden by @typescript-eslint/no-non-null-assertion)
|
|
139
|
+
* with type-safe access. The throw branch is unreachable after the expect,
|
|
140
|
+
* but TypeScript needs it for control-flow narrowing.
|
|
141
|
+
*/
|
|
142
|
+
function unwrap(value) {
|
|
143
|
+
if (value === null || value === undefined) {
|
|
144
|
+
throw new Error('unwrap: value is null/undefined');
|
|
145
|
+
}
|
|
146
|
+
return value;
|
|
147
|
+
}
|
|
148
|
+
// ── Tests ────────────────────────────────────────────────────────────────────
|
|
149
|
+
describe('Task 12: BasePeerRunner permanent-failure agentDraft injection', () => {
|
|
150
|
+
let connection = null;
|
|
151
|
+
let store = null;
|
|
152
|
+
let mockDeps;
|
|
153
|
+
let runner;
|
|
154
|
+
let task;
|
|
155
|
+
beforeEach(() => {
|
|
156
|
+
connection = createTestConnection();
|
|
157
|
+
// Touch getDb() so initSchema() runs (creates pending_agent_drafts table).
|
|
158
|
+
connection.getDb();
|
|
159
|
+
store = new PendingAgentDraftStore(connection);
|
|
160
|
+
mockDeps = createMockDeps({ pendingAgentDraftStore: store });
|
|
161
|
+
runner = new AgentDraftTestRunner(mockDeps);
|
|
162
|
+
task = makeTask();
|
|
163
|
+
});
|
|
164
|
+
afterEach(() => {
|
|
165
|
+
connection?.close();
|
|
166
|
+
});
|
|
167
|
+
it('permanent error → pending_agent_drafts table contains exactly one row', async () => {
|
|
168
|
+
const ctx = {
|
|
169
|
+
taskId: TASK_ID,
|
|
170
|
+
task,
|
|
171
|
+
errorCategory: 'input_invalid',
|
|
172
|
+
failureReason: 'Task input was malformed',
|
|
173
|
+
};
|
|
174
|
+
const result = await runner.callRetryOrFail(ctx);
|
|
175
|
+
expect(result.status).toBe('failed');
|
|
176
|
+
expect(result.errorCategory).toBe('input_invalid');
|
|
177
|
+
// The store should have exactly one unconsumed row for this taskId.
|
|
178
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
179
|
+
expect(row).not.toBeNull();
|
|
180
|
+
expect(unwrap(row).taskId).toBe(TASK_ID);
|
|
181
|
+
// And exactly one row total in the table.
|
|
182
|
+
const allRows = store.listPending();
|
|
183
|
+
expect(allRows).toHaveLength(1);
|
|
184
|
+
});
|
|
185
|
+
it('permanent error → agentDraft.summary contains taskKind + errorCategory', async () => {
|
|
186
|
+
const ctx = {
|
|
187
|
+
taskId: TASK_ID,
|
|
188
|
+
task,
|
|
189
|
+
errorCategory: 'input_invalid',
|
|
190
|
+
failureReason: 'malformed input',
|
|
191
|
+
};
|
|
192
|
+
await runner.callRetryOrFail(ctx);
|
|
193
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
194
|
+
expect(row).not.toBeNull();
|
|
195
|
+
// summary format: `${taskKind} failed with category=${errorCategory} at ${isoTimestamp}`
|
|
196
|
+
expect(unwrap(row).agentDraft.summary).toContain('dreamer');
|
|
197
|
+
expect(unwrap(row).agentDraft.summary).toContain('input_invalid');
|
|
198
|
+
expect(unwrap(row).agentDraft.summary).toMatch(/\bfailed with category=/);
|
|
199
|
+
// ISO timestamp at the end
|
|
200
|
+
expect(unwrap(row).agentDraft.summary).toMatch(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/);
|
|
201
|
+
});
|
|
202
|
+
it('permanent error → agentDraft.observedFailure contains redacted error message', async () => {
|
|
203
|
+
const ctx = {
|
|
204
|
+
taskId: TASK_ID,
|
|
205
|
+
task,
|
|
206
|
+
errorCategory: 'input_invalid',
|
|
207
|
+
failureReason: 'Task input was malformed: missing required field "principleId"',
|
|
208
|
+
};
|
|
209
|
+
await runner.callRetryOrFail(ctx);
|
|
210
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
211
|
+
expect(row).not.toBeNull();
|
|
212
|
+
expect(unwrap(row).agentDraft.observedFailure).toBeDefined();
|
|
213
|
+
// The error message text is preserved (it contains no paths/tokens/env, so redaction is a no-op).
|
|
214
|
+
expect(unwrap(row).agentDraft.observedFailure).toContain('Task input was malformed');
|
|
215
|
+
expect(unwrap(row).agentDraft.observedFailure).toContain('principleId');
|
|
216
|
+
});
|
|
217
|
+
it('permanent error → agentDraft.observedFailure does NOT contain raw absolute paths (redacted)', async () => {
|
|
218
|
+
// Construct a failure reason containing a Windows absolute path that
|
|
219
|
+
// redactAbsolutePaths MUST scrub. If redaction is skipped, this test
|
|
220
|
+
// fails — proving the redactor is wired into the injection path.
|
|
221
|
+
//
|
|
222
|
+
// Note: we deliberately avoid key-like tokens (e.g. "secret:") in the
|
|
223
|
+
// path suffix because redactTokenLikeValues' KEY_ASSIGN regex would
|
|
224
|
+
// also redact them — that would conflate two redactors. We want this
|
|
225
|
+
// test to isolate path redaction. Use a plain filename suffix.
|
|
226
|
+
const secretPath = 'D:\\Code\\principles\\secret\\config.json';
|
|
227
|
+
const ctx = {
|
|
228
|
+
taskId: TASK_ID,
|
|
229
|
+
task,
|
|
230
|
+
errorCategory: 'input_invalid',
|
|
231
|
+
failureReason: `Failed to read config from ${secretPath} - file not found`,
|
|
232
|
+
};
|
|
233
|
+
await runner.callRetryOrFail(ctx);
|
|
234
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
235
|
+
expect(row).not.toBeNull();
|
|
236
|
+
expect(unwrap(row).agentDraft.observedFailure).toBeDefined();
|
|
237
|
+
// The raw path MUST NOT appear verbatim in the persisted draft.
|
|
238
|
+
expect(unwrap(row).agentDraft.observedFailure).not.toContain(secretPath);
|
|
239
|
+
expect(unwrap(row).agentDraft.observedFailure).not.toContain('D:\\Code');
|
|
240
|
+
// The redacted marker SHOULD appear instead.
|
|
241
|
+
expect(unwrap(row).agentDraft.observedFailure).toContain('<redacted-path>');
|
|
242
|
+
// Non-path content is preserved.
|
|
243
|
+
expect(unwrap(row).agentDraft.observedFailure).toContain('Failed to read config from');
|
|
244
|
+
expect(unwrap(row).agentDraft.observedFailure).toContain('file not found');
|
|
245
|
+
});
|
|
246
|
+
it('retry-able error (non-permanent) → insertPendingDraft NOT called, no row in table', async () => {
|
|
247
|
+
// Override the retry policy to return TRUE (shouldRetry) so the error
|
|
248
|
+
// flows to markTaskRetryWait instead of markTaskFailed. The agentDraft
|
|
249
|
+
// injection must NOT fire on the retry_wait path.
|
|
250
|
+
mockDeps.stateManager.getRetryPolicy.mockReturnValue({
|
|
251
|
+
shouldRetry: vi.fn().mockReturnValue(true),
|
|
252
|
+
});
|
|
253
|
+
// 'execution_failed' is NOT in permanentErrorCategories for this runner.
|
|
254
|
+
const ctx = {
|
|
255
|
+
taskId: TASK_ID,
|
|
256
|
+
task,
|
|
257
|
+
errorCategory: 'execution_failed',
|
|
258
|
+
failureReason: 'transient network error',
|
|
259
|
+
};
|
|
260
|
+
const result = await runner.callRetryOrFail(ctx);
|
|
261
|
+
// Should be retried, not failed.
|
|
262
|
+
expect(result.status).toBe('retried');
|
|
263
|
+
expect(result.errorCategory).toBe('execution_failed');
|
|
264
|
+
expect(mockDeps.stateManager.markTaskRetryWait).toHaveBeenCalled();
|
|
265
|
+
// NO row should exist in pending_agent_drafts.
|
|
266
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
267
|
+
expect(row).toBeNull();
|
|
268
|
+
// NO agent_draft_inserted telemetry event.
|
|
269
|
+
const calls = telemetryCalls(mockDeps.eventEmitter.emitTelemetry);
|
|
270
|
+
expect(calls.find((c) => c.eventType === 'test_agent_draft_inserted')).toBeUndefined();
|
|
271
|
+
expect(calls.find((c) => c.eventType === 'test_agent_draft_insert_failed')).toBeUndefined();
|
|
272
|
+
});
|
|
273
|
+
it('repeated permanent failure on same taskId → idempotent (no duplicate row, agentDraft updated)', async () => {
|
|
274
|
+
// First permanent failure.
|
|
275
|
+
const ctx1 = {
|
|
276
|
+
taskId: TASK_ID,
|
|
277
|
+
task,
|
|
278
|
+
errorCategory: 'input_invalid',
|
|
279
|
+
failureReason: 'first failure reason text',
|
|
280
|
+
};
|
|
281
|
+
const result1 = await runner.callRetryOrFail(ctx1);
|
|
282
|
+
expect(result1.status).toBe('failed');
|
|
283
|
+
// Verify one row exists. summary does NOT carry the failure reason
|
|
284
|
+
// (only taskKind + errorCategory + timestamp); the reason lives in
|
|
285
|
+
// observedFailure.
|
|
286
|
+
const row1 = store.getUnconsumedByTaskId(TASK_ID);
|
|
287
|
+
expect(row1).not.toBeNull();
|
|
288
|
+
expect(unwrap(row1).agentDraft.summary).toContain('input_invalid');
|
|
289
|
+
expect(unwrap(row1).agentDraft.observedFailure).toContain('first failure reason text');
|
|
290
|
+
const firstId = unwrap(row1).id;
|
|
291
|
+
// Second permanent failure on the SAME taskId (e.g., task was re-leased
|
|
292
|
+
// after manual recovery and failed again with a different reason).
|
|
293
|
+
const ctx2 = {
|
|
294
|
+
taskId: TASK_ID,
|
|
295
|
+
task,
|
|
296
|
+
errorCategory: 'output_invalid',
|
|
297
|
+
failureReason: 'second failure with different reason',
|
|
298
|
+
};
|
|
299
|
+
const result2 = await runner.callRetryOrFail(ctx2);
|
|
300
|
+
expect(result2.status).toBe('failed');
|
|
301
|
+
// Still exactly one unconsumed row (idempotent UPDATE, not INSERT).
|
|
302
|
+
const row2 = store.getUnconsumedByTaskId(TASK_ID);
|
|
303
|
+
expect(row2).not.toBeNull();
|
|
304
|
+
expect(unwrap(row2).id).toBe(firstId); // same row id preserved
|
|
305
|
+
// The agentDraft should reflect the LATEST failure (UPDATE overwrote it).
|
|
306
|
+
// summary now carries the new errorCategory (output_invalid, not input_invalid).
|
|
307
|
+
expect(unwrap(row2).agentDraft.summary).toContain('output_invalid');
|
|
308
|
+
expect(unwrap(row2).agentDraft.summary).not.toContain('input_invalid');
|
|
309
|
+
// observedFailure carries the new failure reason, not the old one.
|
|
310
|
+
expect(unwrap(row2).agentDraft.observedFailure).toContain('second failure with different reason');
|
|
311
|
+
expect(unwrap(row2).agentDraft.observedFailure).not.toContain('first failure reason text');
|
|
312
|
+
// Exactly one row total in the table.
|
|
313
|
+
const allRows = store.listPending();
|
|
314
|
+
expect(allRows).toHaveLength(1);
|
|
315
|
+
});
|
|
316
|
+
it('pendingAgentDraftStore not injected → no throw, markFailed completes normally', async () => {
|
|
317
|
+
// Build a runner WITHOUT a pendingAgentDraftStore — simulates legacy
|
|
318
|
+
// callers that have not yet been upgraded to inject the store.
|
|
319
|
+
// createMockDeps() with no overrides does NOT set pendingAgentDraftStore,
|
|
320
|
+
// so the field is undefined on the resulting deps object.
|
|
321
|
+
const depsWithoutStore = createMockDeps();
|
|
322
|
+
const legacyRunner = new AgentDraftTestRunner(depsWithoutStore);
|
|
323
|
+
const ctx = {
|
|
324
|
+
taskId: TASK_ID,
|
|
325
|
+
task,
|
|
326
|
+
errorCategory: 'input_invalid',
|
|
327
|
+
failureReason: 'permanent failure without draft store',
|
|
328
|
+
};
|
|
329
|
+
// Must NOT throw — backward compatible.
|
|
330
|
+
const result = await legacyRunner.callRetryOrFail(ctx);
|
|
331
|
+
// markTaskFailed still called with the original errorCategory.
|
|
332
|
+
expect(result.status).toBe('failed');
|
|
333
|
+
expect(result.errorCategory).toBe('input_invalid');
|
|
334
|
+
expect(depsWithoutStore.stateManager.markTaskFailed).toHaveBeenCalledWith(TASK_ID, 'input_invalid', 'permanent failure without draft store');
|
|
335
|
+
// NO agent_draft telemetry events (store was not injected).
|
|
336
|
+
const calls = telemetryCalls(depsWithoutStore.eventEmitter.emitTelemetry);
|
|
337
|
+
expect(calls.find((c) => c.eventType === 'test_agent_draft_inserted')).toBeUndefined();
|
|
338
|
+
expect(calls.find((c) => c.eventType === 'test_agent_draft_insert_failed')).toBeUndefined();
|
|
339
|
+
});
|
|
340
|
+
it('insertPendingDraft throws → does not break markFailed flow; telemetry emitted (rc-9)', async () => {
|
|
341
|
+
// Construct a store mock that throws synchronously when insertPendingDraft
|
|
342
|
+
// is called. This simulates a misbehaving store implementation.
|
|
343
|
+
const throwingStore = {
|
|
344
|
+
insertPendingDraft: vi.fn().mockImplementation(() => {
|
|
345
|
+
throw new Error('simulated store corruption');
|
|
346
|
+
}),
|
|
347
|
+
};
|
|
348
|
+
const depsWithThrowingStore = createMockDeps({ pendingAgentDraftStore: throwingStore });
|
|
349
|
+
const runnerWithThrowingStore = new AgentDraftTestRunner(depsWithThrowingStore);
|
|
350
|
+
const ctx = {
|
|
351
|
+
taskId: TASK_ID,
|
|
352
|
+
task,
|
|
353
|
+
errorCategory: 'input_invalid',
|
|
354
|
+
failureReason: 'permanent failure with throwing store',
|
|
355
|
+
};
|
|
356
|
+
// Must NOT throw — the markFailed contract is preserved even when the
|
|
357
|
+
// draft store throws unexpectedly.
|
|
358
|
+
const result = await runnerWithThrowingStore.callRetryOrFail(ctx);
|
|
359
|
+
// markTaskFailed still called and result is the expected failed status.
|
|
360
|
+
expect(result.status).toBe('failed');
|
|
361
|
+
expect(result.errorCategory).toBe('input_invalid');
|
|
362
|
+
expect(depsWithThrowingStore.stateManager.markTaskFailed).toHaveBeenCalled();
|
|
363
|
+
// rc-9: telemetry event MUST be emitted with the error reason + nextAction
|
|
364
|
+
// (never silent).
|
|
365
|
+
const calls = telemetryCalls(depsWithThrowingStore.eventEmitter.emitTelemetry);
|
|
366
|
+
const failedEvent = calls.find((c) => c.eventType === 'test_agent_draft_insert_failed');
|
|
367
|
+
expect(failedEvent).toBeDefined();
|
|
368
|
+
expect(failedEvent?.payload?.errorMessage).toContain('simulated store corruption');
|
|
369
|
+
expect(failedEvent?.payload).toHaveProperty('nextAction');
|
|
370
|
+
expect(typeof failedEvent?.payload?.nextAction).toBe('string');
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
// ── Supplemental: painId linkage from diagnosticJson (rc-1, rc-5, rc-7) ──────
|
|
374
|
+
describe('Task 12: agentDraft painId linkage from diagnosticJson', () => {
|
|
375
|
+
let connection = null;
|
|
376
|
+
let store = null;
|
|
377
|
+
let mockDeps;
|
|
378
|
+
let runner;
|
|
379
|
+
beforeEach(() => {
|
|
380
|
+
connection = createTestConnection();
|
|
381
|
+
connection.getDb();
|
|
382
|
+
store = new PendingAgentDraftStore(connection);
|
|
383
|
+
mockDeps = createMockDeps({ pendingAgentDraftStore: store });
|
|
384
|
+
runner = new AgentDraftTestRunner(mockDeps);
|
|
385
|
+
});
|
|
386
|
+
afterEach(() => {
|
|
387
|
+
connection?.close();
|
|
388
|
+
});
|
|
389
|
+
it('diagnosticJson with sourcePainId → painId linked in pending_agent_drafts', async () => {
|
|
390
|
+
const task = makeTask({
|
|
391
|
+
diagnosticJson: JSON.stringify({ sourcePainId: 'pain-from-diag-001', other: 'metadata' }),
|
|
392
|
+
});
|
|
393
|
+
const ctx = {
|
|
394
|
+
taskId: TASK_ID,
|
|
395
|
+
task,
|
|
396
|
+
errorCategory: 'input_invalid',
|
|
397
|
+
failureReason: 'failure with pain linkage',
|
|
398
|
+
};
|
|
399
|
+
await runner.callRetryOrFail(ctx);
|
|
400
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
401
|
+
expect(row).not.toBeNull();
|
|
402
|
+
expect(unwrap(row).painId).toBe('pain-from-diag-001');
|
|
403
|
+
// agent_draft_inserted telemetry should report painIdLinked: true.
|
|
404
|
+
const calls = telemetryCalls(mockDeps.eventEmitter.emitTelemetry);
|
|
405
|
+
const inserted = calls.find((c) => c.eventType === 'test_agent_draft_inserted');
|
|
406
|
+
expect(inserted).toBeDefined();
|
|
407
|
+
expect(inserted?.payload?.painIdLinked).toBe(true);
|
|
408
|
+
});
|
|
409
|
+
it('diagnosticJson without sourcePainId → painId is null in pending_agent_drafts', async () => {
|
|
410
|
+
const task = makeTask({
|
|
411
|
+
diagnosticJson: JSON.stringify({ unrelated: 'field' }),
|
|
412
|
+
});
|
|
413
|
+
const ctx = {
|
|
414
|
+
taskId: TASK_ID,
|
|
415
|
+
task,
|
|
416
|
+
errorCategory: 'input_invalid',
|
|
417
|
+
failureReason: 'failure without pain linkage',
|
|
418
|
+
};
|
|
419
|
+
await runner.callRetryOrFail(ctx);
|
|
420
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
421
|
+
expect(row).not.toBeNull();
|
|
422
|
+
expect(unwrap(row).painId).toBeNull();
|
|
423
|
+
const calls = telemetryCalls(mockDeps.eventEmitter.emitTelemetry);
|
|
424
|
+
const inserted = calls.find((c) => c.eventType === 'test_agent_draft_inserted');
|
|
425
|
+
expect(inserted).toBeDefined();
|
|
426
|
+
expect(inserted?.payload?.painIdLinked).toBe(false);
|
|
427
|
+
});
|
|
428
|
+
it('diagnosticJson undefined → painId is null (graceful, no throw)', async () => {
|
|
429
|
+
const task = makeTask(); // no diagnosticJson field
|
|
430
|
+
const ctx = {
|
|
431
|
+
taskId: TASK_ID,
|
|
432
|
+
task,
|
|
433
|
+
errorCategory: 'input_invalid',
|
|
434
|
+
failureReason: 'failure with undefined diagnosticJson',
|
|
435
|
+
};
|
|
436
|
+
await runner.callRetryOrFail(ctx);
|
|
437
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
438
|
+
expect(row).not.toBeNull();
|
|
439
|
+
expect(unwrap(row).painId).toBeNull();
|
|
440
|
+
});
|
|
441
|
+
it('diagnosticJson is malformed JSON → painId is null (rc-9 graceful degradation, no throw)', async () => {
|
|
442
|
+
const task = makeTask({
|
|
443
|
+
diagnosticJson: '{not valid json',
|
|
444
|
+
});
|
|
445
|
+
const ctx = {
|
|
446
|
+
taskId: TASK_ID,
|
|
447
|
+
task,
|
|
448
|
+
errorCategory: 'input_invalid',
|
|
449
|
+
failureReason: 'failure with corrupt diagnosticJson',
|
|
450
|
+
};
|
|
451
|
+
// Must NOT throw — corrupt JSON yields null painId, not an exception.
|
|
452
|
+
const result = await runner.callRetryOrFail(ctx);
|
|
453
|
+
expect(result.status).toBe('failed');
|
|
454
|
+
const row = store.getUnconsumedByTaskId(TASK_ID);
|
|
455
|
+
expect(row).not.toBeNull();
|
|
456
|
+
expect(unwrap(row).painId).toBeNull();
|
|
457
|
+
});
|
|
458
|
+
});
|
|
459
|
+
//# sourceMappingURL=base-peer-runner-agent-draft.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-peer-runner-agent-draft.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,11 @@ export declare abstract class BasePeerRunner<TContext extends {
|
|
|
41
41
|
protected readonly artifactStore: PIArtifactStore;
|
|
42
42
|
protected readonly resolvedOptions: ResolvedPeerRunnerOptions;
|
|
43
43
|
protected readonly config: PeerRunnerConfig;
|
|
44
|
+
/**
|
|
45
|
+
* Optional store for agent-authored draft context (Task 12).
|
|
46
|
+
* When undefined, permanent failures do not write a draft — backward compatible.
|
|
47
|
+
*/
|
|
48
|
+
private readonly pendingAgentDraftStore?;
|
|
44
49
|
private phase;
|
|
45
50
|
constructor(deps: PeerRunnerDeps, options: PeerRunnerOptions, config: PeerRunnerConfig);
|
|
46
51
|
/** Current internal phase. For testing/observability only. */
|
|
@@ -131,5 +136,27 @@ export declare abstract class BasePeerRunner<TContext extends {
|
|
|
131
136
|
* Returns false when effectiveConfig is not provided (legacy behavior).
|
|
132
137
|
*/
|
|
133
138
|
protected isDegradationEnabled(): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Task 12: Construct an AgentDraftPayload from the permanent-failure
|
|
141
|
+
* context and write it to pending_agent_drafts via the injected
|
|
142
|
+
* PendingAgentDraftStore. Best-effort: never throws. All failures are
|
|
143
|
+
* observed via telemetry (rc-9: no silent fallback) so the maintainer
|
|
144
|
+
* can diagnose draft-write issues without the markFailed terminal-state
|
|
145
|
+
* contract being broken.
|
|
146
|
+
*
|
|
147
|
+
* No-op when pendingAgentDraftStore is not injected (backward compatible).
|
|
148
|
+
*
|
|
149
|
+
* ERR checklist:
|
|
150
|
+
* - EP-01 / ERR-001, ERR-005, ERR-013: diagnosticJson parsed as unknown,
|
|
151
|
+
* narrowed with typeof + Object.hasOwn. No `as` casts on parsed data.
|
|
152
|
+
* - EP-03 / ERR-002: insertPendingDraft returns { ok: false, error };
|
|
153
|
+
* we emit a telemetry event with reason + nextAction (rc-9).
|
|
154
|
+
* - EP-03 / ERR-074, ERR-089: every branch (store missing, insert
|
|
155
|
+
* returns !ok, insert throws) applies the SAME best-effort contract —
|
|
156
|
+
* never propagate, always observe.
|
|
157
|
+
* - EP-08 / ERR-003, ERR-024: redactAbsolutePaths / redactTokenLikeValues
|
|
158
|
+
* / redactEnvLikeValues are applied to observedFailure BEFORE persist.
|
|
159
|
+
*/
|
|
160
|
+
private injectAgentDraftOnPermanentFailure;
|
|
134
161
|
}
|
|
135
162
|
//# sourceMappingURL=base-peer-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-peer-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/runner/base-peer-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EAGV,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EACV,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,EACf,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"base-peer-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/runner/base-peer-runner.ts"],"names":[],"mappings":"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"}
|