@signhify/agents 0.0.0-stage → 0.3.1

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 (46) hide show
  1. package/dist/__tests__/orchestrator.test.d.ts +2 -0
  2. package/dist/__tests__/orchestrator.test.d.ts.map +1 -0
  3. package/dist/__tests__/orchestrator.test.js +353 -0
  4. package/dist/__tests__/orchestrator.test.js.map +1 -0
  5. package/dist/__tests__/planner.test.d.ts +2 -0
  6. package/dist/__tests__/planner.test.d.ts.map +1 -0
  7. package/dist/__tests__/planner.test.js +29 -0
  8. package/dist/__tests__/planner.test.js.map +1 -0
  9. package/dist/browser-use.d.ts +8 -0
  10. package/dist/browser-use.d.ts.map +1 -0
  11. package/dist/browser-use.js +34 -0
  12. package/dist/browser-use.js.map +1 -0
  13. package/dist/editor.d.ts +8 -0
  14. package/dist/editor.d.ts.map +1 -0
  15. package/dist/editor.js +134 -0
  16. package/dist/editor.js.map +1 -0
  17. package/dist/file-picker.d.ts +8 -0
  18. package/dist/file-picker.d.ts.map +1 -0
  19. package/dist/file-picker.js +64 -0
  20. package/dist/file-picker.js.map +1 -0
  21. package/dist/index.d.ts +8 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +7 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/llm.d.ts +14 -0
  26. package/dist/llm.d.ts.map +1 -0
  27. package/dist/llm.js +34 -0
  28. package/dist/llm.js.map +1 -0
  29. package/dist/orchestrator.d.ts +18 -0
  30. package/dist/orchestrator.d.ts.map +1 -0
  31. package/dist/orchestrator.js +254 -0
  32. package/dist/orchestrator.js.map +1 -0
  33. package/dist/planner.d.ts +26 -0
  34. package/dist/planner.d.ts.map +1 -0
  35. package/dist/planner.js +119 -0
  36. package/dist/planner.js.map +1 -0
  37. package/dist/reviewer.d.ts +10 -0
  38. package/dist/reviewer.d.ts.map +1 -0
  39. package/dist/reviewer.js +164 -0
  40. package/dist/reviewer.js.map +1 -0
  41. package/dist/types.d.ts +56 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +2 -0
  44. package/dist/types.js.map +1 -0
  45. package/package.json +36 -4
  46. package/README.md +0 -3
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=orchestrator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/orchestrator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,353 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import { SubagentOrchestrator } from '../orchestrator.js';
3
+ import * as fs from 'node:fs/promises';
4
+ import * as path from 'node:path';
5
+ import * as os from 'node:os';
6
+ describe('SubagentOrchestrator', () => {
7
+ let tmpDir;
8
+ let orchestrator;
9
+ beforeEach(async () => {
10
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'signhify-subagents-'));
11
+ await fs.writeFile(path.join(tmpDir, 'auth-service.ts'), 'export const auth = true;');
12
+ await fs.writeFile(path.join(tmpDir, 'payment.ts'), 'export const pay = true;');
13
+ orchestrator = new SubagentOrchestrator(tmpDir);
14
+ });
15
+ afterEach(async () => {
16
+ await fs.rm(tmpDir, { recursive: true, force: true });
17
+ });
18
+ it('should list all registered subagents', () => {
19
+ const list = orchestrator.listSubagents();
20
+ const roles = list.map(a => a.role);
21
+ expect(roles).toContain('file-picker');
22
+ expect(roles).toContain('planner');
23
+ expect(roles).toContain('editor');
24
+ expect(roles).toContain('reviewer');
25
+ expect(roles).toContain('browser-use');
26
+ });
27
+ it('should dispatch @FilePicker and discover matching files', async () => {
28
+ const res = await orchestrator.dispatch({
29
+ id: 'task-1',
30
+ role: 'file-picker',
31
+ objective: 'inspect auth service',
32
+ });
33
+ expect(res.success).toBe(true);
34
+ expect(res.output).toContain('auth-service.ts');
35
+ });
36
+ it('should dispatch @Planner and return structured roadmap', async () => {
37
+ const res = await orchestrator.dispatch({
38
+ id: 'task-2',
39
+ role: 'planner',
40
+ objective: 'add stripe webhook',
41
+ });
42
+ expect(res.success).toBe(true);
43
+ expect(res.output).toContain('@Planner');
44
+ expect(res.output).toContain('T1');
45
+ });
46
+ it('planner tasks: >=1 child persisted with parentId "T1" (T3.2)', async () => {
47
+ process.env.SIGNHIFY_MOCK_PROVIDER = '1'; // force the template path — hermetic
48
+ const { MemoryStore } = await import('@signhify/memory');
49
+ const store = new MemoryStore(path.join(tmpDir, 'memory.db'));
50
+ const orchestratorWithMemory = new SubagentOrchestrator(tmpDir, {
51
+ memory: store,
52
+ });
53
+ try {
54
+ const res = await orchestratorWithMemory.dispatch({
55
+ id: 'task-plan-1',
56
+ role: 'planner',
57
+ objective: 'ship the feature',
58
+ });
59
+ expect(res.success).toBe(true);
60
+ const tasks = res.metadata?.tasks;
61
+ expect(tasks.length).toBeGreaterThanOrEqual(2);
62
+ expect(tasks.some(t => t.parentId === 'T1')).toBe(true);
63
+ // And the same rows landed in the SQLite tasks table.
64
+ const child = store.getTask('T1.1');
65
+ expect(child?.parentId).toBe('T1');
66
+ expect(store.getTask('T1')).not.toBeNull();
67
+ }
68
+ finally {
69
+ delete process.env.SIGNHIFY_MOCK_PROVIDER;
70
+ store.close();
71
+ }
72
+ });
73
+ it('should run a pipeline across multiple subagents', async () => {
74
+ const pipeline = await orchestrator.runPipeline([
75
+ { id: '1', role: 'file-picker', objective: 'find payment files' },
76
+ { id: '2', role: 'planner', objective: 'refactor payment gateway' },
77
+ ]);
78
+ expect(pipeline).toHaveLength(2);
79
+ expect(pipeline[0].success).toBe(true);
80
+ expect(pipeline[1].success).toBe(true);
81
+ });
82
+ describe('Closed-loop verification', () => {
83
+ it('should execute closed-loop verifyStep on @Editor after write succeeds', async () => {
84
+ const mockInvokeTool = vi.fn(async (name, payload) => {
85
+ if (name === 'file-io') {
86
+ return { content: JSON.stringify({ success: true, path: payload.path }) };
87
+ }
88
+ if (name === 'shell-exec') {
89
+ return { content: JSON.stringify({ exitCode: 0, stdout: 'PASS src/app.test.ts (2 tests)' }) };
90
+ }
91
+ return { content: '{}' };
92
+ });
93
+ const res = await orchestrator.dispatch({
94
+ id: 'editor-task-1',
95
+ role: 'editor',
96
+ objective: 'implement feature',
97
+ context: {
98
+ targetFile: 'src/app.ts',
99
+ content: 'export const run = () => true;',
100
+ verifyStep: 'npm test -- --run',
101
+ },
102
+ }, { invokeTool: mockInvokeTool });
103
+ expect(res.success).toBe(true);
104
+ expect(res.artifacts).toContain('src/app.ts');
105
+ expect(res.metadata?.verified).toBe(true);
106
+ expect(res.metadata?.testCommand).toBe('npm test -- --run');
107
+ expect(mockInvokeTool).toHaveBeenCalledWith('file-io', {
108
+ action: 'write',
109
+ path: 'src/app.ts',
110
+ content: 'export const run = () => true;',
111
+ });
112
+ expect(mockInvokeTool).toHaveBeenCalledWith('shell-exec', {
113
+ command: 'npm test -- --run',
114
+ timeoutMs: 30000,
115
+ });
116
+ });
117
+ it('should fail @Editor when verifyStep exits with non-zero exit code', async () => {
118
+ const mockInvokeTool = vi.fn(async (name) => {
119
+ if (name === 'file-io') {
120
+ return { content: JSON.stringify({ success: true }) };
121
+ }
122
+ if (name === 'shell-exec') {
123
+ return { content: JSON.stringify({ exitCode: 1, stderr: 'FAIL src/app.test.ts: expected true to be false' }) };
124
+ }
125
+ return { content: '{}' };
126
+ });
127
+ const res = await orchestrator.dispatch({
128
+ id: 'editor-task-2',
129
+ role: 'editor',
130
+ objective: 'implement broken feature',
131
+ context: {
132
+ targetFile: 'src/app.ts',
133
+ content: 'export const run = () => false;',
134
+ testCommand: 'npm test',
135
+ },
136
+ }, { invokeTool: mockInvokeTool });
137
+ expect(res.success).toBe(false);
138
+ expect(res.metadata?.verified).toBe(false);
139
+ expect(res.metadata?.exitCode).toBe(1);
140
+ expect(res.error).toContain('FAIL src/app.test.ts');
141
+ });
142
+ it('should execute testCommand and return structured ReviewVerdict on @Reviewer', async () => {
143
+ const mockInvokeTool = vi.fn(async (name) => {
144
+ if (name === 'shell-exec') {
145
+ return { content: JSON.stringify({ exitCode: 0, stdout: 'Test suite passed: 5 tests' }) };
146
+ }
147
+ return { content: '{}' };
148
+ });
149
+ const res = await orchestrator.dispatch({
150
+ id: 'reviewer-task-1',
151
+ role: 'reviewer',
152
+ objective: 'verify test suite',
153
+ context: {
154
+ testCommand: 'npm test',
155
+ instructions: 'Verify all unit tests pass',
156
+ },
157
+ }, { invokeTool: mockInvokeTool });
158
+ expect(res.success).toBe(true);
159
+ const verdict = res.metadata?.verdict;
160
+ expect(verdict).toBeDefined();
161
+ expect(verdict.met).toBe(true);
162
+ expect(verdict.exitCode).toBe(0);
163
+ expect(res.output).toContain('@Reviewer verified');
164
+ });
165
+ it('should return failed ReviewVerdict with remaining steps when testCommand fails on @Reviewer', async () => {
166
+ const mockInvokeTool = vi.fn(async (name) => {
167
+ if (name === 'shell-exec') {
168
+ return { content: JSON.stringify({ exitCode: 1, stderr: 'AssertionError: expected status 200 got 500' }) };
169
+ }
170
+ return { content: '{}' };
171
+ });
172
+ const res = await orchestrator.dispatch({
173
+ id: 'reviewer-task-2',
174
+ role: 'reviewer',
175
+ objective: 'verify test suite',
176
+ context: {
177
+ testCommand: 'npm test',
178
+ },
179
+ }, { invokeTool: mockInvokeTool });
180
+ expect(res.success).toBe(false);
181
+ const verdict = res.metadata?.verdict;
182
+ expect(verdict).toBeDefined();
183
+ expect(verdict.met).toBe(false);
184
+ expect(verdict.exitCode).toBe(1);
185
+ expect(verdict.remainingSteps.length).toBeGreaterThan(0);
186
+ expect(res.error).toContain('AssertionError');
187
+ });
188
+ it('should evaluate instructions with model adapter and return parsed ReviewVerdict', async () => {
189
+ delete process.env.SIGNHIFY_MOCK_PROVIDER;
190
+ const mockInvokeTool = vi.fn(async (name) => {
191
+ if (name === 'shell-exec') {
192
+ return { content: JSON.stringify({ exitCode: 0, stdout: 'Build successful' }) };
193
+ }
194
+ return { content: '{}' };
195
+ });
196
+ const streamChatSpy = vi.fn(async function* () {
197
+ yield {
198
+ type: 'text',
199
+ content: JSON.stringify({
200
+ met: true,
201
+ reason: 'All acceptance criteria and test assertions pass cleanly',
202
+ remainingSteps: [],
203
+ }),
204
+ };
205
+ });
206
+ const mockAdapter = {
207
+ vendor: 'openai',
208
+ streamChat: streamChatSpy,
209
+ };
210
+ const res = await orchestrator.dispatch({
211
+ id: 'reviewer-task-3',
212
+ role: 'reviewer',
213
+ objective: 'review PR requirements',
214
+ context: {
215
+ instructions: 'Ensure type safety and no errors',
216
+ testCommand: 'npm run typecheck',
217
+ diff: '+ export const isReady = true;',
218
+ },
219
+ }, {
220
+ invokeTool: mockInvokeTool,
221
+ adapter: mockAdapter,
222
+ model: 'test-model',
223
+ });
224
+ expect(res.success).toBe(true);
225
+ const verdict = res.metadata?.verdict;
226
+ expect(verdict).toBeDefined();
227
+ expect(verdict.met).toBe(true);
228
+ expect(verdict.reason).toBe('All acceptance criteria and test assertions pass cleanly');
229
+ expect(streamChatSpy).toHaveBeenCalled();
230
+ });
231
+ it('should run a closed-loop Editor -> Reviewer pipeline with verification', async () => {
232
+ const mockInvokeTool = vi.fn(async (name, payload) => {
233
+ if (name === 'file-io') {
234
+ return { content: JSON.stringify({ success: true, path: payload.path }) };
235
+ }
236
+ if (name === 'shell-exec') {
237
+ return { content: JSON.stringify({ exitCode: 0, stdout: 'Tests: 12 passed' }) };
238
+ }
239
+ return { content: '{}' };
240
+ });
241
+ const pipeline = await orchestrator.runPipeline([
242
+ {
243
+ id: 'edit-step',
244
+ role: 'editor',
245
+ objective: 'apply fix',
246
+ context: {
247
+ targetFile: 'src/fix.ts',
248
+ content: 'export const fixed = true;',
249
+ verifyStep: 'npm test',
250
+ },
251
+ },
252
+ {
253
+ id: 'review-step',
254
+ role: 'reviewer',
255
+ objective: 'verify fix',
256
+ dependsOn: ['edit-step'],
257
+ context: {
258
+ testCommand: 'npm test',
259
+ instructions: 'Verify fix passes tests',
260
+ },
261
+ },
262
+ ], { invokeTool: mockInvokeTool });
263
+ expect(pipeline).toHaveLength(2);
264
+ expect(pipeline[0].success).toBe(true);
265
+ expect(pipeline[0].metadata?.verified).toBe(true);
266
+ expect(pipeline[1].success).toBe(true);
267
+ const verdict = pipeline[1].metadata?.verdict;
268
+ expect(verdict.met).toBe(true);
269
+ });
270
+ });
271
+ describe('AbortSignal cancellation', () => {
272
+ it('should immediately return cancelled result when dispatch called with pre-aborted signal', async () => {
273
+ const controller = new AbortController();
274
+ controller.abort();
275
+ const res = await orchestrator.dispatch({ id: 'task-cancel-1', role: 'file-picker', objective: 'find files' }, { signal: controller.signal });
276
+ expect(res.success).toBe(false);
277
+ expect(res.error).toMatch(/cancelled/i);
278
+ });
279
+ it('should cleanly abort running subagent when signal fires during execution', async () => {
280
+ const controller = new AbortController();
281
+ const mockInvokeTool = vi.fn(async () => {
282
+ controller.abort();
283
+ return new Promise((resolve) => {
284
+ setTimeout(() => resolve({ content: JSON.stringify({ success: true }) }), 50);
285
+ });
286
+ });
287
+ const res = await orchestrator.dispatch({
288
+ id: 'task-cancel-2',
289
+ role: 'editor',
290
+ objective: 'edit file',
291
+ context: { targetFile: 'a.ts', content: 'b' },
292
+ }, { signal: controller.signal, invokeTool: mockInvokeTool });
293
+ expect(res.success).toBe(false);
294
+ expect(res.error).toMatch(/cancelled/i);
295
+ });
296
+ it('should halt pipeline and block downstream tasks when cancelled mid-flight', async () => {
297
+ const controller = new AbortController();
298
+ const mockInvokeTool = vi.fn(async (name) => {
299
+ if (name === 'file-io') {
300
+ // Abort during first task
301
+ controller.abort();
302
+ return { content: JSON.stringify({ success: true }) };
303
+ }
304
+ return { content: '{}' };
305
+ });
306
+ const tasks = [
307
+ {
308
+ id: 'step-1',
309
+ role: 'editor',
310
+ objective: 'edit initial file',
311
+ context: { targetFile: 'file.ts', content: 'hello' },
312
+ },
313
+ {
314
+ id: 'step-2',
315
+ role: 'reviewer',
316
+ objective: 'review changes',
317
+ dependsOn: ['step-1'],
318
+ },
319
+ {
320
+ id: 'step-3',
321
+ role: 'planner',
322
+ objective: 'plan next stage',
323
+ dependsOn: ['step-2'],
324
+ },
325
+ ];
326
+ const results = await orchestrator.runPipeline(tasks, {
327
+ signal: controller.signal,
328
+ invokeTool: mockInvokeTool,
329
+ });
330
+ expect(results).toHaveLength(3);
331
+ // Downstream tasks should not have completed
332
+ expect(results[1].success).toBe(false);
333
+ expect(results[1].error).toMatch(/cancelled|Skipped|blocked/i);
334
+ expect(results[2].success).toBe(false);
335
+ expect(results[2].error).toMatch(/cancelled|Skipped|blocked/i);
336
+ });
337
+ it('should immediately block all pipeline tasks if signal is already aborted', async () => {
338
+ const controller = new AbortController();
339
+ controller.abort();
340
+ const tasks = [
341
+ { id: 'p1', role: 'file-picker', objective: 'find files' },
342
+ { id: 'p2', role: 'planner', objective: 'plan steps', dependsOn: ['p1'] },
343
+ ];
344
+ const results = await orchestrator.runPipeline(tasks, { signal: controller.signal });
345
+ expect(results).toHaveLength(2);
346
+ expect(results[0].success).toBe(false);
347
+ expect(results[0].error).toMatch(/cancelled/i);
348
+ expect(results[1].success).toBe(false);
349
+ expect(results[1].error).toMatch(/cancelled/i);
350
+ });
351
+ });
352
+ });
353
+ //# sourceMappingURL=orchestrator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../../src/__tests__/orchestrator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=planner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/planner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parsePlanSteps, buildTaskNodes } from '../planner.js';
3
+ describe('parsePlanSteps T3.2', () => {
4
+ it('parses a clean JSON plan', () => {
5
+ const steps = parsePlanSteps('[{"id":"T1","title":"Scope","subagent":"file-picker"}]');
6
+ expect(steps).toEqual([{ id: 'T1', title: 'Scope', subagent: 'file-picker' }]);
7
+ });
8
+ it('parses a plan wrapped in prose or a json fence', () => {
9
+ const text = 'Here is the plan:\n```json\n[{"id":"A1","title":"Find files","subagent":"file-picker"},{"id":"A1.1","title":"Edit","subagent":"editor"}]\n```';
10
+ const steps = parsePlanSteps(text);
11
+ expect(steps).toHaveLength(2);
12
+ expect(steps?.[1]).toEqual({ id: 'A1.1', title: 'Edit', subagent: 'editor' });
13
+ });
14
+ it('rejects unknown subagent roles, non-arrays, and garbage', () => {
15
+ expect(parsePlanSteps('[{"id":"T1","title":"x","subagent":"nope"}]')).toBeNull();
16
+ expect(parsePlanSteps('[]')).toBeNull();
17
+ expect(parsePlanSteps('')).toBeNull();
18
+ expect(parsePlanSteps('random chatter without json')).toBeNull();
19
+ });
20
+ it('buildTaskNodes parents every step after the first onto the root id', () => {
21
+ const nodes = buildTaskNodes([
22
+ { id: 'T1', title: 'root', subagent: 'file-picker' },
23
+ { id: 'T1.1', title: 'child', subagent: 'editor' },
24
+ ]);
25
+ expect(nodes[0].parentId).toBeUndefined();
26
+ expect(nodes[1].parentId).toBe('T1');
27
+ });
28
+ });
29
+ //# sourceMappingURL=planner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.test.js","sourceRoot":"","sources":["../../src/__tests__/planner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/D,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,cAAc,CAAC,wDAAwD,CAAC,CAAC;QACvF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,IAAI,GACR,+IAA+I,CAAC;QAClJ,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,cAAc,CAAC,6CAA6C,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjF,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC5E,MAAM,KAAK,GAAG,cAAc,CAAC;YAC3B,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE;YACpD,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;SACnD,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Subagent, SubagentTask, SubagentResult, SubagentContext } from './types.js';
2
+ export declare class BrowserUseSubagent implements Subagent {
3
+ readonly role = "browser-use";
4
+ readonly name = "@BrowserUse";
5
+ readonly description = "Executes end-to-end browser operations and visual verifications";
6
+ run(task: SubagentTask, _cwd: string, ctx?: SubagentContext): Promise<SubagentResult>;
7
+ }
8
+ //# sourceMappingURL=browser-use.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-use.d.ts","sourceRoot":"","sources":["../src/browser-use.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGrF,qBAAa,kBAAmB,YAAW,QAAQ;IACjD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,qEAAqE;IAEnF,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAgC5F"}
@@ -0,0 +1,34 @@
1
+ import { shouldUseAdapter, completeWithAdapter } from './llm.js';
2
+ export class BrowserUseSubagent {
3
+ role = 'browser-use';
4
+ name = '@BrowserUse';
5
+ description = 'Executes end-to-end browser operations and visual verifications';
6
+ async run(task, _cwd, ctx) {
7
+ if (ctx?.signal?.aborted) {
8
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
9
+ }
10
+ const url = task.context?.url;
11
+ if (shouldUseAdapter(ctx)) {
12
+ const system = 'You are @BrowserUse, a browser automation planner. The browser itself must still be driven by the host tooling; your output is a step plan only.';
13
+ try {
14
+ const plan = await completeWithAdapter(ctx, system, `Objective: "${task.objective}". Navigation target: "${url ?? 'about:blank'}". Respond with concise numbered steps.`);
15
+ return {
16
+ success: true,
17
+ output: `@BrowserUse plan for "${url ?? 'about:blank'}":\n${plan}`,
18
+ metadata: { targetUrl: url },
19
+ };
20
+ }
21
+ catch (error) {
22
+ if (ctx.signal?.aborted)
23
+ throw error;
24
+ // fall through to the template readiness notice
25
+ }
26
+ }
27
+ return {
28
+ success: true,
29
+ output: `@BrowserUse ready. Navigation target: "${url ?? 'about:blank'}". Task objective: "${task.objective}".`,
30
+ metadata: { targetUrl: url },
31
+ };
32
+ }
33
+ }
34
+ //# sourceMappingURL=browser-use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-use.js","sourceRoot":"","sources":["../src/browser-use.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,aAAa,CAAC;IACrB,IAAI,GAAG,aAAa,CAAC;IACrB,WAAW,GAAG,iEAAiE,CAAC;IAEzF,KAAK,CAAC,GAAG,CAAC,IAAkB,EAAE,IAAY,EAAE,GAAqB;QAC/D,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,GAAyB,CAAC;QAEpD,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GACV,kJAAkJ,CAAC;YACrJ,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,mBAAmB,CACpC,GAAG,EACH,MAAM,EACN,eAAe,IAAI,CAAC,SAAS,0BAA0B,GAAG,IAAI,aAAa,yCAAyC,CACrH,CAAC;gBACF,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,yBAAyB,GAAG,IAAI,aAAa,OAAO,IAAI,EAAE;oBAClE,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;iBAC7B,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO;oBAAE,MAAM,KAAK,CAAC;gBACrC,gDAAgD;YAClD,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,0CAA0C,GAAG,IAAI,aAAa,uBAAuB,IAAI,CAAC,SAAS,IAAI;YAC/G,QAAQ,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;SAC7B,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { Subagent, SubagentTask, SubagentResult, SubagentContext } from './types.js';
2
+ export declare class EditorSubagent implements Subagent {
3
+ readonly role = "editor";
4
+ readonly name = "@Editor";
5
+ readonly description = "Executes atomic file edits and code modifications with diff preservation";
6
+ run(task: SubagentTask, _cwd: string, ctx?: SubagentContext): Promise<SubagentResult>;
7
+ }
8
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAErF,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,WAAW,8EAA8E;IAE5F,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAwI5F"}
package/dist/editor.js ADDED
@@ -0,0 +1,134 @@
1
+ export class EditorSubagent {
2
+ role = 'editor';
3
+ name = '@Editor';
4
+ description = 'Executes atomic file edits and code modifications with diff preservation';
5
+ async run(task, _cwd, ctx) {
6
+ if (ctx?.signal?.aborted) {
7
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
8
+ }
9
+ const targetFile = task.context?.targetFile;
10
+ const content = task.context?.content;
11
+ if (targetFile === undefined && content === undefined) {
12
+ return {
13
+ success: true,
14
+ output: `@Editor ready. Objective: "${task.objective}". Supply targetFile and content to apply an edit.`,
15
+ };
16
+ }
17
+ if (!targetFile || content === undefined) {
18
+ return { success: false, output: '', error: 'Both targetFile and content are required for an edit.' };
19
+ }
20
+ if (!ctx?.invokeTool) {
21
+ return { success: false, output: '', error: 'Editor writes require the host file-io permission pipeline.' };
22
+ }
23
+ try {
24
+ const result = await ctx.invokeTool('file-io', { action: 'write', path: targetFile, content });
25
+ if (ctx?.signal?.aborted) {
26
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
27
+ }
28
+ if (result.isError)
29
+ return { success: false, output: result.content, error: result.content };
30
+ let write;
31
+ try {
32
+ write = JSON.parse(result.content);
33
+ }
34
+ catch {
35
+ write = { success: true };
36
+ }
37
+ if (write.success !== true) {
38
+ return { success: false, output: result.content, error: write.error ?? 'The host rejected the file write.' };
39
+ }
40
+ // Closed-loop verification step
41
+ const testCommand = (typeof task.context?.testCommand === 'string' && task.context.testCommand) ||
42
+ (typeof task.context?.verifyStep === 'string' && task.context.verifyStep) ||
43
+ (task.context?.verifyStep === true ? 'npm test -- --run' : undefined);
44
+ if (testCommand) {
45
+ if (ctx.signal?.aborted) {
46
+ return {
47
+ success: false,
48
+ output: `@Editor applied file write for "${targetFile}", but execution was cancelled before verification.`,
49
+ artifacts: [targetFile],
50
+ error: 'Subagent cancelled by user',
51
+ };
52
+ }
53
+ const testResult = await ctx.invokeTool('shell-exec', { command: testCommand, timeoutMs: 30_000 });
54
+ if (ctx.signal?.aborted) {
55
+ return {
56
+ success: false,
57
+ output: `@Editor applied file write for "${targetFile}", but execution was cancelled during verification.`,
58
+ artifacts: [targetFile],
59
+ error: 'Subagent cancelled by user',
60
+ };
61
+ }
62
+ if (testResult.isError) {
63
+ return {
64
+ success: false,
65
+ output: `@Editor applied file write for "${targetFile}", but verification failed (${testCommand}):\n${testResult.content}`,
66
+ artifacts: [targetFile],
67
+ error: testResult.content,
68
+ metadata: {
69
+ targetFile,
70
+ verified: false,
71
+ testCommand,
72
+ isError: true,
73
+ },
74
+ };
75
+ }
76
+ let execution;
77
+ try {
78
+ execution = JSON.parse(testResult.content);
79
+ }
80
+ catch {
81
+ execution = { exitCode: 0, stdout: testResult.content };
82
+ }
83
+ const stdout = execution.stdout ?? '';
84
+ const stderr = execution.stderr ?? '';
85
+ if (execution.exitCode !== 0) {
86
+ const errorMsg = (stderr || stdout || `Command exited with code ${execution.exitCode ?? 'unknown'}`).slice(0, 500);
87
+ return {
88
+ success: false,
89
+ output: `@Editor applied file write for "${targetFile}", but verification failed (${testCommand}):\n${errorMsg}`,
90
+ artifacts: [targetFile],
91
+ error: errorMsg,
92
+ metadata: {
93
+ targetFile,
94
+ verified: false,
95
+ testCommand,
96
+ exitCode: execution.exitCode,
97
+ stdout: stdout.slice(0, 500),
98
+ stderr: stderr.slice(0, 500),
99
+ },
100
+ };
101
+ }
102
+ return {
103
+ success: true,
104
+ output: `@Editor applied file write for "${targetFile}" and verification passed (${testCommand}).\n${stdout.slice(0, 500)}`,
105
+ artifacts: [targetFile],
106
+ metadata: {
107
+ targetFile,
108
+ verified: true,
109
+ testCommand,
110
+ exitCode: execution.exitCode,
111
+ stdout: stdout.slice(0, 500),
112
+ },
113
+ };
114
+ }
115
+ return {
116
+ success: true,
117
+ output: `@Editor applied the host-approved file write for "${targetFile}". ${result.content}`,
118
+ artifacts: [targetFile],
119
+ metadata: {
120
+ targetFile,
121
+ verified: false,
122
+ },
123
+ };
124
+ }
125
+ catch (err) {
126
+ return {
127
+ success: false,
128
+ output: '',
129
+ error: err instanceof Error ? err.message : String(err),
130
+ };
131
+ }
132
+ }
133
+ }
134
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,QAAQ,CAAC;IAChB,IAAI,GAAG,SAAS,CAAC;IACjB,WAAW,GAAG,0EAA0E,CAAC;IAElG,KAAK,CAAC,GAAG,CAAC,IAAkB,EAAE,IAAY,EAAE,GAAqB;QAC/D,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;QAC7E,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,UAAgC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAA6B,CAAC;QAE5D,IAAI,UAAU,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACtD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,8BAA8B,IAAI,CAAC,SAAS,oDAAoD;aACzG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,UAAU,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,uDAAuD,EAAE,CAAC;QACxG,CAAC;QACD,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC;YACrB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,6DAA6D,EAAE,CAAC;QAC9G,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/F,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBACzB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,CAAC;YAC7E,CAAC;YACD,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC7F,IAAI,KAA4C,CAAC;YACjD,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAA0C,CAAC;YAC9E,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC5B,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,mCAAmC,EAAE,CAAC;YAC/G,CAAC;YAED,gCAAgC;YAChC,MAAM,WAAW,GACf,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;gBAC3E,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;gBACzE,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAExE,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,mCAAmC,UAAU,qDAAqD;wBAC1G,SAAS,EAAE,CAAC,UAAU,CAAC;wBACvB,KAAK,EAAE,4BAA4B;qBACpC,CAAC;gBACJ,CAAC;gBAED,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBACnG,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,mCAAmC,UAAU,qDAAqD;wBAC1G,SAAS,EAAE,CAAC,UAAU,CAAC;wBACvB,KAAK,EAAE,4BAA4B;qBACpC,CAAC;gBACJ,CAAC;gBAED,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,mCAAmC,UAAU,+BAA+B,WAAW,OAAO,UAAU,CAAC,OAAO,EAAE;wBAC1H,SAAS,EAAE,CAAC,UAAU,CAAC;wBACvB,KAAK,EAAE,UAAU,CAAC,OAAO;wBACzB,QAAQ,EAAE;4BACR,UAAU;4BACV,QAAQ,EAAE,KAAK;4BACf,WAAW;4BACX,OAAO,EAAE,IAAI;yBACd;qBACF,CAAC;gBACJ,CAAC;gBAED,IAAI,SAAkE,CAAC;gBACvE,IAAI,CAAC;oBACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAA4D,CAAC;gBACxG,CAAC;gBAAC,MAAM,CAAC;oBACP,SAAS,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,EAAE,CAAC;gBAC1D,CAAC;gBAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC;gBACtC,IAAI,SAAS,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBAC7B,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,MAAM,IAAI,4BAA4B,SAAS,CAAC,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACnH,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,mCAAmC,UAAU,+BAA+B,WAAW,OAAO,QAAQ,EAAE;wBAChH,SAAS,EAAE,CAAC,UAAU,CAAC;wBACvB,KAAK,EAAE,QAAQ;wBACf,QAAQ,EAAE;4BACR,UAAU;4BACV,QAAQ,EAAE,KAAK;4BACf,WAAW;4BACX,QAAQ,EAAE,SAAS,CAAC,QAAQ;4BAC5B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;4BAC5B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;yBAC7B;qBACF,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,mCAAmC,UAAU,8BAA8B,WAAW,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;oBAC3H,SAAS,EAAE,CAAC,UAAU,CAAC;oBACvB,QAAQ,EAAE;wBACR,UAAU;wBACV,QAAQ,EAAE,IAAI;wBACd,WAAW;wBACX,QAAQ,EAAE,SAAS,CAAC,QAAQ;wBAC5B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;qBAC7B;iBACF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,qDAAqD,UAAU,MAAM,MAAM,CAAC,OAAO,EAAE;gBAC7F,SAAS,EAAE,CAAC,UAAU,CAAC;gBACvB,QAAQ,EAAE;oBACR,UAAU;oBACV,QAAQ,EAAE,KAAK;iBAChB;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAE;gBACV,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}