@stackmemoryai/stackmemory 0.5.30 → 0.5.33

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 (64) hide show
  1. package/README.md +44 -44
  2. package/dist/cli/claude-sm.js +199 -16
  3. package/dist/cli/claude-sm.js.map +2 -2
  4. package/dist/cli/commands/context.js +0 -11
  5. package/dist/cli/commands/context.js.map +2 -2
  6. package/dist/cli/commands/linear.js +1 -14
  7. package/dist/cli/commands/linear.js.map +2 -2
  8. package/dist/cli/commands/login.js +32 -10
  9. package/dist/cli/commands/login.js.map +2 -2
  10. package/dist/cli/commands/migrate.js +80 -22
  11. package/dist/cli/commands/migrate.js.map +2 -2
  12. package/dist/cli/commands/model.js +533 -0
  13. package/dist/cli/commands/model.js.map +7 -0
  14. package/dist/cli/commands/ralph.js +93 -28
  15. package/dist/cli/commands/ralph.js.map +2 -2
  16. package/dist/cli/commands/service.js +10 -3
  17. package/dist/cli/commands/service.js.map +2 -2
  18. package/dist/cli/commands/skills.js +60 -10
  19. package/dist/cli/commands/skills.js.map +2 -2
  20. package/dist/cli/commands/sms-notify.js +342 -22
  21. package/dist/cli/commands/sms-notify.js.map +3 -3
  22. package/dist/cli/index.js +2 -0
  23. package/dist/cli/index.js.map +2 -2
  24. package/dist/core/context/dual-stack-manager.js +23 -7
  25. package/dist/core/context/dual-stack-manager.js.map +2 -2
  26. package/dist/core/context/frame-database.js +33 -5
  27. package/dist/core/context/frame-database.js.map +2 -2
  28. package/dist/core/context/frame-digest.js +6 -1
  29. package/dist/core/context/frame-digest.js.map +2 -2
  30. package/dist/core/context/frame-manager.js +56 -9
  31. package/dist/core/context/frame-manager.js.map +2 -2
  32. package/dist/core/context/permission-manager.js +0 -11
  33. package/dist/core/context/permission-manager.js.map +2 -2
  34. package/dist/core/context/recursive-context-manager.js +15 -9
  35. package/dist/core/context/recursive-context-manager.js.map +2 -2
  36. package/dist/core/context/shared-context-layer.js +0 -11
  37. package/dist/core/context/shared-context-layer.js.map +2 -2
  38. package/dist/core/context/validation.js +6 -1
  39. package/dist/core/context/validation.js.map +2 -2
  40. package/dist/core/models/fallback-monitor.js +229 -0
  41. package/dist/core/models/fallback-monitor.js.map +7 -0
  42. package/dist/core/models/model-router.js +331 -0
  43. package/dist/core/models/model-router.js.map +7 -0
  44. package/dist/hooks/claude-code-whatsapp-hook.js +197 -0
  45. package/dist/hooks/claude-code-whatsapp-hook.js.map +7 -0
  46. package/dist/hooks/linear-task-picker.js +1 -1
  47. package/dist/hooks/linear-task-picker.js.map +2 -2
  48. package/dist/hooks/schemas.js +55 -1
  49. package/dist/hooks/schemas.js.map +2 -2
  50. package/dist/hooks/session-summary.js +5 -1
  51. package/dist/hooks/session-summary.js.map +2 -2
  52. package/dist/hooks/sms-action-runner.js +12 -1
  53. package/dist/hooks/sms-action-runner.js.map +2 -2
  54. package/dist/hooks/sms-notify.js +4 -2
  55. package/dist/hooks/sms-notify.js.map +2 -2
  56. package/dist/hooks/sms-webhook.js +23 -2
  57. package/dist/hooks/sms-webhook.js.map +2 -2
  58. package/dist/hooks/whatsapp-commands.js +376 -0
  59. package/dist/hooks/whatsapp-commands.js.map +7 -0
  60. package/dist/hooks/whatsapp-scheduler.js +317 -0
  61. package/dist/hooks/whatsapp-scheduler.js.map +7 -0
  62. package/dist/hooks/whatsapp-sync.js +375 -0
  63. package/dist/hooks/whatsapp-sync.js.map +7 -0
  64. package/package.json +2 -3
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/commands/model.ts"],
4
+ "sourcesContent": ["/**\n * Model Router CLI Commands\n * Configure model switching between Claude and alternative providers\n */\n\nimport { Command } from 'commander';\nimport chalk from 'chalk';\nimport inquirer from 'inquirer';\nimport {\n loadModelRouterConfig,\n saveModelRouterConfig,\n getModelRouter,\n getFallbackStatus,\n triggerFallback,\n resetFallback,\n type ModelProvider,\n type TaskType,\n type ModelRouterConfig,\n type ModelConfig,\n} from '../../core/models/model-router.js';\n\n/**\n * Create model router command\n */\nexport function createModelCommand(): Command {\n const model = new Command('model')\n .description(\n 'Configure model routing between Claude and alternative providers'\n )\n .addHelpText(\n 'after',\n `\nExamples:\n stackmemory model status Show current model configuration\n stackmemory model enable Enable model routing\n stackmemory model disable Disable model routing (use Claude only)\n stackmemory model route plan qwen Route plan tasks to Qwen\n stackmemory model provider qwen Configure Qwen provider\n stackmemory model thinking Configure thinking mode settings\n`\n );\n\n // Status command\n model\n .command('status')\n .description('Show current model router configuration')\n .action(() => {\n const config = loadModelRouterConfig();\n const router = getModelRouter();\n\n console.log(chalk.cyan('\\nModel Router Status'));\n console.log(chalk.gray('\u2500'.repeat(40)));\n\n console.log(\n ` Enabled: ${config.enabled ? chalk.green('Yes') : chalk.gray('No')}`\n );\n console.log(` Default Provider: ${chalk.white(config.defaultProvider)}`);\n console.log(\n ` Current Provider: ${chalk.white(router.getCurrentProvider())}`\n );\n\n console.log(chalk.cyan('\\nTask Routing'));\n const routes = config.taskRouting;\n console.log(` Plan tasks: ${routes.plan || chalk.gray('(default)')}`);\n console.log(` Think tasks: ${routes.think || chalk.gray('(default)')}`);\n console.log(` Code tasks: ${routes.code || chalk.gray('(default)')}`);\n console.log(\n ` Review tasks: ${routes.review || chalk.gray('(default)')}`\n );\n\n console.log(chalk.cyan('\\nConfigured Providers'));\n for (const [name, provider] of Object.entries(config.providers)) {\n if (provider) {\n const hasKey = process.env[provider.apiKeyEnv]\n ? chalk.green('*')\n : chalk.red('!');\n console.log(` ${hasKey} ${name}: ${provider.model}`);\n if (provider.baseUrl) {\n console.log(chalk.gray(` URL: ${provider.baseUrl}`));\n }\n }\n }\n\n console.log(chalk.cyan('\\nThinking Mode'));\n console.log(\n ` Enabled: ${config.thinkingMode.enabled ? chalk.green('Yes') : chalk.gray('No')}`\n );\n if (config.thinkingMode.budget) {\n console.log(` Budget: ${config.thinkingMode.budget} tokens`);\n }\n if (config.thinkingMode.temperature) {\n console.log(` Temperature: ${config.thinkingMode.temperature}`);\n }\n\n // Fallback status\n console.log(chalk.cyan('\\nFallback (Auto)'));\n const fallbackStatus = getFallbackStatus();\n console.log(\n ` Enabled: ${fallbackStatus.enabled ? chalk.green('Yes') : chalk.gray('No')}`\n );\n if (fallbackStatus.enabled) {\n const keyStatus = fallbackStatus.hasApiKey\n ? chalk.green('ready')\n : chalk.red('no API key');\n console.log(` Provider: ${fallbackStatus.provider} (${keyStatus})`);\n console.log(\n ` Triggers: ${[\n config.fallback?.onRateLimit && 'rate-limit',\n config.fallback?.onError && 'errors',\n config.fallback?.onTimeout && 'timeout',\n ]\n .filter(Boolean)\n .join(', ')}`\n );\n if (fallbackStatus.inFallback) {\n console.log(\n chalk.yellow(` Status: IN FALLBACK (${fallbackStatus.reason})`)\n );\n }\n }\n\n console.log(chalk.gray('\\n* = API key found, ! = API key missing'));\n });\n\n // Enable command\n model\n .command('enable')\n .description('Enable model routing')\n .action(() => {\n const config = loadModelRouterConfig();\n config.enabled = true;\n saveModelRouterConfig(config);\n console.log(chalk.green('[OK] Model routing enabled'));\n });\n\n // Disable command\n model\n .command('disable')\n .description('Disable model routing (use Claude only)')\n .action(() => {\n const config = loadModelRouterConfig();\n config.enabled = false;\n saveModelRouterConfig(config);\n console.log(\n chalk.green('[OK] Model routing disabled (using Claude only)')\n );\n });\n\n // Route command\n model\n .command('route <task> [provider]')\n .description('Route a task type to a specific provider')\n .addHelpText(\n 'after',\n `\nTask types: plan, think, code, review\nProviders: anthropic, qwen, openai, ollama, custom\n\nExamples:\n stackmemory model route plan qwen Route planning to Qwen\n stackmemory model route think qwen Route deep thinking to Qwen\n stackmemory model route plan Clear plan routing (use default)\n`\n )\n .action((task: string, provider?: string) => {\n const validTasks: TaskType[] = ['plan', 'think', 'code', 'review'];\n const validProviders: ModelProvider[] = [\n 'anthropic',\n 'qwen',\n 'openai',\n 'ollama',\n 'custom',\n ];\n\n if (!validTasks.includes(task as TaskType)) {\n console.error(\n chalk.red(`Invalid task type: ${task}. Use: ${validTasks.join(', ')}`)\n );\n process.exit(1);\n }\n\n if (provider && !validProviders.includes(provider as ModelProvider)) {\n console.error(\n chalk.red(\n `Invalid provider: ${provider}. Use: ${validProviders.join(', ')}`\n )\n );\n process.exit(1);\n }\n\n const config = loadModelRouterConfig();\n\n if (provider) {\n config.taskRouting[task as keyof typeof config.taskRouting] =\n provider as ModelProvider;\n saveModelRouterConfig(config);\n console.log(chalk.green(`[OK] ${task} tasks routed to ${provider}`));\n } else {\n delete config.taskRouting[task as keyof typeof config.taskRouting];\n saveModelRouterConfig(config);\n console.log(\n chalk.green(`[OK] ${task} routing cleared (using default)`)\n );\n }\n });\n\n // Provider command\n model\n .command('provider <name>')\n .description('Configure a model provider')\n .option('-m, --model <model>', 'Model name/ID')\n .option('-u, --url <url>', 'Base URL for API')\n .option('-k, --key-env <env>', 'Environment variable for API key')\n .option('-i, --interactive', 'Interactive configuration')\n .action(async (name: string, options) => {\n const validProviders: ModelProvider[] = [\n 'anthropic',\n 'qwen',\n 'openai',\n 'ollama',\n 'custom',\n ];\n\n if (!validProviders.includes(name as ModelProvider)) {\n console.error(\n chalk.red(\n `Invalid provider: ${name}. Use: ${validProviders.join(', ')}`\n )\n );\n process.exit(1);\n }\n\n const config = loadModelRouterConfig();\n\n if (options.interactive) {\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'model',\n message: 'Model name/ID:',\n default:\n config.providers[name as ModelProvider]?.model ||\n getDefaultModel(name),\n },\n {\n type: 'input',\n name: 'baseUrl',\n message: 'Base URL (leave empty for provider default):',\n default:\n config.providers[name as ModelProvider]?.baseUrl ||\n getDefaultUrl(name),\n },\n {\n type: 'input',\n name: 'apiKeyEnv',\n message: 'Environment variable for API key:',\n default:\n config.providers[name as ModelProvider]?.apiKeyEnv ||\n getDefaultKeyEnv(name),\n },\n ]);\n\n const providerConfig: ModelConfig = {\n provider: name as ModelProvider,\n model: answers.model,\n apiKeyEnv: answers.apiKeyEnv,\n };\n\n if (answers.baseUrl) {\n providerConfig.baseUrl = answers.baseUrl;\n }\n\n config.providers[name as ModelProvider] = providerConfig;\n } else {\n // Non-interactive update\n const existing = config.providers[name as ModelProvider] || {\n provider: name as ModelProvider,\n model: getDefaultModel(name),\n apiKeyEnv: getDefaultKeyEnv(name),\n };\n\n if (options.model) existing.model = options.model;\n if (options.url) existing.baseUrl = options.url;\n if (options.keyEnv) existing.apiKeyEnv = options.keyEnv;\n\n config.providers[name as ModelProvider] = existing;\n }\n\n saveModelRouterConfig(config);\n console.log(chalk.green(`[OK] Provider ${name} configured`));\n\n // Show current config\n const provider = config.providers[name as ModelProvider];\n if (provider) {\n console.log(chalk.gray(` Model: ${provider.model}`));\n if (provider.baseUrl) {\n console.log(chalk.gray(` URL: ${provider.baseUrl}`));\n }\n console.log(chalk.gray(` Key env: ${provider.apiKeyEnv}`));\n\n const hasKey = process.env[provider.apiKeyEnv];\n if (!hasKey) {\n console.log(\n chalk.yellow(\n `\\n[WARN] ${provider.apiKeyEnv} not set in environment`\n )\n );\n }\n }\n });\n\n // Thinking command\n model\n .command('thinking')\n .description('Configure thinking mode settings')\n .option('--enable', 'Enable thinking mode')\n .option('--disable', 'Disable thinking mode')\n .option('-b, --budget <tokens>', 'Max thinking tokens', parseInt)\n .option('-t, --temperature <temp>', 'Temperature (0.0-1.0)', parseFloat)\n .option('-p, --top-p <topP>', 'Top P (0.0-1.0)', parseFloat)\n .action((options) => {\n const config = loadModelRouterConfig();\n\n if (options.enable !== undefined) {\n config.thinkingMode.enabled = true;\n }\n if (options.disable !== undefined) {\n config.thinkingMode.enabled = false;\n }\n if (options.budget !== undefined) {\n config.thinkingMode.budget = options.budget;\n }\n if (options.temperature !== undefined) {\n config.thinkingMode.temperature = options.temperature;\n }\n if (options.topP !== undefined) {\n config.thinkingMode.topP = options.topP;\n }\n\n saveModelRouterConfig(config);\n\n console.log(chalk.green('[OK] Thinking mode configured'));\n console.log(chalk.gray(` Enabled: ${config.thinkingMode.enabled}`));\n if (config.thinkingMode.budget) {\n console.log(\n chalk.gray(` Budget: ${config.thinkingMode.budget} tokens`)\n );\n }\n if (config.thinkingMode.temperature) {\n console.log(\n chalk.gray(` Temperature: ${config.thinkingMode.temperature}`)\n );\n }\n if (config.thinkingMode.topP) {\n console.log(chalk.gray(` Top P: ${config.thinkingMode.topP}`));\n }\n });\n\n // Quick setup for Qwen\n model\n .command('setup-qwen')\n .description('Quick setup for Qwen provider (DashScope)')\n .action(async () => {\n console.log(chalk.cyan('\\nQwen Provider Setup'));\n console.log(chalk.gray('\u2500'.repeat(40)));\n console.log(\n chalk.gray(\n 'Qwen3-Max-Thinking supports extended reasoning with thinking mode.'\n )\n );\n console.log(\n chalk.gray('API: https://dashscope.aliyuncs.com/compatible-mode/v1\\n')\n );\n\n const answers = await inquirer.prompt([\n {\n type: 'input',\n name: 'model',\n message: 'Model name:',\n default: 'qwen3-max-2025-01-23',\n },\n {\n type: 'confirm',\n name: 'enableThinking',\n message: 'Enable thinking mode?',\n default: true,\n },\n {\n type: 'number',\n name: 'thinkingBudget',\n message: 'Thinking budget (tokens):',\n default: 10000,\n when: (a: { enableThinking: boolean }) => a.enableThinking,\n },\n {\n type: 'confirm',\n name: 'routePlan',\n message: 'Route plan tasks to Qwen?',\n default: true,\n },\n {\n type: 'confirm',\n name: 'routeThink',\n message: 'Route think tasks to Qwen?',\n default: true,\n },\n ]);\n\n const config = loadModelRouterConfig();\n\n // Configure Qwen provider\n config.providers.qwen = {\n provider: 'qwen',\n model: answers.model,\n baseUrl: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n apiKeyEnv: 'DASHSCOPE_API_KEY',\n params: {\n enable_thinking: answers.enableThinking,\n thinking_budget: answers.thinkingBudget || 10000,\n },\n };\n\n // Configure thinking mode\n if (answers.enableThinking) {\n config.thinkingMode = {\n enabled: true,\n budget: answers.thinkingBudget || 10000,\n temperature: 0.6,\n topP: 0.95,\n };\n }\n\n // Set up routing\n if (answers.routePlan) {\n config.taskRouting.plan = 'qwen';\n }\n if (answers.routeThink) {\n config.taskRouting.think = 'qwen';\n }\n\n config.enabled = true;\n saveModelRouterConfig(config);\n\n console.log(chalk.green('\\n[OK] Qwen provider configured'));\n console.log(chalk.gray(' Model: ' + answers.model));\n console.log(\n chalk.gray(\n ' Thinking mode: ' +\n (answers.enableThinking ? 'Enabled' : 'Disabled')\n )\n );\n\n // Check for API key\n if (!process.env['DASHSCOPE_API_KEY']) {\n console.log(chalk.yellow('\\n[WARN] DASHSCOPE_API_KEY not set'));\n console.log(chalk.gray('Add to your environment:'));\n console.log(chalk.white(' export DASHSCOPE_API_KEY=your-api-key'));\n }\n });\n\n // Default provider command\n model\n .command('default <provider>')\n .description('Set the default provider')\n .action((provider: string) => {\n const validProviders: ModelProvider[] = [\n 'anthropic',\n 'qwen',\n 'openai',\n 'ollama',\n 'custom',\n ];\n\n if (!validProviders.includes(provider as ModelProvider)) {\n console.error(\n chalk.red(\n `Invalid provider: ${provider}. Use: ${validProviders.join(', ')}`\n )\n );\n process.exit(1);\n }\n\n const config = loadModelRouterConfig();\n config.defaultProvider = provider as ModelProvider;\n saveModelRouterConfig(config);\n console.log(chalk.green(`[OK] Default provider set to ${provider}`));\n });\n\n // Fallback command\n model\n .command('fallback')\n .description('Configure automatic fallback to Qwen')\n .option('--enable', 'Enable automatic fallback')\n .option('--disable', 'Disable automatic fallback')\n .option('-p, --provider <provider>', 'Set fallback provider')\n .option('--on-rate-limit', 'Fallback on rate limit (429)')\n .option('--no-rate-limit', 'Disable rate limit fallback')\n .option('--on-error', 'Fallback on server errors (5xx)')\n .option('--no-error', 'Disable error fallback')\n .option('--on-timeout', 'Fallback on timeout')\n .option('--no-timeout', 'Disable timeout fallback')\n .option('--test', 'Test fallback by triggering it manually')\n .option('--reset', 'Reset fallback state (exit fallback mode)')\n .action((options) => {\n const config = loadModelRouterConfig();\n\n // Initialize fallback if not present\n if (!config.fallback) {\n config.fallback = {\n enabled: true,\n provider: 'qwen',\n onRateLimit: true,\n onError: true,\n onTimeout: true,\n maxRetries: 2,\n retryDelayMs: 1000,\n };\n }\n\n // Handle test/reset first\n if (options.test) {\n console.log(chalk.yellow('Testing fallback...'));\n const env = triggerFallback('manual');\n if (Object.keys(env).length > 0) {\n console.log(chalk.green('[OK] Fallback activated'));\n console.log(chalk.gray(` Provider: ${config.fallback.provider}`));\n console.log(chalk.gray(` Model: ${env['ANTHROPIC_MODEL']}`));\n } else {\n console.log(chalk.red('Fallback not available'));\n console.log(chalk.gray(' Check: DASHSCOPE_API_KEY is set'));\n }\n return;\n }\n\n if (options.reset) {\n resetFallback();\n console.log(chalk.green('[OK] Fallback state reset'));\n return;\n }\n\n // Configuration updates\n let updated = false;\n\n if (options.enable !== undefined) {\n config.fallback.enabled = true;\n updated = true;\n }\n if (options.disable !== undefined) {\n config.fallback.enabled = false;\n updated = true;\n }\n if (options.provider) {\n config.fallback.provider = options.provider as ModelProvider;\n updated = true;\n }\n if (options.onRateLimit !== undefined) {\n config.fallback.onRateLimit = true;\n updated = true;\n }\n if (options.rateLimit === false) {\n config.fallback.onRateLimit = false;\n updated = true;\n }\n if (options.onError !== undefined) {\n config.fallback.onError = true;\n updated = true;\n }\n if (options.error === false) {\n config.fallback.onError = false;\n updated = true;\n }\n if (options.onTimeout !== undefined) {\n config.fallback.onTimeout = true;\n updated = true;\n }\n if (options.timeout === false) {\n config.fallback.onTimeout = false;\n updated = true;\n }\n\n if (updated) {\n saveModelRouterConfig(config);\n console.log(chalk.green('[OK] Fallback configuration updated'));\n }\n\n // Show current status\n const status = getFallbackStatus();\n console.log(chalk.cyan('\\nFallback Configuration'));\n console.log(chalk.gray('\u2500'.repeat(30)));\n console.log(\n ` Enabled: ${status.enabled ? chalk.green('Yes') : chalk.gray('No')}`\n );\n console.log(` Provider: ${config.fallback.provider}`);\n console.log(\n ` API Key: ${status.hasApiKey ? chalk.green('Set') : chalk.red('Missing')}`\n );\n console.log(\n ` On Rate Limit: ${config.fallback.onRateLimit ? 'Yes' : 'No'}`\n );\n console.log(` On Error: ${config.fallback.onError ? 'Yes' : 'No'}`);\n console.log(` On Timeout: ${config.fallback.onTimeout ? 'Yes' : 'No'}`);\n\n if (status.inFallback) {\n console.log(\n chalk.yellow(`\\n Currently IN FALLBACK (${status.reason})`)\n );\n }\n\n if (!status.hasApiKey) {\n console.log(chalk.yellow('\\nTo enable Qwen fallback:'));\n console.log(chalk.gray(' export DASHSCOPE_API_KEY=your-api-key'));\n }\n });\n\n // Reset command\n model\n .command('reset')\n .description('Reset model router to defaults')\n .action(async () => {\n const { confirmed } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirmed',\n message: 'Reset model router configuration to defaults?',\n default: false,\n },\n ]);\n\n if (confirmed) {\n const defaultConfig: ModelRouterConfig = {\n enabled: false,\n defaultProvider: 'anthropic',\n taskRouting: {},\n providers: {\n anthropic: {\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n apiKeyEnv: 'ANTHROPIC_API_KEY',\n },\n },\n thinkingMode: {\n enabled: false,\n },\n };\n\n saveModelRouterConfig(defaultConfig);\n console.log(chalk.green('[OK] Model router reset to defaults'));\n } else {\n console.log(chalk.gray('Reset cancelled'));\n }\n });\n\n return model;\n}\n\n// Helper functions for defaults\nfunction getDefaultModel(provider: string): string {\n const defaults: Record<string, string> = {\n anthropic: 'claude-sonnet-4-20250514',\n qwen: 'qwen3-max-2025-01-23',\n openai: 'gpt-4o',\n ollama: 'llama3.2',\n custom: 'custom-model',\n };\n return defaults[provider] || 'unknown';\n}\n\nfunction getDefaultUrl(provider: string): string {\n const defaults: Record<string, string> = {\n qwen: 'https://dashscope.aliyuncs.com/compatible-mode/v1',\n ollama: 'http://localhost:11434/v1',\n };\n return defaults[provider] || '';\n}\n\nfunction getDefaultKeyEnv(provider: string): string {\n const defaults: Record<string, string> = {\n anthropic: 'ANTHROPIC_API_KEY',\n qwen: 'DASHSCOPE_API_KEY',\n openai: 'OPENAI_API_KEY',\n ollama: 'OLLAMA_API_KEY',\n custom: 'CUSTOM_API_KEY',\n };\n return defaults[provider] || 'API_KEY';\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -12,6 +12,7 @@ import { swarmCoordinator } from "../../integrations/ralph/swarm/swarm-coordinat
12
12
  import { ralphDebugger } from "../../integrations/ralph/visualization/ralph-debugger.js";
13
13
  import { existsSync, readFileSync, writeFileSync } from "fs";
14
14
  import { trace } from "../../core/trace/index.js";
15
+ import { SystemError, ErrorCode } from "../../core/errors/index.js";
15
16
  function createRalphCommand() {
16
17
  const ralph = new Command("ralph").description(
17
18
  "Ralph Wiggum Loop integration with StackMemory"
@@ -668,20 +669,44 @@ ${contextResponse.context}`;
668
669
  await swarmCoordinator.forceCleanup();
669
670
  console.log(" \u2705 Basic swarm initialization");
670
671
  passedTests++;
671
- testResults.push({ test: "basic_init", status: "passed", duration: 0 });
672
+ testResults.push({
673
+ test: "basic_init",
674
+ status: "passed",
675
+ duration: 0
676
+ });
672
677
  } catch (error) {
673
- console.log(" \u274C Basic swarm initialization failed:", error.message);
674
- testResults.push({ test: "basic_init", status: "failed", error: error.message });
678
+ console.log(
679
+ " \u274C Basic swarm initialization failed:",
680
+ error.message
681
+ );
682
+ testResults.push({
683
+ test: "basic_init",
684
+ status: "failed",
685
+ error: error.message
686
+ });
675
687
  }
676
688
  totalTests++;
677
689
  try {
678
690
  const usage = swarmCoordinator.getResourceUsage();
679
- console.log(` \u2705 Resource monitoring: ${usage.activeAgents} agents, ${usage.memoryEstimate}MB`);
691
+ console.log(
692
+ ` \u2705 Resource monitoring: ${usage.activeAgents} agents, ${usage.memoryEstimate}MB`
693
+ );
680
694
  passedTests++;
681
- testResults.push({ test: "resource_monitoring", status: "passed", data: usage });
695
+ testResults.push({
696
+ test: "resource_monitoring",
697
+ status: "passed",
698
+ data: usage
699
+ });
682
700
  } catch (error) {
683
- console.log(" \u274C Resource monitoring failed:", error.message);
684
- testResults.push({ test: "resource_monitoring", status: "failed", error: error.message });
701
+ console.log(
702
+ " \u274C Resource monitoring failed:",
703
+ error.message
704
+ );
705
+ testResults.push({
706
+ test: "resource_monitoring",
707
+ status: "failed",
708
+ error: error.message
709
+ });
685
710
  }
686
711
  }
687
712
  if (options.stress) {
@@ -691,10 +716,10 @@ ${contextResponse.context}`;
691
716
  const stressPromises = [];
692
717
  for (let i = 0; i < 3; i++) {
693
718
  stressPromises.push(
694
- swarmCoordinator.launchSwarm(
695
- `Stress test swarm ${i}`,
696
- [{ role: "developer" }, { role: "tester" }]
697
- )
719
+ swarmCoordinator.launchSwarm(`Stress test swarm ${i}`, [
720
+ { role: "developer" },
721
+ { role: "tester" }
722
+ ])
698
723
  );
699
724
  }
700
725
  await Promise.all(stressPromises);
@@ -704,7 +729,11 @@ ${contextResponse.context}`;
704
729
  testResults.push({ test: "stress_parallel", status: "passed" });
705
730
  } catch (error) {
706
731
  console.log(" \u274C Stress test failed:", error.message);
707
- testResults.push({ test: "stress_parallel", status: "failed", error: error.message });
732
+ testResults.push({
733
+ test: "stress_parallel",
734
+ status: "failed",
735
+ error: error.message
736
+ });
708
737
  }
709
738
  }
710
739
  if (options.errorInjection) {
@@ -723,18 +752,24 @@ ${contextResponse.context}`;
723
752
  testResults.push({ test: "error_handling", status: "passed" });
724
753
  }
725
754
  } catch (error) {
726
- console.log(" \u274C Error handling test failed:", error.message);
727
- testResults.push({ test: "error_handling", status: "failed", error: error.message });
755
+ console.log(
756
+ " \u274C Error handling test failed:",
757
+ error.message
758
+ );
759
+ testResults.push({
760
+ test: "error_handling",
761
+ status: "failed",
762
+ error: error.message
763
+ });
728
764
  }
729
765
  }
730
766
  if (options.cleanupTest) {
731
767
  console.log("\n\u{1F9F9} Testing cleanup mechanisms...");
732
768
  totalTests++;
733
769
  try {
734
- await swarmCoordinator.launchSwarm(
735
- "Cleanup test swarm",
736
- [{ role: "developer" }]
737
- );
770
+ await swarmCoordinator.launchSwarm("Cleanup test swarm", [
771
+ { role: "developer" }
772
+ ]);
738
773
  await swarmCoordinator.forceCleanup();
739
774
  const usage = swarmCoordinator.getResourceUsage();
740
775
  if (usage.activeAgents === 0) {
@@ -742,11 +777,22 @@ ${contextResponse.context}`;
742
777
  passedTests++;
743
778
  testResults.push({ test: "cleanup", status: "passed" });
744
779
  } else {
745
- throw new Error(`Cleanup failed: ${usage.activeAgents} agents still active`);
780
+ throw new SystemError(
781
+ `Cleanup failed: ${usage.activeAgents} agents still active`,
782
+ ErrorCode.RESOURCE_EXHAUSTED,
783
+ { activeAgents: usage.activeAgents, test: "cleanup" }
784
+ );
746
785
  }
747
786
  } catch (error) {
748
- console.log(" \u274C Cleanup test failed:", error.message);
749
- testResults.push({ test: "cleanup", status: "failed", error: error.message });
787
+ console.log(
788
+ " \u274C Cleanup test failed:",
789
+ error.message
790
+ );
791
+ testResults.push({
792
+ test: "cleanup",
793
+ status: "failed",
794
+ error: error.message
795
+ });
750
796
  }
751
797
  }
752
798
  if (options.gitTest) {
@@ -754,19 +800,34 @@ ${contextResponse.context}`;
754
800
  totalTests++;
755
801
  try {
756
802
  const gitStatus = swarmCoordinator["gitWorkflowManager"].getGitStatus();
757
- console.log(` \u2705 Git workflow status: ${gitStatus.enabled ? "enabled" : "disabled"}`);
803
+ console.log(
804
+ ` \u2705 Git workflow status: ${gitStatus.enabled ? "enabled" : "disabled"}`
805
+ );
758
806
  passedTests++;
759
- testResults.push({ test: "git_workflow", status: "passed", data: gitStatus });
807
+ testResults.push({
808
+ test: "git_workflow",
809
+ status: "passed",
810
+ data: gitStatus
811
+ });
760
812
  } catch (error) {
761
- console.log(" \u274C Git workflow test failed:", error.message);
762
- testResults.push({ test: "git_workflow", status: "failed", error: error.message });
813
+ console.log(
814
+ " \u274C Git workflow test failed:",
815
+ error.message
816
+ );
817
+ testResults.push({
818
+ test: "git_workflow",
819
+ status: "failed",
820
+ error: error.message
821
+ });
763
822
  }
764
823
  }
765
824
  console.log("\n\u{1F4CA} Test Results Summary:");
766
825
  console.log(` Total tests: ${totalTests}`);
767
826
  console.log(` Passed: ${passedTests} \u2705`);
768
827
  console.log(` Failed: ${totalTests - passedTests} \u274C`);
769
- console.log(` Success rate: ${Math.round(passedTests / totalTests * 100)}%`);
828
+ console.log(
829
+ ` Success rate: ${Math.round(passedTests / totalTests * 100)}%`
830
+ );
770
831
  if (options.report) {
771
832
  const reportPath = ".swarm/test-report.json";
772
833
  const fs = await import("fs");
@@ -789,9 +850,13 @@ ${contextResponse.context}`;
789
850
  console.log(`\u{1F4CB} Detailed report saved to: ${reportPath}`);
790
851
  }
791
852
  if (passedTests === totalTests) {
792
- console.log("\n\u{1F389} All tests passed! Swarm functionality is working correctly.");
853
+ console.log(
854
+ "\n\u{1F389} All tests passed! Swarm functionality is working correctly."
855
+ );
793
856
  } else {
794
- console.log("\n\u26A0\uFE0F Some tests failed. Check the errors above for details.");
857
+ console.log(
858
+ "\n\u26A0\uFE0F Some tests failed. Check the errors above for details."
859
+ );
795
860
  process.exit(1);
796
861
  }
797
862
  } catch (error) {