reflectt-node 0.1.20 → 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.
- package/README.md +64 -0
- package/dist/canvas-interactive.d.ts +53 -0
- package/dist/canvas-interactive.d.ts.map +1 -1
- package/dist/canvas-interactive.js +194 -0
- package/dist/canvas-interactive.js.map +1 -1
- package/dist/canvas-push.d.ts +2 -0
- package/dist/canvas-push.d.ts.map +1 -1
- package/dist/canvas-push.js +89 -0
- package/dist/canvas-push.js.map +1 -1
- package/dist/channels.d.ts +1 -1
- package/dist/intervention-template.d.ts +67 -0
- package/dist/intervention-template.d.ts.map +1 -0
- package/dist/intervention-template.js +290 -0
- package/dist/intervention-template.js.map +1 -0
- package/dist/request-tracker.d.ts +1 -0
- package/dist/request-tracker.d.ts.map +1 -1
- package/dist/request-tracker.js +16 -4
- package/dist/request-tracker.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +157 -4
- package/dist/server.js.map +1 -1
- package/dist/stall-detector.d.ts +109 -0
- package/dist/stall-detector.d.ts.map +1 -0
- package/dist/stall-detector.js +279 -0
- package/dist/stall-detector.js.map +1 -0
- package/package.json +1 -1
- package/public/docs.md +9 -0
- package/dist/agent-config.test.d.ts +0 -2
- package/dist/agent-config.test.d.ts.map +0 -1
- package/dist/agent-config.test.js +0 -91
- package/dist/agent-config.test.js.map +0 -1
- package/dist/agent-exec-guardrail.test.d.ts +0 -2
- package/dist/agent-exec-guardrail.test.d.ts.map +0 -1
- package/dist/agent-exec-guardrail.test.js +0 -55
- package/dist/agent-exec-guardrail.test.js.map +0 -1
- package/dist/agent-memories.test.d.ts +0 -2
- package/dist/agent-memories.test.d.ts.map +0 -1
- package/dist/agent-memories.test.js +0 -327
- package/dist/agent-memories.test.js.map +0 -1
- package/dist/agent-messaging.test.d.ts +0 -2
- package/dist/agent-messaging.test.d.ts.map +0 -1
- package/dist/agent-messaging.test.js +0 -105
- package/dist/agent-messaging.test.js.map +0 -1
- package/dist/agent-runs.test.d.ts +0 -2
- package/dist/agent-runs.test.d.ts.map +0 -1
- package/dist/agent-runs.test.js +0 -386
- package/dist/agent-runs.test.js.map +0 -1
- package/dist/api.test.d.ts +0 -2
- package/dist/api.test.d.ts.map +0 -1
- package/dist/api.test.js +0 -99
- package/dist/api.test.js.map +0 -1
- package/dist/approval-queue.test.d.ts +0 -2
- package/dist/approval-queue.test.d.ts.map +0 -1
- package/dist/approval-queue.test.js +0 -118
- package/dist/approval-queue.test.js.map +0 -1
- package/dist/artifact-store.test.d.ts +0 -2
- package/dist/artifact-store.test.d.ts.map +0 -1
- package/dist/artifact-store.test.js +0 -119
- package/dist/artifact-store.test.js.map +0 -1
- package/dist/canvas-input.test.d.ts +0 -2
- package/dist/canvas-input.test.d.ts.map +0 -1
- package/dist/canvas-input.test.js +0 -96
- package/dist/canvas-input.test.js.map +0 -1
- package/dist/canvas-render.test.d.ts +0 -2
- package/dist/canvas-render.test.d.ts.map +0 -1
- package/dist/canvas-render.test.js +0 -95
- package/dist/canvas-render.test.js.map +0 -1
- package/dist/e2e-loop-proof.test.d.ts +0 -2
- package/dist/e2e-loop-proof.test.d.ts.map +0 -1
- package/dist/e2e-loop-proof.test.js +0 -114
- package/dist/e2e-loop-proof.test.js.map +0 -1
- package/dist/email-sms-send.test.d.ts +0 -2
- package/dist/email-sms-send.test.d.ts.map +0 -1
- package/dist/email-sms-send.test.js +0 -96
- package/dist/email-sms-send.test.js.map +0 -1
- package/dist/handoff-state.test.d.ts +0 -2
- package/dist/handoff-state.test.d.ts.map +0 -1
- package/dist/handoff-state.test.js +0 -102
- package/dist/handoff-state.test.js.map +0 -1
- package/dist/routing-enforcement.test.d.ts +0 -2
- package/dist/routing-enforcement.test.d.ts.map +0 -1
- package/dist/routing-enforcement.test.js +0 -62
- package/dist/routing-enforcement.test.js.map +0 -1
- package/dist/run-retention.test.d.ts +0 -2
- package/dist/run-retention.test.d.ts.map +0 -1
- package/dist/run-retention.test.js +0 -57
- package/dist/run-retention.test.js.map +0 -1
- package/dist/run-stream.test.d.ts +0 -2
- package/dist/run-stream.test.d.ts.map +0 -1
- package/dist/run-stream.test.js +0 -70
- package/dist/run-stream.test.js.map +0 -1
- package/dist/webhook-storage.test.d.ts +0 -2
- package/dist/webhook-storage.test.d.ts.map +0 -1
- package/dist/webhook-storage.test.js +0 -86
- package/dist/webhook-storage.test.js.map +0 -1
- package/dist/workflow-canvas-state.test.d.ts +0 -2
- package/dist/workflow-canvas-state.test.d.ts.map +0 -1
- package/dist/workflow-canvas-state.test.js +0 -53
- package/dist/workflow-canvas-state.test.js.map +0 -1
- package/dist/workflow-templates.test.d.ts +0 -2
- package/dist/workflow-templates.test.d.ts.map +0 -1
- package/dist/workflow-templates.test.js +0 -76
- package/dist/workflow-templates.test.js.map +0 -1
package/dist/agent-runs.test.js
DELETED
|
@@ -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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"}
|
package/dist/api.test.d.ts
DELETED
package/dist/api.test.d.ts.map
DELETED
|
@@ -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
|
package/dist/api.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"api.test.js","sourceRoot":"","sources":["../src/api.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approval-queue.test.d.ts","sourceRoot":"","sources":["../src/approval-queue.test.ts"],"names":[],"mappings":""}
|