funolio-agent 0.1.0

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 (138) hide show
  1. package/README.md +55 -0
  2. package/dist/clerk/index.d.ts +62 -0
  3. package/dist/clerk/index.d.ts.map +1 -0
  4. package/dist/clerk/index.js +186 -0
  5. package/dist/clerk/index.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +42 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/configure.d.ts +2 -0
  11. package/dist/commands/configure.d.ts.map +1 -0
  12. package/dist/commands/configure.js +252 -0
  13. package/dist/commands/configure.js.map +1 -0
  14. package/dist/commands/init.d.ts +6 -0
  15. package/dist/commands/init.d.ts.map +1 -0
  16. package/dist/commands/init.js +151 -0
  17. package/dist/commands/init.js.map +1 -0
  18. package/dist/commands/login.d.ts +6 -0
  19. package/dist/commands/login.d.ts.map +1 -0
  20. package/dist/commands/login.js +170 -0
  21. package/dist/commands/login.js.map +1 -0
  22. package/dist/commands/start.d.ts +8 -0
  23. package/dist/commands/start.d.ts.map +1 -0
  24. package/dist/commands/start.js +179 -0
  25. package/dist/commands/start.js.map +1 -0
  26. package/dist/commands/status.d.ts +2 -0
  27. package/dist/commands/status.d.ts.map +1 -0
  28. package/dist/commands/status.js +55 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/config.d.ts +46 -0
  31. package/dist/config.d.ts.map +1 -0
  32. package/dist/config.js +113 -0
  33. package/dist/config.js.map +1 -0
  34. package/dist/index.d.ts +24 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +48 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp/index.d.ts +9 -0
  39. package/dist/mcp/index.d.ts.map +1 -0
  40. package/dist/mcp/index.js +15 -0
  41. package/dist/mcp/index.js.map +1 -0
  42. package/dist/mcp/manager.d.ts +83 -0
  43. package/dist/mcp/manager.d.ts.map +1 -0
  44. package/dist/mcp/manager.js +338 -0
  45. package/dist/mcp/manager.js.map +1 -0
  46. package/dist/mcp/registry.d.ts +32 -0
  47. package/dist/mcp/registry.d.ts.map +1 -0
  48. package/dist/mcp/registry.js +139 -0
  49. package/dist/mcp/registry.js.map +1 -0
  50. package/dist/message-loop.d.ts +18 -0
  51. package/dist/message-loop.d.ts.map +1 -0
  52. package/dist/message-loop.js +165 -0
  53. package/dist/message-loop.js.map +1 -0
  54. package/dist/mqtt-client.d.ts +67 -0
  55. package/dist/mqtt-client.d.ts.map +1 -0
  56. package/dist/mqtt-client.js +148 -0
  57. package/dist/mqtt-client.js.map +1 -0
  58. package/dist/providers/anthropic.d.ts +10 -0
  59. package/dist/providers/anthropic.d.ts.map +1 -0
  60. package/dist/providers/anthropic.js +183 -0
  61. package/dist/providers/anthropic.js.map +1 -0
  62. package/dist/providers/google.d.ts +10 -0
  63. package/dist/providers/google.d.ts.map +1 -0
  64. package/dist/providers/google.js +161 -0
  65. package/dist/providers/google.js.map +1 -0
  66. package/dist/providers/index.d.ts +42 -0
  67. package/dist/providers/index.d.ts.map +1 -0
  68. package/dist/providers/index.js +19 -0
  69. package/dist/providers/index.js.map +1 -0
  70. package/dist/providers/openai.d.ts +10 -0
  71. package/dist/providers/openai.d.ts.map +1 -0
  72. package/dist/providers/openai.js +173 -0
  73. package/dist/providers/openai.js.map +1 -0
  74. package/dist/providers/retry.d.ts +6 -0
  75. package/dist/providers/retry.d.ts.map +1 -0
  76. package/dist/providers/retry.js +38 -0
  77. package/dist/providers/retry.js.map +1 -0
  78. package/dist/subagent/index.d.ts +8 -0
  79. package/dist/subagent/index.d.ts.map +1 -0
  80. package/dist/subagent/index.js +14 -0
  81. package/dist/subagent/index.js.map +1 -0
  82. package/dist/subagent/orchestrator.d.ts +67 -0
  83. package/dist/subagent/orchestrator.d.ts.map +1 -0
  84. package/dist/subagent/orchestrator.js +152 -0
  85. package/dist/subagent/orchestrator.js.map +1 -0
  86. package/dist/subagent/queue.d.ts +66 -0
  87. package/dist/subagent/queue.d.ts.map +1 -0
  88. package/dist/subagent/queue.js +298 -0
  89. package/dist/subagent/queue.js.map +1 -0
  90. package/dist/subagent/types.d.ts +76 -0
  91. package/dist/subagent/types.d.ts.map +1 -0
  92. package/dist/subagent/types.js +14 -0
  93. package/dist/subagent/types.js.map +1 -0
  94. package/dist/tools/edit-file.d.ts +3 -0
  95. package/dist/tools/edit-file.d.ts.map +1 -0
  96. package/dist/tools/edit-file.js +112 -0
  97. package/dist/tools/edit-file.js.map +1 -0
  98. package/dist/tools/git-tools.d.ts +5 -0
  99. package/dist/tools/git-tools.d.ts.map +1 -0
  100. package/dist/tools/git-tools.js +144 -0
  101. package/dist/tools/git-tools.js.map +1 -0
  102. package/dist/tools/index.d.ts +40 -0
  103. package/dist/tools/index.d.ts.map +1 -0
  104. package/dist/tools/index.js +126 -0
  105. package/dist/tools/index.js.map +1 -0
  106. package/dist/tools/installer.d.ts +41 -0
  107. package/dist/tools/installer.d.ts.map +1 -0
  108. package/dist/tools/installer.js +227 -0
  109. package/dist/tools/installer.js.map +1 -0
  110. package/dist/tools/list-directory.d.ts +3 -0
  111. package/dist/tools/list-directory.d.ts.map +1 -0
  112. package/dist/tools/list-directory.js +107 -0
  113. package/dist/tools/list-directory.js.map +1 -0
  114. package/dist/tools/read-file.d.ts +3 -0
  115. package/dist/tools/read-file.d.ts.map +1 -0
  116. package/dist/tools/read-file.js +89 -0
  117. package/dist/tools/read-file.js.map +1 -0
  118. package/dist/tools/run-command.d.ts +3 -0
  119. package/dist/tools/run-command.d.ts.map +1 -0
  120. package/dist/tools/run-command.js +86 -0
  121. package/dist/tools/run-command.js.map +1 -0
  122. package/dist/tools/sandbox.d.ts +17 -0
  123. package/dist/tools/sandbox.d.ts.map +1 -0
  124. package/dist/tools/sandbox.js +78 -0
  125. package/dist/tools/sandbox.js.map +1 -0
  126. package/dist/tools/write-file.d.ts +3 -0
  127. package/dist/tools/write-file.d.ts.map +1 -0
  128. package/dist/tools/write-file.js +88 -0
  129. package/dist/tools/write-file.js.map +1 -0
  130. package/dist/types.d.ts +67 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +6 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/verification/index.d.ts +17 -0
  135. package/dist/verification/index.d.ts.map +1 -0
  136. package/dist/verification/index.js +224 -0
  137. package/dist/verification/index.js.map +1 -0
  138. package/package.json +41 -0
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 3K: Sub-Agent Orchestrator
4
+ * Coordinates sub-agent spawning, dependency resolution, and result merging.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SubAgentOrchestrator = void 0;
8
+ const events_1 = require("events");
9
+ const queue_1 = require("./queue");
10
+ /**
11
+ * SubAgentOrchestrator takes decomposed checkpoints and runs them
12
+ * as parallel sub-agents with dependency tracking.
13
+ */
14
+ class SubAgentOrchestrator extends events_1.EventEmitter {
15
+ queue;
16
+ config;
17
+ parentTaskId = '';
18
+ constructor(config) {
19
+ super();
20
+ this.config = config;
21
+ this.queue = new queue_1.SubAgentQueue(config.userId, config.tier, config.redisUrl);
22
+ // Forward queue events
23
+ this.queue.on('task-started', (task) => this.emit('subtask-started', task));
24
+ this.queue.on('task-completed', (task, result) => this.emit('subtask-completed', task, result));
25
+ this.queue.on('task-failed', (task, error) => this.emit('subtask-failed', task, error));
26
+ this.queue.on('all-complete', (results) => this.emit('all-complete', results));
27
+ this.queue.on('task-ready', (task) => this.handleTaskReady(task));
28
+ }
29
+ /**
30
+ * Initialize the orchestrator and underlying queue.
31
+ */
32
+ async initialize() {
33
+ await this.queue.initialize();
34
+ }
35
+ /**
36
+ * Execute a set of decomposed steps as sub-agents.
37
+ * Identifies parallelizable steps and manages dependencies.
38
+ */
39
+ async executeSteps(parentTaskId, steps) {
40
+ this.parentTaskId = parentTaskId;
41
+ // Analyze which steps can run in parallel
42
+ const { parallel, sequential } = this.analyzeParallelism(steps);
43
+ console.log(`[SubAgent] Decomposed into ${steps.length} steps: ${parallel.length} parallel, ${sequential.length} sequential`);
44
+ // Create SubAgentTask for each step
45
+ const subTasks = steps.map((step, index) => ({
46
+ id: `${parentTaskId}-sub-${index}`,
47
+ parentTaskId,
48
+ checkpointIndex: index,
49
+ prompt: step.prompt,
50
+ status: 'pending',
51
+ dependsOn: (step.dependsOn || []).map((depIdx) => `${parentTaskId}-sub-${depIdx}`),
52
+ tokenBudget: 4000, // default per sub-task
53
+ createdAt: Date.now(),
54
+ }));
55
+ // Submit to queue
56
+ const jobDataTemplate = {
57
+ userId: this.config.userId,
58
+ projectId: this.config.projectId,
59
+ llmConfig: this.config.llmConfig,
60
+ parentContext: {
61
+ projectDir: this.config.projectDir,
62
+ facts: this.config.facts,
63
+ files: this.config.files,
64
+ },
65
+ };
66
+ await this.queue.submitTasks(subTasks, jobDataTemplate);
67
+ return subTasks;
68
+ }
69
+ /**
70
+ * Analyze steps to identify which can run in parallel.
71
+ */
72
+ analyzeParallelism(steps) {
73
+ const parallel = [];
74
+ const sequential = [];
75
+ for (let i = 0; i < steps.length; i++) {
76
+ if (!steps[i].dependsOn || steps[i].dependsOn.length === 0) {
77
+ parallel.push(i);
78
+ }
79
+ else {
80
+ sequential.push(i);
81
+ }
82
+ }
83
+ return { parallel, sequential };
84
+ }
85
+ /** Handle when a dependent task becomes ready */
86
+ async handleTaskReady(task) {
87
+ // Re-submit just this task
88
+ const jobData = {
89
+ subTask: task,
90
+ userId: this.config.userId,
91
+ projectId: this.config.projectId,
92
+ llmConfig: this.config.llmConfig,
93
+ parentContext: {
94
+ projectDir: this.config.projectDir,
95
+ facts: this.config.facts,
96
+ files: this.config.files,
97
+ },
98
+ };
99
+ // The queue will handle enqueuing
100
+ task.status = 'waiting';
101
+ this.emit('subtask-enqueued', task);
102
+ }
103
+ /**
104
+ * Merge results from all sub-agents into a single summary.
105
+ */
106
+ mergeResults() {
107
+ const tasks = this.queue.getTaskStatuses();
108
+ const completed = tasks.filter((t) => t.status === 'completed');
109
+ const failed = tasks.filter((t) => t.status === 'failed');
110
+ let summary = `## Sub-Agent Results\n\n`;
111
+ summary += `**${completed.length}/${tasks.length}** sub-tasks completed`;
112
+ if (failed.length > 0) {
113
+ summary += ` (${failed.length} failed)`;
114
+ }
115
+ summary += '\n\n';
116
+ for (const task of tasks) {
117
+ const icon = task.status === 'completed' ? '✅' : task.status === 'failed' ? '❌' : '⏳';
118
+ summary += `${icon} **Step ${task.checkpointIndex + 1}:** ${task.prompt.slice(0, 100)}\n`;
119
+ if (task.result) {
120
+ summary += ` Result: ${task.result.slice(0, 200)}\n`;
121
+ }
122
+ if (task.error) {
123
+ summary += ` Error: ${task.error}\n`;
124
+ }
125
+ summary += '\n';
126
+ }
127
+ return summary;
128
+ }
129
+ /** Get dependency graph for UI visualization */
130
+ getDependencyGraph() {
131
+ return this.queue.buildDependencyGraph();
132
+ }
133
+ /** Get all task statuses */
134
+ getStatuses() {
135
+ return this.queue.getTaskStatuses();
136
+ }
137
+ /** Cancel all running sub-agents */
138
+ async cancelAll() {
139
+ const tasks = this.queue.getTaskStatuses();
140
+ for (const task of tasks) {
141
+ if (task.status === 'pending' || task.status === 'waiting' || task.status === 'running') {
142
+ await this.queue.cancelTask(task.id);
143
+ }
144
+ }
145
+ }
146
+ /** Shutdown */
147
+ async shutdown() {
148
+ await this.queue.shutdown();
149
+ }
150
+ }
151
+ exports.SubAgentOrchestrator = SubAgentOrchestrator;
152
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/subagent/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Phase 3K: Sub-Agent Queue
3
+ * BullMQ queue setup for sub-agent job processing on Upstash Redis.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { SubAgentTask, SubAgentJobData, CheckpointWithDependencies } from './types';
7
+ /**
8
+ * SubAgentQueue manages the lifecycle of sub-agent tasks.
9
+ *
10
+ * In production, this uses BullMQ with Upstash Redis.
11
+ * The queue is created per-user to enforce tier-based concurrency.
12
+ *
13
+ * Note: BullMQ dependency (bullmq package) is optional —
14
+ * when not available, falls back to in-process execution.
15
+ */
16
+ export declare class SubAgentQueue extends EventEmitter {
17
+ private userId;
18
+ private tier;
19
+ private tasks;
20
+ private queue;
21
+ private worker;
22
+ private redisUrl;
23
+ constructor(userId: string, tier?: string, redisUrl?: string);
24
+ /** Get concurrency limit for user's tier */
25
+ get concurrencyLimit(): number;
26
+ /**
27
+ * Initialize BullMQ queue and worker.
28
+ * Falls back to in-process if BullMQ/Redis not available.
29
+ */
30
+ initialize(): Promise<void>;
31
+ /**
32
+ * Submit sub-agent tasks for a parent task.
33
+ * Respects dependency ordering — only enqueues tasks whose dependencies are met.
34
+ */
35
+ submitTasks(tasks: SubAgentTask[], jobDataTemplate: Omit<SubAgentJobData, 'subTask'>): Promise<void>;
36
+ /**
37
+ * Enqueue tasks whose dependencies are all satisfied.
38
+ */
39
+ private enqueueReadyTasks;
40
+ /**
41
+ * Process a sub-agent job — this runs in the BullMQ worker.
42
+ * Each sub-agent gets its own LLM conversation context.
43
+ */
44
+ private processJob;
45
+ /** In-process fallback when BullMQ is not available */
46
+ private processJobInProcess;
47
+ /** Handle successful job completion */
48
+ private handleJobComplete;
49
+ /** Handle failed job */
50
+ private handleJobFailed;
51
+ /** Check if completed task unlocks dependents */
52
+ private checkAndEnqueueDependents;
53
+ /** Check if all tasks in the batch are complete */
54
+ private checkAllComplete;
55
+ /** Get current status of all tasks */
56
+ getTaskStatuses(): SubAgentTask[];
57
+ /** Cancel a specific task */
58
+ cancelTask(taskId: string): Promise<void>;
59
+ /** Build dependency graph for UI visualization */
60
+ buildDependencyGraph(): CheckpointWithDependencies[];
61
+ /** Parse Redis URL to BullMQ connection options */
62
+ private parseRedisConnection;
63
+ /** Shutdown queue and worker */
64
+ shutdown(): Promise<void>;
65
+ }
66
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/subagent/queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,YAAY,EACZ,eAAe,EAIf,0BAA0B,EAC3B,MAAM,SAAS,CAAC;AAEjB;;;;;;;;GAQG;AACH,qBAAa,aAAc,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,KAAK,CAAwC;IACrD,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAe,EAAE,QAAQ,CAAC,EAAE,MAAM;IAOpE,4CAA4C;IAC5C,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA2CjC;;;OAGG;IACG,WAAW,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAS1G;;OAEG;YACW,iBAAiB;IA2B/B;;;OAGG;YACW,UAAU;IA+CxB,uDAAuD;YACzC,mBAAmB;IASjC,uCAAuC;IACvC,OAAO,CAAC,iBAAiB;IAgBzB,wBAAwB;IACxB,OAAO,CAAC,eAAe;IAWvB,iDAAiD;IACjD,OAAO,CAAC,yBAAyB;IAiBjC,mDAAmD;IACnD,OAAO,CAAC,gBAAgB;IAUxB,sCAAsC;IACtC,eAAe,IAAI,YAAY,EAAE;IAIjC,6BAA6B;IACvB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/C,kDAAkD;IAClD,oBAAoB,IAAI,0BAA0B,EAAE;IAgBpD,mDAAmD;IACnD,OAAO,CAAC,oBAAoB;IAW5B,gCAAgC;IAC1B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAKhC"}
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 3K: Sub-Agent Queue
4
+ * BullMQ queue setup for sub-agent job processing on Upstash Redis.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.SubAgentQueue = void 0;
41
+ const events_1 = require("events");
42
+ const types_1 = require("./types");
43
+ /**
44
+ * SubAgentQueue manages the lifecycle of sub-agent tasks.
45
+ *
46
+ * In production, this uses BullMQ with Upstash Redis.
47
+ * The queue is created per-user to enforce tier-based concurrency.
48
+ *
49
+ * Note: BullMQ dependency (bullmq package) is optional —
50
+ * when not available, falls back to in-process execution.
51
+ */
52
+ class SubAgentQueue extends events_1.EventEmitter {
53
+ userId;
54
+ tier;
55
+ tasks = new Map();
56
+ queue = null; // BullMQ Queue instance
57
+ worker = null; // BullMQ Worker instance
58
+ redisUrl;
59
+ constructor(userId, tier = 'free', redisUrl) {
60
+ super();
61
+ this.userId = userId;
62
+ this.tier = tier;
63
+ this.redisUrl = redisUrl || process.env.UPSTASH_REDIS_URL || null;
64
+ }
65
+ /** Get concurrency limit for user's tier */
66
+ get concurrencyLimit() {
67
+ return types_1.TIER_CONCURRENCY[this.tier] || 1;
68
+ }
69
+ /**
70
+ * Initialize BullMQ queue and worker.
71
+ * Falls back to in-process if BullMQ/Redis not available.
72
+ */
73
+ async initialize() {
74
+ if (!this.redisUrl) {
75
+ console.log('[SubAgent] No Redis URL — using in-process execution');
76
+ return;
77
+ }
78
+ try {
79
+ // Dynamic import to keep bullmq optional
80
+ // @ts-ignore — bullmq is an optional peer dependency
81
+ const { Queue, Worker } = await Promise.resolve(`${'bullmq'}`).then(s => __importStar(require(s)));
82
+ const connection = this.parseRedisConnection(this.redisUrl);
83
+ this.queue = new Queue(`subagent:${this.userId}`, { connection });
84
+ this.worker = new Worker(`subagent:${this.userId}`, async (job) => {
85
+ return this.processJob(job.data);
86
+ }, {
87
+ connection,
88
+ concurrency: this.concurrencyLimit,
89
+ });
90
+ this.worker.on('completed', (job, result) => {
91
+ this.handleJobComplete(result);
92
+ });
93
+ this.worker.on('failed', (job, err) => {
94
+ const subTaskId = job?.data?.subTask?.id;
95
+ if (subTaskId) {
96
+ this.handleJobFailed(subTaskId, err.message);
97
+ }
98
+ });
99
+ console.log(`[SubAgent] Queue initialized for user ${this.userId} (tier: ${this.tier}, concurrency: ${this.concurrencyLimit})`);
100
+ }
101
+ catch (err) {
102
+ console.log(`[SubAgent] BullMQ not available, using in-process: ${err.message}`);
103
+ }
104
+ }
105
+ /**
106
+ * Submit sub-agent tasks for a parent task.
107
+ * Respects dependency ordering — only enqueues tasks whose dependencies are met.
108
+ */
109
+ async submitTasks(tasks, jobDataTemplate) {
110
+ for (const task of tasks) {
111
+ this.tasks.set(task.id, task);
112
+ }
113
+ // Enqueue tasks with no dependencies (or all deps already completed)
114
+ await this.enqueueReadyTasks(jobDataTemplate);
115
+ }
116
+ /**
117
+ * Enqueue tasks whose dependencies are all satisfied.
118
+ */
119
+ async enqueueReadyTasks(jobDataTemplate) {
120
+ for (const [id, task] of this.tasks) {
121
+ if (task.status !== 'pending')
122
+ continue;
123
+ const depsReady = task.dependsOn.every((depId) => {
124
+ const dep = this.tasks.get(depId);
125
+ return dep && dep.status === 'completed';
126
+ });
127
+ if (depsReady) {
128
+ task.status = 'waiting';
129
+ const jobData = { ...jobDataTemplate, subTask: task };
130
+ if (this.queue) {
131
+ await this.queue.add(`subtask-${task.id}`, jobData, {
132
+ jobId: task.id,
133
+ attempts: 2,
134
+ backoff: { type: 'exponential', delay: 5000 },
135
+ });
136
+ }
137
+ else {
138
+ // In-process fallback
139
+ this.processJobInProcess(jobData);
140
+ }
141
+ }
142
+ }
143
+ }
144
+ /**
145
+ * Process a sub-agent job — this runs in the BullMQ worker.
146
+ * Each sub-agent gets its own LLM conversation context.
147
+ */
148
+ async processJob(data) {
149
+ const { subTask, llmConfig, parentContext } = data;
150
+ const task = this.tasks.get(subTask.id) || subTask;
151
+ task.status = 'running';
152
+ task.startedAt = Date.now();
153
+ this.emit('task-started', task);
154
+ try {
155
+ // Create isolated LLM conversation for this sub-agent
156
+ const { createProvider } = await Promise.resolve().then(() => __importStar(require('../providers/index')));
157
+ const provider = createProvider(llmConfig.provider, {
158
+ apiKey: llmConfig.apiKey,
159
+ model: llmConfig.model,
160
+ });
161
+ // Build system prompt with parent context
162
+ let systemPrompt = 'You are a Funolio sub-agent working on a specific sub-task. Focus only on your assigned task.';
163
+ if (parentContext.facts.length > 0) {
164
+ systemPrompt += '\n\nRelevant context:\n' + parentContext.facts.map((f) => `- ${f}`).join('\n');
165
+ }
166
+ const response = await provider.chat({
167
+ messages: [{ role: 'user', content: subTask.prompt }],
168
+ system: systemPrompt,
169
+ });
170
+ const result = {
171
+ subTaskId: subTask.id,
172
+ status: 'completed',
173
+ result: response.content,
174
+ tokensUsed: (response.usage?.inputTokens || 0) + (response.usage?.outputTokens || 0),
175
+ completedAt: Date.now(),
176
+ };
177
+ return result;
178
+ }
179
+ catch (err) {
180
+ return {
181
+ subTaskId: subTask.id,
182
+ status: 'failed',
183
+ error: err.message,
184
+ tokensUsed: 0,
185
+ completedAt: Date.now(),
186
+ };
187
+ }
188
+ }
189
+ /** In-process fallback when BullMQ is not available */
190
+ async processJobInProcess(data) {
191
+ try {
192
+ const result = await this.processJob(data);
193
+ this.handleJobComplete(result);
194
+ }
195
+ catch (err) {
196
+ this.handleJobFailed(data.subTask.id, err.message);
197
+ }
198
+ }
199
+ /** Handle successful job completion */
200
+ handleJobComplete(result) {
201
+ const task = this.tasks.get(result.subTaskId);
202
+ if (task) {
203
+ task.status = 'completed';
204
+ task.result = result.result;
205
+ task.completedAt = result.completedAt;
206
+ this.emit('task-completed', task, result);
207
+ }
208
+ // Check if this unlocks dependent tasks
209
+ this.checkAndEnqueueDependents(result.subTaskId);
210
+ // Check if all tasks are done
211
+ this.checkAllComplete();
212
+ }
213
+ /** Handle failed job */
214
+ handleJobFailed(subTaskId, error) {
215
+ const task = this.tasks.get(subTaskId);
216
+ if (task) {
217
+ task.status = 'failed';
218
+ task.error = error;
219
+ task.completedAt = Date.now();
220
+ this.emit('task-failed', task, error);
221
+ }
222
+ this.checkAllComplete();
223
+ }
224
+ /** Check if completed task unlocks dependents */
225
+ checkAndEnqueueDependents(completedId) {
226
+ // Find tasks that depend on the completed one and re-check readiness
227
+ for (const [id, task] of this.tasks) {
228
+ if (task.status === 'pending' && task.dependsOn.includes(completedId)) {
229
+ const allDepsReady = task.dependsOn.every((depId) => {
230
+ const dep = this.tasks.get(depId);
231
+ return dep && dep.status === 'completed';
232
+ });
233
+ if (allDepsReady) {
234
+ // This task is now ready — but we need the job data template
235
+ // Emit event for the orchestrator to handle
236
+ this.emit('task-ready', task);
237
+ }
238
+ }
239
+ }
240
+ }
241
+ /** Check if all tasks in the batch are complete */
242
+ checkAllComplete() {
243
+ const allDone = Array.from(this.tasks.values()).every((t) => t.status === 'completed' || t.status === 'failed' || t.status === 'cancelled');
244
+ if (allDone) {
245
+ const results = Array.from(this.tasks.values());
246
+ this.emit('all-complete', results);
247
+ }
248
+ }
249
+ /** Get current status of all tasks */
250
+ getTaskStatuses() {
251
+ return Array.from(this.tasks.values());
252
+ }
253
+ /** Cancel a specific task */
254
+ async cancelTask(taskId) {
255
+ const task = this.tasks.get(taskId);
256
+ if (task && (task.status === 'pending' || task.status === 'waiting')) {
257
+ task.status = 'cancelled';
258
+ this.emit('task-cancelled', task);
259
+ }
260
+ }
261
+ /** Build dependency graph for UI visualization */
262
+ buildDependencyGraph() {
263
+ return Array.from(this.tasks.values()).map((t) => ({
264
+ desc: t.prompt,
265
+ status: t.status,
266
+ result: t.result,
267
+ subAgentId: t.id,
268
+ dependsOn: t.dependsOn
269
+ .map((depId) => {
270
+ const dep = this.tasks.get(depId);
271
+ return dep ? dep.checkpointIndex : -1;
272
+ })
273
+ .filter((i) => i >= 0),
274
+ parallel: t.dependsOn.length === 0,
275
+ }));
276
+ }
277
+ /** Parse Redis URL to BullMQ connection options */
278
+ parseRedisConnection(url) {
279
+ const parsed = new URL(url);
280
+ return {
281
+ host: parsed.hostname,
282
+ port: parseInt(parsed.port || '6379', 10),
283
+ password: parsed.password || undefined,
284
+ username: parsed.username || undefined,
285
+ tls: parsed.protocol === 'rediss:' ? {} : undefined,
286
+ };
287
+ }
288
+ /** Shutdown queue and worker */
289
+ async shutdown() {
290
+ if (this.worker)
291
+ await this.worker.close();
292
+ if (this.queue)
293
+ await this.queue.close();
294
+ this.tasks.clear();
295
+ }
296
+ }
297
+ exports.SubAgentQueue = SubAgentQueue;
298
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/subagent/queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Phase 3K: Sub-Agent System Types
3
+ */
4
+ /** Concurrency limits by subscription tier */
5
+ export declare const TIER_CONCURRENCY: Record<string, number>;
6
+ /** Status of a sub-agent job */
7
+ export type SubAgentStatus = 'pending' | 'waiting' | 'running' | 'completed' | 'failed' | 'cancelled';
8
+ /** A sub-agent task within a parent task decomposition */
9
+ export interface SubAgentTask {
10
+ id: string;
11
+ parentTaskId: string;
12
+ /** Index in the parent's checkpoint list */
13
+ checkpointIndex: number;
14
+ prompt: string;
15
+ status: SubAgentStatus;
16
+ /** IDs of sub-agent tasks this depends on */
17
+ dependsOn: string[];
18
+ /** Token budget for this sub-task */
19
+ tokenBudget: number;
20
+ /** Results when completed */
21
+ result?: string;
22
+ error?: string;
23
+ /** Timestamps */
24
+ createdAt: number;
25
+ startedAt?: number;
26
+ completedAt?: number;
27
+ }
28
+ /** Job data passed to BullMQ worker */
29
+ export interface SubAgentJobData {
30
+ subTask: SubAgentTask;
31
+ userId: string;
32
+ projectId: string;
33
+ /** LLM config for this sub-agent */
34
+ llmConfig: {
35
+ provider: string;
36
+ model: string;
37
+ apiKey: string;
38
+ };
39
+ /** Context passed from parent */
40
+ parentContext: {
41
+ projectDir: string;
42
+ facts: string[];
43
+ files: string[];
44
+ };
45
+ }
46
+ /** Result returned by the BullMQ worker */
47
+ export interface SubAgentJobResult {
48
+ subTaskId: string;
49
+ status: 'completed' | 'failed';
50
+ result?: string;
51
+ error?: string;
52
+ tokensUsed: number;
53
+ completedAt: number;
54
+ }
55
+ /** Dependency graph node for checkpoint tracking */
56
+ export interface DependencyNode {
57
+ id: string;
58
+ checkpointIndex: number;
59
+ description: string;
60
+ dependsOn: string[];
61
+ status: SubAgentStatus;
62
+ result?: string;
63
+ }
64
+ /** Serialized into Task.checkpoints JSONB */
65
+ export interface CheckpointWithDependencies {
66
+ desc: string;
67
+ expectedOutput?: string;
68
+ timeout?: number;
69
+ status: string;
70
+ result?: string;
71
+ /** Sub-agent tracking */
72
+ subAgentId?: string;
73
+ dependsOn?: number[];
74
+ parallel?: boolean;
75
+ }
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/subagent/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKnD,CAAC;AAEF,gCAAgC;AAChC,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEtG,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,cAAc,CAAC;IACvB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,qCAAqC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uCAAuC;AACvC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,SAAS,EAAE;QACT,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,iCAAiC;IACjC,aAAa,EAAE;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;CACH;AAED,2CAA2C;AAC3C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6CAA6C;AAC7C,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * Phase 3K: Sub-Agent System Types
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TIER_CONCURRENCY = void 0;
7
+ /** Concurrency limits by subscription tier */
8
+ exports.TIER_CONCURRENCY = {
9
+ free: 1,
10
+ personal: 2,
11
+ pro: 5,
12
+ team: 10,
13
+ };
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/subagent/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,8CAA8C;AACjC,QAAA,gBAAgB,GAA2B;IACtD,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;IACX,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,EAAE;CACT,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { ToolDefinition } from '../types';
2
+ export declare const editFileTool: ToolDefinition;
3
+ //# sourceMappingURL=edit-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-file.d.ts","sourceRoot":"","sources":["../../src/tools/edit-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAA2B,MAAM,UAAU,CAAC;AAGnE,eAAO,MAAM,YAAY,EAAE,cA8E1B,CAAC"}