@stackmemoryai/stackmemory 0.3.8 → 0.3.10

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 (50) hide show
  1. package/README.md +53 -0
  2. package/dist/agents/core/agent-task-manager.js +12 -1
  3. package/dist/agents/core/agent-task-manager.js.map +3 -3
  4. package/dist/agents/testing-agent.js +610 -0
  5. package/dist/agents/testing-agent.js.map +7 -0
  6. package/dist/cli/claude-sm.js +2 -2
  7. package/dist/cli/claude-sm.js.map +2 -2
  8. package/dist/cli/codex-sm.js +2 -2
  9. package/dist/cli/codex-sm.js.map +2 -2
  10. package/dist/cli/commands/handoff.js +65 -18
  11. package/dist/cli/commands/handoff.js.map +3 -3
  12. package/dist/cli/commands/onboard.js +3 -3
  13. package/dist/cli/commands/onboard.js.map +2 -2
  14. package/dist/cli/commands/quality.js +2 -2
  15. package/dist/cli/commands/quality.js.map +2 -2
  16. package/dist/cli/commands/skills.js +113 -28
  17. package/dist/cli/commands/skills.js.map +2 -2
  18. package/dist/cli/commands/test.js +282 -0
  19. package/dist/cli/commands/test.js.map +7 -0
  20. package/dist/cli/commands/worktree.js +28 -10
  21. package/dist/cli/commands/worktree.js.map +2 -2
  22. package/dist/cli/index.js +2 -0
  23. package/dist/cli/index.js.map +2 -2
  24. package/dist/core/config/config-manager.js +26 -0
  25. package/dist/core/config/config-manager.js.map +3 -3
  26. package/dist/core/context/frame-manager.js +139 -0
  27. package/dist/core/context/frame-manager.js.map +2 -2
  28. package/dist/core/context/recursive-context-manager.js +582 -0
  29. package/dist/core/context/recursive-context-manager.js.map +7 -0
  30. package/dist/core/context/refactored-frame-manager.js +180 -1
  31. package/dist/core/context/refactored-frame-manager.js.map +2 -2
  32. package/dist/core/execution/parallel-executor.js +254 -0
  33. package/dist/core/execution/parallel-executor.js.map +7 -0
  34. package/dist/core/utils/update-checker.js +2 -2
  35. package/dist/core/utils/update-checker.js.map +2 -2
  36. package/dist/integrations/anthropic/client.js +259 -0
  37. package/dist/integrations/anthropic/client.js.map +7 -0
  38. package/dist/integrations/claude-code/subagent-client-stub.js +16 -0
  39. package/dist/integrations/claude-code/subagent-client-stub.js.map +7 -0
  40. package/dist/integrations/claude-code/subagent-client.js +404 -0
  41. package/dist/integrations/claude-code/subagent-client.js.map +7 -0
  42. package/dist/skills/claude-skills.js +191 -0
  43. package/dist/skills/claude-skills.js.map +2 -2
  44. package/dist/skills/recursive-agent-orchestrator.js +559 -0
  45. package/dist/skills/recursive-agent-orchestrator.js.map +7 -0
  46. package/dist/skills/security-secrets-scanner.js +280 -0
  47. package/dist/skills/security-secrets-scanner.js.map +7 -0
  48. package/dist/skills/unified-rlm-orchestrator.js +400 -0
  49. package/dist/skills/unified-rlm-orchestrator.js.map +7 -0
  50. package/package.json +3 -2
@@ -0,0 +1,559 @@
1
+ import { logger } from "../core/monitoring/logger.js";
2
+ import { ParallelExecutor } from "../core/execution/parallel-executor.js";
3
+ import { RecursiveContextManager } from "../core/context/recursive-context-manager.js";
4
+ import { ClaudeCodeSubagentClient } from "../integrations/claude-code/subagent-client.js";
5
+ class RecursiveAgentOrchestrator {
6
+ frameManager;
7
+ contextRetriever;
8
+ taskStore;
9
+ parallelExecutor;
10
+ contextManager;
11
+ subagentClient;
12
+ // Subagent configurations
13
+ subagentConfigs;
14
+ // Execution tracking
15
+ activeExecutions = /* @__PURE__ */ new Map();
16
+ executionHistory = [];
17
+ // Default options
18
+ defaultOptions = {
19
+ maxParallel: 5,
20
+ maxRecursionDepth: 4,
21
+ maxTokensPerAgent: 3e4,
22
+ maxTotalCost: 50,
23
+ // Quality over cost
24
+ timeoutPerAgent: 300,
25
+ retryFailedAgents: true,
26
+ shareContextRealtime: true,
27
+ testGenerationMode: "all",
28
+ reviewStages: 3,
29
+ // Multi-stage review
30
+ qualityThreshold: 0.85,
31
+ verboseLogging: true
32
+ // Full transparency
33
+ };
34
+ constructor(frameManager, dualStackManager, contextRetriever, taskStore) {
35
+ this.frameManager = frameManager;
36
+ this.contextRetriever = contextRetriever;
37
+ this.taskStore = taskStore;
38
+ this.parallelExecutor = new ParallelExecutor(
39
+ this.defaultOptions.maxParallel
40
+ );
41
+ this.contextManager = new RecursiveContextManager(
42
+ dualStackManager,
43
+ contextRetriever
44
+ );
45
+ this.subagentClient = new ClaudeCodeSubagentClient();
46
+ this.subagentConfigs = this.initializeSubagentConfigs();
47
+ logger.info("RLM Orchestrator initialized", {
48
+ maxParallel: this.defaultOptions.maxParallel,
49
+ maxRecursion: this.defaultOptions.maxRecursionDepth,
50
+ reviewStages: this.defaultOptions.reviewStages
51
+ });
52
+ }
53
+ /**
54
+ * Initialize subagent configurations with specialized prompts
55
+ */
56
+ initializeSubagentConfigs() {
57
+ const configs = /* @__PURE__ */ new Map();
58
+ configs.set("planning", {
59
+ type: "planning",
60
+ model: "claude-3-5-sonnet-latest",
61
+ maxTokens: 2e4,
62
+ temperature: 0.3,
63
+ systemPrompt: `You are a Planning Agent specializing in task decomposition.
64
+ Analyze complex tasks and break them into parallel and sequential subtasks.
65
+ Create detailed execution plans with clear dependencies.
66
+ Consider edge cases and potential failures.
67
+ Output structured task trees with agent assignments.`,
68
+ capabilities: ["decompose", "analyze", "strategize", "prioritize"]
69
+ });
70
+ configs.set("code", {
71
+ type: "code",
72
+ model: "claude-3-5-sonnet-latest",
73
+ maxTokens: 3e4,
74
+ temperature: 0.2,
75
+ systemPrompt: `You are a Code Agent specializing in implementation.
76
+ Write clean, maintainable, production-ready code.
77
+ Follow project conventions and best practices.
78
+ Include comprehensive error handling.
79
+ Document complex logic with clear comments.`,
80
+ capabilities: ["implement", "refactor", "optimize", "document"]
81
+ });
82
+ configs.set("testing", {
83
+ type: "testing",
84
+ model: "claude-3-5-sonnet-latest",
85
+ // High quality for test generation
86
+ maxTokens: 25e3,
87
+ temperature: 0.1,
88
+ systemPrompt: `You are a Testing Agent specializing in test generation and validation.
89
+ Generate comprehensive test suites including:
90
+ - Unit tests for all functions/methods
91
+ - Integration tests for API endpoints
92
+ - E2E tests for critical user flows
93
+ - Edge cases and error scenarios
94
+ Ensure 100% code coverage where possible.
95
+ Validate that all tests pass and are meaningful.`,
96
+ capabilities: [
97
+ "generate-tests",
98
+ "validate",
99
+ "coverage-analysis",
100
+ "test-execution"
101
+ ]
102
+ });
103
+ configs.set("linting", {
104
+ type: "linting",
105
+ model: "claude-3-5-haiku-latest",
106
+ maxTokens: 15e3,
107
+ temperature: 0,
108
+ systemPrompt: `You are a Linting Agent specializing in code quality.
109
+ Check for:
110
+ - Syntax errors and type issues
111
+ - Code formatting and style violations
112
+ - Security vulnerabilities
113
+ - Performance anti-patterns
114
+ - Unused imports and dead code
115
+ Provide actionable fixes for all issues found.`,
116
+ capabilities: ["lint", "format", "type-check", "security-scan"]
117
+ });
118
+ configs.set("review", {
119
+ type: "review",
120
+ model: "claude-3-5-sonnet-latest",
121
+ maxTokens: 25e3,
122
+ temperature: 0.2,
123
+ systemPrompt: `You are a Review Agent specializing in multi-stage code review.
124
+ Perform thorough reviews focusing on:
125
+ - Architecture and design patterns
126
+ - Code quality and maintainability
127
+ - Performance implications
128
+ - Security considerations
129
+ - Test coverage adequacy
130
+ Suggest specific improvements with examples.
131
+ Rate quality on a 0-1 scale.`,
132
+ capabilities: [
133
+ "review",
134
+ "critique",
135
+ "suggest-improvements",
136
+ "quality-scoring"
137
+ ]
138
+ });
139
+ configs.set("improve", {
140
+ type: "improve",
141
+ model: "claude-3-5-sonnet-latest",
142
+ maxTokens: 3e4,
143
+ temperature: 0.3,
144
+ systemPrompt: `You are an Improvement Agent specializing in code enhancement.
145
+ Take reviewed code and implement suggested improvements:
146
+ - Refactor for better architecture
147
+ - Optimize performance bottlenecks
148
+ - Enhance error handling
149
+ - Improve code clarity and documentation
150
+ - Add missing test cases
151
+ Ensure all improvements maintain backward compatibility.`,
152
+ capabilities: ["enhance", "refactor", "optimize", "polish"]
153
+ });
154
+ configs.set("context", {
155
+ type: "context",
156
+ model: "claude-3-5-haiku-latest",
157
+ maxTokens: 1e4,
158
+ temperature: 0,
159
+ systemPrompt: `You are a Context Agent specializing in information retrieval.
160
+ Search and retrieve relevant context from:
161
+ - Project codebase and documentation
162
+ - Previous frame history
163
+ - Similar implementations
164
+ - Best practices and patterns
165
+ Provide concise, relevant context for other agents.`,
166
+ capabilities: ["search", "retrieve", "summarize", "contextualize"]
167
+ });
168
+ configs.set("publish", {
169
+ type: "publish",
170
+ model: "claude-3-5-haiku-latest",
171
+ maxTokens: 15e3,
172
+ temperature: 0,
173
+ systemPrompt: `You are a Publish Agent specializing in release management.
174
+ Handle:
175
+ - NPM package publishing
176
+ - GitHub releases and tagging
177
+ - Documentation updates
178
+ - Changelog generation
179
+ - Deployment automation
180
+ Ensure all release steps are properly sequenced.`,
181
+ capabilities: ["publish-npm", "github-release", "deploy", "document"]
182
+ });
183
+ return configs;
184
+ }
185
+ /**
186
+ * Execute a task with recursive decomposition
187
+ */
188
+ async execute(task, context, options) {
189
+ const opts = { ...this.defaultOptions, ...options };
190
+ const executionId = this.generateExecutionId();
191
+ const startTime = Date.now();
192
+ logger.info("Starting RLM execution", {
193
+ executionId,
194
+ task: task.slice(0, 100),
195
+ options: opts
196
+ });
197
+ try {
198
+ const rootFrame = await this.createExecutionFrame(executionId, task);
199
+ const rootNode = await this.planTask(task, context, opts);
200
+ this.activeExecutions.set(executionId, rootNode);
201
+ if (opts.verboseLogging) {
202
+ this.logExecutionTree(rootNode);
203
+ }
204
+ await this.executeTaskTree(rootNode, context, opts, 0);
205
+ const improvements = await this.performMultiStageReview(
206
+ rootNode,
207
+ opts.reviewStages,
208
+ opts.qualityThreshold
209
+ );
210
+ const result = {
211
+ success: rootNode.status === "completed",
212
+ rootNode,
213
+ totalTokens: this.calculateTotalTokens(rootNode),
214
+ totalCost: this.calculateTotalCost(rootNode),
215
+ duration: Date.now() - startTime,
216
+ improvements,
217
+ testsGenerated: this.countGeneratedTests(rootNode),
218
+ issuesFound: this.countIssuesFound(rootNode),
219
+ issuesFixed: this.countIssuesFixed(rootNode)
220
+ };
221
+ this.executionHistory.push(result);
222
+ await this.updateExecutionFrame(rootFrame, result);
223
+ logger.info("RLM execution completed", {
224
+ executionId,
225
+ success: result.success,
226
+ duration: result.duration,
227
+ totalCost: result.totalCost,
228
+ testsGenerated: result.testsGenerated,
229
+ improvements: improvements.length
230
+ });
231
+ return result;
232
+ } catch (error) {
233
+ logger.error("RLM execution failed", { executionId, error });
234
+ throw error;
235
+ } finally {
236
+ this.activeExecutions.delete(executionId);
237
+ }
238
+ }
239
+ /**
240
+ * Plan task decomposition
241
+ */
242
+ async planTask(task, context, options) {
243
+ const response = await this.subagentClient.executeSubagent({
244
+ type: "planning",
245
+ task,
246
+ context: {
247
+ ...context,
248
+ requirements: options
249
+ }
250
+ });
251
+ const taskTree = this.parseTaskTree(JSON.stringify(response.result));
252
+ this.injectTestGenerationNodes(taskTree, options.testGenerationMode);
253
+ this.injectReviewStages(taskTree, options.reviewStages);
254
+ return taskTree;
255
+ }
256
+ /**
257
+ * Execute task tree recursively with parallelization
258
+ */
259
+ async executeTaskTree(node, context, options, depth) {
260
+ if (depth >= options.maxRecursionDepth) {
261
+ logger.warn("Max recursion depth reached", { nodeId: node.id, depth });
262
+ node.status = "failed";
263
+ node.error = new Error("Max recursion depth exceeded");
264
+ return;
265
+ }
266
+ if (options.verboseLogging) {
267
+ logger.info(`Executing node: ${node.description}`, {
268
+ id: node.id,
269
+ type: node.type,
270
+ agent: node.agent,
271
+ depth
272
+ });
273
+ }
274
+ node.status = "running";
275
+ node.startTime = /* @__PURE__ */ new Date();
276
+ try {
277
+ if (node.type === "parallel" && node.children) {
278
+ await this.parallelExecutor.executeParallel(
279
+ node.children,
280
+ async (child) => {
281
+ await this.executeTaskTree(child, context, options, depth + 1);
282
+ }
283
+ );
284
+ } else if (node.type === "sequential" && node.children) {
285
+ for (const child of node.children) {
286
+ await this.executeTaskTree(child, context, options, depth + 1);
287
+ if (child.result) {
288
+ context[`${child.id}_result`] = child.result;
289
+ }
290
+ }
291
+ } else {
292
+ await this.executeLeafNode(node, context, options);
293
+ }
294
+ node.status = "completed";
295
+ } catch (error) {
296
+ logger.error(`Node execution failed: ${node.description}`, { error });
297
+ if (options.retryFailedAgents && node.attempts < 3) {
298
+ node.attempts++;
299
+ logger.info(`Retrying node: ${node.description}`, {
300
+ attempt: node.attempts
301
+ });
302
+ await this.executeTaskTree(node, context, options, depth);
303
+ } else {
304
+ node.status = "failed";
305
+ node.error = error;
306
+ }
307
+ } finally {
308
+ node.endTime = /* @__PURE__ */ new Date();
309
+ if (options.verboseLogging) {
310
+ const duration = node.endTime.getTime() - node.startTime.getTime();
311
+ logger.info(`Completed node: ${node.description}`, {
312
+ id: node.id,
313
+ status: node.status,
314
+ duration,
315
+ tokens: node.tokens,
316
+ cost: node.cost
317
+ });
318
+ }
319
+ }
320
+ }
321
+ /**
322
+ * Execute a leaf node with the appropriate agent
323
+ */
324
+ async executeLeafNode(node, context, options) {
325
+ const agentConfig = this.subagentConfigs.get(node.agent);
326
+ const agentContext = await this.contextManager.prepareAgentContext(
327
+ node.agent,
328
+ context,
329
+ options.maxTokensPerAgent
330
+ );
331
+ const taskDescription = this.buildAgentPrompt(node, agentContext);
332
+ const response = await this.subagentClient.executeSubagent({
333
+ type: node.agent,
334
+ task: taskDescription,
335
+ context: agentContext
336
+ });
337
+ node.result = response.result;
338
+ node.tokens = response.tokens || this.estimateTokens(JSON.stringify(response));
339
+ node.cost = this.calculateNodeCost(node.tokens, agentConfig.model);
340
+ if (options.shareContextRealtime) {
341
+ await this.shareAgentResults(node);
342
+ }
343
+ }
344
+ /**
345
+ * Perform multi-stage review and improvement
346
+ */
347
+ async performMultiStageReview(rootNode, stages, qualityThreshold) {
348
+ const improvements = [];
349
+ let currentQuality = 0;
350
+ for (let stage = 1; stage <= stages; stage++) {
351
+ logger.info(`Starting review stage ${stage}/${stages}`);
352
+ const reviewNode = {
353
+ id: `review-stage-${stage}`,
354
+ type: "task",
355
+ description: `Review stage ${stage}`,
356
+ agent: "review",
357
+ dependencies: [],
358
+ context: { rootNode, stage },
359
+ status: "pending",
360
+ attempts: 0
361
+ };
362
+ const reviewResponse = await this.subagentClient.executeSubagent({
363
+ type: "review",
364
+ task: `Review stage ${stage}: Analyze code quality and suggest improvements`,
365
+ context: { rootNode, stage }
366
+ });
367
+ reviewNode.result = reviewResponse.result;
368
+ reviewNode.status = reviewResponse.success ? "completed" : "failed";
369
+ const reviewResult = reviewResponse.result;
370
+ currentQuality = reviewResult.quality;
371
+ improvements.push(...reviewResult.suggestions);
372
+ logger.info(`Review stage ${stage} complete`, {
373
+ quality: currentQuality,
374
+ issues: reviewResult.issues.length,
375
+ suggestions: reviewResult.suggestions.length
376
+ });
377
+ if (currentQuality >= qualityThreshold) {
378
+ logger.info(
379
+ `Quality threshold met: ${currentQuality} >= ${qualityThreshold}`
380
+ );
381
+ break;
382
+ }
383
+ if (stage < stages) {
384
+ const improveNode = {
385
+ id: `improve-stage-${stage}`,
386
+ type: "task",
387
+ description: `Improvement stage ${stage}`,
388
+ agent: "improve",
389
+ dependencies: [reviewNode.id],
390
+ context: { reviewResult, rootNode },
391
+ status: "pending",
392
+ attempts: 0
393
+ };
394
+ const improveResponse = await this.subagentClient.executeSubagent({
395
+ type: "improve",
396
+ task: `Improvement stage ${stage}: Implement suggested improvements`,
397
+ context: { reviewResult, rootNode }
398
+ });
399
+ improveNode.result = improveResponse.result;
400
+ improveNode.status = improveResponse.success ? "completed" : "failed";
401
+ this.applyImprovements(rootNode, improveNode.result);
402
+ }
403
+ }
404
+ return improvements;
405
+ }
406
+ /**
407
+ * Helper methods
408
+ */
409
+ generateExecutionId() {
410
+ return `rlm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
411
+ }
412
+ async createExecutionFrame(executionId, task) {
413
+ return this.frameManager.pushFrame({
414
+ name: `RLM: ${task.slice(0, 50)}`,
415
+ type: "rlm-execution",
416
+ metadata: { executionId }
417
+ });
418
+ }
419
+ async updateExecutionFrame(frame, result) {
420
+ frame.outputs = [
421
+ {
422
+ type: "rlm-result",
423
+ content: JSON.stringify(result, null, 2)
424
+ }
425
+ ];
426
+ frame.state = result.success ? "completed" : "failed";
427
+ }
428
+ logExecutionTree(node, depth = 0) {
429
+ const indent = " ".repeat(depth);
430
+ const status = node.status === "completed" ? "\u2713" : node.status === "failed" ? "\u2717" : node.status === "running" ? "\u27F3" : "\u25CB";
431
+ console.log(`${indent}${status} ${node.description} [${node.agent}]`);
432
+ if (node.children) {
433
+ for (const child of node.children) {
434
+ this.logExecutionTree(child, depth + 1);
435
+ }
436
+ }
437
+ }
438
+ parseTaskTree(_response) {
439
+ return {
440
+ id: "root",
441
+ type: "sequential",
442
+ description: "Root task",
443
+ agent: "planning",
444
+ dependencies: [],
445
+ context: {},
446
+ status: "pending",
447
+ attempts: 0,
448
+ children: []
449
+ };
450
+ }
451
+ injectTestGenerationNodes(node, _mode) {
452
+ if (!node.children) return;
453
+ const testNode = {
454
+ id: `${node.id}-test`,
455
+ type: "task",
456
+ description: `Generate ${_mode} tests for ${node.description}`,
457
+ agent: "testing",
458
+ dependencies: [node.id],
459
+ context: { testMode: _mode },
460
+ status: "pending",
461
+ attempts: 0
462
+ };
463
+ node.children.push(testNode);
464
+ }
465
+ injectReviewStages(_node, _stages) {
466
+ }
467
+ buildAgentPrompt(node, context) {
468
+ return `
469
+ Task: ${node.description}
470
+
471
+ Context:
472
+ ${JSON.stringify(context, null, 2)}
473
+
474
+ Previous Results:
475
+ ${JSON.stringify(
476
+ node.dependencies.map((id) => this.activeExecutions.get(id)?.result),
477
+ null,
478
+ 2
479
+ )}
480
+
481
+ Please complete this task following your specialized role.
482
+ `;
483
+ }
484
+ estimateTokens(text) {
485
+ return Math.ceil(text.length / 4);
486
+ }
487
+ async shareAgentResults(_node) {
488
+ logger.debug("Sharing agent results", { nodeId: _node.id });
489
+ }
490
+ applyImprovements(_rootNode, improvements) {
491
+ logger.debug("Applying improvements", { improvements });
492
+ }
493
+ calculateTotalTokens(node) {
494
+ let total = node.tokens || 0;
495
+ if (node.children) {
496
+ for (const child of node.children) {
497
+ total += this.calculateTotalTokens(child);
498
+ }
499
+ }
500
+ return total;
501
+ }
502
+ calculateTotalCost(node) {
503
+ let total = node.cost || 0;
504
+ if (node.children) {
505
+ for (const child of node.children) {
506
+ total += this.calculateTotalCost(child);
507
+ }
508
+ }
509
+ return total;
510
+ }
511
+ calculateNodeCost(tokens, model) {
512
+ const pricing = {
513
+ "claude-3-5-sonnet-latest": 15,
514
+ "claude-3-5-haiku-latest": 1,
515
+ "claude-3-opus-latest": 75
516
+ };
517
+ return tokens / 1e6 * (pricing[model] || 10);
518
+ }
519
+ countGeneratedTests(node) {
520
+ let count = 0;
521
+ if (node.agent === "testing" && node.result?.tests) {
522
+ count += node.result.tests.length;
523
+ }
524
+ if (node.children) {
525
+ for (const child of node.children) {
526
+ count += this.countGeneratedTests(child);
527
+ }
528
+ }
529
+ return count;
530
+ }
531
+ countIssuesFound(node) {
532
+ let count = 0;
533
+ if ((node.agent === "review" || node.agent === "linting") && node.result?.issues) {
534
+ count += node.result.issues.length;
535
+ }
536
+ if (node.children) {
537
+ for (const child of node.children) {
538
+ count += this.countIssuesFound(child);
539
+ }
540
+ }
541
+ return count;
542
+ }
543
+ countIssuesFixed(node) {
544
+ let count = 0;
545
+ if (node.agent === "improve" && node.result?.fixed) {
546
+ count += node.result.fixed.length;
547
+ }
548
+ if (node.children) {
549
+ for (const child of node.children) {
550
+ count += this.countIssuesFixed(child);
551
+ }
552
+ }
553
+ return count;
554
+ }
555
+ }
556
+ export {
557
+ RecursiveAgentOrchestrator
558
+ };
559
+ //# sourceMappingURL=recursive-agent-orchestrator.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/skills/recursive-agent-orchestrator.ts"],
4
+ "sourcesContent": ["/**\n * Recursive Language Model (RLM) Orchestrator for StackMemory\n *\n * Implements recursive task decomposition with parallel Claude API execution\n * Based on \"Recursive Language Models\" paper concepts\n *\n * Key Features:\n * - Parallel subagent execution via Claude API\n * - Automatic test generation and validation\n * - Multi-stage code review and improvement\n * - Large codebase processing through chunking\n * - Full operation transparency\n */\n\nimport { logger } from '../core/monitoring/logger.js';\nimport { FrameManager } from '../core/context/frame-manager.js';\nimport { DualStackManager } from '../core/context/dual-stack-manager.js';\nimport { ContextRetriever } from '../core/retrieval/context-retriever.js';\nimport { PebblesTaskStore } from '../features/tasks/pebbles-task-store.js';\nimport { ParallelExecutor } from '../core/execution/parallel-executor.js';\nimport { RecursiveContextManager } from '../core/context/recursive-context-manager.js';\nimport { ClaudeCodeSubagentClient } from '../integrations/claude-code/subagent-client.js';\nimport type { Frame } from '../core/context/frame-manager.js';\n\n// Subagent types\nexport type SubagentType =\n | 'planning'\n | 'code'\n | 'testing'\n | 'linting'\n | 'review'\n | 'context'\n | 'publish'\n | 'improve';\n\n// Subagent configuration\nexport interface SubagentConfig {\n type: SubagentType;\n model:\n | 'claude-3-5-sonnet-latest'\n | 'claude-3-5-haiku-latest'\n | 'claude-3-opus-latest';\n maxTokens: number;\n temperature: number;\n systemPrompt: string;\n capabilities: string[];\n}\n\n// Task decomposition node\nexport interface TaskNode {\n id: string;\n type: 'task' | 'parallel' | 'sequential';\n description: string;\n agent: SubagentType;\n dependencies: string[];\n context: Record<string, any>;\n children?: TaskNode[];\n status: 'pending' | 'running' | 'completed' | 'failed';\n result?: any;\n error?: Error;\n attempts: number;\n startTime?: Date;\n endTime?: Date;\n tokens?: number;\n cost?: number;\n}\n\n// Execution result\nexport interface ExecutionResult {\n success: boolean;\n rootNode: TaskNode;\n totalTokens: number;\n totalCost: number;\n duration: number;\n improvements: string[];\n testsGenerated: number;\n issuesFound: number;\n issuesFixed: number;\n}\n\n// RLM Options\nexport interface RLMOptions {\n maxParallel?: number;\n maxRecursionDepth?: number;\n maxTokensPerAgent?: number;\n maxTotalCost?: number;\n timeoutPerAgent?: number;\n retryFailedAgents?: boolean;\n shareContextRealtime?: boolean;\n testGenerationMode?: 'unit' | 'integration' | 'e2e' | 'all';\n reviewStages?: number;\n qualityThreshold?: number;\n verboseLogging?: boolean;\n}\n\n/**\n * Main RLM Orchestrator\n */\nexport class RecursiveAgentOrchestrator {\n private frameManager: FrameManager;\n private contextRetriever: ContextRetriever;\n private taskStore: PebblesTaskStore;\n private parallelExecutor: ParallelExecutor;\n private contextManager: RecursiveContextManager;\n private subagentClient: ClaudeCodeSubagentClient;\n\n // Subagent configurations\n private subagentConfigs: Map<SubagentType, SubagentConfig>;\n\n // Execution tracking\n private activeExecutions: Map<string, TaskNode> = new Map();\n private executionHistory: ExecutionResult[] = [];\n\n // Default options\n private defaultOptions: Required<RLMOptions> = {\n maxParallel: 5,\n maxRecursionDepth: 4,\n maxTokensPerAgent: 30000,\n maxTotalCost: 50.0, // Quality over cost\n timeoutPerAgent: 300,\n retryFailedAgents: true,\n shareContextRealtime: true,\n testGenerationMode: 'all',\n reviewStages: 3, // Multi-stage review\n qualityThreshold: 0.85,\n verboseLogging: true, // Full transparency\n };\n\n constructor(\n frameManager: FrameManager,\n dualStackManager: DualStackManager,\n contextRetriever: ContextRetriever,\n taskStore: PebblesTaskStore\n ) {\n this.frameManager = frameManager;\n this.contextRetriever = contextRetriever;\n this.taskStore = taskStore;\n\n // Initialize components\n this.parallelExecutor = new ParallelExecutor(\n this.defaultOptions.maxParallel\n );\n this.contextManager = new RecursiveContextManager(\n dualStackManager,\n contextRetriever\n );\n this.subagentClient = new ClaudeCodeSubagentClient();\n\n // Initialize subagent configurations\n this.subagentConfigs = this.initializeSubagentConfigs();\n\n logger.info('RLM Orchestrator initialized', {\n maxParallel: this.defaultOptions.maxParallel,\n maxRecursion: this.defaultOptions.maxRecursionDepth,\n reviewStages: this.defaultOptions.reviewStages,\n });\n }\n\n /**\n * Initialize subagent configurations with specialized prompts\n */\n private initializeSubagentConfigs(): Map<SubagentType, SubagentConfig> {\n const configs = new Map<SubagentType, SubagentConfig>();\n\n // Planning Agent - Task decomposer\n configs.set('planning', {\n type: 'planning',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 20000,\n temperature: 0.3,\n systemPrompt: `You are a Planning Agent specializing in task decomposition.\n Analyze complex tasks and break them into parallel and sequential subtasks.\n Create detailed execution plans with clear dependencies.\n Consider edge cases and potential failures.\n Output structured task trees with agent assignments.`,\n capabilities: ['decompose', 'analyze', 'strategize', 'prioritize'],\n });\n\n // Code Agent - Implementation specialist\n configs.set('code', {\n type: 'code',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 30000,\n temperature: 0.2,\n systemPrompt: `You are a Code Agent specializing in implementation.\n Write clean, maintainable, production-ready code.\n Follow project conventions and best practices.\n Include comprehensive error handling.\n Document complex logic with clear comments.`,\n capabilities: ['implement', 'refactor', 'optimize', 'document'],\n });\n\n // Testing Agent - Test generation and validation\n configs.set('testing', {\n type: 'testing',\n model: 'claude-3-5-sonnet-latest', // High quality for test generation\n maxTokens: 25000,\n temperature: 0.1,\n systemPrompt: `You are a Testing Agent specializing in test generation and validation.\n Generate comprehensive test suites including:\n - Unit tests for all functions/methods\n - Integration tests for API endpoints\n - E2E tests for critical user flows\n - Edge cases and error scenarios\n Ensure 100% code coverage where possible.\n Validate that all tests pass and are meaningful.`,\n capabilities: [\n 'generate-tests',\n 'validate',\n 'coverage-analysis',\n 'test-execution',\n ],\n });\n\n // Linting Agent - Code quality enforcer\n configs.set('linting', {\n type: 'linting',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You are a Linting Agent specializing in code quality.\n Check for:\n - Syntax errors and type issues\n - Code formatting and style violations\n - Security vulnerabilities\n - Performance anti-patterns\n - Unused imports and dead code\n Provide actionable fixes for all issues found.`,\n capabilities: ['lint', 'format', 'type-check', 'security-scan'],\n });\n\n // Review Agent - Multi-stage code reviewer\n configs.set('review', {\n type: 'review',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 25000,\n temperature: 0.2,\n systemPrompt: `You are a Review Agent specializing in multi-stage code review.\n Perform thorough reviews focusing on:\n - Architecture and design patterns\n - Code quality and maintainability\n - Performance implications\n - Security considerations\n - Test coverage adequacy\n Suggest specific improvements with examples.\n Rate quality on a 0-1 scale.`,\n capabilities: [\n 'review',\n 'critique',\n 'suggest-improvements',\n 'quality-scoring',\n ],\n });\n\n // Improvement Agent - Code enhancer\n configs.set('improve', {\n type: 'improve',\n model: 'claude-3-5-sonnet-latest',\n maxTokens: 30000,\n temperature: 0.3,\n systemPrompt: `You are an Improvement Agent specializing in code enhancement.\n Take reviewed code and implement suggested improvements:\n - Refactor for better architecture\n - Optimize performance bottlenecks\n - Enhance error handling\n - Improve code clarity and documentation\n - Add missing test cases\n Ensure all improvements maintain backward compatibility.`,\n capabilities: ['enhance', 'refactor', 'optimize', 'polish'],\n });\n\n // Context Agent - Information retriever\n configs.set('context', {\n type: 'context',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 10000,\n temperature: 0,\n systemPrompt: `You are a Context Agent specializing in information retrieval.\n Search and retrieve relevant context from:\n - Project codebase and documentation\n - Previous frame history\n - Similar implementations\n - Best practices and patterns\n Provide concise, relevant context for other agents.`,\n capabilities: ['search', 'retrieve', 'summarize', 'contextualize'],\n });\n\n // Publish Agent - Release and deployment\n configs.set('publish', {\n type: 'publish',\n model: 'claude-3-5-haiku-latest',\n maxTokens: 15000,\n temperature: 0,\n systemPrompt: `You are a Publish Agent specializing in release management.\n Handle:\n - NPM package publishing\n - GitHub releases and tagging\n - Documentation updates\n - Changelog generation\n - Deployment automation\n Ensure all release steps are properly sequenced.`,\n capabilities: ['publish-npm', 'github-release', 'deploy', 'document'],\n });\n\n return configs;\n }\n\n /**\n * Execute a task with recursive decomposition\n */\n async execute(\n task: string,\n context: Record<string, any>,\n options?: RLMOptions\n ): Promise<ExecutionResult> {\n const opts = { ...this.defaultOptions, ...options };\n const executionId = this.generateExecutionId();\n const startTime = Date.now();\n\n logger.info('Starting RLM execution', {\n executionId,\n task: task.slice(0, 100),\n options: opts,\n });\n\n try {\n // Create root frame for execution\n const rootFrame = await this.createExecutionFrame(executionId, task);\n\n // Step 1: Planning - Decompose task into subtasks\n const rootNode = await this.planTask(task, context, opts);\n this.activeExecutions.set(executionId, rootNode);\n\n // Log execution tree for transparency\n if (opts.verboseLogging) {\n this.logExecutionTree(rootNode);\n }\n\n // Step 2: Execute task tree recursively with parallelization\n await this.executeTaskTree(rootNode, context, opts, 0);\n\n // Step 3: Multi-stage review and improvement\n const improvements = await this.performMultiStageReview(\n rootNode,\n opts.reviewStages,\n opts.qualityThreshold\n );\n\n // Step 4: Aggregate results\n const result: ExecutionResult = {\n success: rootNode.status === 'completed',\n rootNode,\n totalTokens: this.calculateTotalTokens(rootNode),\n totalCost: this.calculateTotalCost(rootNode),\n duration: Date.now() - startTime,\n improvements,\n testsGenerated: this.countGeneratedTests(rootNode),\n issuesFound: this.countIssuesFound(rootNode),\n issuesFixed: this.countIssuesFixed(rootNode),\n };\n\n // Store execution history\n this.executionHistory.push(result);\n\n // Update frame with results\n await this.updateExecutionFrame(rootFrame, result);\n\n logger.info('RLM execution completed', {\n executionId,\n success: result.success,\n duration: result.duration,\n totalCost: result.totalCost,\n testsGenerated: result.testsGenerated,\n improvements: improvements.length,\n });\n\n return result;\n } catch (error) {\n logger.error('RLM execution failed', { executionId, error });\n throw error;\n } finally {\n this.activeExecutions.delete(executionId);\n }\n }\n\n /**\n * Plan task decomposition\n */\n private async planTask(\n task: string,\n context: Record<string, any>,\n options: Required<RLMOptions>\n ): Promise<TaskNode> {\n // Call planning agent using Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: 'planning',\n task: task,\n context: {\n ...context,\n requirements: options,\n },\n });\n\n // Parse response into task tree\n const taskTree = this.parseTaskTree(JSON.stringify(response.result));\n\n // Add automatic test generation nodes\n this.injectTestGenerationNodes(taskTree, options.testGenerationMode);\n\n // Add review stages\n this.injectReviewStages(taskTree, options.reviewStages);\n\n return taskTree;\n }\n\n /**\n * Execute task tree recursively with parallelization\n */\n private async executeTaskTree(\n node: TaskNode,\n context: Record<string, any>,\n options: Required<RLMOptions>,\n depth: number\n ): Promise<void> {\n // Check recursion depth\n if (depth >= options.maxRecursionDepth) {\n logger.warn('Max recursion depth reached', { nodeId: node.id, depth });\n node.status = 'failed';\n node.error = new Error('Max recursion depth exceeded');\n return;\n }\n\n // Log execution start for transparency\n if (options.verboseLogging) {\n logger.info(`Executing node: ${node.description}`, {\n id: node.id,\n type: node.type,\n agent: node.agent,\n depth,\n });\n }\n\n node.status = 'running';\n node.startTime = new Date();\n\n try {\n if (node.type === 'parallel' && node.children) {\n // Execute children in parallel\n await this.parallelExecutor.executeParallel(\n node.children,\n async (child) => {\n await this.executeTaskTree(child, context, options, depth + 1);\n }\n );\n } else if (node.type === 'sequential' && node.children) {\n // Execute children sequentially\n for (const child of node.children) {\n await this.executeTaskTree(child, context, options, depth + 1);\n\n // Pass results to next child\n if (child.result) {\n context[`${child.id}_result`] = child.result;\n }\n }\n } else {\n // Leaf node - execute with appropriate agent\n await this.executeLeafNode(node, context, options);\n }\n\n node.status = 'completed';\n } catch (error) {\n logger.error(`Node execution failed: ${node.description}`, { error });\n\n if (options.retryFailedAgents && node.attempts < 3) {\n node.attempts++;\n logger.info(`Retrying node: ${node.description}`, {\n attempt: node.attempts,\n });\n await this.executeTaskTree(node, context, options, depth);\n } else {\n node.status = 'failed';\n node.error = error as Error;\n }\n } finally {\n node.endTime = new Date();\n\n // Log completion for transparency\n if (options.verboseLogging) {\n const duration = node.endTime.getTime() - node.startTime!.getTime();\n logger.info(`Completed node: ${node.description}`, {\n id: node.id,\n status: node.status,\n duration,\n tokens: node.tokens,\n cost: node.cost,\n });\n }\n }\n }\n\n /**\n * Execute a leaf node with the appropriate agent\n */\n private async executeLeafNode(\n node: TaskNode,\n context: Record<string, any>,\n options: Required<RLMOptions>\n ): Promise<void> {\n const agentConfig = this.subagentConfigs.get(node.agent)!;\n\n // Prepare agent-specific context\n const agentContext = await this.contextManager.prepareAgentContext(\n node.agent,\n context,\n options.maxTokensPerAgent\n );\n\n // Build task description for agent\n const taskDescription = this.buildAgentPrompt(node, agentContext);\n\n // Call agent via Claude Code Task tool\n const response = await this.subagentClient.executeSubagent({\n type: node.agent,\n task: taskDescription,\n context: agentContext,\n });\n\n // Process agent response\n node.result = response.result;\n node.tokens =\n response.tokens || this.estimateTokens(JSON.stringify(response));\n node.cost = this.calculateNodeCost(node.tokens, agentConfig.model);\n\n // Share results with other agents if real-time sharing is enabled\n if (options.shareContextRealtime) {\n await this.shareAgentResults(node);\n }\n }\n\n /**\n * Perform multi-stage review and improvement\n */\n private async performMultiStageReview(\n rootNode: TaskNode,\n stages: number,\n qualityThreshold: number\n ): Promise<string[]> {\n const improvements: string[] = [];\n let currentQuality = 0;\n\n for (let stage = 1; stage <= stages; stage++) {\n logger.info(`Starting review stage ${stage}/${stages}`);\n\n // Review stage\n const reviewNode: TaskNode = {\n id: `review-stage-${stage}`,\n type: 'task',\n description: `Review stage ${stage}`,\n agent: 'review',\n dependencies: [],\n context: { rootNode, stage },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute review via Claude Code subagent\n const reviewResponse = await this.subagentClient.executeSubagent({\n type: 'review',\n task: `Review stage ${stage}: Analyze code quality and suggest improvements`,\n context: { rootNode, stage },\n });\n\n reviewNode.result = reviewResponse.result;\n reviewNode.status = reviewResponse.success ? 'completed' : 'failed';\n\n const reviewResult = reviewResponse.result as {\n quality: number;\n issues: string[];\n suggestions: string[];\n };\n\n currentQuality = reviewResult.quality;\n improvements.push(...reviewResult.suggestions);\n\n logger.info(`Review stage ${stage} complete`, {\n quality: currentQuality,\n issues: reviewResult.issues.length,\n suggestions: reviewResult.suggestions.length,\n });\n\n // If quality meets threshold, stop\n if (currentQuality >= qualityThreshold) {\n logger.info(\n `Quality threshold met: ${currentQuality} >= ${qualityThreshold}`\n );\n break;\n }\n\n // Improvement stage\n if (stage < stages) {\n const improveNode: TaskNode = {\n id: `improve-stage-${stage}`,\n type: 'task',\n description: `Improvement stage ${stage}`,\n agent: 'improve',\n dependencies: [reviewNode.id],\n context: { reviewResult, rootNode },\n status: 'pending',\n attempts: 0,\n };\n\n // Execute improvement via Claude Code subagent\n const improveResponse = await this.subagentClient.executeSubagent({\n type: 'improve',\n task: `Improvement stage ${stage}: Implement suggested improvements`,\n context: { reviewResult, rootNode },\n });\n\n improveNode.result = improveResponse.result;\n improveNode.status = improveResponse.success ? 'completed' : 'failed';\n\n // Apply improvements to root node\n this.applyImprovements(rootNode, improveNode.result);\n }\n }\n\n return improvements;\n }\n\n /**\n * Helper methods\n */\n\n private generateExecutionId(): string {\n return `rlm-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private async createExecutionFrame(\n executionId: string,\n task: string\n ): Promise<Frame> {\n return this.frameManager.pushFrame({\n name: `RLM: ${task.slice(0, 50)}`,\n type: 'rlm-execution',\n metadata: { executionId },\n });\n }\n\n private async updateExecutionFrame(\n frame: Frame,\n result: ExecutionResult\n ): Promise<void> {\n frame.outputs = [\n {\n type: 'rlm-result',\n content: JSON.stringify(result, null, 2),\n },\n ];\n frame.state = result.success ? 'completed' : 'failed';\n }\n\n private logExecutionTree(node: TaskNode, depth: number = 0): void {\n const indent = ' '.repeat(depth);\n const status =\n node.status === 'completed'\n ? '\u2713'\n : node.status === 'failed'\n ? '\u2717'\n : node.status === 'running'\n ? '\u27F3'\n : '\u25CB';\n\n console.log(`${indent}${status} ${node.description} [${node.agent}]`);\n\n if (node.children) {\n for (const child of node.children) {\n this.logExecutionTree(child, depth + 1);\n }\n }\n }\n\n private parseTaskTree(_response: string): TaskNode {\n // Parse LLM response into structured task tree\n // This would need sophisticated parsing logic\n // For now, return a mock structure\n return {\n id: 'root',\n type: 'sequential',\n description: 'Root task',\n agent: 'planning',\n dependencies: [],\n context: {},\n status: 'pending',\n attempts: 0,\n children: [],\n };\n }\n\n private injectTestGenerationNodes(node: TaskNode, _mode: string): void {\n // Inject test generation nodes based on mode\n if (!node.children) return;\n\n const testNode: TaskNode = {\n id: `${node.id}-test`,\n type: 'task',\n description: `Generate ${_mode} tests for ${node.description}`,\n agent: 'testing',\n dependencies: [node.id],\n context: { testMode: _mode },\n status: 'pending',\n attempts: 0,\n };\n\n node.children.push(testNode);\n }\n\n private injectReviewStages(_node: TaskNode, _stages: number): void {\n // Inject review stages into task tree\n // Implementation would add review nodes at appropriate points\n }\n\n private buildAgentPrompt(node: TaskNode, context: any): string {\n return `\n Task: ${node.description}\n \n Context:\n ${JSON.stringify(context, null, 2)}\n \n Previous Results:\n ${JSON.stringify(\n node.dependencies.map((id) => this.activeExecutions.get(id)?.result),\n null,\n 2\n )}\n \n Please complete this task following your specialized role.\n `;\n }\n\n private estimateTokens(text: string): number {\n // Rough estimation: 1 token \u2248 4 characters\n return Math.ceil(text.length / 4);\n }\n\n private async shareAgentResults(_node: TaskNode): Promise<void> {\n // Share results with other agents via Redis or shared context\n logger.debug('Sharing agent results', { nodeId: _node.id });\n }\n\n private applyImprovements(_rootNode: TaskNode, improvements: any): void {\n // Apply improvements to the task tree\n logger.debug('Applying improvements', { improvements });\n }\n\n private calculateTotalTokens(node: TaskNode): number {\n let total = node.tokens || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalTokens(child);\n }\n }\n return total;\n }\n\n private calculateTotalCost(node: TaskNode): number {\n let total = node.cost || 0;\n if (node.children) {\n for (const child of node.children) {\n total += this.calculateTotalCost(child);\n }\n }\n return total;\n }\n\n private calculateNodeCost(tokens: number, model: string): number {\n // Pricing per 1M tokens (approximate)\n const pricing: Record<string, number> = {\n 'claude-3-5-sonnet-latest': 15.0,\n 'claude-3-5-haiku-latest': 1.0,\n 'claude-3-opus-latest': 75.0,\n };\n return (tokens / 1000000) * (pricing[model] || 10);\n }\n\n private countGeneratedTests(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'testing' && node.result?.tests) {\n count += node.result.tests.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countGeneratedTests(child);\n }\n }\n return count;\n }\n\n private countIssuesFound(node: TaskNode): number {\n let count = 0;\n if (\n (node.agent === 'review' || node.agent === 'linting') &&\n node.result?.issues\n ) {\n count += node.result.issues.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFound(child);\n }\n }\n return count;\n }\n\n private countIssuesFixed(node: TaskNode): number {\n let count = 0;\n if (node.agent === 'improve' && node.result?.fixed) {\n count += node.result.fixed.length;\n }\n if (node.children) {\n for (const child of node.children) {\n count += this.countIssuesFixed(child);\n }\n }\n return count;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }