@principles/core 1.236.0 → 1.238.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.
Files changed (108) hide show
  1. package/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js +586 -0
  2. package/dist/runtime-v2/__tests__/artificer-runner-vslice.test.js.map +1 -1
  3. package/dist/runtime-v2/__tests__/feedback/create-report.test.js +51 -0
  4. package/dist/runtime-v2/__tests__/feedback/create-report.test.js.map +1 -1
  5. package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.js +1 -1
  6. package/dist/runtime-v2/__tests__/feedback/privacy-preview.test.js.map +1 -1
  7. package/dist/runtime-v2/__tests__/feedback/render-markdown.test.js +1 -1
  8. package/dist/runtime-v2/__tests__/feedback/render-markdown.test.js.map +1 -1
  9. package/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js +109 -0
  10. package/dist/runtime-v2/activation/__tests__/activation-dispatcher.test.js.map +1 -1
  11. package/dist/runtime-v2/activation/activation-dispatcher.d.ts +11 -0
  12. package/dist/runtime-v2/activation/activation-dispatcher.d.ts.map +1 -1
  13. package/dist/runtime-v2/activation/activation-dispatcher.js +60 -6
  14. package/dist/runtime-v2/activation/activation-dispatcher.js.map +1 -1
  15. package/dist/runtime-v2/activation/activation-types.d.ts +4 -0
  16. package/dist/runtime-v2/activation/activation-types.d.ts.map +1 -1
  17. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +34 -0
  18. package/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  19. package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  20. package/dist/runtime-v2/feature-flags/feature-flag-contract.js +5 -0
  21. package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  22. package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.d.ts +2 -0
  23. package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.d.ts.map +1 -0
  24. package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.js +221 -0
  25. package/dist/runtime-v2/feedback/__tests__/create-report-agent-draft.test.js.map +1 -0
  26. package/dist/runtime-v2/feedback/__tests__/mailto-url.test.d.ts +11 -0
  27. package/dist/runtime-v2/feedback/__tests__/mailto-url.test.d.ts.map +1 -0
  28. package/dist/runtime-v2/feedback/__tests__/mailto-url.test.js +160 -0
  29. package/dist/runtime-v2/feedback/__tests__/mailto-url.test.js.map +1 -0
  30. package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.d.ts +2 -0
  31. package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.d.ts.map +1 -0
  32. package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.js +342 -0
  33. package/dist/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.js.map +1 -0
  34. package/dist/runtime-v2/feedback/create-report.d.ts +7 -1
  35. package/dist/runtime-v2/feedback/create-report.d.ts.map +1 -1
  36. package/dist/runtime-v2/feedback/create-report.js +65 -7
  37. package/dist/runtime-v2/feedback/create-report.js.map +1 -1
  38. package/dist/runtime-v2/feedback/feedback-types.d.ts +18 -1
  39. package/dist/runtime-v2/feedback/feedback-types.d.ts.map +1 -1
  40. package/dist/runtime-v2/feedback/feedback-types.js +19 -12
  41. package/dist/runtime-v2/feedback/feedback-types.js.map +1 -1
  42. package/dist/runtime-v2/feedback/index.d.ts +3 -1
  43. package/dist/runtime-v2/feedback/index.d.ts.map +1 -1
  44. package/dist/runtime-v2/feedback/index.js +7 -1
  45. package/dist/runtime-v2/feedback/index.js.map +1 -1
  46. package/dist/runtime-v2/feedback/pending-agent-draft-store.d.ts +106 -0
  47. package/dist/runtime-v2/feedback/pending-agent-draft-store.d.ts.map +1 -0
  48. package/dist/runtime-v2/feedback/pending-agent-draft-store.js +220 -0
  49. package/dist/runtime-v2/feedback/pending-agent-draft-store.js.map +1 -0
  50. package/dist/runtime-v2/feedback/privacy-preview.d.ts +16 -0
  51. package/dist/runtime-v2/feedback/privacy-preview.d.ts.map +1 -1
  52. package/dist/runtime-v2/feedback/privacy-preview.js +54 -0
  53. package/dist/runtime-v2/feedback/privacy-preview.js.map +1 -1
  54. package/dist/runtime-v2/index.d.ts +5 -0
  55. package/dist/runtime-v2/index.d.ts.map +1 -1
  56. package/dist/runtime-v2/index.js +9 -0
  57. package/dist/runtime-v2/index.js.map +1 -1
  58. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +74 -0
  59. package/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
  60. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +30 -1
  61. package/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
  62. package/dist/runtime-v2/internalization/artificer-prompt-builder.js +9 -0
  63. package/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
  64. package/dist/runtime-v2/internalization/artificer-runner.d.ts +9 -0
  65. package/dist/runtime-v2/internalization/artificer-runner.d.ts.map +1 -1
  66. package/dist/runtime-v2/internalization/artificer-runner.js +131 -0
  67. package/dist/runtime-v2/internalization/artificer-runner.js.map +1 -1
  68. package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.d.ts +2 -0
  69. package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.d.ts.map +1 -0
  70. package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.js +459 -0
  71. package/dist/runtime-v2/runner/__tests__/base-peer-runner-agent-draft.test.js.map +1 -0
  72. package/dist/runtime-v2/runner/base-peer-runner.d.ts +27 -0
  73. package/dist/runtime-v2/runner/base-peer-runner.d.ts.map +1 -1
  74. package/dist/runtime-v2/runner/base-peer-runner.js +138 -0
  75. package/dist/runtime-v2/runner/base-peer-runner.js.map +1 -1
  76. package/dist/runtime-v2/runner/peer-runner-types.d.ts +9 -0
  77. package/dist/runtime-v2/runner/peer-runner-types.d.ts.map +1 -1
  78. package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.d.ts +2 -0
  79. package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.d.ts.map +1 -0
  80. package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.js +225 -0
  81. package/dist/runtime-v2/store/pain/__tests__/sqlite-dead-letter-store.test.js.map +1 -0
  82. package/dist/runtime-v2/store/pain/index.d.ts +3 -0
  83. package/dist/runtime-v2/store/pain/index.d.ts.map +1 -0
  84. package/dist/runtime-v2/store/pain/index.js +2 -0
  85. package/dist/runtime-v2/store/pain/index.js.map +1 -0
  86. package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.d.ts +70 -0
  87. package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.d.ts.map +1 -0
  88. package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.js +154 -0
  89. package/dist/runtime-v2/store/pain/sqlite-dead-letter-store.js.map +1 -0
  90. package/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  91. package/dist/runtime-v2/store/sqlite-connection.js +41 -0
  92. package/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  93. package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.d.ts +2 -0
  94. package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.d.ts.map +1 -0
  95. package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js +442 -0
  96. package/dist/runtime-v2/store/task/__tests__/sqlite-task-store.failed-tasks.test.js.map +1 -0
  97. package/dist/runtime-v2/store/task/index.d.ts +1 -0
  98. package/dist/runtime-v2/store/task/index.d.ts.map +1 -1
  99. package/dist/runtime-v2/store/task/index.js.map +1 -1
  100. package/dist/runtime-v2/store/task/sqlite-task-store.d.ts +45 -0
  101. package/dist/runtime-v2/store/task/sqlite-task-store.d.ts.map +1 -1
  102. package/dist/runtime-v2/store/task/sqlite-task-store.js +205 -0
  103. package/dist/runtime-v2/store/task/sqlite-task-store.js.map +1 -1
  104. package/dist/runtime-v2/store/task/task-types.d.ts +60 -0
  105. package/dist/runtime-v2/store/task/task-types.d.ts.map +1 -0
  106. package/dist/runtime-v2/store/task/task-types.js +2 -0
  107. package/dist/runtime-v2/store/task/task-types.js.map +1 -0
  108. package/package.json +3 -2
@@ -0,0 +1,342 @@
1
+ /**
2
+ * PendingAgentDraftStore tests (Task 11).
3
+ *
4
+ * Verifies insertPendingDraft (incl. idempotency), getUnconsumedByTaskId,
5
+ * markConsumed, and listPending against a real SQLite database.
6
+ *
7
+ * ERR checklist:
8
+ * - EP-01 / ERR-001, ERR-005: agent_draft JSON parsed as unknown; no `as`
9
+ * casts on row data — only `as unknown` then narrowed via isRecord/typeof.
10
+ * - EP-03 / ERR-002: write failures return { ok: false, error } (rc-9).
11
+ * - EP-03 / ERR-009, ERR-010: corrupt agent_draft JSON fails loud (rc-3).
12
+ * - EP-05 / ERR-015: insertPendingDraft reads fresh state via SELECT before
13
+ * INSERT/UPDATE; markConsumed uses UPDATE ... WHERE.
14
+ */
15
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
16
+ import * as path from 'node:path';
17
+ import * as os from 'node:os';
18
+ import * as fs from 'node:fs';
19
+ import { SqliteConnection } from '../../store/sqlite-connection.js';
20
+ import { PendingAgentDraftStore, } from '../pending-agent-draft-store.js';
21
+ function createTestConnection() {
22
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'pd-test-pending-draft-'));
23
+ return new SqliteConnection(tmpDir);
24
+ }
25
+ function makeDraft(overrides = {}) {
26
+ return {
27
+ summary: 'peer runner failed',
28
+ observedFailure: 'Error: permanent failure',
29
+ commandSummary: 'last tool call: write_file',
30
+ ...overrides,
31
+ };
32
+ }
33
+ describe('PendingAgentDraftStore', () => {
34
+ let connection = null;
35
+ let store = null;
36
+ beforeEach(() => {
37
+ connection = createTestConnection();
38
+ // Touch getDb() so initSchema() runs (creates pending_agent_drafts table).
39
+ connection.getDb();
40
+ store = new PendingAgentDraftStore(connection);
41
+ });
42
+ afterEach(() => {
43
+ connection?.close();
44
+ });
45
+ describe('insertPendingDraft', () => {
46
+ it('creates a new row with correct fields and returns ok with pad- prefixed id', () => {
47
+ const result = store.insertPendingDraft({
48
+ taskId: 'task-1',
49
+ painId: 'pain-1',
50
+ agentDraft: makeDraft(),
51
+ });
52
+ expect(result.ok).toBe(true);
53
+ if (result.ok) {
54
+ expect(result.id).toMatch(/^pad-/);
55
+ }
56
+ const row = store.getUnconsumedByTaskId('task-1');
57
+ expect(row).not.toBeNull();
58
+ if (!row)
59
+ throw new Error('row is null');
60
+ expect(row.taskId).toBe('task-1');
61
+ expect(row.painId).toBe('pain-1');
62
+ expect(row.consumedAt).toBeNull();
63
+ expect(row.createdAt).toMatch(/^\d{4}-\d{2}-\d{2}T/);
64
+ expect(row.agentDraft.summary).toBe('peer runner failed');
65
+ expect(row.agentDraft.observedFailure).toBe('Error: permanent failure');
66
+ expect(row.agentDraft.commandSummary).toBe('last tool call: write_file');
67
+ });
68
+ it('persists painId as null when not provided', () => {
69
+ store.insertPendingDraft({
70
+ taskId: 'task-no-pain',
71
+ agentDraft: makeDraft(),
72
+ });
73
+ const row = store.getUnconsumedByTaskId('task-no-pain');
74
+ expect(row).not.toBeNull();
75
+ if (!row)
76
+ throw new Error('row is null');
77
+ expect(row.painId).toBeNull();
78
+ });
79
+ it('serializes agentDraft as JSON in the database', () => {
80
+ store.insertPendingDraft({
81
+ taskId: 'task-1',
82
+ agentDraft: makeDraft({ summary: 'special chars: "quotes" \\backslash' }),
83
+ });
84
+ // Read raw row to verify JSON serialization.
85
+ const db = connection.getDb();
86
+ const rawRow = db
87
+ .prepare('SELECT agent_draft FROM pending_agent_drafts WHERE task_id = ?')
88
+ .get('task-1');
89
+ expect(rawRow).toBeDefined();
90
+ if (!rawRow)
91
+ throw new Error('rawRow is null');
92
+ const parsed = JSON.parse(rawRow.agent_draft);
93
+ expect(parsed.summary).toBe('special chars: "quotes" \\backslash');
94
+ });
95
+ it('is idempotent: same taskId second insert updates the existing row, does not create a new one', () => {
96
+ const draft1 = makeDraft({ summary: 'first attempt' });
97
+ const r1 = store.insertPendingDraft({ taskId: 'task-idem', painId: 'pain-1', agentDraft: draft1 });
98
+ expect(r1.ok).toBe(true);
99
+ // Brief delay so createdAt differs (ISO millisecond precision).
100
+ // Use a unique draft so we can verify the update.
101
+ const draft2 = makeDraft({ summary: 'second attempt', observedFailure: 'new failure' });
102
+ const r2 = store.insertPendingDraft({ taskId: 'task-idem', painId: 'pain-2', agentDraft: draft2 });
103
+ expect(r2.ok).toBe(true);
104
+ // The id should be preserved (UPDATE, not INSERT).
105
+ if (r1.ok && r2.ok) {
106
+ expect(r2.id).toBe(r1.id);
107
+ }
108
+ // Count rows for this taskId — should be exactly 1.
109
+ const db = connection.getDb();
110
+ const countRow = db
111
+ .prepare('SELECT COUNT(*) as cnt FROM pending_agent_drafts WHERE task_id = ?')
112
+ .get('task-idem');
113
+ expect(countRow.cnt).toBe(1);
114
+ // The single row should reflect the updated values.
115
+ const row = store.getUnconsumedByTaskId('task-idem');
116
+ expect(row).not.toBeNull();
117
+ if (!row)
118
+ throw new Error('row is null');
119
+ expect(row.agentDraft.summary).toBe('second attempt');
120
+ expect(row.agentDraft.observedFailure).toBe('new failure');
121
+ expect(row.painId).toBe('pain-2');
122
+ });
123
+ it('idempotent update preserves the original row id', () => {
124
+ const r1 = store.insertPendingDraft({
125
+ taskId: 'task-idem-id',
126
+ agentDraft: makeDraft({ summary: 'v1' }),
127
+ });
128
+ expect(r1.ok).toBe(true);
129
+ const originalId = r1.ok ? r1.id : '';
130
+ // Three successive updates — id must stay the same.
131
+ const r2 = store.insertPendingDraft({
132
+ taskId: 'task-idem-id',
133
+ agentDraft: makeDraft({ summary: 'v2' }),
134
+ });
135
+ const r3 = store.insertPendingDraft({
136
+ taskId: 'task-idem-id',
137
+ agentDraft: makeDraft({ summary: 'v3' }),
138
+ });
139
+ expect(r2.ok && r2.id).toBe(originalId);
140
+ expect(r3.ok && r3.id).toBe(originalId);
141
+ const row = store.getUnconsumedByTaskId('task-idem-id');
142
+ expect(row).not.toBeNull();
143
+ if (!row)
144
+ throw new Error('row is null');
145
+ expect(row.id).toBe(originalId);
146
+ expect(row.agentDraft.summary).toBe('v3');
147
+ });
148
+ it('after markConsumed, a new insert creates a fresh row (partial unique index allows it)', () => {
149
+ const r1 = store.insertPendingDraft({
150
+ taskId: 'task-cycle',
151
+ agentDraft: makeDraft({ summary: 'first' }),
152
+ });
153
+ expect(r1.ok).toBe(true);
154
+ const firstId = r1.ok ? r1.id : '';
155
+ // Mark consumed — frees the partial unique index slot for this taskId.
156
+ expect(store.markConsumed(firstId).ok).toBe(true);
157
+ // A new insert should succeed and create a NEW row (different id).
158
+ const r2 = store.insertPendingDraft({
159
+ taskId: 'task-cycle',
160
+ agentDraft: makeDraft({ summary: 'second' }),
161
+ });
162
+ expect(r2.ok).toBe(true);
163
+ const secondId = r2.ok ? r2.id : '';
164
+ expect(secondId).not.toBe(firstId);
165
+ // getUnconsumedByTaskId should return the NEW row, not the consumed one.
166
+ const row = store.getUnconsumedByTaskId('task-cycle');
167
+ expect(row).not.toBeNull();
168
+ if (!row)
169
+ throw new Error('row is null');
170
+ expect(row.id).toBe(secondId);
171
+ expect(row.agentDraft.summary).toBe('second');
172
+ // The consumed row should still exist in the table (just with consumed_at set).
173
+ const db = connection.getDb();
174
+ const countRow = db
175
+ .prepare('SELECT COUNT(*) as cnt FROM pending_agent_drafts WHERE task_id = ?')
176
+ .get('task-cycle');
177
+ expect(countRow.cnt).toBe(2);
178
+ });
179
+ });
180
+ describe('getUnconsumedByTaskId', () => {
181
+ it('returns null when no row exists', () => {
182
+ const row = store.getUnconsumedByTaskId('nonexistent');
183
+ expect(row).toBeNull();
184
+ });
185
+ it('returns null after the only row is consumed', () => {
186
+ store.insertPendingDraft({ taskId: 'task-1', agentDraft: makeDraft() });
187
+ const row = store.getUnconsumedByTaskId('task-1');
188
+ expect(row).not.toBeNull();
189
+ if (!row)
190
+ throw new Error('row is null');
191
+ expect(store.markConsumed(row.id).ok).toBe(true);
192
+ expect(store.getUnconsumedByTaskId('task-1')).toBeNull();
193
+ });
194
+ it('returns the unconsumed row when both a consumed and unconsumed row exist for the same taskId', () => {
195
+ // Insert, consume, then insert again — leaves one consumed + one pending.
196
+ const r1 = store.insertPendingDraft({
197
+ taskId: 'task-multi',
198
+ agentDraft: makeDraft({ summary: 'consumed' }),
199
+ });
200
+ expect(r1.ok).toBe(true);
201
+ expect(store.markConsumed(r1.ok ? r1.id : '').ok).toBe(true);
202
+ const r2 = store.insertPendingDraft({
203
+ taskId: 'task-multi',
204
+ agentDraft: makeDraft({ summary: 'pending' }),
205
+ });
206
+ expect(r2.ok).toBe(true);
207
+ const row = store.getUnconsumedByTaskId('task-multi');
208
+ expect(row).not.toBeNull();
209
+ if (!row)
210
+ throw new Error('row is null');
211
+ expect(row.agentDraft.summary).toBe('pending');
212
+ expect(row.consumedAt).toBeNull();
213
+ });
214
+ });
215
+ describe('markConsumed', () => {
216
+ it('sets consumed_at on an existing row', () => {
217
+ const r = store.insertPendingDraft({ taskId: 'task-1', agentDraft: makeDraft() });
218
+ expect(r.ok).toBe(true);
219
+ const id = r.ok ? r.id : '';
220
+ const markResult = store.markConsumed(id);
221
+ expect(markResult.ok).toBe(true);
222
+ // The row should no longer be returned by getUnconsumedByTaskId.
223
+ expect(store.getUnconsumedByTaskId('task-1')).toBeNull();
224
+ // But it should still exist with consumed_at set.
225
+ const db = connection.getDb();
226
+ const rawRow = db
227
+ .prepare('SELECT consumed_at FROM pending_agent_drafts WHERE id = ?')
228
+ .get(id);
229
+ expect(rawRow).toBeDefined();
230
+ if (!rawRow)
231
+ throw new Error('rawRow is null');
232
+ expect(rawRow.consumed_at).not.toBeNull();
233
+ expect(rawRow.consumed_at).toMatch(/^\d{4}-\d{2}-\d{2}T/);
234
+ });
235
+ it('returns ok:true for a non-existent id (silent success per spec)', () => {
236
+ const result = store.markConsumed('pad-does-not-exist');
237
+ expect(result.ok).toBe(true);
238
+ });
239
+ it('is idempotent: marking an already-consumed row again still returns ok', () => {
240
+ const r = store.insertPendingDraft({ taskId: 'task-1', agentDraft: makeDraft() });
241
+ expect(r.ok).toBe(true);
242
+ const id = r.ok ? r.id : '';
243
+ expect(store.markConsumed(id).ok).toBe(true);
244
+ // Second mark — should still succeed (consumed_at just refreshes).
245
+ const second = store.markConsumed(id);
246
+ expect(second.ok).toBe(true);
247
+ });
248
+ });
249
+ describe('listPending', () => {
250
+ it('returns empty array when no rows exist', () => {
251
+ expect(store.listPending()).toEqual([]);
252
+ });
253
+ it('returns only unconsumed rows, ordered by created_at DESC', () => {
254
+ // Insert three drafts with distinct taskIds. Use raw SQL to set
255
+ // deterministic created_at values so the ORDER BY is unambiguous.
256
+ const db = connection.getDb();
257
+ const baseDraft = JSON.stringify(makeDraft());
258
+ db.prepare('INSERT INTO pending_agent_drafts (id, task_id, pain_id, agent_draft, created_at, consumed_at) VALUES (?, ?, ?, ?, ?, ?)').run('pad-old', 'task-old', null, baseDraft, '2026-07-01T00:00:00Z', null);
259
+ db.prepare('INSERT INTO pending_agent_drafts (id, task_id, pain_id, agent_draft, created_at, consumed_at) VALUES (?, ?, ?, ?, ?, ?)').run('pad-mid', 'task-mid', null, baseDraft, '2026-07-02T00:00:00Z', null);
260
+ db.prepare('INSERT INTO pending_agent_drafts (id, task_id, pain_id, agent_draft, created_at, consumed_at) VALUES (?, ?, ?, ?, ?, ?)').run('pad-new', 'task-new', null, baseDraft, '2026-07-03T00:00:00Z', null);
261
+ // Mark the middle one consumed — it should be excluded.
262
+ expect(store.markConsumed('pad-mid').ok).toBe(true);
263
+ const rows = store.listPending();
264
+ expect(rows).toHaveLength(2);
265
+ // DESC order: newest first.
266
+ if (!rows[0])
267
+ throw new Error('rows[0] is null');
268
+ if (!rows[1])
269
+ throw new Error('rows[1] is null');
270
+ expect(rows[0].id).toBe('pad-new');
271
+ expect(rows[1].id).toBe('pad-old');
272
+ });
273
+ it('respects the limit parameter', () => {
274
+ for (let i = 0; i < 5; i++) {
275
+ store.insertPendingDraft({ taskId: `task-${i}`, agentDraft: makeDraft() });
276
+ }
277
+ const rows = store.listPending({ limit: 2 });
278
+ expect(rows).toHaveLength(2);
279
+ });
280
+ it('defaults to limit=100 when no filter provided', () => {
281
+ for (let i = 0; i < 110; i++) {
282
+ store.insertPendingDraft({ taskId: `task-${i}`, agentDraft: makeDraft() });
283
+ }
284
+ const rows = store.listPending();
285
+ expect(rows).toHaveLength(100);
286
+ });
287
+ });
288
+ describe('agentDraft JSON round-trip (rc-1: treat as unknown)', () => {
289
+ it('preserves nested string fields through serialize/deserialize', () => {
290
+ const draft = {
291
+ summary: 'complex summary with "quotes"',
292
+ observedFailure: 'multi\nline\nfailure',
293
+ commandSummary: 'cmd: foo --bar baz',
294
+ };
295
+ store.insertPendingDraft({ taskId: 'task-complex', agentDraft: draft });
296
+ const row = store.getUnconsumedByTaskId('task-complex');
297
+ expect(row).not.toBeNull();
298
+ if (!row)
299
+ throw new Error('row is null');
300
+ expect(row.agentDraft.summary).toBe(draft.summary);
301
+ expect(row.agentDraft.observedFailure).toBe(draft.observedFailure);
302
+ expect(row.agentDraft.commandSummary).toBe(draft.commandSummary);
303
+ });
304
+ it('preserves a draft with only the required summary field', () => {
305
+ const draft = { summary: 'minimal' };
306
+ store.insertPendingDraft({ taskId: 'task-min', agentDraft: draft });
307
+ const row = store.getUnconsumedByTaskId('task-min');
308
+ expect(row).not.toBeNull();
309
+ if (!row)
310
+ throw new Error('row is null');
311
+ expect(row.agentDraft.summary).toBe('minimal');
312
+ expect(row.agentDraft.observedFailure).toBeUndefined();
313
+ expect(row.agentDraft.commandSummary).toBeUndefined();
314
+ });
315
+ it('fails loud when agent_draft is corrupt JSON (rc-3: no silent fallback)', () => {
316
+ // Insert a row with invalid JSON directly via raw SQL.
317
+ const db = connection.getDb();
318
+ db.prepare('INSERT INTO pending_agent_drafts (id, task_id, pain_id, agent_draft, created_at, consumed_at) VALUES (?, ?, ?, ?, ?, ?)').run('pad-corrupt', 'task-corrupt', null, '{not valid json', '2026-07-04T00:00:00Z', null);
319
+ // getUnconsumedByTaskId should throw (fail loud) rather than return
320
+ // a row with a raw string masquerading as AgentDraftPayload.
321
+ expect(() => store.getUnconsumedByTaskId('task-corrupt')).toThrow(/corrupt agent_draft JSON/);
322
+ // listPending should also throw on the same corrupt row.
323
+ expect(() => store.listPending()).toThrow(/corrupt agent_draft JSON/);
324
+ });
325
+ it('fails loud when agent_draft JSON does not match AgentDraftPayload shape (rc-3)', () => {
326
+ const db = connection.getDb();
327
+ // summary is missing — fails isAgentDraftPayload validation.
328
+ db.prepare('INSERT INTO pending_agent_drafts (id, task_id, pain_id, agent_draft, created_at, consumed_at) VALUES (?, ?, ?, ?, ?, ?)').run('pad-shape', 'task-shape', null, '{"observedFailure":"x"}', '2026-07-04T00:00:00Z', null);
329
+ expect(() => store.getUnconsumedByTaskId('task-shape')).toThrow(/failed shape validation/);
330
+ });
331
+ it('fails loud when agent_draft is empty string (rc-3: corrupt JSON)', () => {
332
+ const db = connection.getDb();
333
+ // Empty string is a string (passes the typeof guard) but is not valid
334
+ // JSON — JSON.parse('') throws SyntaxError. The store must fail loud
335
+ // rather than return a row whose agentDraft is an empty string.
336
+ db.prepare('INSERT INTO pending_agent_drafts (id, task_id, pain_id, agent_draft, created_at, consumed_at) VALUES (?, ?, ?, ?, ?, ?)').run('pad-empty', 'task-empty', null, '', '2026-07-04T00:00:00Z', null);
337
+ // Empty string fails JSON.parse — should fail loud as corrupt JSON.
338
+ expect(() => store.getUnconsumedByTaskId('task-empty')).toThrow(/corrupt agent_draft JSON/);
339
+ });
340
+ });
341
+ });
342
+ //# sourceMappingURL=pending-agent-draft-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pending-agent-draft-store.test.js","sourceRoot":"","sources":["../../../../src/runtime-v2/feedback/__tests__/pending-agent-draft-store.test.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import type { FeedbackReport, ValidationError } from './feedback-types.js';
2
+ import type { PendingAgentDraftStore } from './pending-agent-draft-store.js';
2
3
  export type CreateReportResult = {
3
4
  ok: true;
4
5
  report: FeedbackReport;
@@ -9,6 +10,11 @@ export type CreateReportResult = {
9
10
  /**
10
11
  * Create a FeedbackReport from untrusted input + diagnostics.
11
12
  * No `as` casts on untrusted values. Failure paths return structured errors.
13
+ *
14
+ * `maintainerEmail` (optional): when provided as a non-empty string, a
15
+ * `mailto:` URL is built into `report.outputs.mailtoUrl`. When omitted or
16
+ * empty, `mailtoUrl` is ''. The email value itself is not validated for
17
+ * shape — callers decide what address to pass.
12
18
  */
13
- export declare function createFeedbackReport(input: unknown, diagnostics: unknown): CreateReportResult;
19
+ export declare function createFeedbackReport(input: unknown, diagnostics: unknown, maintainerEmail?: string, pendingAgentDraftStore?: PendingAgentDraftStore): CreateReportResult;
14
20
  //# sourceMappingURL=create-report.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-report.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/create-report.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,cAAc,EAId,eAAe,EAGhB,MAAM,qBAAqB,CAAC;AAiB7B,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAiI7C;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,OAAO,GACnB,kBAAkB,CAwHpB"}
1
+ {"version":3,"file":"create-report.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/create-report.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,cAAc,EAId,eAAe,EAIhB,MAAM,qBAAqB,CAAC;AAgB7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAE7E,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAiI7C;;;;;;;;GAQG;AAEH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,OAAO,EACpB,eAAe,CAAC,EAAE,MAAM,EACxB,sBAAsB,CAAC,EAAE,sBAAsB,GAC9C,kBAAkB,CA6KpB"}
@@ -8,7 +8,7 @@ import { isRecord, isString, isUserSeverity, normalizeFeedbackDraftInput, } from
8
8
  import { redactAbsolutePaths, redactTokenLikeValues, redactEnvLikeValues, redactSensitiveFields, } from './redact-sensitive.js';
9
9
  import { renderReportMarkdown } from './render-markdown.js';
10
10
  import { buildGitHubIssueDraftUrl } from './render-github-url.js';
11
- import { buildPrivacyPreview, buildEmailText } from './privacy-preview.js';
11
+ import { buildPrivacyPreview, buildEmailText, buildMailtoUrl } from './privacy-preview.js';
12
12
  const MAX_DESCRIPTION_FOR_REDACT = 8000;
13
13
  const MAX_STEPS_FOR_REDACT = 8000;
14
14
  const MAX_CONTEXT_REFS = 12;
@@ -137,8 +137,14 @@ function collectDiagnostics(diagnostics) {
137
137
  /**
138
138
  * Create a FeedbackReport from untrusted input + diagnostics.
139
139
  * No `as` casts on untrusted values. Failure paths return structured errors.
140
+ *
141
+ * `maintainerEmail` (optional): when provided as a non-empty string, a
142
+ * `mailto:` URL is built into `report.outputs.mailtoUrl`. When omitted or
143
+ * empty, `mailtoUrl` is ''. The email value itself is not validated for
144
+ * shape — callers decide what address to pass.
140
145
  */
141
- export function createFeedbackReport(input, diagnostics) {
146
+ // eslint-disable-next-line @typescript-eslint/max-params -- Task 13: pendingAgentDraftStore added for agent draft merge
147
+ export function createFeedbackReport(input, diagnostics, maintainerEmail, pendingAgentDraftStore) {
142
148
  // Step 1: validate and normalize the input
143
149
  const norm = normalizeFeedbackDraftInput(input);
144
150
  if (!norm.ok) {
@@ -172,11 +178,44 @@ export function createFeedbackReport(input, diagnostics) {
172
178
  if (typeof actualInput === 'string' && actualBehavior !== actualInput) {
173
179
  redactionNotes.push('actualBehavior was redacted');
174
180
  }
181
+ // Task 13: If taskId is provided and a pending agent draft exists, merge it.
182
+ // User-provided agentDraft (from input.agentDraft) takes priority — the
183
+ // agent draft from the store is a fallback for when the user didn't write one.
184
+ let mergedAgentDraft = draft.agentDraft;
185
+ let consumedDraftId;
186
+ if (draft.taskId && pendingAgentDraftStore) {
187
+ try {
188
+ const pendingDraft = pendingAgentDraftStore.getUnconsumedByTaskId(draft.taskId);
189
+ if (pendingDraft) {
190
+ consumedDraftId = pendingDraft.id;
191
+ if (!mergedAgentDraft) {
192
+ // User didn't provide agentDraft — use the store's draft
193
+ mergedAgentDraft = {
194
+ summary: pendingDraft.agentDraft.summary,
195
+ };
196
+ if (pendingDraft.agentDraft.observedFailure) {
197
+ mergedAgentDraft.observedFailure = pendingDraft.agentDraft.observedFailure;
198
+ }
199
+ if (pendingDraft.agentDraft.commandSummary) {
200
+ mergedAgentDraft.commandSummary = pendingDraft.agentDraft.commandSummary;
201
+ }
202
+ }
203
+ // If user provided agentDraft, we still mark the store's draft as consumed
204
+ // (the user's report supersedes the agent's draft — no need to keep it pending)
205
+ }
206
+ }
207
+ catch (err) {
208
+ // rc-9: don't silently swallow store errors — record to redactionNotes
209
+ // and continue without the agent draft. The report still gets created.
210
+ redactionNotes.push(`agent draft lookup failed: ${err instanceof Error ? err.message : String(err)}`);
211
+ }
212
+ }
175
213
  // Step 4: scrub the diagnosticSummary via redactSensitiveFields (defense in
176
214
  // depth — versions and platform should already be low-sensitivity, but
177
215
  // user-injected values must not leak tokens through the field structure).
178
216
  const scrubbed = redactSensitiveFields(diagnosticSummary);
179
217
  const safeDiagnostic = scrubbed.ok
218
+ // runtime-contract-exempt: ERR-001 redactSensitiveFields is a shape-preserving recursive redactor — it only replaces string values and truncates, never changes object structure. The output is guaranteed to match the input's DiagnosticSummary shape by construction.
180
219
  ? scrubbed.value
181
220
  : diagnosticSummary;
182
221
  if (scrubbed.ok) {
@@ -191,15 +230,18 @@ export function createFeedbackReport(input, diagnostics) {
191
230
  // Step 6: build contextRefs from the context object
192
231
  const contextRefs = [];
193
232
  if (draft.context) {
194
- pushContextRef(contextRefs, 'source', { id: draft.context.source, label: `source=${draft.context.source}` });
233
+ const ctxSource = draft.context.source;
234
+ pushContextRef(contextRefs, 'source', { id: ctxSource, label: ctxSource !== undefined ? `source=${ctxSource}` : undefined });
235
+ pushContextRef(contextRefs, 'sourceDetail', { id: draft.context.sourceDetail });
195
236
  pushContextRef(contextRefs, 'page', { id: draft.context.page });
196
237
  pushContextRef(contextRefs, 'painId', { id: draft.context.painId });
197
238
  pushContextRef(contextRefs, 'principleId', { id: draft.context.principleId });
198
239
  pushContextRef(contextRefs, 'approvalId', { id: draft.context.approvalId });
199
240
  pushContextRef(contextRefs, 'activationId', { id: draft.context.activationId });
200
241
  pushContextRef(contextRefs, 'updateAttemptId', { id: draft.context.updateAttemptId });
242
+ pushContextRef(contextRefs, 'taskId', { id: draft.context.taskId });
201
243
  }
202
- if (draft.agentDraft) {
244
+ if (mergedAgentDraft) {
203
245
  pushContextRef(contextRefs, 'agentDraft', { id: 'present', label: 'agentDraft attached' });
204
246
  }
205
247
  // Step 7: build the privacy preview
@@ -227,13 +269,13 @@ export function createFeedbackReport(input, diagnostics) {
227
269
  diagnosticSummary: safeDiagnostic,
228
270
  contextRefs,
229
271
  privacy,
230
- outputs: { markdown: '', emailText: '', githubIssueUrl: '' },
272
+ outputs: { markdown: '', emailText: '', githubIssueUrl: '', mailtoUrl: '' },
231
273
  };
232
274
  // Surface the agent-attached evidence in the report so it propagates to
233
275
  // markdown, emailText, and any later consumer.
234
276
  // Redact sensitive values (paths/tokens/env) from agentDraft string fields.
235
- if (draft.agentDraft) {
236
- const ad = draft.agentDraft;
277
+ if (mergedAgentDraft) {
278
+ const ad = mergedAgentDraft;
237
279
  report.agentDraft = {
238
280
  summary: redactEnvLikeValues(redactAbsolutePaths(redactTokenLikeValues(ad.summary))),
239
281
  };
@@ -252,6 +294,22 @@ export function createFeedbackReport(input, diagnostics) {
252
294
  const shortSummary = `type=${draft.type}; ${description.slice(0, 200)}`;
253
295
  const urlResult = buildGitHubIssueDraftUrl(redactedTitle, draft.type, shortSummary);
254
296
  report.outputs.githubIssueUrl = urlResult.ok ? urlResult.url : '';
297
+ // Step 11: build the mailto: URL when a maintainer email is provided.
298
+ // buildMailtoUrl returns '' for empty/missing email, so the output is
299
+ // always a string (callers without an email get an empty mailtoUrl).
300
+ report.outputs.mailtoUrl = buildMailtoUrl(report, maintainerEmail ?? '');
301
+ // Task 13: Mark the pending agent draft as consumed now that the report
302
+ // has been successfully built. Idempotent — safe to call even if the
303
+ // draft was already consumed or never existed.
304
+ if (consumedDraftId && pendingAgentDraftStore) {
305
+ try {
306
+ pendingAgentDraftStore.markConsumed(consumedDraftId);
307
+ }
308
+ catch (err) {
309
+ // rc-9: record the failure but don't fail the report creation
310
+ report.privacy.redactionNotes.push(`agent draft markConsumed failed: ${err instanceof Error ? err.message : String(err)}`);
311
+ }
312
+ }
255
313
  return { ok: true, report };
256
314
  }
257
315
  //# sourceMappingURL=create-report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-report.js","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/create-report.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create-report.js","sourceRoot":"","sources":["../../../src/runtime-v2/feedback/create-report.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,21 @@ export type FeedbackType = 'bug' | 'confusing' | 'privacy_concern' | 'feature_re
2
2
  export type UserSeverity = 'low' | 'medium' | 'high';
3
3
  export type FeedbackSource = 'console' | 'cli' | 'agent';
4
4
  export interface FeedbackContext {
5
- source: FeedbackSource;
5
+ source?: FeedbackSource;
6
+ /**
7
+ * P1-3 (rc-9): Preserves the original `source` value when it is not a valid
8
+ * FeedbackSource enum. For example, `source=failed_tasks_page` is mapped to
9
+ * `source='console'` with `sourceDetail='failed_tasks_page'` so the
10
+ * maintainer can see the concrete entry point without losing the enum.
11
+ */
12
+ sourceDetail?: string;
6
13
  page?: string;
7
14
  painId?: string;
8
15
  principleId?: string;
9
16
  approvalId?: string;
10
17
  activationId?: string;
11
18
  updateAttemptId?: string;
19
+ taskId?: string;
12
20
  }
13
21
  export interface AgentDraft {
14
22
  summary: string;
@@ -38,6 +46,12 @@ export interface FeedbackDraftInput {
38
46
  userSeverity?: unknown;
39
47
  context?: unknown;
40
48
  agentDraft?: unknown;
49
+ /**
50
+ * Task 13: top-level taskId shortcut, independent from context.taskId.
51
+ * When provided, createFeedbackReport uses it to look up a pending agent
52
+ * draft in PendingAgentDraftStore and merge it into the report.
53
+ */
54
+ taskId?: unknown;
41
55
  }
42
56
  /**
43
57
  * The narrowed shape returned by `normalizeFeedbackDraftInput` on success.
@@ -49,6 +63,8 @@ export interface NormalizedDraft {
49
63
  userText: FeedbackUserText;
50
64
  context?: FeedbackContext;
51
65
  agentDraft?: AgentDraft;
66
+ /** Task 13: top-level taskId (validated string), separate from context.taskId. */
67
+ taskId?: string;
52
68
  }
53
69
  export interface RecentEvent {
54
70
  type: string;
@@ -92,6 +108,7 @@ export interface FeedbackReport {
92
108
  markdown: string;
93
109
  emailText: string;
94
110
  githubIssueUrl: string;
111
+ mailtoUrl: string;
95
112
  };
96
113
  }
97
114
  export type ValidationError = {