@signhify/agents 0.0.0-stage → 0.3.2

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/README.md +20 -2
  2. package/dist/__tests__/orchestrator.test.d.ts +2 -0
  3. package/dist/__tests__/orchestrator.test.d.ts.map +1 -0
  4. package/dist/__tests__/orchestrator.test.js +353 -0
  5. package/dist/__tests__/orchestrator.test.js.map +1 -0
  6. package/dist/__tests__/planner.test.d.ts +2 -0
  7. package/dist/__tests__/planner.test.d.ts.map +1 -0
  8. package/dist/__tests__/planner.test.js +29 -0
  9. package/dist/__tests__/planner.test.js.map +1 -0
  10. package/dist/browser-use.d.ts +8 -0
  11. package/dist/browser-use.d.ts.map +1 -0
  12. package/dist/browser-use.js +34 -0
  13. package/dist/browser-use.js.map +1 -0
  14. package/dist/editor.d.ts +8 -0
  15. package/dist/editor.d.ts.map +1 -0
  16. package/dist/editor.js +134 -0
  17. package/dist/editor.js.map +1 -0
  18. package/dist/file-picker.d.ts +8 -0
  19. package/dist/file-picker.d.ts.map +1 -0
  20. package/dist/file-picker.js +64 -0
  21. package/dist/file-picker.js.map +1 -0
  22. package/dist/index.d.ts +8 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +7 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/llm.d.ts +14 -0
  27. package/dist/llm.d.ts.map +1 -0
  28. package/dist/llm.js +34 -0
  29. package/dist/llm.js.map +1 -0
  30. package/dist/orchestrator.d.ts +18 -0
  31. package/dist/orchestrator.d.ts.map +1 -0
  32. package/dist/orchestrator.js +254 -0
  33. package/dist/orchestrator.js.map +1 -0
  34. package/dist/planner.d.ts +26 -0
  35. package/dist/planner.d.ts.map +1 -0
  36. package/dist/planner.js +119 -0
  37. package/dist/planner.js.map +1 -0
  38. package/dist/reviewer.d.ts +10 -0
  39. package/dist/reviewer.d.ts.map +1 -0
  40. package/dist/reviewer.js +164 -0
  41. package/dist/reviewer.js.map +1 -0
  42. package/dist/types.d.ts +56 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +36 -4
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"}
@@ -0,0 +1,8 @@
1
+ import { Subagent, SubagentTask, SubagentResult, SubagentContext } from './types.js';
2
+ export declare class FilePickerSubagent implements Subagent {
3
+ readonly role = "file-picker";
4
+ readonly name = "@FilePicker";
5
+ readonly description = "Explores repository layout and discovers minimal relevant files for a coding task";
6
+ run(task: SubagentTask, cwd: string, ctx?: SubagentContext): Promise<SubagentResult>;
7
+ }
8
+ //# sourceMappingURL=file-picker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-picker.d.ts","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIrF,qBAAa,kBAAmB,YAAW,QAAQ;IACjD,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,QAAQ,CAAC,WAAW,uFAAuF;IAErG,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CA+D3F"}
@@ -0,0 +1,64 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as path from 'node:path';
3
+ export class FilePickerSubagent {
4
+ role = 'file-picker';
5
+ name = '@FilePicker';
6
+ description = 'Explores repository layout and discovers minimal relevant files for a coding task';
7
+ async run(task, cwd, ctx) {
8
+ if (ctx?.signal?.aborted) {
9
+ return { success: false, output: '', error: 'Subagent cancelled by user' };
10
+ }
11
+ const matchedFiles = [];
12
+ const query = (task.objective || '').toLowerCase();
13
+ const keywords = query.split(/\s+/).filter(k => k.length > 2);
14
+ try {
15
+ const walk = async (dir, depth = 0) => {
16
+ if (ctx?.signal?.aborted)
17
+ throw new Error('Subagent cancelled by user');
18
+ if (depth > 4)
19
+ return;
20
+ const entries = await fs.readdir(dir, { withFileTypes: true });
21
+ for (const entry of entries) {
22
+ if (ctx?.signal?.aborted)
23
+ throw new Error('Subagent cancelled by user');
24
+ if (entry.name.startsWith('.') ||
25
+ entry.name === 'node_modules' ||
26
+ entry.name === 'dist' ||
27
+ entry.name === 'coverage') {
28
+ continue;
29
+ }
30
+ const fullPath = path.join(dir, entry.name);
31
+ const relPath = path.relative(cwd, fullPath).replace(/\\/g, '/');
32
+ if (entry.isDirectory()) {
33
+ await walk(fullPath, depth + 1);
34
+ }
35
+ else if (entry.isFile()) {
36
+ const lowerName = entry.name.toLowerCase();
37
+ const lowerPath = relPath.toLowerCase();
38
+ const isRelevant = keywords.some(kw => lowerName.includes(kw) || lowerPath.includes(kw));
39
+ if (isRelevant || matchedFiles.length < 5) {
40
+ matchedFiles.push(relPath);
41
+ }
42
+ }
43
+ }
44
+ };
45
+ await walk(cwd);
46
+ const relevant = matchedFiles.slice(0, 15);
47
+ return {
48
+ success: true,
49
+ output: relevant.length > 0
50
+ ? `Discovered ${relevant.length} relevant file(s):\n${relevant.map(f => `- ${f}`).join('\n')}`
51
+ : 'No specific matching files found in repository.',
52
+ artifacts: relevant,
53
+ };
54
+ }
55
+ catch (err) {
56
+ return {
57
+ success: false,
58
+ output: '',
59
+ error: err instanceof Error ? err.message : String(err),
60
+ };
61
+ }
62
+ }
63
+ }
64
+ //# sourceMappingURL=file-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-picker.js","sourceRoot":"","sources":["../src/file-picker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type { Subagent, SubagentRole, SubagentTask, SubagentResult, SubagentProgressEvent, SubagentContext, TaskPersister, ReviewVerdict, } from './types.js';
2
+ export { FilePickerSubagent } from './file-picker.js';
3
+ export { PlannerSubagent, type PlanStep, buildTaskNodes, parsePlanSteps } from './planner.js';
4
+ export { EditorSubagent } from './editor.js';
5
+ export { ReviewerSubagent, parseReviewVerdict } from './reviewer.js';
6
+ export { BrowserUseSubagent } from './browser-use.js';
7
+ export { SubagentOrchestrator } from './orchestrator.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,aAAa,GACd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { FilePickerSubagent } from './file-picker.js';
2
+ export { PlannerSubagent, buildTaskNodes, parsePlanSteps } from './planner.js';
3
+ export { EditorSubagent } from './editor.js';
4
+ export { ReviewerSubagent, parseReviewVerdict } from './reviewer.js';
5
+ export { BrowserUseSubagent } from './browser-use.js';
6
+ export { SubagentOrchestrator } from './orchestrator.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAiB,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/llm.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { ModelProviderAdapter } from '@signhify/providers';
2
+ import type { SubagentContext } from './types.js';
3
+ /**
4
+ * Real LLM output only when an adapter is wired and the offline path is not
5
+ * forced (SIGNHIFY_MOCK_PROVIDER=1 or a mock adapter).
6
+ */
7
+ export declare function shouldUseAdapter(ctx: SubagentContext | undefined): ctx is Required<Pick<SubagentContext, 'adapter'>> & SubagentContext;
8
+ /** Collect the text of one adapter completion. Tools stay empty: subagents answer, they do not act. */
9
+ export declare function completeWithAdapter(ctx: {
10
+ adapter: ModelProviderAdapter;
11
+ model?: string;
12
+ signal?: AbortSignal;
13
+ }, system: string, user: string): Promise<string>;
14
+ //# sourceMappingURL=llm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,eAAe,GAAG,SAAS,GAC/B,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC,GAAG,eAAe,CAKrE;AAED,uGAAuG;AACvG,wBAAsB,mBAAmB,CACvC,GAAG,EAAE;IAAE,OAAO,EAAE,oBAAoB,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,EAC5E,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAgBjB"}
package/dist/llm.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Real LLM output only when an adapter is wired and the offline path is not
3
+ * forced (SIGNHIFY_MOCK_PROVIDER=1 or a mock adapter).
4
+ */
5
+ export function shouldUseAdapter(ctx) {
6
+ if (!ctx?.adapter)
7
+ return false;
8
+ if (process.env.SIGNHIFY_MOCK_PROVIDER === '1')
9
+ return false;
10
+ if (ctx.adapter.vendor === 'mock')
11
+ return false;
12
+ return true;
13
+ }
14
+ /** Collect the text of one adapter completion. Tools stay empty: subagents answer, they do not act. */
15
+ export async function completeWithAdapter(ctx, system, user) {
16
+ let out = '';
17
+ for await (const chunk of ctx.adapter.streamChat({
18
+ messages: [
19
+ { role: 'system', content: system },
20
+ { role: 'user', content: user },
21
+ ],
22
+ tools: [],
23
+ model: ctx.model ?? 'default',
24
+ maxTokens: 1024,
25
+ abortSignal: ctx.signal,
26
+ })) {
27
+ if (chunk.type === 'text' && chunk.content)
28
+ out += chunk.content;
29
+ }
30
+ if (ctx.signal?.aborted)
31
+ throw new Error('Subagent cancelled by user');
32
+ return out.trim();
33
+ }
34
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAgC;IAEhC,IAAI,CAAC,GAAG,EAAE,OAAO;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC7D,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAA4E,EAC5E,MAAc,EACd,IAAY;IAEZ,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;QAC/C,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;YACnC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;SAChC;QACD,KAAK,EAAE,EAAE;QACT,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,SAAS;QAC7B,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,GAAG,CAAC,MAAM;KACxB,CAAC,EAAE,CAAC;QACH,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO;YAAE,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC;IACnE,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,EAAE,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACvE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Subagent, SubagentRole, SubagentTask, SubagentResult, SubagentContext } from './types.js';
2
+ export declare class SubagentOrchestrator {
3
+ private registry;
4
+ private workingDirectory;
5
+ private ctx;
6
+ /** Wire an adapter/model and (optionally) the task-tree store at construction. */
7
+ constructor(workingDirectory: string, options?: SubagentContext);
8
+ registerSubagent(agent: Subagent): void;
9
+ getSubagent(role: SubagentRole): Subagent | undefined;
10
+ listSubagents(): Array<{
11
+ role: SubagentRole;
12
+ name: string;
13
+ description: string;
14
+ }>;
15
+ dispatch(task: SubagentTask, context?: Partial<SubagentContext>): Promise<SubagentResult>;
16
+ runPipeline(tasks: SubagentTask[], context?: Partial<SubagentContext>): Promise<SubagentResult[]>;
17
+ }
18
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAYnG,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,GAAG,CAAkB;IAE7B,kFAAkF;gBACtE,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe;IAU/D,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAIvC,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS;IAIrD,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ3E,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;IAwEzF,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CA4JxG"}
@@ -0,0 +1,254 @@
1
+ import { FilePickerSubagent } from './file-picker.js';
2
+ import { PlannerSubagent } from './planner.js';
3
+ import { EditorSubagent } from './editor.js';
4
+ import { ReviewerSubagent } from './reviewer.js';
5
+ import { BrowserUseSubagent } from './browser-use.js';
6
+ const parallelRoles = new Set(['file-picker', 'browser-use']);
7
+ let pipelineSequence = 0;
8
+ export class SubagentOrchestrator {
9
+ registry = new Map();
10
+ workingDirectory;
11
+ ctx;
12
+ /** Wire an adapter/model and (optionally) the task-tree store at construction. */
13
+ constructor(workingDirectory, options) {
14
+ this.workingDirectory = workingDirectory;
15
+ this.ctx = options ?? {};
16
+ this.registerSubagent(new FilePickerSubagent());
17
+ this.registerSubagent(new PlannerSubagent());
18
+ this.registerSubagent(new EditorSubagent());
19
+ this.registerSubagent(new ReviewerSubagent());
20
+ this.registerSubagent(new BrowserUseSubagent());
21
+ }
22
+ registerSubagent(agent) {
23
+ this.registry.set(agent.role, agent);
24
+ }
25
+ getSubagent(role) {
26
+ return this.registry.get(role);
27
+ }
28
+ listSubagents() {
29
+ return Array.from(this.registry.values()).map(a => ({
30
+ role: a.role,
31
+ name: a.name,
32
+ description: a.description,
33
+ }));
34
+ }
35
+ async dispatch(task, context) {
36
+ const signal = context?.signal ?? this.ctx.signal;
37
+ if (signal?.aborted) {
38
+ return {
39
+ success: false,
40
+ output: '',
41
+ error: 'Subagent execution cancelled',
42
+ };
43
+ }
44
+ const agent = this.registry.get(task.role);
45
+ if (!agent) {
46
+ return {
47
+ success: false,
48
+ output: '',
49
+ error: `No subagent registered for role: "${task.role}". Available: ${Array.from(this.registry.keys()).join(', ')}`,
50
+ };
51
+ }
52
+ const runContext = {
53
+ ...this.ctx,
54
+ ...context,
55
+ signal,
56
+ };
57
+ if (!signal) {
58
+ return agent.run(task, this.workingDirectory, runContext);
59
+ }
60
+ const runPromise = agent.run(task, this.workingDirectory, runContext);
61
+ return new Promise((resolve, reject) => {
62
+ const onAbort = () => {
63
+ cleanup();
64
+ resolve({
65
+ success: false,
66
+ output: '',
67
+ error: 'Subagent execution cancelled',
68
+ });
69
+ };
70
+ const cleanup = () => {
71
+ signal.removeEventListener('abort', onAbort);
72
+ };
73
+ signal.addEventListener('abort', onAbort, { once: true });
74
+ runPromise
75
+ .then((res) => {
76
+ cleanup();
77
+ if (signal.aborted) {
78
+ resolve({
79
+ success: false,
80
+ output: '',
81
+ error: 'Subagent execution cancelled',
82
+ });
83
+ }
84
+ else {
85
+ resolve(res);
86
+ }
87
+ })
88
+ .catch((err) => {
89
+ cleanup();
90
+ if (signal.aborted) {
91
+ resolve({
92
+ success: false,
93
+ output: '',
94
+ error: 'Subagent execution cancelled',
95
+ });
96
+ }
97
+ else {
98
+ reject(err);
99
+ }
100
+ });
101
+ });
102
+ }
103
+ async runPipeline(tasks, context) {
104
+ const runContext = { ...context, signal: context?.signal ?? this.ctx.signal };
105
+ const signal = runContext.signal;
106
+ const ids = new Set();
107
+ for (const task of tasks) {
108
+ if (!task.id.trim() || ids.has(task.id)) {
109
+ return [{ success: false, output: '', error: `Pipeline task ids must be unique and non-empty: "${task.id}"` }];
110
+ }
111
+ ids.add(task.id);
112
+ }
113
+ for (const task of tasks) {
114
+ const dependencies = task.dependsOn ?? [];
115
+ const unknown = dependencies.find((id) => !ids.has(id));
116
+ if (unknown) {
117
+ return [{ success: false, output: '', error: `Task "${task.id}" depends on unknown task "${unknown}"` }];
118
+ }
119
+ if (dependencies.includes(task.id)) {
120
+ return [{ success: false, output: '', error: `Task "${task.id}" cannot depend on itself` }];
121
+ }
122
+ }
123
+ const runId = `pipeline_${Date.now()}_${++pipelineSequence}`;
124
+ const states = new Map();
125
+ for (const task of tasks)
126
+ states.set(task.id, 'pending');
127
+ const results = new Map();
128
+ const emit = (task, status, message) => {
129
+ const event = {
130
+ type: status === 'failed' || status === 'blocked' ? 'error' : status === 'done' ? 'done' : 'status',
131
+ message,
132
+ data: { taskId: task.id, role: task.role, status },
133
+ };
134
+ try {
135
+ this.ctx.onProgress?.(event);
136
+ }
137
+ catch {
138
+ // UI/log observers must not interrupt task execution.
139
+ }
140
+ };
141
+ const persist = (task, status, message) => {
142
+ this.ctx.memory?.saveTask({
143
+ id: `${runId}.${task.id}`,
144
+ parentId: task.parentId ? `${runId}.${task.parentId}` : null,
145
+ title: `@${task.role}: ${task.objective}`,
146
+ status,
147
+ progressLog: message,
148
+ });
149
+ };
150
+ for (const task of tasks) {
151
+ persist(task, 'pending', 'Waiting for dependencies.');
152
+ }
153
+ if (signal?.aborted) {
154
+ for (const task of tasks) {
155
+ states.set(task.id, 'blocked');
156
+ const res = { success: false, output: '', error: 'Pipeline cancelled before start' };
157
+ results.set(task.id, res);
158
+ persist(task, 'blocked', res.error);
159
+ emit(task, 'blocked', `${task.id} cancelled before start`);
160
+ }
161
+ return tasks.map((task) => ({
162
+ ...results.get(task.id),
163
+ metadata: { taskId: task.id, role: task.role, status: 'blocked' },
164
+ }));
165
+ }
166
+ while ([...states.values()].some((status) => status === 'pending') && !signal?.aborted) {
167
+ for (const task of tasks) {
168
+ if (states.get(task.id) !== 'pending')
169
+ continue;
170
+ const dependencies = task.dependsOn ?? [];
171
+ const failed = dependencies.find((id) => ['failed', 'blocked'].includes(states.get(id) ?? ''));
172
+ if (failed) {
173
+ const result = { success: false, output: '', error: `Skipped because dependency "${failed}" did not complete.` };
174
+ states.set(task.id, 'blocked');
175
+ results.set(task.id, result);
176
+ persist(task, 'blocked', result.error);
177
+ emit(task, 'blocked', `${task.id} blocked by ${failed}`);
178
+ }
179
+ }
180
+ if (signal?.aborted)
181
+ break;
182
+ const ready = tasks.filter((task) => states.get(task.id) === 'pending' &&
183
+ (task.dependsOn ?? []).every((id) => states.get(id) === 'done'));
184
+ if (ready.length === 0) {
185
+ if ([...states.values()].some((status) => status === 'pending')) {
186
+ for (const task of tasks) {
187
+ if (states.get(task.id) !== 'pending')
188
+ continue;
189
+ const result = { success: false, output: '', error: 'Blocked by a dependency cycle or unresolved dependency.' };
190
+ states.set(task.id, 'blocked');
191
+ results.set(task.id, result);
192
+ persist(task, 'blocked', result.error);
193
+ emit(task, 'blocked', `${task.id} blocked by unresolved dependencies`);
194
+ }
195
+ }
196
+ break;
197
+ }
198
+ if (signal?.aborted)
199
+ break;
200
+ const first = ready[0];
201
+ const batch = parallelRoles.has(first.role) && first.dependsOn !== undefined
202
+ ? ready.filter((task) => parallelRoles.has(task.role) && task.dependsOn !== undefined).slice(0, 2)
203
+ : [first];
204
+ await Promise.all(batch.map(async (task) => {
205
+ states.set(task.id, 'running');
206
+ persist(task, 'in_progress', 'Subagent started.');
207
+ emit(task, 'in_progress', `${task.id} started @${task.role}`);
208
+ let result;
209
+ try {
210
+ result = await this.dispatch(task, runContext);
211
+ }
212
+ catch (error) {
213
+ result = { success: false, output: '', error: error instanceof Error ? error.message : String(error) };
214
+ }
215
+ const status = signal?.aborted ? 'blocked' : result.success ? 'done' : 'failed';
216
+ if (signal?.aborted && result.success) {
217
+ result = { ...result, success: false, error: 'Subagent execution cancelled' };
218
+ }
219
+ states.set(task.id, status);
220
+ results.set(task.id, result);
221
+ persist(task, status === 'done' ? 'done' : 'blocked', result.success ? 'Subagent completed.' : result.error ?? 'Subagent failed.');
222
+ emit(task, status, result.success ? `${task.id} completed @${task.role}` : `${task.id} ${status} @${task.role}: ${result.error ?? 'unknown error'}`);
223
+ }));
224
+ }
225
+ if (signal?.aborted) {
226
+ for (const task of tasks) {
227
+ if (states.get(task.id) === 'pending') {
228
+ const result = { success: false, output: '', error: 'Cancelled before this task started.' };
229
+ states.set(task.id, 'blocked');
230
+ results.set(task.id, result);
231
+ persist(task, 'blocked', result.error);
232
+ emit(task, 'blocked', `${task.id} cancelled before start`);
233
+ }
234
+ }
235
+ }
236
+ return tasks.map((task) => {
237
+ const result = results.get(task.id) ?? {
238
+ success: false,
239
+ output: '',
240
+ error: `Task "${task.id}" did not produce a result.`,
241
+ };
242
+ return {
243
+ ...result,
244
+ metadata: {
245
+ ...result.metadata,
246
+ taskId: task.id,
247
+ role: task.role,
248
+ status: states.get(task.id) ?? 'blocked',
249
+ },
250
+ };
251
+ });
252
+ }
253
+ }
254
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Subagent, SubagentTask, SubagentResult, SubagentContext } from './types.js';
2
+ import type { TaskNode } from '@signhify/core';
3
+ export interface PlanStep {
4
+ id: string;
5
+ title: string;
6
+ subagent: 'file-picker' | 'editor' | 'reviewer' | 'browser-use';
7
+ }
8
+ /**
9
+ * Parse a model plan out of its reply: a JSON array under a [plan] or ```json
10
+ * fence, or anywhere in the text. Returns null when nothing usable is there —
11
+ * the caller then falls back to the template roadmap.
12
+ */
13
+ export declare function parsePlanSteps(text: string): PlanStep[] | null;
14
+ /**
15
+ * TaskNode[] mirroring the plan: first step is the root, the rest become its
16
+ * children — this is the `T1 → T1.n` tree the sidebar and TaskManager read.
17
+ */
18
+ export declare function buildTaskNodes(steps: PlanStep[]): TaskNode[];
19
+ export declare class PlannerSubagent implements Subagent {
20
+ readonly role = "planner";
21
+ readonly name = "@Planner";
22
+ readonly description = "Formulates hierarchical task roadmaps and assigns specialized subagents";
23
+ run(task: SubagentTask, _cwd: string, ctx?: SubagentContext): Promise<SubagentResult>;
24
+ templateSteps(objective: string): PlanStep[];
25
+ }
26
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../src/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,aAAa,CAAC;CACjE;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI,CAmB9D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,EAAE,CAS5D;AAED,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,IAAI,cAAc;IAC3B,QAAQ,CAAC,WAAW,6EAA6E;IAE3F,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAmD3F,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE;CAmB7C"}