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
|
@@ -1,118 +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
|
-
// In-memory test implementation matching the real logic
|
|
5
|
-
class ApprovalQueue {
|
|
6
|
-
items = [];
|
|
7
|
-
add(item) {
|
|
8
|
-
this.items.push(item);
|
|
9
|
-
}
|
|
10
|
-
list(opts) {
|
|
11
|
-
let result = [...this.items];
|
|
12
|
-
if (opts?.category)
|
|
13
|
-
result = result.filter(i => i.category === opts.category);
|
|
14
|
-
if (!opts?.includeExpired)
|
|
15
|
-
result = result.filter(i => !i.isExpired);
|
|
16
|
-
if (opts?.limit)
|
|
17
|
-
result = result.slice(0, opts.limit);
|
|
18
|
-
return result;
|
|
19
|
-
}
|
|
20
|
-
clear() { this.items = []; }
|
|
21
|
-
}
|
|
22
|
-
describe('approval queue', () => {
|
|
23
|
-
let queue;
|
|
24
|
-
beforeEach(() => {
|
|
25
|
-
queue = new ApprovalQueue();
|
|
26
|
-
});
|
|
27
|
-
it('returns empty list when no items', () => {
|
|
28
|
-
assert.deepEqual(queue.list(), []);
|
|
29
|
-
});
|
|
30
|
-
it('adds and retrieves review items', () => {
|
|
31
|
-
queue.add({
|
|
32
|
-
id: 'aevt-1', category: 'review', title: 'Review PR #100',
|
|
33
|
-
description: 'Code review needed', urgency: 'normal', owner: 'link',
|
|
34
|
-
expiresAt: null, autoAction: null, isExpired: false, createdAt: Date.now(),
|
|
35
|
-
});
|
|
36
|
-
const items = queue.list();
|
|
37
|
-
assert.equal(items.length, 1);
|
|
38
|
-
assert.equal(items[0].category, 'review');
|
|
39
|
-
assert.equal(items[0].title, 'Review PR #100');
|
|
40
|
-
});
|
|
41
|
-
it('adds and retrieves agent_action items', () => {
|
|
42
|
-
queue.add({
|
|
43
|
-
id: 'aevt-2', category: 'agent_action', title: 'Deploy to production?',
|
|
44
|
-
description: 'Link wants to deploy v0.1.9', urgency: 'high', owner: 'ryan',
|
|
45
|
-
expiresAt: Date.now() + 300000, autoAction: 'defer', isExpired: false, createdAt: Date.now(),
|
|
46
|
-
});
|
|
47
|
-
const items = queue.list();
|
|
48
|
-
assert.equal(items.length, 1);
|
|
49
|
-
assert.equal(items[0].category, 'agent_action');
|
|
50
|
-
assert.equal(items[0].autoAction, 'defer');
|
|
51
|
-
});
|
|
52
|
-
it('filters by category', () => {
|
|
53
|
-
queue.add({
|
|
54
|
-
id: 'aevt-1', category: 'review', title: 'Review',
|
|
55
|
-
description: null, urgency: null, owner: null,
|
|
56
|
-
expiresAt: null, autoAction: null, isExpired: false, createdAt: 1,
|
|
57
|
-
});
|
|
58
|
-
queue.add({
|
|
59
|
-
id: 'aevt-2', category: 'agent_action', title: 'Deploy?',
|
|
60
|
-
description: null, urgency: 'high', owner: null,
|
|
61
|
-
expiresAt: null, autoAction: 'reject', isExpired: false, createdAt: 2,
|
|
62
|
-
});
|
|
63
|
-
assert.equal(queue.list({ category: 'review' }).length, 1);
|
|
64
|
-
assert.equal(queue.list({ category: 'agent_action' }).length, 1);
|
|
65
|
-
assert.equal(queue.list().length, 2);
|
|
66
|
-
});
|
|
67
|
-
it('excludes expired items by default', () => {
|
|
68
|
-
queue.add({
|
|
69
|
-
id: 'aevt-3', category: 'agent_action', title: 'Expired deploy',
|
|
70
|
-
description: null, urgency: 'critical', owner: 'ryan',
|
|
71
|
-
expiresAt: Date.now() - 10000, autoAction: 'reject', isExpired: true, createdAt: 1,
|
|
72
|
-
});
|
|
73
|
-
assert.equal(queue.list().length, 0);
|
|
74
|
-
assert.equal(queue.list({ includeExpired: true }).length, 1);
|
|
75
|
-
});
|
|
76
|
-
it('respects limit', () => {
|
|
77
|
-
for (let i = 0; i < 5; i++) {
|
|
78
|
-
queue.add({
|
|
79
|
-
id: `aevt-${i}`, category: 'review', title: `Item ${i}`,
|
|
80
|
-
description: null, urgency: null, owner: null,
|
|
81
|
-
expiresAt: null, autoAction: null, isExpired: false, createdAt: i,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
assert.equal(queue.list({ limit: 3 }).length, 3);
|
|
85
|
-
assert.equal(queue.list().length, 5);
|
|
86
|
-
});
|
|
87
|
-
it('expiry detection is correct', () => {
|
|
88
|
-
const future = { expiresAt: Date.now() + 60000, isExpired: false };
|
|
89
|
-
const past = { expiresAt: Date.now() - 1000, isExpired: true };
|
|
90
|
-
const none = { expiresAt: null, isExpired: false };
|
|
91
|
-
assert.equal(future.isExpired, false);
|
|
92
|
-
assert.equal(past.isExpired, true);
|
|
93
|
-
assert.equal(none.isExpired, false);
|
|
94
|
-
});
|
|
95
|
-
it('auto_action field is preserved', () => {
|
|
96
|
-
queue.add({
|
|
97
|
-
id: 'aevt-4', category: 'agent_action', title: 'Auto-reject test',
|
|
98
|
-
description: 'Will auto-reject in 5m', urgency: 'high', owner: 'ryan',
|
|
99
|
-
expiresAt: Date.now() + 300000, autoAction: 'reject', isExpired: false, createdAt: 1,
|
|
100
|
-
});
|
|
101
|
-
const item = queue.list()[0];
|
|
102
|
-
assert.equal(item.autoAction, 'reject');
|
|
103
|
-
});
|
|
104
|
-
it('includes all required fields per COO spec', () => {
|
|
105
|
-
queue.add({
|
|
106
|
-
id: 'aevt-5', category: 'agent_action', title: 'What needs decision',
|
|
107
|
-
description: 'Context', urgency: 'high', owner: 'ryan',
|
|
108
|
-
expiresAt: Date.now() + 60000, autoAction: 'defer', isExpired: false, createdAt: Date.now(),
|
|
109
|
-
});
|
|
110
|
-
const item = queue.list()[0];
|
|
111
|
-
// COO spec: what needs decision, who owns it, when it expires, what happens if ignored
|
|
112
|
-
assert.ok(item.title, 'what needs decision');
|
|
113
|
-
assert.ok(item.owner, 'who owns it');
|
|
114
|
-
assert.ok(item.expiresAt, 'when it expires');
|
|
115
|
-
assert.ok(item.autoAction, 'what happens if ignored');
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
//# sourceMappingURL=approval-queue.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approval-queue.test.js","sourceRoot":"","sources":["../src/approval-queue.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-store.test.d.ts","sourceRoot":"","sources":["../src/artifact-store.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,119 +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
|
-
class InMemoryArtifactStore {
|
|
5
|
-
artifacts = [];
|
|
6
|
-
counter = 0;
|
|
7
|
-
store(agentId, name, content, opts) {
|
|
8
|
-
const buf = typeof content === 'string' ? Buffer.from(content) : content;
|
|
9
|
-
const art = {
|
|
10
|
-
id: `art-${++this.counter}`,
|
|
11
|
-
agentId, name,
|
|
12
|
-
runId: opts?.runId ?? null,
|
|
13
|
-
taskId: opts?.taskId ?? null,
|
|
14
|
-
mimeType: opts?.mimeType ?? this.guessMime(name),
|
|
15
|
-
sizeBytes: buf.length,
|
|
16
|
-
content: buf,
|
|
17
|
-
};
|
|
18
|
-
this.artifacts.push(art);
|
|
19
|
-
return art;
|
|
20
|
-
}
|
|
21
|
-
get(id) { return this.artifacts.find(a => a.id === id) ?? null; }
|
|
22
|
-
read(id) { return this.get(id)?.content ?? null; }
|
|
23
|
-
list(opts) {
|
|
24
|
-
return this.artifacts.filter(a => {
|
|
25
|
-
if (opts.agentId && a.agentId !== opts.agentId)
|
|
26
|
-
return false;
|
|
27
|
-
if (opts.runId && a.runId !== opts.runId)
|
|
28
|
-
return false;
|
|
29
|
-
if (opts.taskId && a.taskId !== opts.taskId)
|
|
30
|
-
return false;
|
|
31
|
-
return true;
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
delete(id) {
|
|
35
|
-
const idx = this.artifacts.findIndex(a => a.id === id);
|
|
36
|
-
if (idx === -1)
|
|
37
|
-
return false;
|
|
38
|
-
this.artifacts.splice(idx, 1);
|
|
39
|
-
return true;
|
|
40
|
-
}
|
|
41
|
-
usage(agentId) {
|
|
42
|
-
const mine = this.artifacts.filter(a => a.agentId === agentId);
|
|
43
|
-
return { totalBytes: mine.reduce((sum, a) => sum + a.sizeBytes, 0), count: mine.length };
|
|
44
|
-
}
|
|
45
|
-
guessMime(name) {
|
|
46
|
-
const ext = name.split('.').pop()?.toLowerCase();
|
|
47
|
-
if (ext === 'json')
|
|
48
|
-
return 'application/json';
|
|
49
|
-
if (ext === 'md')
|
|
50
|
-
return 'text/markdown';
|
|
51
|
-
if (ext === 'png')
|
|
52
|
-
return 'image/png';
|
|
53
|
-
return 'application/octet-stream';
|
|
54
|
-
}
|
|
55
|
-
clear() { this.artifacts = []; this.counter = 0; }
|
|
56
|
-
}
|
|
57
|
-
describe('artifact store', () => {
|
|
58
|
-
let store;
|
|
59
|
-
beforeEach(() => { store = new InMemoryArtifactStore(); });
|
|
60
|
-
it('stores and retrieves artifact', () => {
|
|
61
|
-
const art = store.store('link', 'report.md', '# Report');
|
|
62
|
-
assert.ok(art.id.startsWith('art-'));
|
|
63
|
-
assert.equal(art.name, 'report.md');
|
|
64
|
-
assert.equal(art.mimeType, 'text/markdown');
|
|
65
|
-
assert.equal(art.sizeBytes, 8);
|
|
66
|
-
});
|
|
67
|
-
it('reads content back', () => {
|
|
68
|
-
const art = store.store('link', 'data.json', '{"key":"value"}');
|
|
69
|
-
const content = store.read(art.id);
|
|
70
|
-
assert.ok(content);
|
|
71
|
-
assert.equal(content.toString(), '{"key":"value"}');
|
|
72
|
-
});
|
|
73
|
-
it('returns null for missing artifact', () => {
|
|
74
|
-
assert.equal(store.get('nonexistent'), null);
|
|
75
|
-
assert.equal(store.read('nonexistent'), null);
|
|
76
|
-
});
|
|
77
|
-
it('links artifact to run', () => {
|
|
78
|
-
store.store('link', 'log.txt', 'run output', { runId: 'arun-123' });
|
|
79
|
-
const results = store.list({ runId: 'arun-123' });
|
|
80
|
-
assert.equal(results.length, 1);
|
|
81
|
-
assert.equal(results[0].runId, 'arun-123');
|
|
82
|
-
});
|
|
83
|
-
it('links artifact to task', () => {
|
|
84
|
-
store.store('link', 'screenshot.png', Buffer.alloc(100), { taskId: 'task-456' });
|
|
85
|
-
const results = store.list({ taskId: 'task-456' });
|
|
86
|
-
assert.equal(results.length, 1);
|
|
87
|
-
});
|
|
88
|
-
it('lists by agent', () => {
|
|
89
|
-
store.store('link', 'a.md', 'aaa');
|
|
90
|
-
store.store('kai', 'b.md', 'bbb');
|
|
91
|
-
store.store('link', 'c.md', 'ccc');
|
|
92
|
-
assert.equal(store.list({ agentId: 'link' }).length, 2);
|
|
93
|
-
assert.equal(store.list({ agentId: 'kai' }).length, 1);
|
|
94
|
-
});
|
|
95
|
-
it('deletes artifact', () => {
|
|
96
|
-
const art = store.store('link', 'temp.txt', 'temp');
|
|
97
|
-
assert.equal(store.delete(art.id), true);
|
|
98
|
-
assert.equal(store.get(art.id), null);
|
|
99
|
-
assert.equal(store.delete(art.id), false);
|
|
100
|
-
});
|
|
101
|
-
it('tracks storage usage', () => {
|
|
102
|
-
store.store('link', 'a.txt', 'hello'); // 5 bytes
|
|
103
|
-
store.store('link', 'b.txt', 'world!'); // 6 bytes
|
|
104
|
-
const usage = store.usage('link');
|
|
105
|
-
assert.equal(usage.count, 2);
|
|
106
|
-
assert.equal(usage.totalBytes, 11);
|
|
107
|
-
});
|
|
108
|
-
it('uses correct MIME types', () => {
|
|
109
|
-
assert.equal(store.store('link', 'file.json', '{}').mimeType, 'application/json');
|
|
110
|
-
assert.equal(store.store('link', 'file.md', '#').mimeType, 'text/markdown');
|
|
111
|
-
assert.equal(store.store('link', 'file.png', Buffer.alloc(1)).mimeType, 'image/png');
|
|
112
|
-
assert.equal(store.store('link', 'file.xyz', 'x').mimeType, 'application/octet-stream');
|
|
113
|
-
});
|
|
114
|
-
it('allows custom MIME type override', () => {
|
|
115
|
-
const art = store.store('link', 'data.bin', 'custom', { mimeType: 'application/x-custom' });
|
|
116
|
-
assert.equal(art.mimeType, 'application/x-custom');
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
//# sourceMappingURL=artifact-store.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-store.test.js","sourceRoot":"","sources":["../src/artifact-store.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-input.test.d.ts","sourceRoot":"","sources":["../src/canvas-input.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
import { describe, it } from 'node:test';
|
|
3
|
-
import assert from 'node:assert/strict';
|
|
4
|
-
const VALID_ACTIONS = ['decision', 'interrupt', 'pause', 'resume', 'mute', 'unmute'];
|
|
5
|
-
const VALID_CHOICES = ['approve', 'deny', 'defer'];
|
|
6
|
-
function validateCanvasInput(body) {
|
|
7
|
-
const action = body.action;
|
|
8
|
-
if (!VALID_ACTIONS.includes(action)) {
|
|
9
|
-
return { valid: false, error: `action must be one of: ${VALID_ACTIONS.join(', ')}` };
|
|
10
|
-
}
|
|
11
|
-
if (typeof body.actor !== 'string' || !body.actor.trim()) {
|
|
12
|
-
return { valid: false, error: 'actor is required (non-empty string)' };
|
|
13
|
-
}
|
|
14
|
-
if (action === 'decision') {
|
|
15
|
-
if (!body.decisionId)
|
|
16
|
-
return { valid: false, error: 'decision action requires decisionId' };
|
|
17
|
-
if (!VALID_CHOICES.includes(body.choice)) {
|
|
18
|
-
return { valid: false, error: `decision action requires choice: ${VALID_CHOICES.join(', ')}` };
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return { valid: true };
|
|
22
|
-
}
|
|
23
|
-
describe('canvas input validation', () => {
|
|
24
|
-
it('accepts valid decision input', () => {
|
|
25
|
-
const r = validateCanvasInput({
|
|
26
|
-
action: 'decision',
|
|
27
|
-
actor: 'ryan',
|
|
28
|
-
decisionId: 'dec-123',
|
|
29
|
-
choice: 'approve',
|
|
30
|
-
});
|
|
31
|
-
assert.equal(r.valid, true);
|
|
32
|
-
});
|
|
33
|
-
it('accepts valid interrupt input', () => {
|
|
34
|
-
const r = validateCanvasInput({
|
|
35
|
-
action: 'interrupt',
|
|
36
|
-
actor: 'ryan',
|
|
37
|
-
targetRunId: 'arun-123',
|
|
38
|
-
});
|
|
39
|
-
assert.equal(r.valid, true);
|
|
40
|
-
});
|
|
41
|
-
it('accepts valid pause input', () => {
|
|
42
|
-
const r = validateCanvasInput({ action: 'pause', actor: 'ryan' });
|
|
43
|
-
assert.equal(r.valid, true);
|
|
44
|
-
});
|
|
45
|
-
it('accepts valid resume input', () => {
|
|
46
|
-
const r = validateCanvasInput({ action: 'resume', actor: 'ryan' });
|
|
47
|
-
assert.equal(r.valid, true);
|
|
48
|
-
});
|
|
49
|
-
it('accepts valid mute input', () => {
|
|
50
|
-
const r = validateCanvasInput({ action: 'mute', actor: 'ryan' });
|
|
51
|
-
assert.equal(r.valid, true);
|
|
52
|
-
});
|
|
53
|
-
it('accepts valid unmute input', () => {
|
|
54
|
-
const r = validateCanvasInput({ action: 'unmute', actor: 'ryan' });
|
|
55
|
-
assert.equal(r.valid, true);
|
|
56
|
-
});
|
|
57
|
-
it('rejects missing actor', () => {
|
|
58
|
-
const r = validateCanvasInput({ action: 'interrupt' });
|
|
59
|
-
assert.equal(r.valid, false);
|
|
60
|
-
assert.ok(r.error?.includes('actor'));
|
|
61
|
-
});
|
|
62
|
-
it('rejects invalid action', () => {
|
|
63
|
-
const r = validateCanvasInput({ action: 'explode', actor: 'ryan' });
|
|
64
|
-
assert.equal(r.valid, false);
|
|
65
|
-
assert.ok(r.error?.includes('action'));
|
|
66
|
-
});
|
|
67
|
-
it('rejects decision without decisionId', () => {
|
|
68
|
-
const r = validateCanvasInput({ action: 'decision', actor: 'ryan', choice: 'approve' });
|
|
69
|
-
assert.equal(r.valid, false);
|
|
70
|
-
assert.ok(r.error?.includes('decisionId'));
|
|
71
|
-
});
|
|
72
|
-
it('rejects decision without choice', () => {
|
|
73
|
-
const r = validateCanvasInput({ action: 'decision', actor: 'ryan', decisionId: 'dec-1' });
|
|
74
|
-
assert.equal(r.valid, false);
|
|
75
|
-
assert.ok(r.error?.includes('choice'));
|
|
76
|
-
});
|
|
77
|
-
it('rejects decision with invalid choice', () => {
|
|
78
|
-
const r = validateCanvasInput({ action: 'decision', actor: 'ryan', decisionId: 'dec-1', choice: 'maybe' });
|
|
79
|
-
assert.equal(r.valid, false);
|
|
80
|
-
assert.ok(r.error?.includes('choice'));
|
|
81
|
-
});
|
|
82
|
-
it('accepts all valid decision choices', () => {
|
|
83
|
-
for (const choice of VALID_CHOICES) {
|
|
84
|
-
const r = validateCanvasInput({ action: 'decision', actor: 'ryan', decisionId: 'dec-1', choice });
|
|
85
|
-
assert.equal(r.valid, true, `Expected ${choice} to be valid`);
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
it('accepts all valid actions', () => {
|
|
89
|
-
for (const action of VALID_ACTIONS) {
|
|
90
|
-
const extra = action === 'decision' ? { decisionId: 'd-1', choice: 'approve' } : {};
|
|
91
|
-
const r = validateCanvasInput({ action, actor: 'ryan', ...extra });
|
|
92
|
-
assert.equal(r.valid, true, `Expected ${action} to be valid`);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
});
|
|
96
|
-
//# sourceMappingURL=canvas-input.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-input.test.js","sourceRoot":"","sources":["../src/canvas-input.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-render.test.d.ts","sourceRoot":"","sources":["../src/canvas-render.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
import { describe, it } from 'node:test';
|
|
3
|
-
import assert from 'node:assert/strict';
|
|
4
|
-
const CANVAS_STATES = ['floor', 'listening', 'thinking', 'rendering', 'ambient', 'decision', 'urgent', 'handoff'];
|
|
5
|
-
const SENSOR_VALUES = [null, 'mic', 'camera', 'mic+camera'];
|
|
6
|
-
function validateCanvasRender(body) {
|
|
7
|
-
if (!CANVAS_STATES.includes(body.state)) {
|
|
8
|
-
return { valid: false, error: `state must be one of: ${CANVAS_STATES.join(', ')}` };
|
|
9
|
-
}
|
|
10
|
-
if (body.sensors !== undefined && body.sensors !== null && !['mic', 'camera', 'mic+camera'].includes(body.sensors)) {
|
|
11
|
-
return { valid: false, error: 'sensors must be null, mic, camera, or mic+camera' };
|
|
12
|
-
}
|
|
13
|
-
if (typeof body.agentId !== 'string' || !body.agentId) {
|
|
14
|
-
return { valid: false, error: 'agentId is required' };
|
|
15
|
-
}
|
|
16
|
-
// Validate decision payload if state is decision
|
|
17
|
-
if (body.state === 'decision' && body.payload) {
|
|
18
|
-
const p = body.payload;
|
|
19
|
-
if (p.decision && (!p.decision.question || !p.decision.decisionId)) {
|
|
20
|
-
return { valid: false, error: 'decision payload requires question and decisionId' };
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return { valid: true };
|
|
24
|
-
}
|
|
25
|
-
describe('canvas render state validation', () => {
|
|
26
|
-
it('accepts all 8 valid states', () => {
|
|
27
|
-
for (const state of CANVAS_STATES) {
|
|
28
|
-
const r = validateCanvasRender({ state, agentId: 'link', sensors: null });
|
|
29
|
-
assert.equal(r.valid, true, `${state} should be valid`);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
it('rejects invalid state', () => {
|
|
33
|
-
const r = validateCanvasRender({ state: 'exploding', agentId: 'link' });
|
|
34
|
-
assert.equal(r.valid, false);
|
|
35
|
-
});
|
|
36
|
-
it('accepts all valid sensor values', () => {
|
|
37
|
-
for (const s of SENSOR_VALUES) {
|
|
38
|
-
const r = validateCanvasRender({ state: 'floor', agentId: 'link', sensors: s });
|
|
39
|
-
assert.equal(r.valid, true, `sensor ${s} should be valid`);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
it('rejects invalid sensor', () => {
|
|
43
|
-
const r = validateCanvasRender({ state: 'floor', agentId: 'link', sensors: 'lidar' });
|
|
44
|
-
assert.equal(r.valid, false);
|
|
45
|
-
});
|
|
46
|
-
it('requires agentId', () => {
|
|
47
|
-
const r = validateCanvasRender({ state: 'floor' });
|
|
48
|
-
assert.equal(r.valid, false);
|
|
49
|
-
assert.ok(r.error?.includes('agentId'));
|
|
50
|
-
});
|
|
51
|
-
it('accepts floor with empty payload', () => {
|
|
52
|
-
const r = validateCanvasRender({ state: 'floor', agentId: 'link', sensors: null, payload: {} });
|
|
53
|
-
assert.equal(r.valid, true);
|
|
54
|
-
});
|
|
55
|
-
it('accepts thinking with text payload', () => {
|
|
56
|
-
const r = validateCanvasRender({ state: 'thinking', agentId: 'link', sensors: null, payload: { text: 'Working on PR...' } });
|
|
57
|
-
assert.equal(r.valid, true);
|
|
58
|
-
});
|
|
59
|
-
it('accepts decision with full decision payload', () => {
|
|
60
|
-
const r = validateCanvasRender({
|
|
61
|
-
state: 'decision', agentId: 'link', sensors: null,
|
|
62
|
-
payload: { decision: { question: 'Deploy?', decisionId: 'dec-1', expiresAt: Date.now() + 60000, autoAction: 'defer' } },
|
|
63
|
-
});
|
|
64
|
-
assert.equal(r.valid, true);
|
|
65
|
-
});
|
|
66
|
-
it('rejects decision payload missing question', () => {
|
|
67
|
-
const r = validateCanvasRender({
|
|
68
|
-
state: 'decision', agentId: 'link', sensors: null,
|
|
69
|
-
payload: { decision: { decisionId: 'dec-1' } },
|
|
70
|
-
});
|
|
71
|
-
assert.equal(r.valid, false);
|
|
72
|
-
});
|
|
73
|
-
it('accepts handoff with summary payload', () => {
|
|
74
|
-
const r = validateCanvasRender({
|
|
75
|
-
state: 'handoff', agentId: 'link', sensors: null,
|
|
76
|
-
payload: { summary: { headline: 'Session complete', items: ['3 PRs merged'], cost: '$0.42', duration: '2h' } },
|
|
77
|
-
});
|
|
78
|
-
assert.equal(r.valid, true);
|
|
79
|
-
});
|
|
80
|
-
it('accepts ambient with agents list', () => {
|
|
81
|
-
const r = validateCanvasRender({
|
|
82
|
-
state: 'ambient', agentId: 'link', sensors: null,
|
|
83
|
-
payload: { agents: [{ name: 'link', state: 'idle' }, { name: 'pixel', state: 'working', task: 'UX flow' }] },
|
|
84
|
-
});
|
|
85
|
-
assert.equal(r.valid, true);
|
|
86
|
-
});
|
|
87
|
-
it('accepts urgent with mic sensor', () => {
|
|
88
|
-
const r = validateCanvasRender({
|
|
89
|
-
state: 'urgent', agentId: 'link', sensors: 'mic',
|
|
90
|
-
payload: { text: 'Server down!' },
|
|
91
|
-
});
|
|
92
|
-
assert.equal(r.valid, true);
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
//# sourceMappingURL=canvas-render.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"canvas-render.test.js","sourceRoot":"","sources":["../src/canvas-render.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"e2e-loop-proof.test.d.ts","sourceRoot":"","sources":["../src/e2e-loop-proof.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
-
// End-to-end loop proof: trigger → run → decision/approval → completion
|
|
3
|
-
// Exercises the REAL Host API against a live server.
|
|
4
|
-
import { describe, it } from 'node:test';
|
|
5
|
-
import assert from 'node:assert/strict';
|
|
6
|
-
const BASE = process.env.TEST_HOST || 'http://127.0.0.1:4445';
|
|
7
|
-
async function api(method, path, body) {
|
|
8
|
-
const opts = { method, headers: { 'Content-Type': 'application/json' } };
|
|
9
|
-
if (body)
|
|
10
|
-
opts.body = JSON.stringify(body);
|
|
11
|
-
const res = await fetch(`${BASE}${path}`, opts);
|
|
12
|
-
const text = await res.text();
|
|
13
|
-
let data = {};
|
|
14
|
-
try {
|
|
15
|
-
data = JSON.parse(text);
|
|
16
|
-
}
|
|
17
|
-
catch {
|
|
18
|
-
data = { _raw: text };
|
|
19
|
-
}
|
|
20
|
-
return { status: res.status, data };
|
|
21
|
-
}
|
|
22
|
-
describe('E2E Host Loop — trigger → run → decision → approval → completion', () => {
|
|
23
|
-
let runId;
|
|
24
|
-
let reviewEventId;
|
|
25
|
-
it('Step 1: Create a run (trigger)', async () => {
|
|
26
|
-
const { status, data } = await api('POST', '/agents/link/runs', {
|
|
27
|
-
objective: 'E2E loop proof — automated test',
|
|
28
|
-
teamId: 'default',
|
|
29
|
-
});
|
|
30
|
-
assert.equal(status, 201, `Expected 201, got ${status}: ${JSON.stringify(data)}`);
|
|
31
|
-
runId = data.id;
|
|
32
|
-
assert.ok(runId.startsWith('arun-'), `Run ID format: ${runId}`);
|
|
33
|
-
assert.equal(data.status, 'idle');
|
|
34
|
-
console.log(` ✓ Run created: ${runId}`);
|
|
35
|
-
});
|
|
36
|
-
it('Step 2: Attach task + start work', async () => {
|
|
37
|
-
// Emit task_attached event
|
|
38
|
-
const { status } = await api('POST', '/agents/link/events', {
|
|
39
|
-
eventType: 'task_attached',
|
|
40
|
-
runId,
|
|
41
|
-
payload: { taskId: 'test-task-e2e', title: 'E2E proof task' },
|
|
42
|
-
});
|
|
43
|
-
assert.equal(status, 201);
|
|
44
|
-
// Update run to working
|
|
45
|
-
const { status: s2, data } = await api('PATCH', `/agents/link/runs/${runId}`, { status: 'working' });
|
|
46
|
-
assert.equal(s2, 200);
|
|
47
|
-
assert.equal(data.status, 'working');
|
|
48
|
-
console.log(' ✓ Run status: working');
|
|
49
|
-
});
|
|
50
|
-
it('Step 3: Request review (decision point)', async () => {
|
|
51
|
-
const { status, data } = await api('POST', '/agents/link/events', {
|
|
52
|
-
eventType: 'review_requested',
|
|
53
|
-
runId,
|
|
54
|
-
payload: {
|
|
55
|
-
action_required: 'approve',
|
|
56
|
-
urgency: 'normal',
|
|
57
|
-
owner: 'ryan',
|
|
58
|
-
prUrl: 'https://github.com/reflectt/reflectt-node/pull/e2e-test',
|
|
59
|
-
rationale: {
|
|
60
|
-
choice: 'request approval for E2E loop proof',
|
|
61
|
-
considered: ['host loop reached review point', 'approval path needs proof'],
|
|
62
|
-
constraint: 'must pass through real approval endpoint',
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
});
|
|
66
|
-
assert.equal(status, 201);
|
|
67
|
-
reviewEventId = data.id;
|
|
68
|
-
assert.ok(reviewEventId.startsWith('aevt-'));
|
|
69
|
-
// Set run to waiting_review
|
|
70
|
-
const { status: s2 } = await api('PATCH', `/agents/link/runs/${runId}`, { status: 'waiting_review' });
|
|
71
|
-
assert.equal(s2, 200);
|
|
72
|
-
console.log(` ✓ Review requested: ${reviewEventId}`);
|
|
73
|
-
});
|
|
74
|
-
it('Step 4: Approve (human decision)', async () => {
|
|
75
|
-
const { status, data } = await api('POST', `/approvals/${reviewEventId}/decide`, {
|
|
76
|
-
decision: 'approve',
|
|
77
|
-
reviewer: 'ryan',
|
|
78
|
-
comment: 'LGTM — E2E proof approved',
|
|
79
|
-
rationale: {
|
|
80
|
-
choice: 'approve E2E loop proof',
|
|
81
|
-
considered: ['review request present', 'loop should prove approval path'],
|
|
82
|
-
constraint: 'keep to host-only proof path',
|
|
83
|
-
},
|
|
84
|
-
});
|
|
85
|
-
assert.equal(status, 200);
|
|
86
|
-
console.log(' ✓ Approved by ryan');
|
|
87
|
-
});
|
|
88
|
-
it('Step 5: Complete run', async () => {
|
|
89
|
-
// Emit completed event
|
|
90
|
-
const { status } = await api('POST', '/agents/link/events', {
|
|
91
|
-
eventType: 'completed',
|
|
92
|
-
runId,
|
|
93
|
-
payload: { summary: 'E2E loop proven — all steps passed' },
|
|
94
|
-
});
|
|
95
|
-
assert.equal(status, 201);
|
|
96
|
-
// Mark run completed
|
|
97
|
-
const { status: s2, data } = await api('PATCH', `/agents/link/runs/${runId}`, { status: 'completed' });
|
|
98
|
-
assert.equal(s2, 200);
|
|
99
|
-
assert.equal(data.status, 'completed');
|
|
100
|
-
console.log(' ✓ Run completed');
|
|
101
|
-
});
|
|
102
|
-
it('Step 6: Verify full event chain', async () => {
|
|
103
|
-
const { status, data } = await api('GET', `/agents/link/events?runId=${runId}`);
|
|
104
|
-
assert.equal(status, 200);
|
|
105
|
-
const events = data;
|
|
106
|
-
const types = events.map(e => e.eventType);
|
|
107
|
-
assert.ok(types.includes('task_attached'), `Missing task_attached in: ${types}`);
|
|
108
|
-
assert.ok(types.includes('review_requested'), `Missing review_requested in: ${types}`);
|
|
109
|
-
assert.ok(types.includes('review_approved'), `Missing review_approved in: ${types}`);
|
|
110
|
-
assert.ok(types.includes('completed'), `Missing completed in: ${types}`);
|
|
111
|
-
console.log(` ✓ Full chain verified: ${types.join(' → ')}`);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
//# sourceMappingURL=e2e-loop-proof.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"e2e-loop-proof.test.js","sourceRoot":"","sources":["../src/e2e-loop-proof.test.ts"],"names":[],"mappings":"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"}
|