@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.
- package/README.md +44 -44
- package/dist/cli/claude-sm.js +199 -16
- package/dist/cli/claude-sm.js.map +2 -2
- package/dist/cli/commands/context.js +0 -11
- package/dist/cli/commands/context.js.map +2 -2
- package/dist/cli/commands/linear.js +1 -14
- package/dist/cli/commands/linear.js.map +2 -2
- package/dist/cli/commands/login.js +32 -10
- package/dist/cli/commands/login.js.map +2 -2
- package/dist/cli/commands/migrate.js +80 -22
- package/dist/cli/commands/migrate.js.map +2 -2
- package/dist/cli/commands/model.js +533 -0
- package/dist/cli/commands/model.js.map +7 -0
- package/dist/cli/commands/ralph.js +93 -28
- package/dist/cli/commands/ralph.js.map +2 -2
- package/dist/cli/commands/service.js +10 -3
- package/dist/cli/commands/service.js.map +2 -2
- package/dist/cli/commands/skills.js +60 -10
- package/dist/cli/commands/skills.js.map +2 -2
- package/dist/cli/commands/sms-notify.js +342 -22
- package/dist/cli/commands/sms-notify.js.map +3 -3
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +2 -2
- package/dist/core/context/dual-stack-manager.js +23 -7
- package/dist/core/context/dual-stack-manager.js.map +2 -2
- package/dist/core/context/frame-database.js +33 -5
- package/dist/core/context/frame-database.js.map +2 -2
- package/dist/core/context/frame-digest.js +6 -1
- package/dist/core/context/frame-digest.js.map +2 -2
- package/dist/core/context/frame-manager.js +56 -9
- package/dist/core/context/frame-manager.js.map +2 -2
- package/dist/core/context/permission-manager.js +0 -11
- package/dist/core/context/permission-manager.js.map +2 -2
- package/dist/core/context/recursive-context-manager.js +15 -9
- package/dist/core/context/recursive-context-manager.js.map +2 -2
- package/dist/core/context/shared-context-layer.js +0 -11
- package/dist/core/context/shared-context-layer.js.map +2 -2
- package/dist/core/context/validation.js +6 -1
- package/dist/core/context/validation.js.map +2 -2
- package/dist/core/models/fallback-monitor.js +229 -0
- package/dist/core/models/fallback-monitor.js.map +7 -0
- package/dist/core/models/model-router.js +331 -0
- package/dist/core/models/model-router.js.map +7 -0
- package/dist/hooks/claude-code-whatsapp-hook.js +197 -0
- package/dist/hooks/claude-code-whatsapp-hook.js.map +7 -0
- package/dist/hooks/linear-task-picker.js +1 -1
- package/dist/hooks/linear-task-picker.js.map +2 -2
- package/dist/hooks/schemas.js +55 -1
- package/dist/hooks/schemas.js.map +2 -2
- package/dist/hooks/session-summary.js +5 -1
- package/dist/hooks/session-summary.js.map +2 -2
- package/dist/hooks/sms-action-runner.js +12 -1
- package/dist/hooks/sms-action-runner.js.map +2 -2
- package/dist/hooks/sms-notify.js +4 -2
- package/dist/hooks/sms-notify.js.map +2 -2
- package/dist/hooks/sms-webhook.js +23 -2
- package/dist/hooks/sms-webhook.js.map +2 -2
- package/dist/hooks/whatsapp-commands.js +376 -0
- package/dist/hooks/whatsapp-commands.js.map +7 -0
- package/dist/hooks/whatsapp-scheduler.js +317 -0
- package/dist/hooks/whatsapp-scheduler.js.map +7 -0
- package/dist/hooks/whatsapp-sync.js +375 -0
- package/dist/hooks/whatsapp-sync.js.map +7 -0
- 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({
|
|
672
|
+
testResults.push({
|
|
673
|
+
test: "basic_init",
|
|
674
|
+
status: "passed",
|
|
675
|
+
duration: 0
|
|
676
|
+
});
|
|
672
677
|
} catch (error) {
|
|
673
|
-
console.log(
|
|
674
|
-
|
|
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(
|
|
691
|
+
console.log(
|
|
692
|
+
` \u2705 Resource monitoring: ${usage.activeAgents} agents, ${usage.memoryEstimate}MB`
|
|
693
|
+
);
|
|
680
694
|
passedTests++;
|
|
681
|
-
testResults.push({
|
|
695
|
+
testResults.push({
|
|
696
|
+
test: "resource_monitoring",
|
|
697
|
+
status: "passed",
|
|
698
|
+
data: usage
|
|
699
|
+
});
|
|
682
700
|
} catch (error) {
|
|
683
|
-
console.log(
|
|
684
|
-
|
|
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
|
-
|
|
696
|
-
|
|
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({
|
|
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(
|
|
727
|
-
|
|
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
|
-
|
|
736
|
-
|
|
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
|
|
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(
|
|
749
|
-
|
|
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(
|
|
803
|
+
console.log(
|
|
804
|
+
` \u2705 Git workflow status: ${gitStatus.enabled ? "enabled" : "disabled"}`
|
|
805
|
+
);
|
|
758
806
|
passedTests++;
|
|
759
|
-
testResults.push({
|
|
807
|
+
testResults.push({
|
|
808
|
+
test: "git_workflow",
|
|
809
|
+
status: "passed",
|
|
810
|
+
data: gitStatus
|
|
811
|
+
});
|
|
760
812
|
} catch (error) {
|
|
761
|
-
console.log(
|
|
762
|
-
|
|
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(
|
|
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(
|
|
853
|
+
console.log(
|
|
854
|
+
"\n\u{1F389} All tests passed! Swarm functionality is working correctly."
|
|
855
|
+
);
|
|
793
856
|
} else {
|
|
794
|
-
console.log(
|
|
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) {
|