reflectt-node 0.1.21 → 0.1.22

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 (103) hide show
  1. package/README.md +64 -0
  2. package/dist/canvas-interactive.d.ts +53 -0
  3. package/dist/canvas-interactive.d.ts.map +1 -1
  4. package/dist/canvas-interactive.js +194 -0
  5. package/dist/canvas-interactive.js.map +1 -1
  6. package/dist/canvas-push.d.ts +2 -0
  7. package/dist/canvas-push.d.ts.map +1 -1
  8. package/dist/canvas-push.js +89 -0
  9. package/dist/canvas-push.js.map +1 -1
  10. package/dist/channels.d.ts +1 -1
  11. package/dist/intervention-template.d.ts +67 -0
  12. package/dist/intervention-template.d.ts.map +1 -0
  13. package/dist/intervention-template.js +290 -0
  14. package/dist/intervention-template.js.map +1 -0
  15. package/dist/request-tracker.d.ts +1 -0
  16. package/dist/request-tracker.d.ts.map +1 -1
  17. package/dist/request-tracker.js +16 -4
  18. package/dist/request-tracker.js.map +1 -1
  19. package/dist/server.d.ts.map +1 -1
  20. package/dist/server.js +144 -3
  21. package/dist/server.js.map +1 -1
  22. package/dist/stall-detector.d.ts +109 -0
  23. package/dist/stall-detector.d.ts.map +1 -0
  24. package/dist/stall-detector.js +279 -0
  25. package/dist/stall-detector.js.map +1 -0
  26. package/package.json +1 -1
  27. package/public/docs.md +9 -0
  28. package/dist/agent-config.test.d.ts +0 -2
  29. package/dist/agent-config.test.d.ts.map +0 -1
  30. package/dist/agent-config.test.js +0 -91
  31. package/dist/agent-config.test.js.map +0 -1
  32. package/dist/agent-exec-guardrail.test.d.ts +0 -2
  33. package/dist/agent-exec-guardrail.test.d.ts.map +0 -1
  34. package/dist/agent-exec-guardrail.test.js +0 -55
  35. package/dist/agent-exec-guardrail.test.js.map +0 -1
  36. package/dist/agent-memories.test.d.ts +0 -2
  37. package/dist/agent-memories.test.d.ts.map +0 -1
  38. package/dist/agent-memories.test.js +0 -327
  39. package/dist/agent-memories.test.js.map +0 -1
  40. package/dist/agent-messaging.test.d.ts +0 -2
  41. package/dist/agent-messaging.test.d.ts.map +0 -1
  42. package/dist/agent-messaging.test.js +0 -105
  43. package/dist/agent-messaging.test.js.map +0 -1
  44. package/dist/agent-runs.test.d.ts +0 -2
  45. package/dist/agent-runs.test.d.ts.map +0 -1
  46. package/dist/agent-runs.test.js +0 -386
  47. package/dist/agent-runs.test.js.map +0 -1
  48. package/dist/api.test.d.ts +0 -2
  49. package/dist/api.test.d.ts.map +0 -1
  50. package/dist/api.test.js +0 -99
  51. package/dist/api.test.js.map +0 -1
  52. package/dist/approval-queue.test.d.ts +0 -2
  53. package/dist/approval-queue.test.d.ts.map +0 -1
  54. package/dist/approval-queue.test.js +0 -118
  55. package/dist/approval-queue.test.js.map +0 -1
  56. package/dist/artifact-store.test.d.ts +0 -2
  57. package/dist/artifact-store.test.d.ts.map +0 -1
  58. package/dist/artifact-store.test.js +0 -119
  59. package/dist/artifact-store.test.js.map +0 -1
  60. package/dist/canvas-input.test.d.ts +0 -2
  61. package/dist/canvas-input.test.d.ts.map +0 -1
  62. package/dist/canvas-input.test.js +0 -96
  63. package/dist/canvas-input.test.js.map +0 -1
  64. package/dist/canvas-render.test.d.ts +0 -2
  65. package/dist/canvas-render.test.d.ts.map +0 -1
  66. package/dist/canvas-render.test.js +0 -95
  67. package/dist/canvas-render.test.js.map +0 -1
  68. package/dist/e2e-loop-proof.test.d.ts +0 -2
  69. package/dist/e2e-loop-proof.test.d.ts.map +0 -1
  70. package/dist/e2e-loop-proof.test.js +0 -114
  71. package/dist/e2e-loop-proof.test.js.map +0 -1
  72. package/dist/email-sms-send.test.d.ts +0 -2
  73. package/dist/email-sms-send.test.d.ts.map +0 -1
  74. package/dist/email-sms-send.test.js +0 -96
  75. package/dist/email-sms-send.test.js.map +0 -1
  76. package/dist/handoff-state.test.d.ts +0 -2
  77. package/dist/handoff-state.test.d.ts.map +0 -1
  78. package/dist/handoff-state.test.js +0 -102
  79. package/dist/handoff-state.test.js.map +0 -1
  80. package/dist/routing-enforcement.test.d.ts +0 -2
  81. package/dist/routing-enforcement.test.d.ts.map +0 -1
  82. package/dist/routing-enforcement.test.js +0 -62
  83. package/dist/routing-enforcement.test.js.map +0 -1
  84. package/dist/run-retention.test.d.ts +0 -2
  85. package/dist/run-retention.test.d.ts.map +0 -1
  86. package/dist/run-retention.test.js +0 -57
  87. package/dist/run-retention.test.js.map +0 -1
  88. package/dist/run-stream.test.d.ts +0 -2
  89. package/dist/run-stream.test.d.ts.map +0 -1
  90. package/dist/run-stream.test.js +0 -70
  91. package/dist/run-stream.test.js.map +0 -1
  92. package/dist/webhook-storage.test.d.ts +0 -2
  93. package/dist/webhook-storage.test.d.ts.map +0 -1
  94. package/dist/webhook-storage.test.js +0 -86
  95. package/dist/webhook-storage.test.js.map +0 -1
  96. package/dist/workflow-canvas-state.test.d.ts +0 -2
  97. package/dist/workflow-canvas-state.test.d.ts.map +0 -1
  98. package/dist/workflow-canvas-state.test.js +0 -53
  99. package/dist/workflow-canvas-state.test.js.map +0 -1
  100. package/dist/workflow-templates.test.d.ts +0 -2
  101. package/dist/workflow-templates.test.d.ts.map +0 -1
  102. package/dist/workflow-templates.test.js +0 -76
  103. package/dist/workflow-templates.test.js.map +0 -1
@@ -1,386 +0,0 @@
1
- // SPDX-License-Identifier: Apache-2.0
2
- import { describe, it, beforeEach } from 'node:test';
3
- import assert from 'node:assert/strict';
4
- import Database from 'better-sqlite3';
5
- import { validateRationale } from './agent-runs.js';
6
- // Inline DB setup — avoids importing db.ts which reads config
7
- function createTestDb() {
8
- const db = new Database(':memory:');
9
- db.pragma('journal_mode = WAL');
10
- db.pragma('foreign_keys = ON');
11
- db.exec(`
12
- CREATE TABLE IF NOT EXISTS agent_runs (
13
- id TEXT PRIMARY KEY,
14
- agent_id TEXT NOT NULL,
15
- team_id TEXT NOT NULL,
16
- objective TEXT NOT NULL,
17
- status TEXT NOT NULL DEFAULT 'idle',
18
- parent_run_id TEXT,
19
- context_snapshot TEXT DEFAULT '{}',
20
- artifacts TEXT DEFAULT '[]',
21
- started_at INTEGER NOT NULL,
22
- updated_at INTEGER NOT NULL,
23
- completed_at INTEGER
24
- );
25
- CREATE INDEX IF NOT EXISTS idx_agent_runs_agent_team ON agent_runs(agent_id, team_id);
26
- CREATE INDEX IF NOT EXISTS idx_agent_runs_status ON agent_runs(status);
27
-
28
- CREATE TABLE IF NOT EXISTS agent_events (
29
- id TEXT PRIMARY KEY,
30
- run_id TEXT,
31
- agent_id TEXT NOT NULL,
32
- event_type TEXT NOT NULL,
33
- payload TEXT NOT NULL DEFAULT '{}',
34
- created_at INTEGER NOT NULL
35
- );
36
- CREATE INDEX IF NOT EXISTS idx_agent_events_run ON agent_events(run_id, created_at);
37
- CREATE INDEX IF NOT EXISTS idx_agent_events_agent ON agent_events(agent_id, created_at);
38
- CREATE INDEX IF NOT EXISTS idx_agent_events_type ON agent_events(event_type, created_at);
39
- `);
40
- return db;
41
- }
42
- // Direct DB operations for testing without importing the full module
43
- // This tests the schema + SQL logic directly
44
- describe('agent_runs schema', () => {
45
- let db;
46
- beforeEach(() => {
47
- db = createTestDb();
48
- });
49
- it('creates a run with all required fields', () => {
50
- const now = Date.now();
51
- db.prepare(`
52
- INSERT INTO agent_runs (id, agent_id, team_id, objective, status, context_snapshot, artifacts, started_at, updated_at)
53
- VALUES (?, ?, ?, ?, 'idle', '{}', '[]', ?, ?)
54
- `).run('arun-1', 'link', 'team-1', 'Push coverage to 85%', now, now);
55
- const row = db.prepare('SELECT * FROM agent_runs WHERE id = ?').get('arun-1');
56
- assert.equal(row.id, 'arun-1');
57
- assert.equal(row.agent_id, 'link');
58
- assert.equal(row.team_id, 'team-1');
59
- assert.equal(row.objective, 'Push coverage to 85%');
60
- assert.equal(row.status, 'idle');
61
- assert.equal(row.parent_run_id, null);
62
- assert.equal(row.completed_at, null);
63
- });
64
- it('enforces primary key uniqueness', () => {
65
- const now = Date.now();
66
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at) VALUES (?, ?, ?, ?, 'idle', ?, ?)`).run('arun-1', 'link', 'team-1', 'test', now, now);
67
- assert.throws(() => {
68
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at) VALUES (?, ?, ?, ?, 'idle', ?, ?)`).run('arun-1', 'kai', 'team-1', 'duplicate', now, now);
69
- });
70
- });
71
- it('supports parent_run_id for sub-tasks', () => {
72
- const now = Date.now();
73
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at) VALUES (?, ?, ?, ?, 'working', ?, ?)`).run('arun-parent', 'link', 'team-1', 'parent task', now, now);
74
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, parent_run_id, started_at, updated_at) VALUES (?, ?, ?, ?, 'idle', ?, ?, ?)`).run('arun-child', 'link', 'team-1', 'sub task', 'arun-parent', now, now);
75
- const child = db.prepare('SELECT * FROM agent_runs WHERE id = ?').get('arun-child');
76
- assert.equal(child.parent_run_id, 'arun-parent');
77
- });
78
- it('updates status and completed_at', () => {
79
- const now = Date.now();
80
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at) VALUES (?, ?, ?, ?, 'working', ?, ?)`).run('arun-1', 'link', 'team-1', 'test', now, now);
81
- db.prepare('UPDATE agent_runs SET status = ?, completed_at = ?, updated_at = ? WHERE id = ?').run('completed', now + 1000, now + 1000, 'arun-1');
82
- const row = db.prepare('SELECT * FROM agent_runs WHERE id = ?').get('arun-1');
83
- assert.equal(row.status, 'completed');
84
- assert.equal(row.completed_at, now + 1000);
85
- });
86
- it('filters by status and agent', () => {
87
- const now = Date.now();
88
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at) VALUES (?, ?, ?, ?, 'working', ?, ?)`).run('arun-1', 'link', 'team-1', 'active', now, now);
89
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at, completed_at) VALUES (?, ?, ?, ?, 'completed', ?, ?, ?)`).run('arun-2', 'link', 'team-1', 'done', now, now, now);
90
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at) VALUES (?, ?, ?, ?, 'working', ?, ?)`).run('arun-3', 'kai', 'team-1', 'other agent', now, now);
91
- const linkActive = db.prepare(`SELECT * FROM agent_runs WHERE agent_id = ? AND team_id = ? AND status NOT IN ('completed', 'failed', 'cancelled') ORDER BY started_at DESC LIMIT 1`).get('link', 'team-1');
92
- assert.equal(linkActive.id, 'arun-1');
93
- const allLink = db.prepare('SELECT * FROM agent_runs WHERE agent_id = ? AND team_id = ?').all('link', 'team-1');
94
- assert.equal(allLink.length, 2);
95
- });
96
- it('stores and retrieves JSON context_snapshot and artifacts', () => {
97
- const now = Date.now();
98
- const ctx = JSON.stringify({ taskId: 'task-123', branch: 'link/test' });
99
- const arts = JSON.stringify([{ type: 'pr', url: 'https://github.com/test/pr/1' }]);
100
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, context_snapshot, artifacts, started_at, updated_at) VALUES (?, ?, ?, ?, 'working', ?, ?, ?, ?)`).run('arun-1', 'link', 'team-1', 'test', ctx, arts, now, now);
101
- const row = db.prepare('SELECT * FROM agent_runs WHERE id = ?').get('arun-1');
102
- const parsed = JSON.parse(row.context_snapshot);
103
- assert.equal(parsed.taskId, 'task-123');
104
- const artsParsed = JSON.parse(row.artifacts);
105
- assert.equal(artsParsed[0].type, 'pr');
106
- });
107
- });
108
- describe('agent_events rationale validation', () => {
109
- it('accepts structured rationale', () => {
110
- const parsed = validateRationale({
111
- choice: 'approved PR #826',
112
- considered: ['CSS-only, no logic changes', 'CI green'],
113
- constraint: 'manual merge within scope',
114
- });
115
- assert.equal(parsed.choice, 'approved PR #826');
116
- assert.equal(parsed.considered?.length, 2);
117
- assert.equal(parsed.constraint, 'manual merge within scope');
118
- });
119
- it('rejects rationale without choice', () => {
120
- assert.throws(() => validateRationale({ considered: ['missing choice'] }), /rationale\.choice is required/);
121
- });
122
- it('rejects non-string considered entries', () => {
123
- assert.throws(() => validateRationale({ choice: 'x', considered: ['ok', 42] }), /rationale\.considered must be an array of non-empty strings/);
124
- });
125
- });
126
- describe('agent_events schema (append-only)', () => {
127
- let db;
128
- beforeEach(() => {
129
- db = createTestDb();
130
- });
131
- it('appends an event', () => {
132
- const now = Date.now();
133
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-1', 'arun-1', 'link', 'run_created', '{"objective":"test"}', now);
134
- const row = db.prepare('SELECT * FROM agent_events WHERE id = ?').get('aevt-1');
135
- assert.equal(row.event_type, 'run_created');
136
- assert.equal(row.agent_id, 'link');
137
- assert.equal(row.run_id, 'arun-1');
138
- });
139
- it('stores events without run_id', () => {
140
- const now = Date.now();
141
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-1', null, 'link', 'tool_invoked', '{"tool":"browser"}', now);
142
- const row = db.prepare('SELECT * FROM agent_events WHERE id = ?').get('aevt-1');
143
- assert.equal(row.run_id, null);
144
- assert.equal(row.event_type, 'tool_invoked');
145
- });
146
- it('lists events by agent ordered by created_at DESC', () => {
147
- const base = Date.now();
148
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-1', 'arun-1', 'link', 'run_created', '{}', base);
149
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-2', 'arun-1', 'link', 'task_attached', '{}', base + 100);
150
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-3', 'arun-1', 'link', 'completed', '{}', base + 200);
151
- const rows = db.prepare('SELECT * FROM agent_events WHERE agent_id = ? ORDER BY created_at DESC').all('link');
152
- assert.equal(rows.length, 3);
153
- assert.equal(rows[0].id, 'aevt-3'); // newest first
154
- assert.equal(rows[2].id, 'aevt-1'); // oldest last
155
- });
156
- it('filters events by run_id', () => {
157
- const now = Date.now();
158
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-1', 'arun-1', 'link', 'run_created', '{}', now);
159
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-2', 'arun-2', 'link', 'run_created', '{}', now);
160
- const rows = db.prepare('SELECT * FROM agent_events WHERE run_id = ?').all('arun-1');
161
- assert.equal(rows.length, 1);
162
- assert.equal(rows[0].run_id, 'arun-1');
163
- });
164
- it('filters events by type', () => {
165
- const now = Date.now();
166
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-1', null, 'link', 'artifact_produced', '{}', now);
167
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-2', null, 'link', 'review_requested', '{}', now);
168
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-3', null, 'link', 'artifact_produced', '{}', now + 100);
169
- const rows = db.prepare('SELECT * FROM agent_events WHERE event_type = ? ORDER BY created_at DESC').all('artifact_produced');
170
- assert.equal(rows.length, 2);
171
- });
172
- it('filters events by since timestamp', () => {
173
- const base = Date.now();
174
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-old', null, 'link', 'run_created', '{}', base);
175
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-new', null, 'link', 'completed', '{}', base + 5000);
176
- const rows = db.prepare('SELECT * FROM agent_events WHERE created_at >= ?').all(base + 1000);
177
- assert.equal(rows.length, 1);
178
- assert.equal(rows[0].id, 'aevt-new');
179
- });
180
- it('supports all event types from spec', () => {
181
- const types = [
182
- 'run_created', 'task_attached', 'tool_invoked', 'artifact_produced',
183
- 'review_requested', 'review_approved', 'review_rejected',
184
- 'blocked', 'handed_off', 'completed', 'failed',
185
- ];
186
- const now = Date.now();
187
- for (let i = 0; i < types.length; i++) {
188
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
189
- .run(`aevt-${i}`, null, 'link', types[i], '{}', now + i);
190
- }
191
- const all = db.prepare('SELECT * FROM agent_events WHERE agent_id = ?').all('link');
192
- assert.equal(all.length, 11);
193
- });
194
- it('preserves complex payload JSON', () => {
195
- const payload = JSON.stringify({
196
- from_agent: 'link',
197
- to_agent: 'sage',
198
- task_id: 'task-123',
199
- decision: 'approved',
200
- next_action: 'merge and deploy',
201
- rationale: {
202
- choice: 'approved PR #826',
203
- considered: ['CSS-only, no logic changes', 'CI green'],
204
- constraint: 'manual merge within scope'
205
- }
206
- });
207
- const now = Date.now();
208
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-1', 'arun-1', 'link', 'handed_off', payload, now);
209
- const row = db.prepare('SELECT * FROM agent_events WHERE id = ?').get('aevt-1');
210
- const parsed = JSON.parse(row.payload);
211
- assert.equal(parsed.to_agent, 'sage');
212
- assert.equal(parsed.decision, 'approved');
213
- });
214
- });
215
- describe('PR review handoff workflow (release gate)', () => {
216
- let db;
217
- beforeEach(() => {
218
- db = createTestDb();
219
- });
220
- it('supports the full PR review lifecycle', () => {
221
- const now = Date.now();
222
- // 1. Run created automatically
223
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, context_snapshot, started_at, updated_at) VALUES (?, ?, ?, ?, 'working', ?, ?, ?)`)
224
- .run('arun-pr', 'link', 'team-1', 'Implement agent runs schema', JSON.stringify({ taskId: 'task-qxwos0ffp' }), now, now);
225
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
226
- .run('aevt-1', 'arun-pr', 'link', 'run_created', JSON.stringify({ objective: 'Implement agent runs schema', taskId: 'task-qxwos0ffp' }), now);
227
- // 2. Events accumulate: task attached, artifact produced
228
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
229
- .run('aevt-2', 'arun-pr', 'link', 'task_attached', JSON.stringify({ task_id: 'task-qxwos0ffp', title: 'Persistent memory API' }), now + 100);
230
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
231
- .run('aevt-3', 'arun-pr', 'link', 'artifact_produced', JSON.stringify({ type: 'pr', url: 'https://github.com/reflectt/reflectt-node/pull/830' }), now + 200);
232
- // 3. Review requested
233
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
234
- .run('aevt-4', 'arun-pr', 'link', 'review_requested', JSON.stringify({ pr_url: 'https://github.com/reflectt/reflectt-node/pull/830', target_agent: 'sage', rationale: { choice: 'request review from sage', considered: ['schema touches persistence', 'needs second set of eyes'], constraint: 'review required before merge' } }), now + 300);
235
- // Update run to waiting_review
236
- db.prepare('UPDATE agent_runs SET status = ?, updated_at = ? WHERE id = ?').run('waiting_review', now + 300, 'arun-pr');
237
- // 4. Review approved (by second agent)
238
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
239
- .run('aevt-5', 'arun-pr', 'sage', 'review_approved', JSON.stringify({ pr_url: 'https://github.com/reflectt/reflectt-node/pull/830', reviewer: 'sage', comment: 'LGTM', rationale: { choice: 'approve PR #830', considered: ['tests pass', 'schema is minimal'], constraint: 'within current sprint scope' } }), now + 500);
240
- // 5. Handoff + completion
241
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at) VALUES (?, ?, ?, ?, ?, ?)`)
242
- .run('aevt-6', 'arun-pr', 'link', 'completed', JSON.stringify({ summary: 'PR merged', artifacts: [{ type: 'pr', url: 'https://github.com/reflectt/reflectt-node/pull/830' }] }), now + 600);
243
- db.prepare('UPDATE agent_runs SET status = ?, completed_at = ?, updated_at = ? WHERE id = ?').run('completed', now + 600, now + 600, 'arun-pr');
244
- // Verify release gate checks:
245
- // Check 1: Run exists
246
- const run = db.prepare('SELECT * FROM agent_runs WHERE id = ?').get('arun-pr');
247
- assert.equal(run.status, 'completed');
248
- // Check 2: Events accumulated
249
- const events = db.prepare('SELECT * FROM agent_events WHERE run_id = ? ORDER BY created_at').all('arun-pr');
250
- assert.equal(events.length, 6);
251
- // Check 3: Second agent (sage) has context via events — no chat archaeology needed
252
- const sageEvents = db.prepare('SELECT * FROM agent_events WHERE run_id = ? AND agent_id = ?').all('arun-pr', 'sage');
253
- assert.equal(sageEvents.length, 1);
254
- assert.equal(sageEvents[0].event_type, 'review_approved');
255
- // Check 4: Artifact/review state visible
256
- const artifactEvents = db.prepare('SELECT * FROM agent_events WHERE run_id = ? AND event_type IN (?, ?)').all('arun-pr', 'artifact_produced', 'review_approved');
257
- assert.equal(artifactEvents.length, 2);
258
- // Check 5: Completion is durable and queryable
259
- const completedRuns = db.prepare(`SELECT * FROM agent_runs WHERE agent_id = ? AND status = 'completed'`).all('link');
260
- assert.equal(completedRuns.length, 1);
261
- assert.ok(completedRuns[0].completed_at);
262
- });
263
- });
264
- describe('approval routing', () => {
265
- let db;
266
- beforeEach(() => {
267
- db = createTestDb();
268
- });
269
- it('pending approvals: finds review_requested with action_required', () => {
270
- const now = Date.now();
271
- // Create a review_requested event with action_required
272
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
273
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-req-1', 'arun-1', 'link', 'review_requested', JSON.stringify({ action_required: 'approve', urgency: 'high', owner: 'ryan' }), now);
274
- // Create a regular event (should NOT appear)
275
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
276
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-other', 'arun-1', 'link', 'tool_invoked', '{}', now + 1);
277
- const pending = db.prepare(`
278
- SELECT e.* FROM agent_events e
279
- WHERE e.event_type = 'review_requested'
280
- AND json_extract(e.payload, '$.action_required') IS NOT NULL
281
- AND NOT EXISTS (
282
- SELECT 1 FROM agent_events r
283
- WHERE r.run_id = e.run_id
284
- AND r.event_type IN ('review_approved', 'review_rejected')
285
- AND r.created_at > e.created_at
286
- )
287
- ORDER BY e.created_at DESC
288
- `).all();
289
- assert.equal(pending.length, 1);
290
- assert.equal(pending[0].id, 'aevt-req-1');
291
- const payload = JSON.parse(pending[0].payload);
292
- assert.equal(payload.action_required, 'approve');
293
- assert.equal(payload.urgency, 'high');
294
- });
295
- it('resolved approvals are excluded from pending', () => {
296
- const now = Date.now();
297
- // Create request
298
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
299
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-req-2', 'arun-2', 'link', 'review_requested', JSON.stringify({ action_required: 'approve' }), now);
300
- // Approve it
301
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
302
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-approve-2', 'arun-2', 'ryan', 'review_approved', JSON.stringify({ original_event_id: 'aevt-req-2', reviewer: 'ryan' }), now + 1);
303
- const pending = db.prepare(`
304
- SELECT e.* FROM agent_events e
305
- WHERE e.event_type = 'review_requested'
306
- AND json_extract(e.payload, '$.action_required') IS NOT NULL
307
- AND NOT EXISTS (
308
- SELECT 1 FROM agent_events r
309
- WHERE r.run_id = e.run_id
310
- AND r.event_type IN ('review_approved', 'review_rejected')
311
- AND r.created_at > e.created_at
312
- )
313
- `).all();
314
- assert.equal(pending.length, 0);
315
- });
316
- it('approval decision records event and can unblock run', () => {
317
- const now = Date.now();
318
- // Create a run in waiting_review
319
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at)
320
- VALUES (?, ?, ?, ?, ?, ?, ?)`).run('arun-3', 'link', 'default', 'PR review', 'waiting_review', now, now);
321
- // Create review_requested
322
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
323
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-req-3', 'arun-3', 'link', 'review_requested', JSON.stringify({ action_required: 'approve' }), now);
324
- // Simulate approval: record event + update run
325
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
326
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-approve-3', 'arun-3', 'link', 'review_approved', JSON.stringify({ original_event_id: 'aevt-req-3', reviewer: 'ryan' }), now + 1);
327
- db.prepare(`UPDATE agent_runs SET status = 'working', updated_at = ? WHERE id = ? AND status = 'waiting_review'`).run(now + 1, 'arun-3');
328
- // Verify run is unblocked
329
- const run = db.prepare('SELECT * FROM agent_runs WHERE id = ?').get('arun-3');
330
- assert.equal(run.status, 'working');
331
- // Verify approval event recorded
332
- const events = db.prepare(`SELECT * FROM agent_events WHERE event_type = 'review_approved' AND run_id = ?`).all('arun-3');
333
- assert.equal(events.length, 1);
334
- const payload = JSON.parse(events[0].payload);
335
- assert.equal(payload.reviewer, 'ryan');
336
- });
337
- it('rejection does not unblock run', () => {
338
- const now = Date.now();
339
- db.prepare(`INSERT INTO agent_runs (id, agent_id, team_id, objective, status, started_at, updated_at)
340
- VALUES (?, ?, ?, ?, ?, ?, ?)`).run('arun-4', 'link', 'default', 'Feature PR', 'waiting_review', now, now);
341
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
342
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-req-4', 'arun-4', 'link', 'review_requested', JSON.stringify({ action_required: 'approve' }), now);
343
- // Reject
344
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
345
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-reject-4', 'arun-4', 'link', 'review_rejected', JSON.stringify({ original_event_id: 'aevt-req-4', reviewer: 'ryan', comment: 'needs changes' }), now + 1);
346
- // Don't update run status for rejection
347
- const run = db.prepare('SELECT * FROM agent_runs WHERE id = ?').get('arun-4');
348
- assert.equal(run.status, 'waiting_review'); // Still blocked
349
- });
350
- it('multiple agents can have independent pending approvals', () => {
351
- const now = Date.now();
352
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
353
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-req-5', 'arun-5', 'link', 'review_requested', JSON.stringify({ action_required: 'approve' }), now);
354
- db.prepare(`INSERT INTO agent_events (id, run_id, agent_id, event_type, payload, created_at)
355
- VALUES (?, ?, ?, ?, ?, ?)`).run('aevt-req-6', 'arun-6', 'rhythm', 'review_requested', JSON.stringify({ action_required: 'approve' }), now + 1);
356
- // All pending
357
- const allPending = db.prepare(`
358
- SELECT e.* FROM agent_events e
359
- WHERE e.event_type = 'review_requested'
360
- AND json_extract(e.payload, '$.action_required') IS NOT NULL
361
- AND NOT EXISTS (
362
- SELECT 1 FROM agent_events r
363
- WHERE r.run_id = e.run_id
364
- AND r.event_type IN ('review_approved', 'review_rejected')
365
- AND r.created_at > e.created_at
366
- )
367
- `).all();
368
- assert.equal(allPending.length, 2);
369
- // Filter by agent
370
- const linkOnly = db.prepare(`
371
- SELECT e.* FROM agent_events e
372
- WHERE e.event_type = 'review_requested'
373
- AND e.agent_id = 'link'
374
- AND json_extract(e.payload, '$.action_required') IS NOT NULL
375
- AND NOT EXISTS (
376
- SELECT 1 FROM agent_events r
377
- WHERE r.run_id = e.run_id
378
- AND r.event_type IN ('review_approved', 'review_rejected')
379
- AND r.created_at > e.created_at
380
- )
381
- `).all();
382
- assert.equal(linkOnly.length, 1);
383
- assert.equal(linkOnly[0].agent_id, 'link');
384
- });
385
- });
386
- //# sourceMappingURL=agent-runs.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-runs.test.js","sourceRoot":"","sources":["../src/agent-runs.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=api.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.test.d.ts","sourceRoot":"","sources":["../src/api.test.ts"],"names":[],"mappings":""}
package/dist/api.test.js DELETED
@@ -1,99 +0,0 @@
1
- import { describe, it } from 'node:test';
2
- import { strict as should } from 'node:assert';
3
- const NODE_URL = 'http://127.0.0.1:4445';
4
- describe('GET /health', async () => {
5
- it('returns 200 with status ok', async () => {
6
- const res = await fetch(`${NODE_URL}/health`);
7
- should.equal(res.status, 200);
8
- const body = await res.json();
9
- should.equal(body.status, 'ok');
10
- should.ok(body.version);
11
- should.ok(body.uptime_seconds >= 0);
12
- });
13
- });
14
- describe('GET /presence', async () => {
15
- it('returns agent presence list', async () => {
16
- const res = await fetch(`${NODE_URL}/presence`);
17
- should.equal(res.status, 200);
18
- const body = await res.json();
19
- should.ok(body.presences);
20
- should.ok(Array.isArray(body.presences));
21
- });
22
- });
23
- describe('GET /canvas/state', async () => {
24
- it('returns canvas state with agents', async () => {
25
- const res = await fetch(`${NODE_URL}/canvas/state`);
26
- should.equal(res.status, 200);
27
- const body = await res.json();
28
- should.ok(body.agents);
29
- should.equal(typeof body.agents, 'object');
30
- });
31
- });
32
- describe('GET /tasks', async () => {
33
- it('returns tasks list', async () => {
34
- const res = await fetch(`${NODE_URL}/tasks`);
35
- should.equal(res.status, 200);
36
- const body = await res.json();
37
- should.ok(body.tasks);
38
- should.ok(Array.isArray(body.tasks));
39
- });
40
- it('filter by status=doing', async () => {
41
- const res = await fetch(`${NODE_URL}/tasks?status=doing`);
42
- should.equal(res.status, 200);
43
- const body = await res.json();
44
- should.ok(Array.isArray(body.tasks));
45
- for (const task of body.tasks) {
46
- should.equal(task.status, 'doing');
47
- }
48
- });
49
- });
50
- describe('POST /canvas/push', async () => {
51
- it('accepts thought type with agentId and text', async () => {
52
- const res = await fetch(`${NODE_URL}/canvas/push`, {
53
- method: 'POST',
54
- headers: { 'Content-Type': 'application/json' },
55
- body: JSON.stringify({ type: 'thought', agentId: 'kai', text: 'e2e test', ttl: 5000 }),
56
- });
57
- should.equal(res.status, 200);
58
- const body = await res.json();
59
- should.equal(body.success, true);
60
- });
61
- it('accepts canvas_spark type', async () => {
62
- const res = await fetch(`${NODE_URL}/canvas/push`, {
63
- method: 'POST',
64
- headers: { 'Content-Type': 'application/json' },
65
- body: JSON.stringify({ type: 'canvas_spark', kind: 'utterance', agentId: 'kai', text: 'spark test', ttl: 5000 }),
66
- });
67
- const body = await res.json();
68
- should.ok(body.success === true || res.status === 200);
69
- });
70
- it('rejects missing type', async () => {
71
- const res = await fetch(`${NODE_URL}/canvas/push`, {
72
- method: 'POST',
73
- headers: { 'Content-Type': 'application/json' },
74
- body: JSON.stringify({ agentId: 'kai' }),
75
- });
76
- should.notEqual(res.status, 200);
77
- });
78
- });
79
- describe('POST /chat/messages', async () => {
80
- it('posts message to general channel', async () => {
81
- const res = await fetch(`${NODE_URL}/chat/messages`, {
82
- method: 'POST',
83
- headers: { 'Content-Type': 'application/json' },
84
- body: JSON.stringify({ from: 'kai', content: 'e2e test message', channel: 'general' }),
85
- });
86
- const body = await res.json();
87
- should.equal(body.success, true);
88
- });
89
- });
90
- describe('GET /chat/messages', async () => {
91
- it('returns recent messages', async () => {
92
- const res = await fetch(`${NODE_URL}/chat/messages?limit=5`);
93
- should.equal(res.status, 200);
94
- const body = await res.json();
95
- should.ok(body.messages);
96
- should.ok(Array.isArray(body.messages));
97
- });
98
- });
99
- //# sourceMappingURL=api.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.test.js","sourceRoot":"","sources":["../src/api.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=approval-queue.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"approval-queue.test.d.ts","sourceRoot":"","sources":["../src/approval-queue.test.ts"],"names":[],"mappings":""}