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.
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 +157 -4
  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,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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=artifact-store.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=canvas-input.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=canvas-render.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=e2e-loop-proof.test.d.ts.map
@@ -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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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=email-sms-send.test.d.ts.map