@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,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SqliteTaskStore failed-task observability tests (Task 8).
|
|
3
|
+
*
|
|
4
|
+
* Covers listFailedTasks / getFailedTaskDetail / countFailedTasks:
|
|
5
|
+
* - status filtering (failed / needs_human_review vs succeeded)
|
|
6
|
+
* - kind filter
|
|
7
|
+
* - since filter (derived from runs.started_at)
|
|
8
|
+
* - limit / offset pagination
|
|
9
|
+
* - sort order (lastAttemptAt DESC)
|
|
10
|
+
* - painId extraction from diagnostic_json
|
|
11
|
+
* - getFailedTaskDetail run history + null pendingAgentDraft
|
|
12
|
+
* - countFailedTasks matches listFailedTasks length
|
|
13
|
+
*
|
|
14
|
+
* Uses a real in-memory SqliteConnection (tmpdir) for isolation.
|
|
15
|
+
*/
|
|
16
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
17
|
+
import * as fs from 'fs';
|
|
18
|
+
import * as path from 'path';
|
|
19
|
+
import * as os from 'os';
|
|
20
|
+
import { SqliteConnection } from '../../sqlite-connection.js';
|
|
21
|
+
import { SqliteTaskStore } from '../sqlite-task-store.js';
|
|
22
|
+
import { SqliteRunStore } from '../../run/sqlite-run-store.js';
|
|
23
|
+
function makeTaskInput(overrides = {}) {
|
|
24
|
+
return {
|
|
25
|
+
taskId: overrides.taskId ?? `task_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
26
|
+
taskKind: overrides.taskKind ?? 'diagnostician',
|
|
27
|
+
status: overrides.status ?? 'pending',
|
|
28
|
+
attemptCount: overrides.attemptCount ?? 0,
|
|
29
|
+
maxAttempts: overrides.maxAttempts ?? 3,
|
|
30
|
+
inputRef: overrides.inputRef,
|
|
31
|
+
resultRef: overrides.resultRef,
|
|
32
|
+
leaseOwner: overrides.leaseOwner,
|
|
33
|
+
leaseExpiresAt: overrides.leaseExpiresAt,
|
|
34
|
+
lastError: overrides.lastError,
|
|
35
|
+
diagnosticJson: overrides.diagnosticJson,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function makeRunInput(overrides = {}) {
|
|
39
|
+
return {
|
|
40
|
+
runId: overrides.runId ?? `run_${Date.now()}_${Math.random().toString(36).slice(2)}`,
|
|
41
|
+
taskId: overrides.taskId ?? 'task-unknown',
|
|
42
|
+
runtimeKind: overrides.runtimeKind ?? 'test-double',
|
|
43
|
+
executionStatus: overrides.executionStatus ?? 'failed',
|
|
44
|
+
startedAt: overrides.startedAt ?? new Date().toISOString(),
|
|
45
|
+
attemptNumber: overrides.attemptNumber ?? 1,
|
|
46
|
+
endedAt: overrides.endedAt,
|
|
47
|
+
reason: overrides.reason,
|
|
48
|
+
outputRef: overrides.outputRef,
|
|
49
|
+
inputPayload: overrides.inputPayload,
|
|
50
|
+
outputPayload: overrides.outputPayload,
|
|
51
|
+
errorCategory: overrides.errorCategory,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
describe('SqliteTaskStore failed-task observability', () => {
|
|
55
|
+
const tmpDir = path.join(os.tmpdir(), `pd-failed-test-${process.pid}-${Date.now()}`);
|
|
56
|
+
let connection;
|
|
57
|
+
let store;
|
|
58
|
+
let runStore;
|
|
59
|
+
beforeEach(() => {
|
|
60
|
+
const testDir = path.join(tmpDir, `t-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
61
|
+
fs.mkdirSync(testDir, { recursive: true });
|
|
62
|
+
connection = new SqliteConnection(testDir);
|
|
63
|
+
store = new SqliteTaskStore(connection);
|
|
64
|
+
runStore = new SqliteRunStore(connection);
|
|
65
|
+
});
|
|
66
|
+
afterEach(() => {
|
|
67
|
+
connection.close();
|
|
68
|
+
try {
|
|
69
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// ignore cleanup errors on Windows
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
// ── listFailedTasks: status filtering ──────────────────────────────────────
|
|
76
|
+
describe('listFailedTasks — status filtering', () => {
|
|
77
|
+
it('returns only failed and needs_human_review tasks (excludes succeeded)', async () => {
|
|
78
|
+
await store.createTask(makeTaskInput({ taskId: 't-failed', status: 'failed', lastError: 'runtime_unavailable' }));
|
|
79
|
+
await store.createTask(makeTaskInput({ taskId: 't-review', status: 'needs_human_review' }));
|
|
80
|
+
await store.createTask(makeTaskInput({ taskId: 't-ok', status: 'succeeded' }));
|
|
81
|
+
const results = await store.listFailedTasks();
|
|
82
|
+
const ids = results.map((r) => r.taskId);
|
|
83
|
+
expect(ids).toContain('t-failed');
|
|
84
|
+
expect(ids).toContain('t-review');
|
|
85
|
+
expect(ids).not.toContain('t-ok');
|
|
86
|
+
expect(results).toHaveLength(2);
|
|
87
|
+
});
|
|
88
|
+
it('returns empty array when no failed tasks exist', async () => {
|
|
89
|
+
await store.createTask(makeTaskInput({ taskId: 't-ok', status: 'succeeded' }));
|
|
90
|
+
const results = await store.listFailedTasks();
|
|
91
|
+
expect(results).toEqual([]);
|
|
92
|
+
});
|
|
93
|
+
it('each summary has correct status type (failed or needs_human_review)', async () => {
|
|
94
|
+
await store.createTask(makeTaskInput({ taskId: 't-f1', status: 'failed' }));
|
|
95
|
+
await store.createTask(makeTaskInput({ taskId: 't-r1', status: 'needs_human_review' }));
|
|
96
|
+
const results = await store.listFailedTasks();
|
|
97
|
+
for (const r of results) {
|
|
98
|
+
expect(r.status === 'failed' || r.status === 'needs_human_review').toBe(true);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
// ── listFailedTasks: kind filter ───────────────────────────────────────────
|
|
103
|
+
describe('listFailedTasks — kind filter', () => {
|
|
104
|
+
it('filters by taskKind', async () => {
|
|
105
|
+
await store.createTask(makeTaskInput({ taskId: 't-d1', status: 'failed', taskKind: 'diagnostician' }));
|
|
106
|
+
await store.createTask(makeTaskInput({ taskId: 't-d2', status: 'failed', taskKind: 'diagnostician' }));
|
|
107
|
+
await store.createTask(makeTaskInput({ taskId: 't-s1', status: 'failed', taskKind: 'scribe' }));
|
|
108
|
+
const diags = await store.listFailedTasks({ kind: 'diagnostician' });
|
|
109
|
+
const ids = diags.map((r) => r.taskId);
|
|
110
|
+
expect(ids).toContain('t-d1');
|
|
111
|
+
expect(ids).toContain('t-d2');
|
|
112
|
+
expect(ids).not.toContain('t-s1');
|
|
113
|
+
expect(diags).toHaveLength(2);
|
|
114
|
+
});
|
|
115
|
+
it('returns all failed tasks when kind is undefined', async () => {
|
|
116
|
+
await store.createTask(makeTaskInput({ taskId: 't-a', status: 'failed', taskKind: 'diagnostician' }));
|
|
117
|
+
await store.createTask(makeTaskInput({ taskId: 't-b', status: 'failed', taskKind: 'scribe' }));
|
|
118
|
+
const results = await store.listFailedTasks();
|
|
119
|
+
expect(results).toHaveLength(2);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
// ── listFailedTasks: since filter ──────────────────────────────────────────
|
|
123
|
+
describe('listFailedTasks — since filter', () => {
|
|
124
|
+
it('filters by lastAttemptAt >= since (derived from runs.started_at)', async () => {
|
|
125
|
+
const oldTime = new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(); // 10 days ago
|
|
126
|
+
const recentTime = new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(); // 1 day ago
|
|
127
|
+
// Task with an old run
|
|
128
|
+
await store.createTask(makeTaskInput({ taskId: 't-old', status: 'failed' }));
|
|
129
|
+
await runStore.createRun(makeRunInput({ taskId: 't-old', startedAt: oldTime }));
|
|
130
|
+
// Task with a recent run
|
|
131
|
+
await store.createTask(makeTaskInput({ taskId: 't-recent', status: 'failed' }));
|
|
132
|
+
await runStore.createRun(makeRunInput({ taskId: 't-recent', startedAt: recentTime }));
|
|
133
|
+
// since = 5 days ago → only 't-recent' should be included
|
|
134
|
+
const sinceMs = Date.now() - 5 * 24 * 60 * 60 * 1000;
|
|
135
|
+
const results = await store.listFailedTasks({ since: sinceMs });
|
|
136
|
+
const ids = results.map((r) => r.taskId);
|
|
137
|
+
expect(ids).toContain('t-recent');
|
|
138
|
+
expect(ids).not.toContain('t-old');
|
|
139
|
+
});
|
|
140
|
+
it('excludes tasks with no runs when since is specified', async () => {
|
|
141
|
+
// Task with no runs
|
|
142
|
+
await store.createTask(makeTaskInput({ taskId: 't-no-runs', status: 'failed' }));
|
|
143
|
+
// Task with a recent run
|
|
144
|
+
await store.createTask(makeTaskInput({ taskId: 't-with-run', status: 'failed' }));
|
|
145
|
+
await runStore.createRun(makeRunInput({ taskId: 't-with-run', startedAt: new Date().toISOString() }));
|
|
146
|
+
const sinceMs = Date.now() - 60 * 1000; // 1 minute ago
|
|
147
|
+
const results = await store.listFailedTasks({ since: sinceMs });
|
|
148
|
+
const ids = results.map((r) => r.taskId);
|
|
149
|
+
expect(ids).toContain('t-with-run');
|
|
150
|
+
expect(ids).not.toContain('t-no-runs');
|
|
151
|
+
});
|
|
152
|
+
it('includes tasks with no runs when since is not specified', async () => {
|
|
153
|
+
await store.createTask(makeTaskInput({ taskId: 't-no-runs', status: 'failed' }));
|
|
154
|
+
const results = await store.listFailedTasks();
|
|
155
|
+
const ids = results.map((r) => r.taskId);
|
|
156
|
+
expect(ids).toContain('t-no-runs');
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
// ── listFailedTasks: limit / offset pagination ─────────────────────────────
|
|
160
|
+
describe('listFailedTasks — pagination', () => {
|
|
161
|
+
it('applies limit', async () => {
|
|
162
|
+
for (let i = 0; i < 5; i++) {
|
|
163
|
+
await store.createTask(makeTaskInput({ taskId: `t-page-${i}`, status: 'failed' }));
|
|
164
|
+
}
|
|
165
|
+
const results = await store.listFailedTasks({ limit: 2 });
|
|
166
|
+
expect(results).toHaveLength(2);
|
|
167
|
+
});
|
|
168
|
+
it('applies offset for pagination', async () => {
|
|
169
|
+
for (let i = 0; i < 5; i++) {
|
|
170
|
+
await store.createTask(makeTaskInput({ taskId: `t-page-${i}`, status: 'failed' }));
|
|
171
|
+
}
|
|
172
|
+
const page1 = await store.listFailedTasks({ limit: 2, offset: 0 });
|
|
173
|
+
const page2 = await store.listFailedTasks({ limit: 2, offset: 2 });
|
|
174
|
+
expect(page1).toHaveLength(2);
|
|
175
|
+
expect(page2).toHaveLength(2);
|
|
176
|
+
const p1Ids = page1.map((r) => r.taskId);
|
|
177
|
+
const p2Ids = page2.map((r) => r.taskId);
|
|
178
|
+
// No overlap between pages
|
|
179
|
+
for (const id of p1Ids) {
|
|
180
|
+
expect(p2Ids).not.toContain(id);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
it('returns empty for offset beyond result count', async () => {
|
|
184
|
+
await store.createTask(makeTaskInput({ taskId: 't-only', status: 'failed' }));
|
|
185
|
+
const results = await store.listFailedTasks({ limit: 10, offset: 10 });
|
|
186
|
+
expect(results).toEqual([]);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
// ── listFailedTasks: sort order ────────────────────────────────────────────
|
|
190
|
+
describe('listFailedTasks — sort order', () => {
|
|
191
|
+
it('sorts by lastAttemptAt DESC (most recent first)', async () => {
|
|
192
|
+
const t1 = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString(); // 30 days ago
|
|
193
|
+
const t2 = new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString(); // 1 day ago
|
|
194
|
+
const t3 = new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(); // 10 days ago
|
|
195
|
+
await store.createTask(makeTaskInput({ taskId: 't-oldest', status: 'failed' }));
|
|
196
|
+
await runStore.createRun(makeRunInput({ taskId: 't-oldest', startedAt: t1 }));
|
|
197
|
+
await store.createTask(makeTaskInput({ taskId: 't-newest', status: 'failed' }));
|
|
198
|
+
await runStore.createRun(makeRunInput({ taskId: 't-newest', startedAt: t2 }));
|
|
199
|
+
await store.createTask(makeTaskInput({ taskId: 't-middle', status: 'failed' }));
|
|
200
|
+
await runStore.createRun(makeRunInput({ taskId: 't-middle', startedAt: t3 }));
|
|
201
|
+
const results = await store.listFailedTasks();
|
|
202
|
+
expect(results).toHaveLength(3);
|
|
203
|
+
// Most recent first
|
|
204
|
+
const [newest, middle, oldest] = results;
|
|
205
|
+
if (!newest || !middle || !oldest) {
|
|
206
|
+
throw new Error('expected 3 results');
|
|
207
|
+
}
|
|
208
|
+
expect(newest.taskId).toBe('t-newest');
|
|
209
|
+
expect(middle.taskId).toBe('t-middle');
|
|
210
|
+
expect(oldest.taskId).toBe('t-oldest');
|
|
211
|
+
});
|
|
212
|
+
it('tasks with no runs (NULL lastAttemptAt) sort last', async () => {
|
|
213
|
+
// Task with a run
|
|
214
|
+
await store.createTask(makeTaskInput({ taskId: 't-with-run', status: 'failed' }));
|
|
215
|
+
await runStore.createRun(makeRunInput({ taskId: 't-with-run', startedAt: new Date().toISOString() }));
|
|
216
|
+
// Task without runs
|
|
217
|
+
await store.createTask(makeTaskInput({ taskId: 't-no-run', status: 'failed' }));
|
|
218
|
+
const results = await store.listFailedTasks();
|
|
219
|
+
expect(results).toHaveLength(2);
|
|
220
|
+
// Task with run comes first (non-NULL lastAttemptAt sorts before NULL in DESC)
|
|
221
|
+
const [withRun, noRun] = results;
|
|
222
|
+
if (!withRun || !noRun) {
|
|
223
|
+
throw new Error('expected 2 results');
|
|
224
|
+
}
|
|
225
|
+
expect(withRun.taskId).toBe('t-with-run');
|
|
226
|
+
expect(withRun.lastAttemptAt).not.toBeNull();
|
|
227
|
+
expect(noRun.taskId).toBe('t-no-run');
|
|
228
|
+
expect(noRun.lastAttemptAt).toBeNull();
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
// ── listFailedTasks: painId extraction ─────────────────────────────────────
|
|
232
|
+
describe('listFailedTasks — painId extraction', () => {
|
|
233
|
+
it('extracts painId from diagnostic_json.sourcePainId', async () => {
|
|
234
|
+
await store.createTask(makeTaskInput({
|
|
235
|
+
taskId: 't-with-pain',
|
|
236
|
+
status: 'failed',
|
|
237
|
+
diagnosticJson: JSON.stringify({ sourcePainId: 'pain-abc-123', other: 'data' }),
|
|
238
|
+
}));
|
|
239
|
+
const results = await store.listFailedTasks();
|
|
240
|
+
const found = results.find((r) => r.taskId === 't-with-pain');
|
|
241
|
+
expect(found).toBeDefined();
|
|
242
|
+
if (!found)
|
|
243
|
+
return;
|
|
244
|
+
expect(found.painId).toBe('pain-abc-123');
|
|
245
|
+
});
|
|
246
|
+
it('returns null painId when diagnostic_json has no sourcePainId', async () => {
|
|
247
|
+
await store.createTask(makeTaskInput({
|
|
248
|
+
taskId: 't-no-pain-field',
|
|
249
|
+
status: 'failed',
|
|
250
|
+
diagnosticJson: JSON.stringify({ otherField: 'value' }),
|
|
251
|
+
}));
|
|
252
|
+
const results = await store.listFailedTasks();
|
|
253
|
+
const found = results.find((r) => r.taskId === 't-no-pain-field');
|
|
254
|
+
expect(found).toBeDefined();
|
|
255
|
+
if (!found)
|
|
256
|
+
return;
|
|
257
|
+
expect(found.painId).toBeNull();
|
|
258
|
+
});
|
|
259
|
+
it('returns null painId when diagnostic_json is not set', async () => {
|
|
260
|
+
await store.createTask(makeTaskInput({ taskId: 't-no-diag', status: 'failed' }));
|
|
261
|
+
const results = await store.listFailedTasks();
|
|
262
|
+
const found = results.find((r) => r.taskId === 't-no-diag');
|
|
263
|
+
expect(found).toBeDefined();
|
|
264
|
+
if (!found)
|
|
265
|
+
return;
|
|
266
|
+
expect(found.painId).toBeNull();
|
|
267
|
+
});
|
|
268
|
+
it('returns null painId when sourcePainId is not a string (graceful degradation)', async () => {
|
|
269
|
+
// diagnostic_json is valid JSON (passes the session-id-hint expression
|
|
270
|
+
// index), but sourcePainId is a number, not a string.
|
|
271
|
+
await store.createTask(makeTaskInput({
|
|
272
|
+
taskId: 't-bad-pain-type',
|
|
273
|
+
status: 'failed',
|
|
274
|
+
diagnosticJson: JSON.stringify({ sourcePainId: 123 }),
|
|
275
|
+
}));
|
|
276
|
+
const results = await store.listFailedTasks();
|
|
277
|
+
const found = results.find((r) => r.taskId === 't-bad-pain-type');
|
|
278
|
+
expect(found).toBeDefined();
|
|
279
|
+
if (!found)
|
|
280
|
+
return;
|
|
281
|
+
expect(found.painId).toBeNull();
|
|
282
|
+
});
|
|
283
|
+
it('returns null painId when diagnostic_json is a JSON array (not an object)', async () => {
|
|
284
|
+
await store.createTask(makeTaskInput({
|
|
285
|
+
taskId: 't-array-json',
|
|
286
|
+
status: 'failed',
|
|
287
|
+
diagnosticJson: JSON.stringify([1, 2, 3]),
|
|
288
|
+
}));
|
|
289
|
+
const results = await store.listFailedTasks();
|
|
290
|
+
const found = results.find((r) => r.taskId === 't-array-json');
|
|
291
|
+
expect(found).toBeDefined();
|
|
292
|
+
if (!found)
|
|
293
|
+
return;
|
|
294
|
+
expect(found.painId).toBeNull();
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
// ── listFailedTasks: field correctness ─────────────────────────────────────
|
|
298
|
+
describe('listFailedTasks — field correctness', () => {
|
|
299
|
+
it('returns correct lastError (PDErrorCategory) and attemptCount', async () => {
|
|
300
|
+
await store.createTask(makeTaskInput({
|
|
301
|
+
taskId: 't-fields',
|
|
302
|
+
status: 'failed',
|
|
303
|
+
lastError: 'capability_missing',
|
|
304
|
+
attemptCount: 3,
|
|
305
|
+
}));
|
|
306
|
+
const results = await store.listFailedTasks();
|
|
307
|
+
const found = results.find((r) => r.taskId === 't-fields');
|
|
308
|
+
expect(found).toBeDefined();
|
|
309
|
+
if (!found)
|
|
310
|
+
return;
|
|
311
|
+
expect(found.lastError).toBe('capability_missing');
|
|
312
|
+
expect(found.attemptCount).toBe(3);
|
|
313
|
+
expect(found.taskKind).toBe('diagnostician');
|
|
314
|
+
expect(found.createdAt).toBeTruthy();
|
|
315
|
+
});
|
|
316
|
+
it('returns null lastError when not set', async () => {
|
|
317
|
+
await store.createTask(makeTaskInput({ taskId: 't-no-err', status: 'failed' }));
|
|
318
|
+
const results = await store.listFailedTasks();
|
|
319
|
+
const found = results.find((r) => r.taskId === 't-no-err');
|
|
320
|
+
expect(found).toBeDefined();
|
|
321
|
+
if (!found)
|
|
322
|
+
return;
|
|
323
|
+
expect(found.lastError).toBeNull();
|
|
324
|
+
});
|
|
325
|
+
});
|
|
326
|
+
// ── getFailedTaskDetail ────────────────────────────────────────────────────
|
|
327
|
+
describe('getFailedTaskDetail', () => {
|
|
328
|
+
it('returns task + runs (DESC) + lastError + null pendingAgentDraft', async () => {
|
|
329
|
+
await store.createTask(makeTaskInput({
|
|
330
|
+
taskId: 't-detail',
|
|
331
|
+
status: 'failed',
|
|
332
|
+
lastError: 'input_invalid',
|
|
333
|
+
attemptCount: 2,
|
|
334
|
+
}));
|
|
335
|
+
// Create two runs with different started_at
|
|
336
|
+
const oldRun = await runStore.createRun(makeRunInput({
|
|
337
|
+
taskId: 't-detail',
|
|
338
|
+
runId: 'run-old',
|
|
339
|
+
startedAt: new Date(Date.now() - 60_000).toISOString(),
|
|
340
|
+
attemptNumber: 1,
|
|
341
|
+
}));
|
|
342
|
+
const newRun = await runStore.createRun(makeRunInput({
|
|
343
|
+
taskId: 't-detail',
|
|
344
|
+
runId: 'run-new',
|
|
345
|
+
startedAt: new Date().toISOString(),
|
|
346
|
+
attemptNumber: 2,
|
|
347
|
+
}));
|
|
348
|
+
void oldRun;
|
|
349
|
+
void newRun;
|
|
350
|
+
const detail = await store.getFailedTaskDetail('t-detail');
|
|
351
|
+
expect(detail).not.toBeNull();
|
|
352
|
+
if (!detail)
|
|
353
|
+
return;
|
|
354
|
+
expect(detail.task.taskId).toBe('t-detail');
|
|
355
|
+
expect(detail.task.status).toBe('failed');
|
|
356
|
+
expect(detail.lastError).toBe('input_invalid');
|
|
357
|
+
expect(detail.pendingAgentDraft).toBeNull();
|
|
358
|
+
// Runs sorted DESC (most recent first)
|
|
359
|
+
expect(detail.runs).toHaveLength(2);
|
|
360
|
+
const [latestRun, earlierRun] = detail.runs;
|
|
361
|
+
if (!latestRun || !earlierRun) {
|
|
362
|
+
throw new Error('expected 2 runs');
|
|
363
|
+
}
|
|
364
|
+
expect(latestRun.runId).toBe('run-new');
|
|
365
|
+
expect(earlierRun.runId).toBe('run-old');
|
|
366
|
+
});
|
|
367
|
+
it('returns task with empty runs array when no runs exist', async () => {
|
|
368
|
+
await store.createTask(makeTaskInput({ taskId: 't-no-runs-detail', status: 'failed' }));
|
|
369
|
+
const detail = await store.getFailedTaskDetail('t-no-runs-detail');
|
|
370
|
+
expect(detail).not.toBeNull();
|
|
371
|
+
if (!detail)
|
|
372
|
+
return;
|
|
373
|
+
expect(detail.runs).toEqual([]);
|
|
374
|
+
expect(detail.task.taskId).toBe('t-no-runs-detail');
|
|
375
|
+
});
|
|
376
|
+
it('returns null for non-existent taskId', async () => {
|
|
377
|
+
const detail = await store.getFailedTaskDetail('does-not-exist');
|
|
378
|
+
expect(detail).toBeNull();
|
|
379
|
+
});
|
|
380
|
+
it('returns null for a succeeded task (wrong status)', async () => {
|
|
381
|
+
await store.createTask(makeTaskInput({ taskId: 't-succeeded', status: 'succeeded' }));
|
|
382
|
+
const detail = await store.getFailedTaskDetail('t-succeeded');
|
|
383
|
+
expect(detail).toBeNull();
|
|
384
|
+
});
|
|
385
|
+
it('returns null for a pending task (wrong status)', async () => {
|
|
386
|
+
await store.createTask(makeTaskInput({ taskId: 't-pending', status: 'pending' }));
|
|
387
|
+
const detail = await store.getFailedTaskDetail('t-pending');
|
|
388
|
+
expect(detail).toBeNull();
|
|
389
|
+
});
|
|
390
|
+
it('returns detail for needs_human_review status', async () => {
|
|
391
|
+
await store.createTask(makeTaskInput({ taskId: 't-review-detail', status: 'needs_human_review' }));
|
|
392
|
+
const detail = await store.getFailedTaskDetail('t-review-detail');
|
|
393
|
+
expect(detail).not.toBeNull();
|
|
394
|
+
if (!detail)
|
|
395
|
+
return;
|
|
396
|
+
expect(detail.task.status).toBe('needs_human_review');
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
// ── countFailedTasks ───────────────────────────────────────────────────────
|
|
400
|
+
describe('countFailedTasks', () => {
|
|
401
|
+
it('counts all failed + needs_human_review tasks', async () => {
|
|
402
|
+
await store.createTask(makeTaskInput({ taskId: 'c-1', status: 'failed' }));
|
|
403
|
+
await store.createTask(makeTaskInput({ taskId: 'c-2', status: 'needs_human_review' }));
|
|
404
|
+
await store.createTask(makeTaskInput({ taskId: 'c-3', status: 'succeeded' }));
|
|
405
|
+
await store.createTask(makeTaskInput({ taskId: 'c-4', status: 'pending' }));
|
|
406
|
+
const count = await store.countFailedTasks();
|
|
407
|
+
expect(count).toBe(2);
|
|
408
|
+
});
|
|
409
|
+
it('counts zero when no failed tasks', async () => {
|
|
410
|
+
await store.createTask(makeTaskInput({ taskId: 'c-ok', status: 'succeeded' }));
|
|
411
|
+
const count = await store.countFailedTasks();
|
|
412
|
+
expect(count).toBe(0);
|
|
413
|
+
});
|
|
414
|
+
it('counts with kind filter', async () => {
|
|
415
|
+
await store.createTask(makeTaskInput({ taskId: 'c-d1', status: 'failed', taskKind: 'diagnostician' }));
|
|
416
|
+
await store.createTask(makeTaskInput({ taskId: 'c-d2', status: 'failed', taskKind: 'diagnostician' }));
|
|
417
|
+
await store.createTask(makeTaskInput({ taskId: 'c-s1', status: 'failed', taskKind: 'scribe' }));
|
|
418
|
+
const diagCount = await store.countFailedTasks({ kind: 'diagnostician' });
|
|
419
|
+
expect(diagCount).toBe(2);
|
|
420
|
+
});
|
|
421
|
+
it('counts with since filter', async () => {
|
|
422
|
+
const oldTime = new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString();
|
|
423
|
+
const recentTime = new Date(Date.now() - 1 * 24 * 60 * 60 * 1000).toISOString();
|
|
424
|
+
await store.createTask(makeTaskInput({ taskId: 'c-old', status: 'failed' }));
|
|
425
|
+
await runStore.createRun(makeRunInput({ taskId: 'c-old', startedAt: oldTime }));
|
|
426
|
+
await store.createTask(makeTaskInput({ taskId: 'c-recent', status: 'failed' }));
|
|
427
|
+
await runStore.createRun(makeRunInput({ taskId: 'c-recent', startedAt: recentTime }));
|
|
428
|
+
const sinceMs = Date.now() - 5 * 24 * 60 * 60 * 1000;
|
|
429
|
+
const count = await store.countFailedTasks({ since: sinceMs });
|
|
430
|
+
expect(count).toBe(1);
|
|
431
|
+
});
|
|
432
|
+
it('count matches listFailedTasks length', async () => {
|
|
433
|
+
for (let i = 0; i < 5; i++) {
|
|
434
|
+
await store.createTask(makeTaskInput({ taskId: `c-match-${i}`, status: 'failed' }));
|
|
435
|
+
}
|
|
436
|
+
const list = await store.listFailedTasks();
|
|
437
|
+
const count = await store.countFailedTasks();
|
|
438
|
+
expect(count).toBe(list.length);
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
//# sourceMappingURL=sqlite-task-store.failed-tasks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-task-store.failed-tasks.test.js","sourceRoot":"","sources":["../../../../../src/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export type { TaskStore, TaskStoreFilter, TaskStoreUpdatePatch } from './task-store.js';
|
|
2
|
+
export type { FailedTaskSummary, FailedTaskFilter, FailedTaskDetail } from './task-types.js';
|
|
2
3
|
export { SqliteTaskStore } from './sqlite-task-store.js';
|
|
3
4
|
export { MemoryTaskStore } from './memory-task-store.js';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/task/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/task/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxF,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/task/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/runtime-v2/store/task/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type TaskRecord } from '../../task-status.js';
|
|
2
2
|
import type { SqliteConnection } from '../sqlite-connection.js';
|
|
3
3
|
import type { TaskStore, TaskStoreFilter, TaskStoreUpdatePatch } from './task-store.js';
|
|
4
|
+
import type { FailedTaskSummary, FailedTaskFilter, FailedTaskDetail } from './task-types.js';
|
|
4
5
|
export declare class SqliteTaskStore implements TaskStore {
|
|
5
6
|
private readonly connection;
|
|
6
7
|
constructor(connection: SqliteConnection);
|
|
@@ -9,6 +10,50 @@ export declare class SqliteTaskStore implements TaskStore {
|
|
|
9
10
|
updateTask(taskId: string, patch: TaskStoreUpdatePatch): Promise<TaskRecord>;
|
|
10
11
|
listTasks(filter?: TaskStoreFilter): Promise<TaskRecord[]>;
|
|
11
12
|
deleteTask(taskId: string): Promise<boolean>;
|
|
13
|
+
/**
|
|
14
|
+
* Shared helper for listFailedTasks / countFailedTasks: build the
|
|
15
|
+
* kind/since WHERE conditions and parameter values, scoped to the given
|
|
16
|
+
* table alias. Keeping this in one place ensures the list query and the
|
|
17
|
+
* count query stay consistent when since semantics or task_kind filtering
|
|
18
|
+
* change — divergence would cause list/total mismatch in the Failed
|
|
19
|
+
* Tasks UI pagination.
|
|
20
|
+
*/
|
|
21
|
+
private static buildFailedTaskConditions;
|
|
22
|
+
/**
|
|
23
|
+
* List tasks in 'failed' or 'needs_human_review' status, sorted by last
|
|
24
|
+
* attempt time descending (most recent failures first).
|
|
25
|
+
*
|
|
26
|
+
* `lastAttemptAt` is derived from `MAX(runs.started_at)` via a correlated
|
|
27
|
+
* subquery; tasks with no runs have NULL lastAttemptAt and sort last
|
|
28
|
+
* (NULL sorts last in SQLite DESC by default).
|
|
29
|
+
*
|
|
30
|
+
* `painId` is extracted from `diagnostic_json.sourcePainId` when present.
|
|
31
|
+
*
|
|
32
|
+
* @param filter Optional kind/since/limit/offset filter.
|
|
33
|
+
*/
|
|
34
|
+
listFailedTasks(filter?: FailedTaskFilter): Promise<FailedTaskSummary[]>;
|
|
35
|
+
/**
|
|
36
|
+
* Fetch full detail for a single failed task: the task record, its run
|
|
37
|
+
* history (most recent first), the last error category, and a pending
|
|
38
|
+
* agent draft (null in Task 8; Task 13 wires the real store).
|
|
39
|
+
*
|
|
40
|
+
* Returns null if the task does not exist or is not in a failed /
|
|
41
|
+
* needs_human_review status.
|
|
42
|
+
*/
|
|
43
|
+
getFailedTaskDetail(taskId: string): Promise<FailedTaskDetail | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Count tasks in 'failed' or 'needs_human_review' status, with the same
|
|
46
|
+
* kind/since filtering as listFailedTasks. Used for pagination totals.
|
|
47
|
+
*/
|
|
48
|
+
countFailedTasks(filter?: Pick<FailedTaskFilter, 'kind' | 'since'>): Promise<number>;
|
|
49
|
+
/**
|
|
50
|
+
* Convert a raw DB row into a validated FailedTaskSummary.
|
|
51
|
+
*
|
|
52
|
+
* Trust boundary (rc-1, rc-2, rc-3): the row is UNTRUSTED data. Each field
|
|
53
|
+
* is read with a runtime guard; required fields fail loud, nullable fields
|
|
54
|
+
* only accept their declared shape.
|
|
55
|
+
*/
|
|
56
|
+
private static rowToFailedTaskSummary;
|
|
12
57
|
private rowToRecord;
|
|
13
58
|
}
|
|
14
59
|
//# sourceMappingURL=sqlite-task-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-task-store.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/task/sqlite-task-store.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAE5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"sqlite-task-store.d.ts","sourceRoot":"","sources":["../../../../src/runtime-v2/store/task/sqlite-task-store.ts"],"names":[],"mappings":"AAOA,OAAO,EAAoB,KAAK,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAE5F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAyE7F,qBAAa,eAAgB,YAAW,SAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,gBAAgB;IAEnD,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IA0BpF,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IASnD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6B5E,SAAS,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAoB1D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQlD;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAuBxC;;;;;;;;;;;OAWG;IACG,eAAe,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAiC9E;;;;;;;OAOG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAoB3E;;;OAGG;IACG,gBAAgB,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB1F;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IA6CrC,OAAO,CAAC,WAAW;CA8BpB"}
|