speexor 0.1.1 → 0.2.1

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 (54) hide show
  1. package/API-REFERENCE.md +96 -1
  2. package/ARCHITECTURE.md +83 -32
  3. package/BENCHMARKS.md +73 -0
  4. package/CHANGELOG.md +59 -4
  5. package/CODE-OF-CONDUCT.md +83 -83
  6. package/CONTRIBUTING.md +92 -97
  7. package/FAQ.md +132 -105
  8. package/GLOSSARY.md +34 -0
  9. package/LICENSE.md +21 -21
  10. package/PUBLISH.md +82 -77
  11. package/README.md +220 -6
  12. package/REFACTOR-LOG.md +40 -40
  13. package/ROADMAP.md +31 -42
  14. package/SECURITY-DEFAULTS.md +118 -0
  15. package/SECURITY.md +80 -79
  16. package/SUMMARY.md +31 -8
  17. package/TESTING.md +140 -140
  18. package/dist/{agent-5D3BVWNK.js → agent-C64T66XT.js} +4 -4
  19. package/dist/agent-C64T66XT.js.map +1 -0
  20. package/dist/{chunk-B7WLHC4W.js → chunk-5OD5UWB5.js} +322 -121
  21. package/dist/chunk-5OD5UWB5.js.map +1 -0
  22. package/dist/chunk-GOGI3JQD.js +1637 -0
  23. package/dist/chunk-GOGI3JQD.js.map +1 -0
  24. package/dist/{chunk-2F66BZYJ.js → chunk-VEZQT5SX.js} +80 -8
  25. package/dist/chunk-VEZQT5SX.js.map +1 -0
  26. package/dist/cli/index.js +2058 -18
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/core/index.d.ts +682 -3
  29. package/dist/core/index.js +1 -1
  30. package/dist/index.d.ts +102 -14
  31. package/dist/index.js +55 -29
  32. package/dist/index.js.map +1 -1
  33. package/dist/plugins/index.d.ts +1 -1
  34. package/dist/plugins/index.js +1 -1
  35. package/dist/types-BOMap-tI.d.ts +389 -0
  36. package/docs/PRD03.md +119 -0
  37. package/docs/PRD06.md +125 -0
  38. package/docs/SETUP.md +94 -94
  39. package/docs/TROUBLESHOOTING.md +113 -113
  40. package/docs/adr/0001-record-architecture-decisions.md +44 -0
  41. package/docs/adr/0002-plugin-architecture.md +53 -0
  42. package/docs/adr/0003-recursive-task-decomposition.md +57 -0
  43. package/docs/adr/0004-local-first-security.md +58 -0
  44. package/docs/adr/0005-data-directory-layout.md +69 -0
  45. package/examples/basic.yaml +61 -61
  46. package/package.json +103 -102
  47. package/schema/config.schema.json +119 -119
  48. package/speexor.config.yaml.example +30 -30
  49. package/dist/agent-5D3BVWNK.js.map +0 -1
  50. package/dist/chunk-2F66BZYJ.js.map +0 -1
  51. package/dist/chunk-B7WLHC4W.js.map +0 -1
  52. package/dist/chunk-SXALZEOJ.js +0 -345
  53. package/dist/chunk-SXALZEOJ.js.map +0 -1
  54. package/dist/types-0q_okI2g.d.ts +0 -205
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/start.ts","../../src/cli/list.ts","../../src/cli/stop.ts","../../src/cli/logs.ts","../../src/cli/config-help.ts","../../src/cli/index.ts"],"names":["chalk","join","existsSync","__dirname","readFileSync"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { stringify } from 'yaml'\nimport { loadConfig, generateDefaultConfig, validateConfig } from '../core/config.js'\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\nimport { loadAllPlugins } from '../plugins/index.js'\nimport { createDashboardServer } from '../dashboard/server.js'\nimport Debug from 'debug'\nimport ora from 'ora'\n\nconst debug = Debug('speexor:start')\n\ninterface StartOptions {\n port?: string\n name?: string\n dashboard?: boolean\n}\n\nexport async function startCommand(repo?: string, options: StartOptions = {}) {\n const cwd = process.cwd()\n const port = parseInt(options.port ?? '3000', 10)\n\n // If repo provided, init new project\n if (repo) {\n const spinner = ora('Initializing Speexor project...').start()\n\n const config = generateDefaultConfig(repo, options.name)\n const configPath = join(cwd, 'speexor.config.yaml')\n\n if (existsSync(configPath)) {\n spinner.warn('speexor.config.yaml already exists — using existing config')\n } else {\n const yaml = stringify(config, { indent: 2 })\n writeFileSync(configPath, yaml, 'utf-8')\n spinner.succeed(`Created speexor.config.yaml at ${configPath}`)\n }\n\n // Create worktrees directory\n const worktreesDir = join(cwd, '.speexor', 'worktrees')\n if (!existsSync(worktreesDir)) {\n mkdirSync(worktreesDir, { recursive: true })\n }\n\n const logsDir = join(cwd, '.speexor', 'logs')\n if (!existsSync(logsDir)) {\n mkdirSync(logsDir, { recursive: true })\n }\n\n spinner.succeed('Project initialized')\n }\n\n // Load config\n try {\n const config = loadConfig(cwd)\n debug(`Loaded config with ${config.projects.length} project(s)`)\n\n // Initialize lifecycle\n const lifecycle = new SpeexorLifecycle(config)\n await lifecycle.initialize()\n\n // Load plugins dynamically\n const spinner = ora('Loading plugins...').start()\n const plugins = loadAllPlugins()\n for (const plugin of plugins) {\n lifecycle.registerPlugin(plugin)\n }\n spinner.succeed(`Loaded ${plugins.length} plugin(s)`)\n\n // Start dashboard if enabled\n if (options.dashboard !== false) {\n const server = createDashboardServer(lifecycle, port)\n server.start()\n console.log(`\\n ✨ Speexor Dashboard: http://localhost:${port}`)\n console.log(` 📋 ${config.projects.length} project(s) configured`)\n console.log(` 🤖 Agents: ${plugins.filter((p) => p.type === 'agent').length} adapter(s) loaded`)\n console.log('\\n Press Ctrl+C to stop\\n')\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log('\\nShutting down...')\n await lifecycle.destroy()\n server.stop()\n process.exit(0)\n }\n\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ✖ Error: ${error.message}\\n`)\n if (!repo) {\n console.log(' Tip: Run `speexor start <repo-url>` first to initialize a project.\\n')\n }\n }\n process.exit(1)\n }\n}\n","import { loadConfig } from '../core/config.js'\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\nimport { loadAllPlugins } from '../plugins/index.js'\nimport chalk from 'chalk'\n\nexport async function listCommand() {\n try {\n const config = loadConfig()\n const lifecycle = new SpeexorLifecycle(config)\n await lifecycle.initialize()\n\n const plugins = loadAllPlugins()\n for (const plugin of plugins) {\n lifecycle.registerPlugin(plugin)\n }\n\n console.log('\\n 📋 Speexor — Active Projects & Agents\\n')\n\n for (const project of config.projects) {\n const statusColor = project.provider.primary === 'opencode' ? chalk.blue : chalk.magenta\n console.log(` ${chalk.bold(project.name)}`)\n console.log(` Repository: ${project.repository}`)\n console.log(` Primary Agent: ${statusColor(project.provider.primary)}`)\n if (project.provider.fallback?.length) {\n console.log(` Fallback: ${project.provider.fallback.join(', ')}`)\n }\n console.log()\n }\n\n const sessions = lifecycle.listSessions()\n if (sessions.length === 0) {\n console.log(` ${chalk.dim('No active agent sessions. Use `speexor agent spawn` to start one.')}\\n`)\n } else {\n for (const session of sessions) {\n console.log(` ${chalk.cyan(session.id)} — ${session.status}`)\n }\n console.log()\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(` ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n","import { loadConfig } from '../core/config.js'\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\nimport { loadAllPlugins } from '../plugins/index.js'\nimport chalk from 'chalk'\n\nexport async function stopCommand(sessionId: string) {\n try {\n const config = loadConfig()\n const lifecycle = new SpeexorLifecycle(config)\n await lifecycle.initialize()\n\n const plugins = loadAllPlugins()\n for (const plugin of plugins) {\n lifecycle.registerPlugin(plugin)\n }\n\n await lifecycle.stopSession(sessionId)\n console.log(`\\n ${chalk.green('✓')} Session ${chalk.bold(sessionId)} stopped\\n`)\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n","import { loadConfig } from '../core/config.js'\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\nimport { loadAllPlugins } from '../plugins/index.js'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport chalk from 'chalk'\n\ninterface LogsOptions {\n follow?: boolean\n lines?: string\n}\n\nexport async function logsCommand(sessionId: string, options: LogsOptions) {\n const numLines = parseInt(options.lines ?? '50', 10)\n const logPath = join(process.cwd(), '.speexor', 'logs', `${sessionId}.log`)\n\n if (!existsSync(logPath)) {\n console.error(`\\n ${chalk.red('✖')} No logs found for session: ${sessionId}\\n`)\n return\n }\n\n try {\n const content = readFileSync(logPath, 'utf-8')\n const lines = content.split('\\n').filter(Boolean)\n const tail = lines.slice(-numLines)\n\n console.log(`\\n 📋 Logs for session ${chalk.bold(sessionId)} (last ${numLines} lines):\\n`)\n for (const line of tail) {\n console.log(` ${line}`)\n }\n console.log()\n\n if (options.follow) {\n console.log(chalk.dim(' (Follow mode — press Ctrl+C to stop)\\n'))\n // In follow mode, we'd tail the file. For now, just show note.\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n","import chalk from 'chalk'\n\nconst CONFIG_HELP = `\n${chalk.bold('speexor.config.yaml Schema Reference')}\n\n${chalk.cyan('version')}\n ${chalk.dim('string, must be \"1\"')}\n\n${chalk.cyan('projects')}\n ${chalk.dim('array of project configurations')}\n\n ${chalk.cyan('projects[].name')}\n ${chalk.dim('string — Project display name')}\n \n ${chalk.cyan('projects[].repository')}\n ${chalk.dim('string — Git repository URL or local path')}\n \n ${chalk.cyan('projects[].path')}\n ${chalk.dim('string (optional) — Local path override')}\n \n ${chalk.cyan('projects[].branch')}\n ${chalk.dim('string (optional) — Default base branch (default: main)')}\n\n ${chalk.cyan('projects[].provider')}\n ${chalk.dim('Provider routing configuration')}\n \n ${chalk.cyan('projects[].provider.primary')}\n ${chalk.dim('string — Primary agent: opencode, claude-code, aider, codex')}\n \n ${chalk.cyan('projects[].provider.fallback')}\n ${chalk.dim('string[] (optional) — Fallback agents in priority order')}\n \n ${chalk.cyan('projects[].provider.concurrentLimit')}\n ${chalk.dim('number (optional) — Max parallel agents for this project (default: 5)')}\n \n ${chalk.cyan('projects[].provider.costLimit')}\n ${chalk.dim('number (optional) — Cost limit in cents per session')}\n\n ${chalk.cyan('projects[].reactions')}\n ${chalk.dim('Reaction rules for CI/PR events')}\n \n ${chalk.cyan('projects[].reactions.ci-failed')}\n ${chalk.cyan('projects[].reactions.changes-requested')}\n ${chalk.cyan('projects[].reactions.approved-and-green')}\n ${chalk.dim('Each reaction has:')}\n ${chalk.dim(' auto: boolean — Auto-trigger reaction')}\n ${chalk.dim(' action: \"fix\" | \"notify\" | \"escalate\" | \"skip\"')}\n ${chalk.dim(' retries: number — Max retry attempts (0-10)')}\n ${chalk.dim(' escalateAfter: number — Minutes before escalation')}\n\n${chalk.bold('Example:')}\n\n${chalk.green(`\nversion: \"1\"\nprojects:\n - name: brainclash\n repository: https://github.com/user/brainclash\n provider:\n primary: opencode\n fallback: [deepseek, claude-code]\n concurrentLimit: 3\n reactions:\n ci-failed:\n auto: true\n action: fix\n retries: 3\n escalateAfter: 30\n changes-requested:\n auto: true\n action: fix\n retries: 2\n escalateAfter: 60\n approved-and-green:\n auto: false\n action: notify\n retries: 0\n escalateAfter: 0\n`)}\n\n${chalk.bold('Commands:')}\n ${chalk.cyan('speexor start [repo-url|path]')}\n ${chalk.dim('Initialize project + start dashboard')}\n ${chalk.cyan('speexor agent spawn --task <id>')}\n ${chalk.dim('Spawn agent for a task')}\n ${chalk.cyan('speexor list')}\n ${chalk.dim('List all projects and active agents')}\n ${chalk.cyan('speexor stop <session-id>')}\n ${chalk.dim('Stop an agent session')}\n ${chalk.cyan('speexor logs <session-id>')}\n ${chalk.dim('View agent session logs')}\n`\n\nexport function configHelpCommand() {\n console.log(CONFIG_HELP)\n}\n","#!/usr/bin/env node\nimport { Command } from 'commander'\nimport { startCommand } from './start.js'\nimport { listCommand } from './list.js'\nimport { stopCommand } from './stop.js'\nimport { logsCommand } from './logs.js'\nimport { configHelpCommand } from './config-help.js'\nimport { readFileSync, existsSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nfunction getVersion(): string {\n try {\n const pkgPath = join(__dirname, '..', '..', 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n return pkg.version ?? '0.1.0'\n }\n } catch {}\n return '0.1.0'\n}\n\nconst program = new Command()\n\nprogram.name('speexor').description('Agent Orchestrator for multi-AI coding agent orchestration (Speexor)').version(getVersion())\n\nprogram\n .command('start [repo]')\n .description('Initialize a project and start the dashboard')\n .option('-p, --port <port>', 'Dashboard port', '3000')\n .option('-n, --name <name>', 'Project name')\n .option('--no-dashboard', 'Skip starting dashboard')\n .action(startCommand)\n\nprogram\n .command('agent')\n .description('Manage agents')\n .addCommand(\n new Command('spawn')\n .description('Spawn a new agent for a task')\n .requiredOption('-t, --task <id>', 'Task ID')\n .option('-a, --agent <type>', 'Agent type (opencode, claude-code, aider, codex)', 'opencode')\n .action(async (opts) => {\n const { agentSpawnCommand } = await import('./agent.js')\n await agentSpawnCommand(opts)\n }),\n )\n\nprogram.command('list').description('List all projects and active agent statuses').action(listCommand)\n\nprogram.command('stop <session-id>').description('Stop an agent session safely').action(stopCommand)\n\nprogram\n .command('logs <session-id>')\n .description('Tail logs for an agent session')\n .option('-f, --follow', 'Follow log output')\n .option('-n, --lines <count>', 'Number of lines', '50')\n .action(logsCommand)\n\nprogram.command('config-help').description('Show full config schema reference').action(configHelpCommand)\n\nprogram.parse(process.argv)\n"]}
1
+ {"version":3,"sources":["../../src/cli/start.ts","../../src/cli/list.ts","../../src/cli/stop.ts","../../src/cli/logs.ts","../../src/cli/config-help.ts","../../src/task-graph/store.ts","../../src/task-graph/graph.ts","../../src/planner/decomposer.ts","../../src/planner/engine.ts","../../src/cli/task.ts","../../src/extension-manager/marketplace.ts","../../src/extension-manager/extension-manifest.ts","../../src/extension-manager/permission-view.ts","../../src/extension-manager/registry.ts","../../src/cli/ext.ts","../../src/config-migration/registry.ts","../../src/config-migration/migrations.ts","../../src/config-migration/engine.ts","../../src/cli/config-validate.ts","../../src/eval/decision-log.ts","../../src/eval/calibration.ts","../../src/eval/evaluator.ts","../../src/cli/eval-commands.ts","../../src/cli/index.ts"],"names":["chalk","join","existsSync","debug","Debug","mkdirSync","readFileSync","writeFileSync","resolve","copyFileSync","stringify","parse","__dirname","dirname"],"mappings":"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","file":"index.js","sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { execSync } from 'node:child_process'\nimport { stringify } from 'yaml'\nimport { loadConfig, generateDefaultConfig } from '../core/config.js'\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\nimport { loadAllPlugins } from '../plugins/index.js'\nimport { createDashboardServer } from '../dashboard/server.js'\nimport Debug from 'debug'\nimport ora from 'ora'\n\nconst debug = Debug('speexor:start')\n\ninterface StartOptions {\n port?: string\n name?: string\n dashboard?: boolean\n}\n\nexport async function startCommand(repo?: string, options: StartOptions = {}) {\n const cwd = process.cwd()\n const port = parseInt(options.port ?? '7777', 10)\n\n const ensureDir = (dir: string) => {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n }\n\n // If repo provided, init new project\n if (repo) {\n const spinner = ora('Initializing Speexor project...').start()\n\n const config = generateDefaultConfig(repo, options.name)\n const configPath = join(cwd, 'speexor.config.yaml')\n\n if (existsSync(configPath)) {\n spinner.warn('speexor.config.yaml already exists — using existing config')\n } else {\n const yaml = stringify(config, { indent: 2 })\n writeFileSync(configPath, yaml, 'utf-8')\n spinner.succeed(`Created speexor.config.yaml at ${configPath}`)\n }\n\n // Create worktrees directory\n ensureDir(join(cwd, '.speexor', 'worktrees'))\n ensureDir(join(cwd, '.speexor', 'logs'))\n\n spinner.succeed('Project initialized')\n } else {\n // No repo arg — try to detect from current git repo\n let repoUrl: string | undefined\n try {\n repoUrl = execSync('git remote get-url origin', { encoding: 'utf-8', cwd }).trim()\n } catch {\n // Not a git repo or no remote\n }\n\n if (repoUrl) {\n const configPath = join(cwd, 'speexor.config.yaml')\n if (!existsSync(configPath)) {\n const spinner = ora('Detected git repo — auto-generating config...').start()\n const config = generateDefaultConfig(repoUrl, options.name)\n const yaml = stringify(config, { indent: 2 })\n writeFileSync(configPath, yaml, 'utf-8')\n ensureDir(join(cwd, '.speexor', 'worktrees'))\n ensureDir(join(cwd, '.speexor', 'logs'))\n spinner.succeed(`Created speexor.config.yaml at ${configPath}`)\n }\n }\n }\n\n // Load config\n try {\n const config = loadConfig(cwd)\n debug(`Loaded config with ${config.projects.length} project(s)`)\n\n // Initialize lifecycle\n const lifecycle = new SpeexorLifecycle(config)\n await lifecycle.initialize()\n\n // Load plugins dynamically\n const spinner = ora('Loading plugins...').start()\n const plugins = loadAllPlugins()\n for (const plugin of plugins) {\n lifecycle.registerPlugin(plugin)\n }\n spinner.succeed(`Loaded ${plugins.length} plugin(s)`)\n\n // Start dashboard if enabled\n if (options.dashboard !== false) {\n const server = createDashboardServer(lifecycle, port)\n server.start()\n console.log(`\\n ✨ Speexor Dashboard: http://localhost:${port}`)\n console.log(` 📋 ${config.projects.length} project(s) configured`)\n console.log(` 🤖 Agents: ${plugins.filter((p) => p.type === 'agent').length} adapter(s) loaded`)\n console.log('\\n Press Ctrl+C to stop\\n')\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log('\\nShutting down...')\n await lifecycle.destroy()\n server.stop()\n process.exit(0)\n }\n\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ✖ Error: ${error.message}\\n`)\n if (!repo) {\n console.log(' Tip: Run `speexor start <repo-url>` to initialize a project, or run from a git repository.\\n')\n }\n }\n process.exit(1)\n }\n}\n","import { loadConfig } from '../core/config.js'\r\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\r\nimport { loadAllPlugins } from '../plugins/index.js'\r\nimport chalk from 'chalk'\r\n\r\nexport async function listCommand() {\r\n try {\r\n const config = loadConfig()\r\n const lifecycle = new SpeexorLifecycle(config)\r\n await lifecycle.initialize()\r\n\r\n const plugins = loadAllPlugins()\r\n for (const plugin of plugins) {\r\n lifecycle.registerPlugin(plugin)\r\n }\r\n\r\n console.log('\\n 📋 Speexor — Active Projects & Agents\\n')\r\n\r\n for (const project of config.projects) {\r\n const statusColor = project.provider.primary === 'opencode' ? chalk.blue : chalk.magenta\r\n console.log(` ${chalk.bold(project.name)}`)\r\n console.log(` Repository: ${project.repository}`)\r\n console.log(` Primary Agent: ${statusColor(project.provider.primary)}`)\r\n if (project.provider.fallback?.length) {\r\n console.log(` Fallback: ${project.provider.fallback.join(', ')}`)\r\n }\r\n console.log()\r\n }\r\n\r\n const sessions = lifecycle.listSessions()\r\n if (sessions.length === 0) {\r\n console.log(` ${chalk.dim('No active agent sessions. Use `speexor agent spawn` to start one.')}\\n`)\r\n } else {\r\n for (const session of sessions) {\r\n console.log(` ${chalk.cyan(session.id)} — ${session.status}`)\r\n }\r\n console.log()\r\n }\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n console.error(` ${chalk.red('✖')} ${error.message}\\n`)\r\n }\r\n }\r\n}\r\n","import { loadConfig } from '../core/config.js'\r\nimport { SpeexorLifecycle } from '../core/lifecycle.js'\r\nimport { loadAllPlugins } from '../plugins/index.js'\r\nimport chalk from 'chalk'\r\n\r\nexport async function stopCommand(sessionId: string) {\r\n try {\r\n const config = loadConfig()\r\n const lifecycle = new SpeexorLifecycle(config)\r\n await lifecycle.initialize()\r\n\r\n const plugins = loadAllPlugins()\r\n for (const plugin of plugins) {\r\n lifecycle.registerPlugin(plugin)\r\n }\r\n\r\n await lifecycle.stopSession(sessionId)\r\n console.log(`\\n ${chalk.green('✓')} Session ${chalk.bold(sessionId)} stopped\\n`)\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\r\n }\r\n }\r\n}\r\n","import { readFileSync, existsSync } from 'node:fs'\nimport { join } from 'node:path'\nimport chalk from 'chalk'\n\ninterface LogsOptions {\n follow?: boolean\n lines?: string\n}\n\nexport async function logsCommand(sessionId: string, options: LogsOptions) {\n const numLines = parseInt(options.lines ?? '50', 10)\n const logPath = join(process.cwd(), '.speexor', 'logs', `${sessionId}.log`)\n\n if (!existsSync(logPath)) {\n console.error(`\\n ${chalk.red('✖')} No logs found for session: ${sessionId}\\n`)\n return\n }\n\n try {\n const content = readFileSync(logPath, 'utf-8')\n const lines = content.split('\\n').filter(Boolean)\n const tail = lines.slice(-numLines)\n\n console.log(`\\n 📋 Logs for session ${chalk.bold(sessionId)} (last ${numLines} lines):\\n`)\n for (const line of tail) {\n console.log(` ${line}`)\n }\n console.log()\n\n if (options.follow) {\n console.log(chalk.dim(' (Follow mode — press Ctrl+C to stop)\\n'))\n // In follow mode, we'd tail the file. For now, just show note.\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n","import chalk from 'chalk'\r\n\r\nconst CONFIG_HELP = `\r\n${chalk.bold('speexor.config.yaml Schema Reference')}\r\n\r\n${chalk.cyan('version')}\r\n ${chalk.dim('string, must be \"1\"')}\r\n\r\n${chalk.cyan('projects')}\r\n ${chalk.dim('array of project configurations')}\r\n\r\n ${chalk.cyan('projects[].name')}\r\n ${chalk.dim('string — Project display name')}\r\n \r\n ${chalk.cyan('projects[].repository')}\r\n ${chalk.dim('string — Git repository URL or local path')}\r\n \r\n ${chalk.cyan('projects[].path')}\r\n ${chalk.dim('string (optional) — Local path override')}\r\n \r\n ${chalk.cyan('projects[].branch')}\r\n ${chalk.dim('string (optional) — Default base branch (default: main)')}\r\n\r\n ${chalk.cyan('projects[].provider')}\r\n ${chalk.dim('Provider routing configuration')}\r\n \r\n ${chalk.cyan('projects[].provider.primary')}\r\n ${chalk.dim('string — Primary agent: opencode, claude-code, aider, codex')}\r\n \r\n ${chalk.cyan('projects[].provider.fallback')}\r\n ${chalk.dim('string[] (optional) — Fallback agents in priority order')}\r\n \r\n ${chalk.cyan('projects[].provider.concurrentLimit')}\r\n ${chalk.dim('number (optional) — Max parallel agents for this project (default: 5)')}\r\n \r\n ${chalk.cyan('projects[].provider.costLimit')}\r\n ${chalk.dim('number (optional) — Cost limit in cents per session')}\r\n\r\n ${chalk.cyan('projects[].reactions')}\r\n ${chalk.dim('Reaction rules for CI/PR events')}\r\n \r\n ${chalk.cyan('projects[].reactions.ci-failed')}\r\n ${chalk.cyan('projects[].reactions.changes-requested')}\r\n ${chalk.cyan('projects[].reactions.approved-and-green')}\r\n ${chalk.dim('Each reaction has:')}\r\n ${chalk.dim(' auto: boolean — Auto-trigger reaction')}\r\n ${chalk.dim(' action: \"fix\" | \"notify\" | \"escalate\" | \"skip\"')}\r\n ${chalk.dim(' retries: number — Max retry attempts (0-10)')}\r\n ${chalk.dim(' escalateAfter: number — Minutes before escalation')}\r\n\r\n${chalk.bold('Example:')}\r\n\r\n${chalk.green(`\r\nversion: \"1\"\r\nprojects:\r\n - name: brainclash\r\n repository: https://github.com/user/brainclash\r\n provider:\r\n primary: opencode\r\n fallback: [deepseek, claude-code]\r\n concurrentLimit: 3\r\n reactions:\r\n ci-failed:\r\n auto: true\r\n action: fix\r\n retries: 3\r\n escalateAfter: 30\r\n changes-requested:\r\n auto: true\r\n action: fix\r\n retries: 2\r\n escalateAfter: 60\r\n approved-and-green:\r\n auto: false\r\n action: notify\r\n retries: 0\r\n escalateAfter: 1\r\n`)}\r\n\r\n${chalk.bold('Commands:')}\r\n ${chalk.cyan('speexor start [repo-url|path]')}\r\n ${chalk.dim('Initialize project + start dashboard')}\r\n ${chalk.cyan('speexor agent spawn --task <id>')}\r\n ${chalk.dim('Spawn agent for a task')}\r\n ${chalk.cyan('speexor list')}\r\n ${chalk.dim('List all projects and active agents')}\r\n ${chalk.cyan('speexor stop <session-id>')}\r\n ${chalk.dim('Stop an agent session')}\r\n ${chalk.cyan('speexor logs <session-id>')}\r\n ${chalk.dim('View agent session logs')}\r\n`\r\n\r\nexport function configHelpCommand() {\r\n console.log(CONFIG_HELP)\r\n}\r\n","import { join } from 'node:path'\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\r\nimport type { TaskGraph, TaskNode, TaskNodeStatus } from '../core/types.js'\r\nimport Debug from 'debug'\r\n\r\nconst debug = Debug('speexor:task-graph:store')\r\n\r\ntype GraphRow = {\r\n id: string\r\n root_task_id: string\r\n project_name: string\r\n status: string\r\n created_at: string\r\n updated_at: string\r\n}\r\n\r\ntype NodeRow = {\r\n id: string\r\n graph_id: string\r\n title: string\r\n description: string | null\r\n status: string\r\n parent_id: string | null\r\n depth: string\r\n depends_on: string\r\n created_by: string\r\n created_by_agent_id: string | null\r\n assigned_agent_id: string | null\r\n worktree_path: string | null\r\n skills_used: string\r\n commands_executed: string\r\n result_json: string | null\r\n proposed_by: string | null\r\n proposed_reason: string | null\r\n created_at: string\r\n updated_at: string\r\n}\r\n\r\nexport class TaskGraphStore {\r\n private db: any\r\n private dbPath: string\r\n\r\n private constructor(db: any, dbPath: string) {\r\n this.db = db\r\n this.dbPath = dbPath\r\n }\r\n\r\n static async create(dbPath?: string): Promise<TaskGraphStore> {\r\n const { default: initSqlJs } = await import('sql.js')\r\n const SQL = await initSqlJs()\r\n\r\n const dir = dbPath ?? join(process.cwd(), '.speexor')\r\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\r\n\r\n const fullPath = join(dir, 'task-graph.sqlite')\r\n\r\n let db: any\r\n if (existsSync(fullPath)) {\r\n const buffer = readFileSync(fullPath)\r\n db = new SQL.Database(buffer)\r\n } else {\r\n db = new SQL.Database()\r\n }\r\n\r\n const store = new TaskGraphStore(db, fullPath)\r\n store.initialize()\r\n return store\r\n }\r\n\r\n private initialize(): void {\r\n this.db.exec(`\r\n CREATE TABLE IF NOT EXISTS task_graphs (\r\n id TEXT PRIMARY KEY,\r\n root_task_id TEXT NOT NULL,\r\n project_name TEXT NOT NULL,\r\n status TEXT NOT NULL DEFAULT 'decomposing',\r\n created_at TEXT NOT NULL,\r\n updated_at TEXT NOT NULL\r\n );\r\n\r\n CREATE TABLE IF NOT EXISTS task_nodes (\r\n id TEXT PRIMARY KEY,\r\n graph_id TEXT NOT NULL,\r\n title TEXT NOT NULL,\r\n description TEXT,\r\n status TEXT NOT NULL DEFAULT 'pending',\r\n parent_id TEXT,\r\n depth INTEGER NOT NULL DEFAULT 0,\r\n depends_on TEXT DEFAULT '[]',\r\n created_by TEXT NOT NULL DEFAULT 'user',\r\n created_by_agent_id TEXT,\r\n assigned_agent_id TEXT,\r\n worktree_path TEXT,\r\n skills_used TEXT DEFAULT '[]',\r\n commands_executed TEXT DEFAULT '[]',\r\n result_json TEXT,\r\n proposed_by TEXT,\r\n proposed_reason TEXT,\r\n created_at TEXT NOT NULL,\r\n updated_at TEXT NOT NULL,\r\n FOREIGN KEY (graph_id) REFERENCES task_graphs(id)\r\n );\r\n\r\n CREATE INDEX IF NOT EXISTS idx_nodes_graph ON task_nodes(graph_id);\r\n CREATE INDEX IF NOT EXISTS idx_nodes_status ON task_nodes(status);\r\n CREATE INDEX IF NOT EXISTS idx_nodes_parent ON task_nodes(parent_id);\r\n `)\r\n debug('Task Graph SQLite store initialized')\r\n }\r\n\r\n private save(): void {\r\n const data = this.db.export()\r\n writeFileSync(this.dbPath, Buffer.from(data))\r\n }\r\n\r\n private queryOne(sql: string, params?: (string | number | null)[]): Record<string, unknown> | undefined {\r\n const stmt = this.db.prepare(sql)\r\n if (params) stmt.bind(params)\r\n try {\r\n if (stmt.step()) {\r\n return stmt.getAsObject()\r\n }\r\n return undefined\r\n } finally {\r\n stmt.free()\r\n }\r\n }\r\n\r\n private queryAll(sql: string, params?: (string | number | null)[]): Record<string, unknown>[] {\r\n const stmt = this.db.prepare(sql)\r\n if (params) stmt.bind(params)\r\n const rows: Record<string, unknown>[] = []\r\n try {\r\n while (stmt.step()) {\r\n rows.push(stmt.getAsObject())\r\n }\r\n return rows\r\n } finally {\r\n stmt.free()\r\n }\r\n }\r\n\r\n createGraph(projectName: string, rootTask: TaskNode): TaskGraph {\r\n const graph: TaskGraph = {\r\n id: `tg-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\r\n rootTaskId: rootTask.id,\r\n projectName,\r\n nodes: new Map([[rootTask.id, rootTask]]),\r\n status: 'decomposing',\r\n createdAt: new Date(),\r\n updatedAt: new Date(),\r\n }\r\n\r\n this.db.run('BEGIN')\r\n try {\r\n this.db.run(`INSERT INTO task_graphs (id, root_task_id, project_name, status, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)`, [\r\n graph.id,\r\n graph.rootTaskId,\r\n graph.projectName,\r\n graph.status,\r\n graph.createdAt.toISOString(),\r\n graph.updatedAt.toISOString(),\r\n ])\r\n this.insertNode(graph.id, rootTask)\r\n this.db.run('COMMIT')\r\n this.save()\r\n } catch (e) {\r\n this.db.run('ROLLBACK')\r\n throw e\r\n }\r\n\r\n return graph\r\n }\r\n\r\n private insertNode(graphId: string, node: TaskNode): void {\r\n this.db.run(\r\n `INSERT OR REPLACE INTO task_nodes (id, graph_id, title, description, status, parent_id, depth, depends_on, created_by, created_by_agent_id, assigned_agent_id, worktree_path, skills_used, commands_executed, result_json, proposed_by, proposed_reason, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\r\n [\r\n node.id,\r\n graphId,\r\n node.title,\r\n node.description,\r\n node.status,\r\n node.parentId,\r\n node.depth,\r\n JSON.stringify(node.dependsOn),\r\n node.createdBy,\r\n node.createdByAgentId ?? null,\r\n node.assignedAgentId ?? null,\r\n node.worktreePath ?? null,\r\n JSON.stringify(node.skillsUsed),\r\n JSON.stringify(node.commandsExecuted),\r\n node.result ? JSON.stringify(node.result) : null,\r\n node.proposedBy ?? null,\r\n node.proposedReason ?? null,\r\n node.createdAt.toISOString(),\r\n node.updatedAt.toISOString(),\r\n ],\r\n )\r\n }\r\n\r\n getGraph(graphId: string): TaskGraph | null {\r\n const graphRow = this.queryOne('SELECT * FROM task_graphs WHERE id = ?', [graphId]) as GraphRow | undefined\r\n if (!graphRow) return null\r\n\r\n const nodeRows = this.queryAll('SELECT * FROM task_nodes WHERE graph_id = ?', [graphId]) as NodeRow[]\r\n\r\n const nodes = new Map<string, TaskNode>()\r\n for (const row of nodeRows) {\r\n nodes.set(row.id, this.rowToNode(row))\r\n }\r\n\r\n return {\r\n id: graphRow.id,\r\n rootTaskId: graphRow.root_task_id,\r\n projectName: graphRow.project_name,\r\n nodes,\r\n status: graphRow.status as TaskGraph['status'],\r\n createdAt: new Date(graphRow.created_at),\r\n updatedAt: new Date(graphRow.updated_at),\r\n }\r\n }\r\n\r\n private rowToNode(row: NodeRow): TaskNode {\r\n return {\r\n id: row.id,\r\n title: row.title,\r\n description: row.description ?? '',\r\n status: row.status as TaskNodeStatus,\r\n parentId: row.parent_id ?? null,\r\n depth: Number.parseInt(row.depth),\r\n dependsOn: JSON.parse(row.depends_on ?? '[]'),\r\n createdBy: row.created_by as TaskNode['createdBy'],\r\n createdByAgentId: row.created_by_agent_id ?? undefined,\r\n assignedAgentId: row.assigned_agent_id ?? null,\r\n worktreePath: row.worktree_path ?? null,\r\n skillsUsed: JSON.parse(row.skills_used ?? '[]'),\r\n commandsExecuted: JSON.parse(row.commands_executed ?? '[]'),\r\n result: row.result_json ? JSON.parse(row.result_json) : undefined,\r\n proposedBy: row.proposed_by ?? undefined,\r\n proposedReason: row.proposed_reason ?? undefined,\r\n createdAt: new Date(row.created_at),\r\n updatedAt: new Date(row.updated_at),\r\n }\r\n }\r\n\r\n updateNodeStatus(nodeId: string, status: TaskNodeStatus): void {\r\n this.db.run('UPDATE task_nodes SET status = ?, updated_at = ? WHERE id = ?', [status, new Date().toISOString(), nodeId])\r\n this.save()\r\n }\r\n\r\n updateNodeResult(nodeId: string, result: TaskNode['result']): void {\r\n this.db.run('UPDATE task_nodes SET result_json = ?, updated_at = ? WHERE id = ?', [\r\n JSON.stringify(result),\r\n new Date().toISOString(),\r\n nodeId,\r\n ])\r\n this.save()\r\n }\r\n\r\n addNode(graphId: string, node: TaskNode): void {\r\n this.insertNode(graphId, node)\r\n this.save()\r\n }\r\n\r\n getReadyNodes(graphId: string): TaskNode[] {\r\n const rows = this.queryAll('SELECT * FROM task_nodes WHERE graph_id = ? AND status = ?', [graphId, 'ready']) as NodeRow[]\r\n return rows.map((r) => this.rowToNode(r))\r\n }\r\n\r\n getNodesByStatus(graphId: string, status: TaskNodeStatus): TaskNode[] {\r\n const rows = this.queryAll('SELECT * FROM task_nodes WHERE graph_id = ? AND status = ?', [graphId, status]) as NodeRow[]\r\n return rows.map((r) => this.rowToNode(r))\r\n }\r\n\r\n updateGraphStatus(graphId: string, status: TaskGraph['status']): void {\r\n this.db.run('UPDATE task_graphs SET status = ?, updated_at = ? WHERE id = ?', [status, new Date().toISOString(), graphId])\r\n this.save()\r\n }\r\n\r\n assignAgent(nodeId: string, agentId: string): void {\r\n this.db.run('UPDATE task_nodes SET assigned_agent_id = ?, updated_at = ? WHERE id = ?', [agentId, new Date().toISOString(), nodeId])\r\n this.save()\r\n }\r\n\r\n close(): void {\r\n this.save()\r\n this.db.close()\r\n }\r\n}\r\n","import type { TaskNode, TaskGraph } from '../core/types.js'\n\nexport class TaskGraphManager {\n private graph: TaskGraph\n\n constructor(graph: TaskGraph) {\n this.graph = graph\n }\n\n getGraph(): TaskGraph {\n return this.graph\n }\n\n getNode(nodeId: string): TaskNode | undefined {\n return this.graph.nodes.get(nodeId)\n }\n\n addNode(node: TaskNode): void {\n this.graph.nodes.set(node.id, node)\n this.graph.updatedAt = new Date()\n }\n\n updateNodeStatus(nodeId: string, status: TaskNode['status']): void {\n const node = this.graph.nodes.get(nodeId)\n if (node) {\n node.status = status\n node.updatedAt = new Date()\n this.graph.updatedAt = new Date()\n\n if (status === 'failed') {\n this.blockDependents(nodeId)\n }\n }\n }\n\n private blockDependents(nodeId: string): void {\n for (const [, node] of this.graph.nodes) {\n if (node.dependsOn.includes(nodeId) && node.status === 'pending') {\n node.status = 'blocked'\n node.updatedAt = new Date()\n }\n }\n }\n\n /** Get topologically sorted list of nodes */\n topologicalSort(): TaskNode[] {\n const visited = new Set<string>()\n const result: TaskNode[] = []\n\n const visit = (nodeId: string) => {\n if (visited.has(nodeId)) return\n visited.add(nodeId)\n const node = this.graph.nodes.get(nodeId)\n if (!node) return\n\n for (const depId of node.dependsOn) {\n visit(depId)\n }\n result.push(node)\n }\n\n visit(this.graph.rootTaskId)\n\n for (const [id] of this.graph.nodes) {\n if (!visited.has(id)) visit(id)\n }\n\n return result\n }\n\n /** Get nodes that are ready to execute (all dependencies done) */\n getReadyNodes(): TaskNode[] {\n const ready: TaskNode[] = []\n\n for (const [, node] of this.graph.nodes) {\n if (node.status !== 'pending') continue\n\n const allDepsDone = node.dependsOn.every((depId) => {\n const dep = this.graph.nodes.get(depId)\n return dep?.status === 'done'\n })\n\n if (allDepsDone) {\n ready.push(node)\n }\n }\n\n return ready\n }\n\n /** Validate the DAG has no cycles */\n validateDag(): { valid: boolean; cycle?: string[] } {\n const visited = new Set<string>()\n const recStack = new Set<string>()\n\n const dfs = (nodeId: string, path: string[]): string[] | null => {\n visited.add(nodeId)\n recStack.add(nodeId)\n path.push(nodeId)\n\n const node = this.graph.nodes.get(nodeId)\n if (node) {\n for (const depId of node.dependsOn) {\n if (!visited.has(depId)) {\n const result = dfs(depId, [...path])\n if (result) return result\n } else if (recStack.has(depId)) {\n const cycleStart = path.indexOf(depId)\n return path.slice(cycleStart)\n }\n }\n }\n\n recStack.delete(nodeId)\n return null\n }\n\n for (const [id] of this.graph.nodes) {\n if (!visited.has(id)) {\n const cycle = dfs(id, [])\n if (cycle) return { valid: false, cycle }\n }\n }\n\n return { valid: true }\n }\n\n /** Get all leaf nodes (no dependents) */\n getLeafNodes(): TaskNode[] {\n const hasDependents = new Set<string>()\n\n for (const [, node] of this.graph.nodes) {\n for (const depId of node.dependsOn) {\n hasDependents.add(depId)\n }\n }\n\n return Array.from(this.graph.nodes.values()).filter((n) => !hasDependents.has(n.id))\n }\n\n /** Get depth of a node from root */\n getNodeDepth(nodeId: string): number {\n let depth = 0\n let current = this.graph.nodes.get(nodeId)\n while (current?.parentId) {\n depth++\n current = this.graph.nodes.get(current.parentId)\n }\n return depth\n }\n\n /** Check if the graph is complete */\n isComplete(): boolean {\n for (const [, node] of this.graph.nodes) {\n if (node.status !== 'done' && node.status !== 'failed') return false\n }\n return true\n }\n\n /** Check if all nodes are terminal (done or failed) */\n allTerminal(): boolean {\n for (const [, node] of this.graph.nodes) {\n if (node.status !== 'done' && node.status !== 'failed') return false\n }\n return true\n }\n}\n","import type { TaskNode, DecompositionConfig } from \"../core/types.js\";\n\nexport interface DecomposedSubtask {\n\ttitle: string;\n\tdescription: string;\n\tdependsOn: string[];\n}\n\nexport interface DecompositionResult {\n\tsubtasks: DecomposedSubtask[];\n\tisValid: boolean;\n\twarnings: string[];\n}\n\nexport class TaskDecomposer {\n\tprivate config: DecompositionConfig;\n\n\tconstructor(config: DecompositionConfig) {\n\t\tthis.config = config;\n\t}\n\n\tcreateDecompositionPrompt(task: TaskNode): string {\n\t\treturn `You are a task decomposition engine. Break down the following software engineering task into smaller, executable subtasks.\n\nROOT TASK: ${task.title}\nDESCRIPTION: ${task.description}\n\nRULES:\n- Each subtask must be scoped to a single concern (e.g., \"Create database schema\", not \"Build the feature\")\n- Maximum depth: ${this.config.maxTaskGraphDepth}\n- Maximum nodes per graph: ${this.config.maxNodesPerGraph}\n- Identify dependencies between subtasks (e.g., \"schema\" must be done before \"API endpoints\")\n- Each subtask should be completable independently\n\nOUTPUT FORMAT (JSON only):\n{\n \"subtasks\": [\n {\n \"title\": \"Short task title\",\n \"description\": \"What to do, acceptance criteria, files likely involved\",\n \"dependsOn\": [\"title of task this depends on\"]\n }\n ]\n}\n\nOutput ONLY valid JSON, no explanation.`;\n\t}\n\n\tparseDecompositionResponse(llmResponse: string): DecompositionResult {\n\t\ttry {\n\t\t\tlet jsonStr = llmResponse.trim();\n\t\t\tif (jsonStr.startsWith(\"```\")) {\n\t\t\t\tjsonStr = jsonStr.replace(/```(?:json)?\\n?/g, \"\").trim();\n\t\t\t}\n\n\t\t\tconst parsed = JSON.parse(jsonStr);\n\t\t\tconst subtasks = parsed.subtasks as DecomposedSubtask[];\n\n\t\t\tif (!Array.isArray(subtasks) || subtasks.length === 0) {\n\t\t\t\treturn {\n\t\t\t\t\tsubtasks: [],\n\t\t\t\t\tisValid: false,\n\t\t\t\t\twarnings: [\"No subtasks found in response\"],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (subtasks.length > this.config.maxNodesPerGraph) {\n\t\t\t\treturn {\n\t\t\t\t\tsubtasks: subtasks.slice(0, this.config.maxNodesPerGraph),\n\t\t\t\t\tisValid: false,\n\t\t\t\t\twarnings: [\n\t\t\t\t\t\t`Truncated to ${this.config.maxNodesPerGraph} subtasks (max)`,\n\t\t\t\t\t],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst warnings: string[] = [];\n\t\t\tconst titles = new Set(subtasks.map((s) => s.title));\n\n\t\t\tfor (const sub of subtasks) {\n\t\t\t\tfor (const dep of sub.dependsOn) {\n\t\t\t\t\tif (!titles.has(dep)) {\n\t\t\t\t\t\twarnings.push(\n\t\t\t\t\t\t\t`Subtask \"${sub.title}\" depends on \"${dep}\" which doesn't exist`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst graph = new Map<string, string[]>();\n\t\t\tfor (const sub of subtasks) {\n\t\t\t\tgraph.set(sub.title, sub.dependsOn);\n\t\t\t}\n\n\t\t\tconst visited = new Set<string>();\n\t\t\tconst recStack = new Set<string>();\n\n\t\t\tconst hasCycle = (title: string): boolean => {\n\t\t\t\tif (recStack.has(title)) return true;\n\t\t\t\tif (visited.has(title)) return false;\n\t\t\t\tvisited.add(title);\n\t\t\t\trecStack.add(title);\n\t\t\t\tconst deps = graph.get(title) ?? [];\n\t\t\t\tfor (const dep of deps) {\n\t\t\t\t\tif (hasCycle(dep)) return true;\n\t\t\t\t}\n\t\t\t\trecStack.delete(title);\n\t\t\t\treturn false;\n\t\t\t};\n\n\t\t\tfor (const title of titles) {\n\t\t\t\tif (hasCycle(title)) {\n\t\t\t\t\twarnings.push(\"Circular dependency detected in decomposition\");\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { subtasks, isValid: warnings.length === 0, warnings };\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tsubtasks: [],\n\t\t\t\tisValid: false,\n\t\t\t\twarnings: [\n\t\t\t\t\t`Failed to parse LLM response: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t}\n\n\tneedsFurtherDecomposition(\n\t\tsubtask: DecomposedSubtask,\n\t\tcurrentDepth: number,\n\t): boolean {\n\t\tif (currentDepth >= this.config.maxTaskGraphDepth) return false;\n\n\t\tconst scopeIndicators = [\n\t\t\t\"implement\",\n\t\t\t\"build\",\n\t\t\t\"create\",\n\t\t\t\"develop\",\n\t\t\t\"setup\",\n\t\t];\n\n\t\tconst hasMultipleConcepts =\n\t\t\tsubtask.description.includes(\" and \") ||\n\t\t\tsubtask.description.includes(\",\");\n\t\tconst hasBroadVerbs = scopeIndicators.some((v) =>\n\t\t\tsubtask.description.toLowerCase().startsWith(v),\n\t\t);\n\t\tconst isLong = subtask.description.length > 500;\n\n\t\treturn hasMultipleConcepts || (hasBroadVerbs && isLong);\n\t}\n\n\theuristicDecomposition(task: TaskNode): DecompositionResult {\n\t\tconst text = `${task.title} ${task.description}`.toLowerCase();\n\t\tconst subtasks: DecomposedSubtask[] = [];\n\t\tconst warnings: string[] = [];\n\n\t\tconst patterns = [\n\t\t\t{\n\t\t\t\tkeyword: \"research|analyze|investigate|understand\",\n\t\t\t\tlabel: \"Research & Analysis\",\n\t\t\t\tphase: 0,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyword: \"design|architect|plan|outline|schema\",\n\t\t\t\tlabel: \"Design & Architecture\",\n\t\t\t\tphase: 1,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyword: \"implement|build|create|develop|write|code|add\",\n\t\t\t\tlabel: \"Implementation\",\n\t\t\t\tphase: 2,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyword: \"test|verify|validate|check|qa\",\n\t\t\t\tlabel: \"Testing & Verification\",\n\t\t\t\tphase: 3,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyword: \"document|documentation|readme|comment\",\n\t\t\t\tlabel: \"Documentation\",\n\t\t\t\tphase: 4,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyword: \"deploy|release|ship|publish|ci|cd\",\n\t\t\t\tlabel: \"Deployment & Release\",\n\t\t\t\tphase: 5,\n\t\t\t},\n\t\t\t{\n\t\t\t\tkeyword: \"refactor|clean|optimize|improve|migrate\",\n\t\t\t\tlabel: \"Refactoring & Optimization\",\n\t\t\t\tphase: 2,\n\t\t\t},\n\t\t];\n\n\t\tconst mentionedPhases = patterns.filter((p) =>\n\t\t\tnew RegExp(p.keyword, \"i\").test(text),\n\t\t);\n\n\t\tif (mentionedPhases.length > 0) {\n\t\t\tconst unique = new Map<number, (typeof patterns)[0]>();\n\t\t\tfor (const p of mentionedPhases) unique.set(p.phase, p);\n\t\t\tconst sorted = [...unique.values()].sort((a, b) => a.phase - b.phase);\n\n\t\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\t\tconst current = sorted[i]!;\n\t\t\t\tconst prev = i > 0 ? sorted[i - 1] : undefined;\n\t\t\t\tconst deps: string[] = prev ? [prev.label] : [];\n\t\t\t\tsubtasks.push({\n\t\t\t\t\ttitle: current.label,\n\t\t\t\t\tdescription: `Perform ${current.label.toLowerCase()} for: ${task.description}`,\n\t\t\t\t\tdependsOn: deps,\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tconst parts = task.description\n\t\t\t\t.split(/\\band\\b|[,;]\\s+/)\n\t\t\t\t.map((s) => s.trim())\n\t\t\t\t.filter((s) => s.length > 10);\n\n\t\t\tif (parts.length >= 2) {\n\t\t\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\t\t\tconst part = parts[i]!;\n\t\t\t\t\tconst title = part.length > 60 ? `${part.slice(0, 57)}...` : part;\n\t\t\t\t\tconst prev = i > 0 ? subtasks[i - 1] : undefined;\n\t\t\t\t\tsubtasks.push({\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\tdescription: part,\n\t\t\t\t\t\tdependsOn: prev ? [prev.title] : [],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsubtasks.push(\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Research & Approach\",\n\t\t\t\t\t\tdescription: `Research and determine approach for: ${task.description}`,\n\t\t\t\t\t\tdependsOn: [],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Implementation\",\n\t\t\t\t\t\tdescription: `Implement the solution for: ${task.description}`,\n\t\t\t\t\t\tdependsOn: [\"Research & Approach\"],\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Testing\",\n\t\t\t\t\t\tdescription: `Write and run tests for: ${task.description}`,\n\t\t\t\t\t\tdependsOn: [\"Implementation\"],\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (subtasks.length > this.config.maxNodesPerGraph) {\n\t\t\twarnings.push(\n\t\t\t\t`Truncated to ${this.config.maxNodesPerGraph} subtasks (max)`,\n\t\t\t);\n\t\t}\n\n\t\treturn {\n\t\t\tsubtasks: subtasks.slice(0, this.config.maxNodesPerGraph),\n\t\t\tisValid: warnings.length === 0,\n\t\t\twarnings,\n\t\t};\n\t}\n\n\tsubtasksToNodes(\n\t\tsubtasks: DecomposedSubtask[],\n\t\tparentId: string | null,\n\t\tparentTask: TaskNode,\n\t\tdepth: number,\n\t): TaskNode[] {\n\t\tconst titleToId = new Map<string, string>();\n\t\tconst nodes: TaskNode[] = [];\n\n\t\tfor (const sub of subtasks) {\n\t\t\tconst id = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n\t\t\ttitleToId.set(sub.title, id);\n\t\t}\n\n\t\tfor (const sub of subtasks) {\n\t\t\tconst nodeId = titleToId.get(sub.title)!;\n\t\t\tnodes.push({\n\t\t\t\tid: nodeId,\n\t\t\t\ttitle: sub.title,\n\t\t\t\tdescription: sub.description,\n\t\t\t\tstatus: \"pending\",\n\t\t\t\tparentId,\n\t\t\t\tdepth,\n\t\t\t\tdependsOn: sub.dependsOn\n\t\t\t\t\t.map((d) => titleToId.get(d) ?? d)\n\t\t\t\t\t.filter(Boolean),\n\t\t\t\tcreatedBy: parentTask.createdBy === \"user\" ? \"agent\" : \"subagent\",\n\t\t\t\tcreatedByAgentId: parentTask.createdByAgentId,\n\t\t\t\tassignedAgentId: null,\n\t\t\t\tworktreePath: null,\n\t\t\t\tskillsUsed: [],\n\t\t\t\tcommandsExecuted: [],\n\t\t\t\tcreatedAt: new Date(),\n\t\t\t\tupdatedAt: new Date(),\n\t\t\t});\n\t\t}\n\n\t\treturn nodes;\n\t}\n}\n","import type {\n\tTaskNode,\n\tTaskGraph,\n\tDecompositionConfig,\n} from \"../core/types.js\";\nimport {\n\tTaskDecomposer,\n\ttype DecomposedSubtask,\n\ttype DecompositionResult,\n} from \"./decomposer.js\";\nimport { TaskGraphManager } from \"../task-graph/graph.js\";\nimport { TaskGraphStore } from \"../task-graph/store.js\";\nimport { execa } from \"execa\";\nimport Debug from \"debug\";\n\nconst debug = Debug(\"speexor:planner:engine\");\n\nexport class PlannerEngine {\n\tprivate decomposer: TaskDecomposer;\n\tprivate config: DecompositionConfig;\n\n\tconstructor(config: DecompositionConfig) {\n\t\tthis.config = config;\n\t\tthis.decomposer = new TaskDecomposer(config);\n\t}\n\n\tasync planTask(\n\t\ttask: TaskNode,\n\t\tgraph: TaskGraph,\n\t\tstore: TaskGraphStore,\n\t): Promise<{ graph: TaskGraph; newNodes: TaskNode[] }> {\n\t\tconst manager = new TaskGraphManager(graph);\n\t\tconst newNodes: TaskNode[] = [];\n\n\t\tif (task.depth >= this.config.maxTaskGraphDepth) {\n\t\t\tdebug(`Max depth reached for ${task.id}, marking as ready`);\n\t\t\tmanager.updateNodeStatus(task.id, \"ready\");\n\t\t\tstore.updateNodeStatus(task.id, \"ready\");\n\t\t\treturn { graph, newNodes: [] };\n\t\t}\n\n\t\tconst prompt = this.decomposer.createDecompositionPrompt(task);\n\t\tlet result: DecompositionResult | null = null;\n\n\t\tconst provider = this.config.plannerProvider || \"opencode\";\n\t\tresult = await this.callLLM(prompt, provider);\n\n\t\tif (!result || !result.isValid) {\n\t\t\tdebug(`LLM decomposition failed, falling back to heuristic`);\n\t\t\tresult = this.heuristicDecomposition(task);\n\t\t}\n\n\t\tif (!result || !result.subtasks.length) {\n\t\t\tdebug(`Heuristic returned no subtasks, marking as atomic task`);\n\t\t\tmanager.updateNodeStatus(task.id, \"ready\");\n\t\t\tstore.updateNodeStatus(task.id, \"ready\");\n\t\t\treturn { graph, newNodes: [] };\n\t\t}\n\n\t\tconst childNodes = this.decomposer.subtasksToNodes(\n\t\t\tresult.subtasks,\n\t\t\ttask.id,\n\t\t\ttask,\n\t\t\ttask.depth + 1,\n\t\t);\n\n\t\tfor (const node of childNodes) {\n\t\t\tmanager.addNode(node);\n\t\t\tstore.addNode(graph.id, node);\n\t\t\tnewNodes.push(node);\n\t\t}\n\n\t\tif (newNodes.length === 0) {\n\t\t\tmanager.updateNodeStatus(task.id, \"ready\");\n\t\t\tstore.updateNodeStatus(task.id, \"ready\");\n\t\t}\n\n\t\treturn { graph, newNodes };\n\t}\n\n\tprivate async callLLM(\n\t\tprompt: string,\n\t\tprovider: string,\n\t): Promise<DecompositionResult | null> {\n\t\tconst fallbackChain = [provider, \"opencode\", \"claude-code\"];\n\n\t\tfor (const p of fallbackChain) {\n\t\t\ttry {\n\t\t\t\tconst response = await this.callProvider(prompt, p);\n\t\t\t\tif (!response) continue;\n\n\t\t\t\tconst result = this.decomposer.parseDecompositionResponse(response);\n\t\t\t\tif (result.isValid && result.subtasks.length > 0) {\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\tdebug(\n\t\t\t\t\t`Provider \"${p}\" returned invalid result: ${result.warnings.join(\", \")}`,\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tdebug(\n\t\t\t\t\t`Provider \"${p}\" threw: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate async callProvider(\n\t\tprompt: string,\n\t\tprovider: string,\n\t): Promise<string | null> {\n\t\tswitch (provider) {\n\t\t\tcase \"opencode\":\n\t\t\t\treturn this.callOpenCode(prompt);\n\t\t\tcase \"claude-code\":\n\t\t\t\treturn this.callClaudeCode(prompt);\n\t\t\tdefault:\n\t\t\t\tdebug(`Unknown provider \"${provider}\", trying opencode CLI`);\n\t\t\t\treturn this.callOpenCode(prompt);\n\t\t}\n\t}\n\n\tprivate async callOpenCode(prompt: string): Promise<string | null> {\n\t\ttry {\n\t\t\tconst { stdout } = await execa(\n\t\t\t\t\"opencode\",\n\t\t\t\t[\"prompt\", prompt, \"--quiet\"],\n\t\t\t\t{\n\t\t\t\t\ttimeout: 30_000,\n\t\t\t\t\treject: false,\n\t\t\t\t},\n\t\t\t);\n\t\t\treturn stdout || null;\n\t\t} catch (error) {\n\t\t\tdebug(\n\t\t\t\t`opencode CLI failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate async callClaudeCode(prompt: string): Promise<string | null> {\n\t\ttry {\n\t\t\tconst { stdout } = await execa(\"claude\", [\"-p\", prompt, \"--print\"], {\n\t\t\t\ttimeout: 30_000,\n\t\t\t\treject: false,\n\t\t\t});\n\t\t\treturn stdout || null;\n\t\t} catch (error) {\n\t\t\tdebug(\n\t\t\t\t`claude CLI failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate heuristicDecomposition(task: TaskNode): DecompositionResult {\n\t\treturn this.decomposer.heuristicDecomposition(task);\n\t}\n\n\tgenerateDefaultPlan(task: TaskNode): DecomposedSubtask[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\ttitle: `Analyze: ${task.title}`,\n\t\t\t\tdescription: `Research and analyze requirements for: ${task.description}`,\n\t\t\t\tdependsOn: [],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: `Implement: ${task.title}`,\n\t\t\t\tdescription: `Implement the changes needed for: ${task.description}`,\n\t\t\t\tdependsOn: [`Analyze: ${task.title}`],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttitle: `Test: ${task.title}`,\n\t\t\t\tdescription: `Write and run tests for: ${task.description}`,\n\t\t\t\tdependsOn: [`Implement: ${task.title}`],\n\t\t\t},\n\t\t];\n\t}\n\n\tasync decomposeGraph(\n\t\tgraph: TaskGraph,\n\t\tstore: TaskGraphStore,\n\t): Promise<TaskGraph> {\n\t\tconst manager = new TaskGraphManager(graph);\n\n\t\tlet changed = true;\n\t\twhile (changed) {\n\t\t\tchanged = false;\n\t\t\tconst pendingNodes = Array.from(graph.nodes.values()).filter(\n\t\t\t\t(n) => n.status === \"pending\",\n\t\t\t);\n\n\t\t\tfor (const node of pendingNodes) {\n\t\t\t\tif (node.depth >= this.config.maxTaskGraphDepth) {\n\t\t\t\t\tmanager.updateNodeStatus(node.id, \"ready\");\n\t\t\t\t\tstore.updateNodeStatus(node.id, \"ready\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst { graph: updatedGraph } = await this.planTask(node, graph, store);\n\t\t\t\tgraph = updatedGraph;\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t}\n\n\t\tstore.updateGraphStatus(graph.id, \"executing\");\n\t\treturn graph;\n\t}\n}\n","import { loadConfig } from '../core/config.js'\r\nimport { TaskGraphStore } from '../task-graph/store.js'\r\nimport { TaskGraphManager } from '../task-graph/graph.js'\r\nimport { PlannerEngine } from '../planner/engine.js'\r\nimport type { TaskNode, TaskGraph } from '../core/types.js'\r\nimport chalk from 'chalk'\r\n\r\nexport async function taskSubmitCommand(description: string) {\r\n try {\r\n const config = loadConfig()\r\n\r\n const depConfig = config.decomposition ?? {\r\n maxTaskGraphDepth: 5,\r\n maxAgentSpawnDepth: 3,\r\n maxNodesPerGraph: 50,\r\n plannerProvider: 'opencode',\r\n }\r\n\r\n const projectName = config.projects[0]?.name ?? 'default'\r\n const store = await TaskGraphStore.create()\r\n\r\n const rootNode: TaskNode = {\r\n id: `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\r\n title: description.length > 80 ? `${description.slice(0, 77)}...` : description,\r\n description,\r\n status: 'pending',\r\n parentId: null,\r\n depth: 0,\r\n dependsOn: [],\r\n createdBy: 'user',\r\n assignedAgentId: null,\r\n worktreePath: null,\r\n skillsUsed: [],\r\n commandsExecuted: [],\r\n createdAt: new Date(),\r\n updatedAt: new Date(),\r\n }\r\n\r\n const graph: TaskGraph = store.createGraph(projectName, rootNode)\r\n const planner = new PlannerEngine(depConfig)\r\n const finalGraph = await planner.decomposeGraph(graph, store)\r\n const manager = new TaskGraphManager(finalGraph)\r\n const sorted = manager.topologicalSort()\r\n\r\n console.log(`\\n ${chalk.bold('📋 Task Graph Generated')}`)\r\n console.log(` ${chalk.dim(`Graph ID: ${graph.id}`)}`)\r\n console.log(` ${chalk.dim(`Project: ${projectName}`)}`)\r\n console.log(` ${chalk.dim(`Nodes: ${sorted.length}`)}\\n`)\r\n\r\n const depthColors = [chalk.cyan, chalk.green, chalk.yellow, chalk.magenta, chalk.blue]\r\n for (const node of sorted) {\r\n const color = depthColors[node.depth] ?? chalk.white\r\n const indent = ' '.repeat(node.depth)\r\n const statusIcon =\r\n node.status === 'done'\r\n ? '✓'\r\n : node.status === 'failed'\r\n ? '✖'\r\n : node.status === 'blocked'\r\n ? '⊘'\r\n : node.status === 'ready'\r\n ? '→'\r\n : node.status === 'in_progress'\r\n ? '◌'\r\n : '○'\r\n const statusColor =\r\n node.status === 'done'\r\n ? chalk.green\r\n : node.status === 'failed'\r\n ? chalk.red\r\n : node.status === 'blocked'\r\n ? chalk.red\r\n : node.status === 'ready'\r\n ? chalk.cyan\r\n : chalk.dim\r\n const deps =\r\n node.dependsOn.length > 0\r\n ? chalk.dim(\r\n ` (after: ${sorted\r\n .filter((n) => node.dependsOn.includes(n.id))\r\n .map((n) => n.title.substring(0, 30))\r\n .join(', ')})`,\r\n )\r\n : ''\r\n console.log(` ${indent}${statusColor(statusIcon)} ${color(node.title)}${deps}`)\r\n }\r\n\r\n console.log(`\\n ${chalk.green('✓')} Task graph persisted to ${chalk.bold('.speexor/task-graph.sqlite')}\\n`)\r\n } catch (error) {\r\n if (error instanceof Error) {\r\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\r\n }\r\n process.exit(1)\r\n }\r\n}\r\n","import Debug from \"debug\";\n\nconst debug = Debug(\"speexor:marketplace\");\n\nexport interface MarketplaceIndex {\n\tname: string;\n\tmanifestUrl: string;\n\tchecksum: string;\n\tauthor: string;\n\tdescription: string;\n\tversion: string;\n}\n\nexport interface MarketplaceSource {\n\ttype: \"github-index\" | \"npm\";\n\turl: string;\n}\n\nexport class MarketplaceClient {\n\tprivate sources: MarketplaceSource[];\n\n\tconstructor(sources: MarketplaceSource[]) {\n\t\tthis.sources = sources;\n\t}\n\n\tasync search(query: string): Promise<MarketplaceIndex[]> {\n\t\tconst results: MarketplaceIndex[] = [];\n\t\tconst lowerQuery = query.toLowerCase();\n\n\t\tfor (const source of this.sources) {\n\t\t\ttry {\n\t\t\t\tconst packages = await this.fetchSourceIndex(source);\n\t\t\t\tconst filtered = packages.filter(\n\t\t\t\t\t(pkg) =>\n\t\t\t\t\t\tpkg.name.toLowerCase().includes(lowerQuery) ||\n\t\t\t\t\t\tpkg.description.toLowerCase().includes(lowerQuery) ||\n\t\t\t\t\t\tpkg.author.toLowerCase().includes(lowerQuery),\n\t\t\t\t);\n\t\t\t\tresults.push(...filtered);\n\t\t\t} catch (err) {\n\t\t\t\tdebug(\n\t\t\t\t\t`Failed to search source ${source.url}: ${(err as Error).message}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync getDetails(packageName: string): Promise<MarketplaceIndex> {\n\t\tfor (const source of this.sources) {\n\t\t\ttry {\n\t\t\t\tconst packages = await this.fetchSourceIndex(source);\n\t\t\t\tconst found = packages.find((p) => p.name === packageName);\n\t\t\t\tif (found) return found;\n\t\t\t} catch (err) {\n\t\t\t\tdebug(\n\t\t\t\t\t`Failed to fetch details from ${source.url}: ${(err as Error).message}`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t`Package \"${packageName}\" not found in any marketplace source`,\n\t\t);\n\t}\n\n\tresolveDownloadUrl(packageName: string): string {\n\t\tfor (const source of this.sources) {\n\t\t\tif (source.type === \"github-index\") {\n\t\t\t\tconst base = source.url\n\t\t\t\t\t.replace(/\\/index\\.json$/, \"\")\n\t\t\t\t\t.replace(/\\/$/, \"\");\n\t\t\t\treturn `${base}/${packageName}/speexor.extension.json`;\n\t\t\t}\n\t\t\tif (source.type === \"npm\") {\n\t\t\t\treturn `npm:${packageName}`;\n\t\t\t}\n\t\t}\n\t\tthrow new Error(`No download URL could be resolved for \"${packageName}\"`);\n\t}\n\n\tprivate async fetchSourceIndex(\n\t\tsource: MarketplaceSource,\n\t): Promise<MarketplaceIndex[]> {\n\t\tif (source.type === \"github-index\") {\n\t\t\tconst response = await fetch(source.url);\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\n\t\t\t}\n\t\t\tconst data = (await response.json()) as { packages: MarketplaceIndex[] };\n\t\t\treturn data.packages ?? [];\n\t\t}\n\n\t\tif (source.type === \"npm\") {\n\t\t\tconst encodedName = source.url.startsWith(\"@\")\n\t\t\t\t? `@${encodeURIComponent(source.url.slice(1).split(\"/\")[0]!)}/${encodeURIComponent(source.url.split(\"/\")[1]!)}`\n\t\t\t\t: encodeURIComponent(source.url);\n\n\t\t\tconst response = await fetch(`https://registry.npmjs.org/${encodedName}`);\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(`HTTP ${response.status}: ${response.statusText}`);\n\t\t\t}\n\t\t\tconst data = (await response.json()) as {\n\t\t\t\tname: string;\n\t\t\t\tdescription?: string;\n\t\t\t\t\"dist-tags\"?: { latest: string };\n\t\t\t\tauthor?: { name?: string };\n\t\t\t\t_npmUser?: { name?: string };\n\t\t\t};\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tname: data.name,\n\t\t\t\t\tmanifestUrl: `https://www.npmjs.com/package/${source.url}`,\n\t\t\t\t\tchecksum: \"\",\n\t\t\t\t\tauthor: data.author?.name ?? data._npmUser?.name ?? \"unknown\",\n\t\t\t\t\tdescription: data.description ?? \"\",\n\t\t\t\t\tversion: data[\"dist-tags\"]?.latest ?? \"0.0.0\",\n\t\t\t\t},\n\t\t\t];\n\t\t}\n\n\t\treturn [];\n\t}\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport type {\n\tExtensionManifest,\n\tExtensionPermissions,\n\tExtensionType,\n\tPermissionLevel,\n} from \"../core/types.js\";\n\nexport class ExtensionManifestLoader {\n\tloadFromFile(path: string): ExtensionManifest {\n\t\tif (!existsSync(path)) {\n\t\t\tthrow new Error(`Manifest file not found: ${path}`);\n\t\t}\n\n\t\tlet raw: string;\n\t\ttry {\n\t\t\traw = readFileSync(path, \"utf-8\");\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to read manifest file: ${(err as Error).message}`,\n\t\t\t);\n\t\t}\n\n\t\tlet parsed: Record<string, unknown>;\n\t\ttry {\n\t\t\tparsed = JSON.parse(raw);\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid JSON in manifest file: ${(err as Error).message}`,\n\t\t\t);\n\t\t}\n\n\t\tconst manifest = parsed as unknown as ExtensionManifest;\n\t\tconst validation = this.validate(manifest);\n\t\tif (!validation.valid) {\n\t\t\tthrow new Error(\n\t\t\t\t`Manifest validation failed:\\n ${validation.errors.join(\"\\n \")}`,\n\t\t\t);\n\t\t}\n\n\t\treturn manifest;\n\t}\n\n\tvalidate(manifest: ExtensionManifest): { valid: boolean; errors: string[] } {\n\t\tconst errors: string[] = [];\n\n\t\tif (!manifest.name || typeof manifest.name !== \"string\") {\n\t\t\terrors.push('Missing or invalid \"name\" (must be a non-empty string)');\n\t\t}\n\n\t\tif (!manifest.version || typeof manifest.version !== \"string\") {\n\t\t\terrors.push('Missing or invalid \"version\" (must be a string)');\n\t\t} else if (!/^\\d+\\.\\d+\\.\\d+/.test(manifest.version)) {\n\t\t\terrors.push('Invalid \"version\" format (must be semver like x.y.z)');\n\t\t}\n\n\t\tconst validTypes: ExtensionType[] = [\n\t\t\t\"agent-backend\",\n\t\t\t\"skill\",\n\t\t\t\"plugin\",\n\t\t\t\"action-adapter\",\n\t\t\t\"library\",\n\t\t\t\"mcp-server\",\n\t\t];\n\t\tif (!manifest.type || !validTypes.includes(manifest.type)) {\n\t\t\terrors.push(\n\t\t\t\t`Missing or invalid \"type\" (must be one of: ${validTypes.join(\", \")})`,\n\t\t\t);\n\t\t}\n\n\t\tif (\n\t\t\t!manifest.speexorApiVersion ||\n\t\t\ttypeof manifest.speexorApiVersion !== \"string\"\n\t\t) {\n\t\t\terrors.push('Missing or invalid \"speexorApiVersion\" (must be a string)');\n\t\t}\n\n\t\tif (!manifest.entry || typeof manifest.entry !== \"string\") {\n\t\t\terrors.push('Missing or invalid \"entry\" (must be a string)');\n\t\t}\n\n\t\tif (!manifest.description || typeof manifest.description !== \"string\") {\n\t\t\terrors.push(\n\t\t\t\t'Missing or invalid \"description\" (must be a non-empty string)',\n\t\t\t);\n\t\t}\n\n\t\tif (!manifest.author || typeof manifest.author !== \"string\") {\n\t\t\terrors.push('Missing or invalid \"author\" (must be a non-empty string)');\n\t\t}\n\n\t\tif (manifest.permissions) {\n\t\t\tconst permErrors = this.validatePermissions(manifest.permissions);\n\t\t\terrors.push(...permErrors);\n\t\t} else {\n\t\t\terrors.push('Missing \"permissions\" object');\n\t\t}\n\n\t\tif (\n\t\t\tmanifest.signature !== undefined &&\n\t\t\ttypeof manifest.signature !== \"string\"\n\t\t) {\n\t\t\terrors.push('Invalid \"signature\" (must be a string if present)');\n\t\t}\n\n\t\treturn { valid: errors.length === 0, errors };\n\t}\n\n\tcheckApiCompatibility(\n\t\tmanifest: ExtensionManifest,\n\t\tcurrentApiVersion: string,\n\t): boolean {\n\t\tconst reqParts = manifest.speexorApiVersion.split(\".\").map(Number);\n\t\tconst curParts = currentApiVersion.split(\".\").map(Number);\n\t\tif (reqParts.length < 2 || curParts.length < 2) return false;\n\t\treturn reqParts[0] === curParts[0] && reqParts[1] === curParts[1];\n\t}\n\n\tprivate validatePermissions(permissions: ExtensionPermissions): string[] {\n\t\tconst errors: string[] = [];\n\t\tconst validLevels: PermissionLevel[] = [\n\t\t\t\"none\",\n\t\t\t\"read-only\",\n\t\t\t\"read-write\",\n\t\t\t\"scoped\",\n\t\t\t\"full\",\n\t\t];\n\t\tconst axes: Array<\"fileSystem\" | \"network\" | \"shell\"> = [\n\t\t\t\"fileSystem\",\n\t\t\t\"network\",\n\t\t\t\"shell\",\n\t\t];\n\n\t\tfor (const axis of axes) {\n\t\t\tif (!validLevels.includes(permissions[axis])) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`Invalid permission level for \"${axis}\" (must be one of: ${validLevels.join(\", \")})`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tif (!Array.isArray(permissions.secrets)) {\n\t\t\terrors.push('\"permissions.secrets\" must be an array of strings');\n\t\t} else {\n\t\t\tfor (const s of permissions.secrets) {\n\t\t\t\tif (typeof s !== \"string\") {\n\t\t\t\t\terrors.push('Each entry in \"permissions.secrets\" must be a string');\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn errors;\n\t}\n}\n","import type {\n\tExtensionPermissions,\n\tPermissionAxis,\n\tPermissionLevel,\n} from \"../core/types.js\";\n\nconst axisLabels: Record<PermissionAxis, string> = {\n\tfileSystem: \"File system access\",\n\tnetwork: \"Network access\",\n\tshell: \"Shell/command execution\",\n\tsecrets: \"Secret/key access\",\n};\n\nconst levelDescriptions: Record<PermissionLevel, string> = {\n\tnone: \"No access\",\n\t\"read-only\": \"Read-only access\",\n\t\"read-write\": \"Read and write access\",\n\tscoped: \"Scoped access (limited to specific paths/origins)\",\n\tfull: \"Full unrestricted access\",\n};\n\nfunction axisToPlainEnglish(\n\taxis: PermissionAxis,\n\tlevel: PermissionLevel,\n): string {\n\tswitch (axis) {\n\t\tcase \"fileSystem\": {\n\t\t\tswitch (level) {\n\t\t\t\tcase \"none\":\n\t\t\t\t\treturn \"This extension has no access to the file system\";\n\t\t\t\tcase \"read-only\":\n\t\t\t\t\treturn \"This extension can read files on your system\";\n\t\t\t\tcase \"read-write\":\n\t\t\t\t\treturn \"This extension can read and modify files on your system\";\n\t\t\t\tcase \"scoped\":\n\t\t\t\t\treturn \"This extension can read and write files only within its permitted scope\";\n\t\t\t\tcase \"full\":\n\t\t\t\t\treturn \"This extension has full, unrestricted access to your file system\";\n\t\t\t}\n\t\t}\n\t\tcase \"network\": {\n\t\t\tswitch (level) {\n\t\t\t\tcase \"none\":\n\t\t\t\t\treturn \"This extension has no network access\";\n\t\t\t\tcase \"read-only\":\n\t\t\t\t\treturn \"This extension can make read-only network requests (GET/HEAD)\";\n\t\t\t\tcase \"read-write\":\n\t\t\t\t\treturn \"This extension can send and receive data over the network\";\n\t\t\t\tcase \"scoped\":\n\t\t\t\t\treturn \"This extension can communicate only with allowed network origins\";\n\t\t\t\tcase \"full\":\n\t\t\t\t\treturn \"This extension has full, unrestricted network access\";\n\t\t\t}\n\t\t}\n\t\tcase \"shell\": {\n\t\t\tswitch (level) {\n\t\t\t\tcase \"none\":\n\t\t\t\t\treturn \"This extension cannot execute shell commands\";\n\t\t\t\tcase \"read-only\":\n\t\t\t\t\treturn \"This extension can execute read-only shell commands\";\n\t\t\t\tcase \"read-write\":\n\t\t\t\t\treturn \"This extension can execute arbitrary shell commands\";\n\t\t\t\tcase \"scoped\":\n\t\t\t\t\treturn \"This extension can execute only whitelisted shell commands\";\n\t\t\t\tcase \"full\":\n\t\t\t\t\treturn \"This extension has full shell access to your system\";\n\t\t\t}\n\t\t}\n\t\tcase \"secrets\": {\n\t\t\tswitch (level) {\n\t\t\t\tcase \"none\":\n\t\t\t\t\treturn \"This extension has no access to secrets\";\n\t\t\t\tcase \"read-only\":\n\t\t\t\t\treturn \"This extension can read secrets\";\n\t\t\t\tcase \"read-write\":\n\t\t\t\t\treturn \"This extension can read and modify secrets\";\n\t\t\t\tcase \"scoped\":\n\t\t\t\t\treturn \"This extension can access only specific secret scopes\";\n\t\t\t\tcase \"full\":\n\t\t\t\t\treturn \"This extension has full access to all secrets\";\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function permissionToPlainEnglish(\n\taxis: PermissionAxis,\n\tlevel: PermissionLevel,\n): string {\n\treturn axisToPlainEnglish(axis, level);\n}\n\nexport function formatPermissions(permissions: ExtensionPermissions): string {\n\tconst lines: string[] = [\"Permissions:\"];\n\tconst axes: Array<\"fileSystem\" | \"network\" | \"shell\"> = [\n\t\t\"fileSystem\",\n\t\t\"network\",\n\t\t\"shell\",\n\t];\n\n\tfor (const axis of axes) {\n\t\tlines.push(\n\t\t\t` ${axisLabels[axis]}: ${levelDescriptions[permissions[axis]]}`,\n\t\t);\n\t}\n\n\tif (permissions.secrets.length > 0) {\n\t\tlines.push(` Secret scopes: ${permissions.secrets.join(\", \")}`);\n\t} else {\n\t\tlines.push(\" Secret scopes: none\");\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function getPermissionRiskLevel(\n\tpermissions: ExtensionPermissions,\n): \"low\" | \"medium\" | \"high\" {\n\tlet riskScore = 0;\n\n\tif (\n\t\tpermissions.fileSystem === \"full\" ||\n\t\tpermissions.fileSystem === \"read-write\"\n\t)\n\t\triskScore += 2;\n\telse if (permissions.fileSystem === \"scoped\") riskScore += 1;\n\n\tif (permissions.network === \"full\" || permissions.network === \"read-write\")\n\t\triskScore += 2;\n\telse if (permissions.network === \"scoped\") riskScore += 1;\n\n\tif (permissions.shell === \"full\" || permissions.shell === \"read-write\")\n\t\triskScore += 3;\n\telse if (permissions.shell === \"scoped\") riskScore += 1;\n\n\tif (permissions.secrets.length > 0)\n\t\triskScore += Math.min(permissions.secrets.length, 3);\n\n\tif (riskScore >= 6) return \"high\";\n\tif (riskScore >= 3) return \"medium\";\n\treturn \"low\";\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync, copyFileSync, rmSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\nimport { homedir } from 'node:os'\nimport { createHash } from 'node:crypto'\nimport Debug from 'debug'\nimport type { ExtensionManifest } from '../core/types.js'\nimport { ExtensionManifestLoader } from './extension-manifest.js'\nimport { formatPermissions, getPermissionRiskLevel } from './permission-view.js'\n\nconst debug = Debug('speexor:extension-registry')\n\nexport interface InstalledExtension {\n name: string\n manifest: ExtensionManifest\n enabled: boolean\n installPath: string\n installedAt: string\n checksum?: string\n}\n\ninterface RegistryData {\n version: 1\n extensions: InstalledExtension[]\n projectOverrides: Record<string, Record<string, boolean>>\n}\n\nexport class ExtensionRegistry {\n private baseDir: string\n private registryPath: string\n private extensionsDir: string\n private data: RegistryData\n private manifestLoader: ExtensionManifestLoader\n\n constructor(baseDir?: string) {\n const defaultDir = join(homedir(), '.speexor', 'extensions')\n this.baseDir = baseDir ?? defaultDir\n this.registryPath = join(this.baseDir, 'registry.json')\n this.extensionsDir = this.baseDir\n this.manifestLoader = new ExtensionManifestLoader()\n this.data = this.loadRegistry()\n }\n\n async install(manifestPath: string): Promise<InstalledExtension> {\n const manifest = this.manifestLoader.loadFromFile(manifestPath)\n\n if (this.get(manifest.name)) {\n throw new Error(`Extension \"${manifest.name}\" is already installed`)\n }\n\n const extDir = join(this.extensionsDir, manifest.name)\n if (!existsSync(extDir)) {\n mkdirSync(extDir, { recursive: true })\n }\n\n const destManifest = join(extDir, 'speexor.extension.json')\n copyFileSync(manifestPath, destManifest)\n\n const sourceDir = dirname(manifestPath)\n const entryPath = join(sourceDir, manifest.entry)\n if (existsSync(entryPath)) {\n const destEntry = join(extDir, manifest.entry)\n const destEntryDir = dirname(destEntry)\n if (!existsSync(destEntryDir)) {\n mkdirSync(destEntryDir, { recursive: true })\n }\n copyFileSync(entryPath, destEntry)\n }\n\n const checksum = createHash('sha256').update(JSON.stringify(manifest)).digest('hex')\n\n const installed: InstalledExtension = {\n name: manifest.name,\n manifest,\n enabled: true,\n installPath: extDir,\n installedAt: new Date().toISOString(),\n checksum,\n }\n\n this.data.extensions.push(installed)\n this.saveRegistry()\n\n debug(`Installed extension \"${manifest.name}\" v${manifest.version}`)\n return installed\n }\n\n remove(name: string): void {\n const idx = this.data.extensions.findIndex((e) => e.name === name)\n if (idx === -1) {\n throw new Error(`Extension \"${name}\" is not installed`)\n }\n\n const ext = this.data.extensions[idx]!\n const extDir = ext.installPath\n\n if (existsSync(extDir)) {\n rmSync(extDir, { recursive: true, force: true })\n }\n\n this.data.extensions.splice(idx, 1)\n\n for (const projectName of Object.keys(this.data.projectOverrides)) {\n const overrides = this.data.projectOverrides[projectName]\n if (overrides) {\n delete overrides[name]\n if (Object.keys(overrides).length === 0) {\n delete this.data.projectOverrides[projectName]\n }\n }\n }\n\n this.saveRegistry()\n debug(`Removed extension \"${name}\"`)\n }\n\n enable(name: string, projectName?: string): void {\n const ext = this.get(name)\n if (!ext) {\n throw new Error(`Extension \"${name}\" is not installed`)\n }\n\n if (projectName) {\n if (!this.data.projectOverrides[projectName]) {\n this.data.projectOverrides[projectName] = {}\n }\n this.data.projectOverrides[projectName]![name] = true\n } else {\n ext.enabled = true\n }\n\n this.saveRegistry()\n debug(`Enabled extension \"${name}\"${projectName ? ` for project \"${projectName}\"` : ''}`)\n }\n\n disable(name: string, projectName?: string): void {\n const ext = this.get(name)\n if (!ext) {\n throw new Error(`Extension \"${name}\" is not installed`)\n }\n\n if (projectName) {\n if (!this.data.projectOverrides[projectName]) {\n this.data.projectOverrides[projectName] = {}\n }\n this.data.projectOverrides[projectName]![name] = false\n } else {\n ext.enabled = false\n }\n\n this.saveRegistry()\n debug(`Disabled extension \"${name}\"${projectName ? ` for project \"${projectName}\"` : ''}`)\n }\n\n list(): InstalledExtension[] {\n return [...this.data.extensions]\n }\n\n get(name: string): InstalledExtension | undefined {\n return this.data.extensions.find((e) => e.name === name)\n }\n\n isEnabled(name: string, projectName?: string): boolean {\n const ext = this.get(name)\n if (!ext) return false\n\n if (projectName) {\n const overrides = this.data.projectOverrides[projectName]\n if (overrides && name in overrides) {\n return overrides[name] === true\n }\n }\n\n return ext.enabled\n }\n\n verifyInstall(name: string): { valid: boolean; expectedChecksum: string; actualChecksum: string } {\n const ext = this.get(name)\n if (!ext) {\n throw new Error(`Extension \"${name}\" is not installed`)\n }\n const actual = createHash('sha256').update(JSON.stringify(ext.manifest)).digest('hex')\n return {\n valid: ext.checksum === actual,\n expectedChecksum: ext.checksum ?? '',\n actualChecksum: actual,\n }\n }\n\n displayPermissions(name: string): string {\n const ext = this.get(name)\n if (!ext) {\n throw new Error(`Extension \"${name}\" is not installed`)\n }\n const formatted = formatPermissions(ext.manifest.permissions)\n const risk = getPermissionRiskLevel(ext.manifest.permissions)\n return `${formatted}\\nRisk level: ${risk}`\n }\n\n private loadRegistry(): RegistryData {\n try {\n if (existsSync(this.registryPath)) {\n const raw = readFileSync(this.registryPath, 'utf-8')\n const parsed = JSON.parse(raw) as RegistryData\n return {\n version: parsed.version ?? 1,\n extensions: parsed.extensions ?? [],\n projectOverrides: parsed.projectOverrides ?? {},\n }\n }\n } catch (error) {\n debug(`Failed to load registry: ${error}`)\n }\n\n return { version: 1, extensions: [], projectOverrides: {} }\n }\n\n private saveRegistry(): void {\n try {\n if (!existsSync(this.baseDir)) {\n mkdirSync(this.baseDir, { recursive: true })\n }\n writeFileSync(this.registryPath, JSON.stringify(this.data, null, 2), 'utf-8')\n } catch (error) {\n debug(`Failed to save registry: ${error}`)\n }\n }\n}\n","import { loadConfig } from '../core/config.js'\nimport { MarketplaceClient } from '../extension-manager/marketplace.js'\nimport { ExtensionRegistry } from '../extension-manager/registry.js'\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport chalk from 'chalk'\n\nexport async function extSearchCommand(query: string) {\n try {\n const config = loadConfig()\n const sources = [\n { type: 'github-index' as const, url: config.extensions?.marketplaceIndex ?? 'https://marketplace.speexor.dev/index.json' },\n ]\n const client = new MarketplaceClient(sources)\n const results = await client.search(query)\n\n if (results.length === 0) {\n console.log(`\\n ${chalk.dim('No extensions found matching')} \"${query}\"\\n`)\n return\n }\n\n console.log(`\\n ${chalk.bold(`🔍 Search results for \"${query}\"`)} (${results.length})\\n`)\n for (const pkg of results) {\n console.log(` ${chalk.cyan(pkg.name)} ${chalk.dim(`v${pkg.version}`)}`)\n console.log(` ${pkg.description}`)\n console.log(` ${chalk.dim(`by ${pkg.author}`)}`)\n console.log()\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n\nexport async function extInstallCommand(name: string) {\n try {\n const config = loadConfig()\n const sources = [\n { type: 'github-index' as const, url: config.extensions?.marketplaceIndex ?? 'https://marketplace.speexor.dev/index.json' },\n ]\n const client = new MarketplaceClient(sources)\n await client.getDetails(name)\n const downloadUrl = client.resolveDownloadUrl(name)\n\n const response = await fetch(downloadUrl)\n if (!response.ok) {\n throw new Error(`Failed to download extension manifest: HTTP ${response.status}`)\n }\n const manifestJson = await response.text()\n\n const extDir = join(process.cwd(), '.speexor', 'extensions', name)\n if (!existsSync(extDir)) {\n mkdirSync(extDir, { recursive: true })\n }\n\n const manifestPath = join(extDir, 'speexor.extension.json')\n writeFileSync(manifestPath, manifestJson, 'utf-8')\n\n const registry = new ExtensionRegistry()\n const installed = await registry.install(manifestPath)\n\n console.log(`\\n ${chalk.green('✓')} Installed ${chalk.bold(installed.name)} v${installed.manifest.version}\\n`)\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n\nexport async function extListCommand() {\n try {\n const registry = new ExtensionRegistry()\n const extensions = registry.list()\n\n if (extensions.length === 0) {\n console.log(`\\n ${chalk.dim('No extensions installed.')}\\n`)\n return\n }\n\n console.log(`\\n ${chalk.bold('📦 Installed Extensions')} (${extensions.length})\\n`)\n for (const ext of extensions) {\n const status = ext.enabled ? chalk.green('enabled') : chalk.red('disabled')\n console.log(` ${chalk.cyan(ext.name)} ${chalk.dim(`v${ext.manifest.version}`)} [${status}]`)\n console.log(` ${ext.manifest.description}`)\n console.log(` ${chalk.dim(`type: ${ext.manifest.type} path: ${ext.installPath}`)}`)\n console.log()\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n\nexport async function extUpdateCommand(name?: string) {\n try {\n const registry = new ExtensionRegistry()\n const config = loadConfig()\n const sources = [\n { type: 'github-index' as const, url: config.extensions?.marketplaceIndex ?? 'https://marketplace.speexor.dev/index.json' },\n ]\n const client = new MarketplaceClient(sources)\n\n const toUpdate = name ? registry.list().filter((e) => e.name === name) : registry.list()\n\n if (toUpdate.length === 0) {\n console.log(`\\n ${chalk.dim('No extensions to update.')}\\n`)\n return\n }\n\n let updated = 0\n for (const ext of toUpdate) {\n try {\n const pkg = await client.getDetails(ext.name)\n if (pkg.version !== ext.manifest.version) {\n registry.remove(ext.name)\n const downloadUrl = client.resolveDownloadUrl(ext.name)\n const response = await fetch(downloadUrl)\n if (response.ok) {\n const manifestJson = await response.text()\n const extDir = join(process.cwd(), '.speexor', 'extensions', ext.name)\n if (!existsSync(extDir)) mkdirSync(extDir, { recursive: true })\n const manifestPath = join(extDir, 'speexor.extension.json')\n writeFileSync(manifestPath, manifestJson, 'utf-8')\n const installed = await registry.install(manifestPath)\n console.log(\n ` ${chalk.green('✓')} Updated ${chalk.bold(installed.name)} ${chalk.dim(`${ext.manifest.version} → ${installed.manifest.version}`)}`,\n )\n updated++\n }\n } else {\n console.log(` ${chalk.dim(`${ext.name} is already at latest version (${pkg.version})`)}`)\n }\n } catch (err) {\n console.error(` ${chalk.red('✖')} Failed to update ${ext.name}: ${(err as Error).message}`)\n }\n }\n\n if (updated > 0) {\n console.log(`\\n ${chalk.green('✓')} ${updated} extension(s) updated\\n`)\n } else {\n console.log(`\\n ${chalk.dim('All extensions up to date.')}\\n`)\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n\nexport async function extRemoveCommand(name: string) {\n try {\n const registry = new ExtensionRegistry()\n registry.remove(name)\n console.log(`\\n ${chalk.green('✓')} Removed extension ${chalk.bold(name)}\\n`)\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n","import Debug from \"debug\";\n\nconst debug = Debug(\"speexor:config-migration:registry\");\n\nexport interface ConfigMigration {\n\tfromVersion: string;\n\ttoVersion: string;\n\tmigrate(config: Record<string, unknown>): Record<string, unknown>;\n}\n\nexport class MigrationRegistry {\n\tprivate migrations: ConfigMigration[] = [];\n\n\tregister(migration: ConfigMigration): void {\n\t\tconst existing = this.migrations.find(\n\t\t\t(m) =>\n\t\t\t\tm.fromVersion === migration.fromVersion &&\n\t\t\t\tm.toVersion === migration.toVersion,\n\t\t);\n\t\tif (existing) {\n\t\t\tdebug(\n\t\t\t\t`Overwriting migration ${migration.fromVersion} → ${migration.toVersion}`,\n\t\t\t);\n\t\t\tconst idx = this.migrations.indexOf(existing);\n\t\t\tthis.migrations[idx] = migration;\n\t\t\treturn;\n\t\t}\n\t\tthis.migrations.push(migration);\n\t\tdebug(\n\t\t\t`Registered migration ${migration.fromVersion} → ${migration.toVersion}`,\n\t\t);\n\t}\n\n\tgetMigration(from: string, to: string): ConfigMigration | undefined {\n\t\treturn this.migrations.find(\n\t\t\t(m) => m.fromVersion === from && m.toVersion === to,\n\t\t);\n\t}\n\n\tgetAvailableMigrations(): Array<{ from: string; to: string }> {\n\t\treturn this.migrations.map((m) => ({\n\t\t\tfrom: m.fromVersion,\n\t\t\tto: m.toVersion,\n\t\t}));\n\t}\n\n\tresolveChain(from: string, to: string): ConfigMigration[] {\n\t\tconst chain: ConfigMigration[] = [];\n\t\tlet current = from;\n\t\twhile (current !== to) {\n\t\t\tconst next = this.findNextStep(current);\n\t\t\tif (!next) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No migration path from ${from} to ${to}. Available: ${JSON.stringify(this.getAvailableMigrations())}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tchain.push(next);\n\t\t\tcurrent = next.toVersion;\n\t\t}\n\t\treturn chain;\n\t}\n\n\tclear(): void {\n\t\tthis.migrations = [];\n\t\tdebug(\"Migration registry cleared\");\n\t}\n\n\tprivate findNextStep(from: string): ConfigMigration | undefined {\n\t\treturn this.migrations.find((m) => m.fromVersion === from);\n\t}\n}\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { stringify } from \"yaml\";\nimport Debug from \"debug\";\n\nconst debug = Debug(\"speexor:config-migration:migrations\");\n\nfunction writeBackup(\n\tconfigPath: string,\n\tconfig: Record<string, unknown>,\n): string {\n\tconst bakPath = `${configPath}.${Date.now()}.bak`;\n\tconst dir = dirname(resolve(bakPath));\n\tif (!existsSync(dir)) {\n\t\tmkdirSync(dir, { recursive: true });\n\t}\n\twriteFileSync(bakPath, stringify(config), \"utf-8\");\n\tdebug(`Backup written to ${bakPath}`);\n\treturn bakPath;\n}\n\nexport function migration1to2(\n\tconfig: Record<string, unknown>,\n\tconfigPath?: string,\n): Record<string, unknown> {\n\tif (configPath) {\n\t\twriteBackup(configPath, config);\n\t}\n\n\tconst migrated: Record<string, unknown> = { ...config };\n\n\tmigrated.version = \"2\";\n\n\tif (!migrated.decomposition) {\n\t\tmigrated.decomposition = {\n\t\t\tmaxTaskGraphDepth: 5,\n\t\t\tmaxAgentSpawnDepth: 3,\n\t\t\tmaxNodesPerGraph: 50,\n\t\t};\n\t}\n\n\tif (!migrated.scheduler) {\n\t\tmigrated.scheduler = {\n\t\t\tmaxConcurrentAgents: \"auto\",\n\t\t\tretryOnFailure: 3,\n\t\t\tproviderFallbackChain: [],\n\t\t};\n\t}\n\n\tif (!migrated.governance) {\n\t\tmigrated.governance = {\n\t\t\tautoApproveProposedTasks: false,\n\t\t\tautoApproveCategories: [],\n\t\t\tduplicateSimilarityThreshold: 0.8,\n\t\t};\n\t}\n\n\tdebug(\n\t\t\"Migrated v1 → v2: added decomposition, scheduler, governance defaults\",\n\t);\n\treturn migrated;\n}\n\nexport function migration2to3(\n\tconfig: Record<string, unknown>,\n\tconfigPath?: string,\n): Record<string, unknown> {\n\tif (configPath) {\n\t\twriteBackup(configPath, config);\n\t}\n\n\tconst migrated: Record<string, unknown> = { ...config };\n\n\tmigrated.version = \"3\";\n\n\tif (!migrated.riskPolicy) {\n\t\tmigrated.riskPolicy = {\n\t\t\tautoApprove: [],\n\t\t\trequireApproval: [],\n\t\t\tapprovalTimeout: \"30m\",\n\t\t\tapprovalDefaultAction: \"escalate\",\n\t\t\tdefaultRiskTierForUnknownActions: \"medium\",\n\t\t};\n\t}\n\n\tif (!migrated.scheduler) {\n\t\tmigrated.scheduler = {\n\t\t\tmaxConcurrentAgents: \"auto\",\n\t\t\tretryOnFailure: 3,\n\t\t\tproviderFallbackChain: [],\n\t\t};\n\t}\n\n\tdebug(\"Migrated v2 → v3: added riskPolicy, session config\");\n\treturn migrated;\n}\n\nexport function migration3to4(\n\tconfig: Record<string, unknown>,\n\tconfigPath?: string,\n): Record<string, unknown> {\n\tif (configPath) {\n\t\twriteBackup(configPath, config);\n\t}\n\n\tconst migrated: Record<string, unknown> = { ...config };\n\n\tmigrated.version = \"4\";\n\n\tif (!migrated.extensions) {\n\t\tmigrated.extensions = {\n\t\t\tenabled: [],\n\t\t\tpermissionsMode: \"strict\",\n\t\t};\n\t}\n\n\tif (!migrated.security) {\n\t\tmigrated.security = {\n\t\t\tsecretsBackend: \"file\",\n\t\t\tencryptAtRest: false,\n\t\t\tsandboxModel: \"process\",\n\t\t};\n\t}\n\n\tif (!migrated.performance) {\n\t\tmigrated.performance = {\n\t\t\tmaxConcurrentAgents: \"auto\",\n\t\t\tworkerThreadPoolSize: 4,\n\t\t};\n\t}\n\n\tdebug(\"Migrated v3 → v4: added extensions, security, performance config\");\n\treturn migrated;\n}\n\nexport function migration4to5(\n\tconfig: Record<string, unknown>,\n\tconfigPath?: string,\n): Record<string, unknown> {\n\tif (configPath) {\n\t\twriteBackup(configPath, config);\n\t}\n\n\tconst migrated: Record<string, unknown> = { ...config };\n\n\tmigrated.version = \"5\";\n\n\tif (!migrated.worktreeHierarchy) {\n\t\tmigrated.worktreeHierarchy = {\n\t\t\tpinToCommitHash: true,\n\t\t\tserializeMerges: true,\n\t\t\tconflictEscalatesToApproval: true,\n\t\t};\n\t}\n\n\tif (!migrated.costGuard) {\n\t\tmigrated.costGuard = {\n\t\t\ttrackByProvider: true,\n\t\t\ttrackByProject: true,\n\t\t\ttrackByTaskNode: false,\n\t\t};\n\t}\n\n\tif (!migrated.logging) {\n\t\tmigrated.logging = {\n\t\t\tlevel: \"info\",\n\t\t};\n\t}\n\n\tif (migrated.extensions && typeof migrated.extensions === \"object\") {\n\t\tconst ext = migrated.extensions as Record<string, unknown>;\n\t\tif (ext.marketplaceIndex === undefined) {\n\t\t\text.marketplaceIndex = \"https://marketplace.speexor.dev\";\n\t\t}\n\t}\n\n\tdebug(\"Migrated v4 → v5: added worktreeHierarchy, costGuard, logging\");\n\treturn migrated;\n}\n","import { readFileSync, existsSync, copyFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parse, stringify } from \"yaml\";\nimport Debug from \"debug\";\nimport { MigrationRegistry } from \"./registry.js\";\nimport {\n\tmigration1to2,\n\tmigration2to3,\n\tmigration3to4,\n\tmigration4to5,\n} from \"./migrations.js\";\n\nconst debug = Debug(\"speexor:config-migration:engine\");\n\nexport class MigrationEngine {\n\tprivate registry: MigrationRegistry;\n\n\tconstructor(registry?: MigrationRegistry) {\n\t\tthis.registry = registry ?? this.buildDefaultRegistry();\n\t}\n\n\tdetectVersion(configPath: string): string {\n\t\tconst absPath = resolve(configPath);\n\t\tif (!existsSync(absPath)) {\n\t\t\tthrow new Error(`Config file not found: ${absPath}`);\n\t\t}\n\t\tconst raw = readFileSync(absPath, \"utf-8\");\n\t\tconst parsed = parse(raw);\n\t\tconst version = parsed?.version;\n\t\tif (!version || typeof version !== \"string\") {\n\t\t\tthrow new Error(\n\t\t\t\t`Config file ${absPath} is missing a valid 'version' field`,\n\t\t\t);\n\t\t}\n\t\tdebug(`Detected version ${version} in ${absPath}`);\n\t\treturn version;\n\t}\n\n\tneedsMigration(configPath: string): {\n\t\tneeds: boolean;\n\t\tfrom: string;\n\t\tto: string;\n\t} {\n\t\tconst from = this.detectVersion(configPath);\n\t\tif (from === \"5\") {\n\t\t\treturn { needs: false, from, to: \"5\" };\n\t\t}\n\t\treturn { needs: true, from, to: \"5\" };\n\t}\n\n\tpreviewMigration(configPath: string): string {\n\t\tconst absPath = resolve(configPath);\n\t\tconst from = this.detectVersion(absPath);\n\n\t\tif (from === \"5\") {\n\t\t\treturn `Config at ${absPath} is already at latest version (5). No migration needed.`;\n\t\t}\n\n\t\tconst chain = this.registry.resolveChain(from, \"5\");\n\t\tconst raw = readFileSync(absPath, \"utf-8\");\n\t\tconst parsed = parse(raw) as Record<string, unknown>;\n\n\t\tconst lines: string[] = [];\n\t\tlines.push(`Migration preview for ${absPath}`);\n\t\tlines.push(` From: v${from}`);\n\t\tlines.push(` To: v5`);\n\t\tlines.push(\n\t\t\t` Steps: ${chain.map((m) => `${m.fromVersion}→${m.toVersion}`).join(\" → \")}`,\n\t\t);\n\t\tlines.push(\"\");\n\n\t\tlet current = { ...parsed };\n\t\tfor (const step of chain) {\n\t\t\tconst beforeKeys = Object.keys(current).sort();\n\t\t\tconst after = step.migrate({ ...current });\n\t\t\tconst afterKeys = Object.keys(after).sort();\n\n\t\t\tconst added = afterKeys.filter((k) => !beforeKeys.includes(k));\n\t\t\tconst removed = beforeKeys.filter((k) => !afterKeys.includes(k));\n\n\t\t\tif (removed.length > 0) {\n\t\t\t\tlines.push(` v${step.fromVersion} → v${step.toVersion}:`);\n\t\t\t\tlines.push(` Removed keys: ${removed.join(\", \")}`);\n\t\t\t}\n\t\t\tif (added.length > 0) {\n\t\t\t\tlines.push(` v${step.fromVersion} → v${step.toVersion}:`);\n\t\t\t\tfor (const key of added) {\n\t\t\t\t\tlines.push(` + ${key}: ${JSON.stringify(after[key])}`);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (added.length === 0 && removed.length === 0) {\n\t\t\t\tlines.push(\n\t\t\t\t\t` v${step.fromVersion} → v${step.toVersion}: (internal changes only)`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tcurrent = after;\n\t\t}\n\n\t\tlines.push(\"\");\n\t\tlines.push(\"Run applyMigration to execute this migration.\");\n\t\treturn lines.join(\"\\n\");\n\t}\n\n\tapplyMigration(configPath: string): { success: boolean; backupPath: string } {\n\t\tconst absPath = resolve(configPath);\n\t\tconst from = this.detectVersion(absPath);\n\n\t\tif (from === \"5\") {\n\t\t\treturn { success: true, backupPath: \"\" };\n\t\t}\n\n\t\tconst chain = this.registry.resolveChain(from, \"5\");\n\t\tconst raw = readFileSync(absPath, \"utf-8\");\n\t\tconst parsed = parse(raw) as Record<string, unknown>;\n\n\t\tlet current = { ...parsed };\n\t\tlet lastBackupPath = \"\";\n\n\t\tfor (const step of chain) {\n\t\t\tconst stepBackupPath = `${absPath}.v${step.fromVersion}-to-v${step.toVersion}.${Date.now()}.bak`;\n\t\t\tcopyFileSync(absPath, stepBackupPath);\n\t\t\tlastBackupPath = stepBackupPath;\n\n\t\t\tconst migrated = step.migrate(current);\n\t\t\tcurrent = migrated;\n\n\t\t\tdebug(\n\t\t\t\t`Applied migration ${step.fromVersion} → ${step.toVersion}, backup at ${stepBackupPath}`,\n\t\t\t);\n\t\t}\n\n\t\tconst output = stringify(current, { indent: 2 });\n\t\twriteFileSync(absPath, output, \"utf-8\");\n\t\tdebug(`Written migrated config to ${absPath}`);\n\n\t\treturn { success: true, backupPath: lastBackupPath };\n\t}\n\n\trollbackMigration(backupPath: string): void {\n\t\tconst absBakPath = resolve(backupPath);\n\t\tif (!existsSync(absBakPath)) {\n\t\t\tthrow new Error(`Backup file not found: ${absBakPath}`);\n\t\t}\n\n\t\tconst configPath = absBakPath\n\t\t\t.replace(/\\.v\\d+-to-v\\d+\\.\\d+\\.bak$/, \"\")\n\t\t\t.replace(/\\.\\d+\\.bak$/, \"\");\n\t\tif (!existsSync(configPath)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cannot determine config path from backup: ${absBakPath}`,\n\t\t\t);\n\t\t}\n\n\t\tcopyFileSync(absBakPath, configPath);\n\t\tdebug(`Restored ${configPath} from backup ${absBakPath}`);\n\t}\n\n\tprivate buildDefaultRegistry(): MigrationRegistry {\n\t\tconst registry = new MigrationRegistry();\n\n\t\tregistry.register({\n\t\t\tfromVersion: \"1\",\n\t\t\ttoVersion: \"2\",\n\t\t\tmigrate: (config) => migration1to2(config),\n\t\t});\n\t\tregistry.register({\n\t\t\tfromVersion: \"2\",\n\t\t\ttoVersion: \"3\",\n\t\t\tmigrate: (config) => migration2to3(config),\n\t\t});\n\t\tregistry.register({\n\t\t\tfromVersion: \"3\",\n\t\t\ttoVersion: \"4\",\n\t\t\tmigrate: (config) => migration3to4(config),\n\t\t});\n\t\tregistry.register({\n\t\t\tfromVersion: \"4\",\n\t\t\ttoVersion: \"5\",\n\t\t\tmigrate: (config) => migration4to5(config),\n\t\t});\n\n\t\treturn registry;\n\t}\n}\n","import { existsSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\nimport { validateConfig } from '../core/config.js'\nimport { MigrationEngine } from '../config-migration/engine.js'\nimport { parse } from 'yaml'\nimport { readFileSync } from 'node:fs'\nimport chalk from 'chalk'\n\nexport async function configValidateCommand() {\n try {\n const cwd = process.cwd()\n const candidates = ['speexor.config.yaml', 'speexor.config.yml', '.speexor.yaml', '.speexor.yml', 'speexor.yaml']\n let configPath: string | undefined\n for (const c of candidates) {\n const full = join(cwd, c)\n if (existsSync(full)) {\n configPath = full\n break\n }\n }\n\n if (!configPath) {\n console.error(`\\n ${chalk.red('✖')} No speexor config found in ${cwd}\\n`)\n return\n }\n\n console.log(`\\n ${chalk.bold('🔍 Config Validation')}`)\n console.log(` ${chalk.dim(`Path: ${resolve(configPath)}`)}\\n`)\n\n const raw = readFileSync(configPath, 'utf-8')\n const parsed = parse(raw)\n const currentVersion = (parsed?.version as string) ?? 'unknown'\n\n console.log(` Schema version: ${chalk.cyan(currentVersion)}`)\n console.log(` Latest version: ${chalk.green('5')}`)\n\n const engine = new MigrationEngine()\n const detected = engine.detectVersion(configPath)\n const migrationStatus = engine.needsMigration(configPath)\n\n if (migrationStatus.needs) {\n console.log(`\\n ${chalk.yellow('⚠')} Version mismatch: v${detected} → v5`)\n console.log(` ${chalk.dim('Run migration to update config to latest schema.')}`)\n console.log()\n console.log(` ${chalk.cyan('Preview:')}`)\n console.log(` ${engine.previewMigration(configPath).replace(/\\n/g, '\\n ')}`)\n console.log()\n console.log(` Run ${chalk.bold('speexor config migrate')} to apply.\\n`)\n } else {\n console.log(` ${chalk.green('✓')} Config is at latest version\\n`)\n }\n\n try {\n validateConfig(parsed)\n console.log(` ${chalk.green('✓')} Schema validation passed\\n`)\n } catch (schemaError) {\n console.log(` ${chalk.red('✖')} Schema validation failed:\\n`)\n const msg = (schemaError as Error).message\n for (const line of msg.split('\\n')) {\n console.log(` ${chalk.red(line)}`)\n }\n console.log()\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n","import type { DecisionLogEntry } from \"../core/types.js\";\nimport { existsSync, mkdirSync, appendFileSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport Debug from \"debug\";\n\nconst debug = Debug(\"speexor:eval:decision-log\");\n\nexport interface DecisionLogFilter {\n\ttaskId?: string;\n\tagentId?: string;\n\tconfidenceMin?: number;\n\tconfidenceMax?: number;\n}\n\nexport class DecisionLog {\n\tprivate entries: DecisionLogEntry[] = [];\n\tprivate logPath: string;\n\n\tconstructor(baseDir?: string) {\n\t\tconst dir = baseDir ?? join(process.cwd(), \".speexor\");\n\t\tif (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\t\tthis.logPath = join(dir, \"decision-log.jsonl\");\n\t\tthis.load();\n\t}\n\n\tprivate load(): void {\n\t\ttry {\n\t\t\tif (existsSync(this.logPath)) {\n\t\t\t\tconst lines = readFileSync(this.logPath, \"utf-8\")\n\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t.filter(Boolean);\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst entry = JSON.parse(line);\n\t\t\t\t\t\tentry.createdAt = new Date(entry.createdAt);\n\t\t\t\t\t\tthis.entries.push(entry);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tdebug(\"Skipping malformed log line\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\tdebug(\"Failed to load decision log, starting fresh\");\n\t\t}\n\t}\n\n\trecord(entry: DecisionLogEntry): void {\n\t\tthis.entries.push(entry);\n\t\tappendFileSync(this.logPath, JSON.stringify(entry) + \"\\n\");\n\t\tdebug(`Decision recorded: ${entry.id} (confidence: ${entry.confidence})`);\n\t}\n\n\tgetEntries(filter?: DecisionLogFilter): DecisionLogEntry[] {\n\t\tlet result = this.entries;\n\t\tif (filter) {\n\t\t\tif (filter.taskId)\n\t\t\t\tresult = result.filter((e) => e.taskId === filter.taskId);\n\t\t\tif (filter.agentId)\n\t\t\t\tresult = result.filter((e) => e.agentId === filter.agentId);\n\t\t\tif (filter.confidenceMin !== undefined)\n\t\t\t\tresult = result.filter((e) => e.confidence >= filter.confidenceMin!);\n\t\t\tif (filter.confidenceMax !== undefined)\n\t\t\t\tresult = result.filter((e) => e.confidence <= filter.confidenceMax!);\n\t\t}\n\t\treturn [...result];\n\t}\n\n\tgetUnlabeledEntries(): DecisionLogEntry[] {\n\t\treturn this.entries.filter((e) => !e.outcome || e.outcome === \"unknown\");\n\t}\n\n\tgetEntriesByTimeRange(from: Date, to: Date): DecisionLogEntry[] {\n\t\treturn this.entries.filter((e) => e.createdAt >= from && e.createdAt <= to);\n\t}\n}\n","import type { DecisionLogEntry } from \"../core/types.js\";\nimport Debug from \"debug\";\n\nconst debug = Debug(\"speexor:eval:calibration\");\n\nexport interface CalibrationBucket {\n\trange: string;\n\tcount: number;\n\tcorrectRate: number;\n}\n\nexport interface CalibrationReport {\n\tbuckets: CalibrationBucket[];\n\toverallAccuracy: number;\n\ttotalDecisions: number;\n\tlabeledDecisions: number;\n}\n\nexport class CalibrationAnalyzer {\n\tanalyze(entries: DecisionLogEntry[]): CalibrationReport {\n\t\tconst buckets: CalibrationBucket[] = [];\n\t\tconst boundaries = [0, 0.2, 0.4, 0.6, 0.8, 1.0];\n\n\t\tfor (let i = 0; i < boundaries.length - 1; i++) {\n\t\t\tconst lo = boundaries[i]!;\n\t\t\tconst hi = boundaries[i + 1]!;\n\t\t\tconst inRange = entries.filter(\n\t\t\t\t(e) =>\n\t\t\t\t\te.confidence >= lo &&\n\t\t\t\t\t(i === boundaries.length - 2\n\t\t\t\t\t\t? e.confidence <= hi\n\t\t\t\t\t\t: e.confidence < hi),\n\t\t\t);\n\t\t\tconst labeled = inRange.filter(\n\t\t\t\t(e) => e.outcome && e.outcome !== \"unknown\",\n\t\t\t);\n\t\t\tconst correct = labeled.filter((e) => e.outcome === \"correct\");\n\t\t\tconst range = `${lo.toFixed(1)}-${hi.toFixed(1)}`;\n\n\t\t\tbuckets.push({\n\t\t\t\trange,\n\t\t\t\tcount: inRange.length,\n\t\t\t\tcorrectRate: labeled.length > 0 ? correct.length / labeled.length : 0,\n\t\t\t});\n\t\t}\n\n\t\tconst labeledEntries = entries.filter(\n\t\t\t(e) => e.outcome && e.outcome !== \"unknown\",\n\t\t);\n\t\tconst correctEntries = labeledEntries.filter(\n\t\t\t(e) => e.outcome === \"correct\",\n\t\t);\n\n\t\tconst report: CalibrationReport = {\n\t\t\tbuckets,\n\t\t\toverallAccuracy:\n\t\t\t\tlabeledEntries.length > 0\n\t\t\t\t\t? correctEntries.length / labeledEntries.length\n\t\t\t\t\t: 0,\n\t\t\ttotalDecisions: entries.length,\n\t\t\tlabeledDecisions: labeledEntries.length,\n\t\t};\n\n\t\tdebug(\n\t\t\t`Calibration report: ${report.labeledDecisions}/${report.totalDecisions} labeled, accuracy ${(report.overallAccuracy * 100).toFixed(1)}%`,\n\t\t);\n\n\t\treturn report;\n\t}\n\n\tgetUnderConfidenceAreas(report: CalibrationReport): string[] {\n\t\tconst areas: string[] = [];\n\t\tfor (const bucket of report.buckets) {\n\t\t\tconst [lo, hi] = bucket.range.split(\"-\").map(Number);\n\t\t\tif (hi === 0) continue;\n\t\t\tconst midConfidence = (lo! + hi!) / 2;\n\t\t\tif (bucket.count > 0 && bucket.correctRate > midConfidence + 0.1) {\n\t\t\t\tareas.push(\n\t\t\t\t\t`Bucket ${bucket.range}: correctRate=${(bucket.correctRate * 100).toFixed(1)}% > midConfidence=${(midConfidence * 100).toFixed(1)}% (underconfident)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn areas;\n\t}\n\n\tgetOverConfidenceAreas(report: CalibrationReport): string[] {\n\t\tconst areas: string[] = [];\n\t\tfor (const bucket of report.buckets) {\n\t\t\tconst [lo, hi] = bucket.range.split(\"-\").map(Number);\n\t\t\tif (hi === 0) continue;\n\t\t\tconst midConfidence = (lo! + hi!) / 2;\n\t\t\tif (bucket.count > 0 && bucket.correctRate < midConfidence - 0.1) {\n\t\t\t\tareas.push(\n\t\t\t\t\t`Bucket ${bucket.range}: correctRate=${(bucket.correctRate * 100).toFixed(1)}% < midConfidence=${(midConfidence * 100).toFixed(1)}% (overconfident)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn areas;\n\t}\n}\n","import type { DecisionLogEntry } from \"../core/types.js\";\nimport { DecisionLog } from \"./decision-log.js\";\nimport { CalibrationAnalyzer } from \"./calibration.js\";\nimport type { CalibrationReport } from \"./calibration.js\";\nimport Debug from \"debug\";\n\nconst debug = Debug(\"speexor:eval:evaluator\");\n\nexport class DecisionEvaluator {\n\tprivate log: DecisionLog;\n\tprivate analyzer: CalibrationAnalyzer;\n\tprivate subscribers: Set<(report: CalibrationReport) => void> = new Set();\n\n\tconstructor(baseDir?: string) {\n\t\tthis.log = new DecisionLog(baseDir);\n\t\tthis.analyzer = new CalibrationAnalyzer();\n\t}\n\n\tgetDecisionLog(): DecisionLog {\n\t\treturn this.log;\n\t}\n\n\tasync runEvaluation(): Promise<CalibrationReport> {\n\t\tconst unlabeled = this.log.getUnlabeledEntries();\n\t\tdebug(`Running evaluation on ${unlabeled.length} unlabeled entries`);\n\n\t\treturn this.getReport();\n\t}\n\n\tlabelDecision(\n\t\tentryId: string,\n\t\toutcome: \"correct\" | \"incorrect\" | \"partial\",\n\t): void {\n\t\tconst all = this.log.getEntries();\n\t\tconst entry = all.find((e) => e.id === entryId);\n\t\tif (entry) {\n\t\t\tentry.outcome = outcome;\n\t\t\tentry.outcomeLabeledBy = \"user\";\n\t\t\tdebug(`Decision ${entryId} labeled as ${outcome} by user`);\n\t\t\tthis.notify();\n\t\t}\n\t}\n\n\tasync autoLabelWithLLM(\n\t\tentry: DecisionLogEntry,\n\t): Promise<{\n\t\toutcome: \"correct\" | \"incorrect\" | \"partial\";\n\t\tconfidence: number;\n\t} | null> {\n\t\tdebug(`Auto-labeling decision ${entry.id} via LLM judge`);\n\t\treturn null;\n\t}\n\n\tgetReport(): CalibrationReport {\n\t\tconst entries = this.log.getEntries();\n\t\treturn this.analyzer.analyze(entries);\n\t}\n\n\tsubscribe(handler: (report: CalibrationReport) => void): () => void {\n\t\tthis.subscribers.add(handler);\n\t\treturn () => {\n\t\t\tthis.subscribers.delete(handler);\n\t\t};\n\t}\n\n\tprivate notify(): void {\n\t\tconst report = this.getReport();\n\t\tfor (const handler of this.subscribers) {\n\t\t\ttry {\n\t\t\t\thandler(report);\n\t\t\t} catch {\n\t\t\t\tdebug(\"Subscriber handler threw\");\n\t\t\t}\n\t\t}\n\t}\n}\n","import { DecisionEvaluator } from '../eval/evaluator.js'\nimport chalk from 'chalk'\n\nexport async function evalDecisionsCommand() {\n try {\n const evaluator = new DecisionEvaluator()\n const report = await evaluator.runEvaluation()\n\n console.log(`\\n ${chalk.bold('📊 Decision Quality Evaluation')}\\n`)\n console.log(` ${chalk.dim(`Total decisions: ${report.totalDecisions}`)}`)\n console.log(` ${chalk.dim(`Labeled decisions: ${report.labeledDecisions}`)}`)\n console.log(` Overall accuracy: ${chalk.cyan(`${(report.overallAccuracy * 100).toFixed(1)}%`)}\\n`)\n\n if (report.buckets.length > 0) {\n console.log(` ${chalk.bold('Calibration Report:')}\\n`)\n console.log(` ${chalk.dim('Confidence Range | Count | Correct Rate')}`)\n console.log(` ${chalk.dim('─'.repeat(45))}`)\n\n for (const bucket of report.buckets) {\n const bar = '█'.repeat(Math.round(bucket.correctRate * 20))\n const mid = bucket.range.split('-').map(Number)\n const midConf = ((mid[0] ?? 0) + (mid[1] ?? 1)) / 2\n let color = chalk.green\n if (bucket.count > 0) {\n if (bucket.correctRate < midConf - 0.1) color = chalk.red\n else if (bucket.correctRate > midConf + 0.1) color = chalk.yellow\n }\n const rateStr = bucket.count > 0 ? `${(bucket.correctRate * 100).toFixed(0).padStart(3)}%` : ' N/A'\n console.log(` ${`${bucket.range.padEnd(17)}`}│ ${String(bucket.count).padStart(4)} │ ${color(rateStr)} ${bar}`)\n }\n console.log()\n }\n } catch (error) {\n if (error instanceof Error) {\n console.error(`\\n ${chalk.red('✖')} ${error.message}\\n`)\n }\n }\n}\n","#!/usr/bin/env node\r\nimport { Command } from 'commander'\r\nimport { startCommand } from './start.js'\r\nimport { listCommand } from './list.js'\r\nimport { stopCommand } from './stop.js'\r\nimport { logsCommand } from './logs.js'\r\nimport { configHelpCommand } from './config-help.js'\r\nimport { taskSubmitCommand } from './task.js'\r\nimport { extSearchCommand, extInstallCommand, extListCommand, extUpdateCommand, extRemoveCommand } from './ext.js'\r\nimport { configValidateCommand } from './config-validate.js'\r\nimport { evalDecisionsCommand } from './eval-commands.js'\r\nimport { readFileSync, existsSync } from 'node:fs'\r\nimport { join, dirname } from 'node:path'\r\nimport { fileURLToPath } from 'node:url'\r\n\r\nconst __dirname = dirname(fileURLToPath(import.meta.url))\r\n\r\nfunction getVersion(): string {\r\n try {\r\n const pkgPath = join(__dirname, '..', '..', 'package.json')\r\n if (existsSync(pkgPath)) {\r\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\r\n return pkg.version ?? '0.1.0'\r\n }\r\n } catch {}\r\n return '0.1.0'\r\n}\r\n\r\nconst program = new Command()\r\n\r\nprogram.name('speexor').description('Agent Orchestrator for multi-AI coding agent orchestration (Speexor)').version(getVersion())\r\n\r\nprogram\r\n .command('start [repo]')\r\n .description('Initialize a project and start the dashboard')\r\n .option('-p, --port <port>', 'Dashboard port', '7777')\r\n .option('-n, --name <name>', 'Project name')\r\n .option('--no-dashboard', 'Skip starting dashboard')\r\n .action(startCommand)\r\n\r\nprogram\r\n .command('agent')\r\n .description('Manage agents')\r\n .addCommand(\r\n new Command('spawn')\r\n .description('Spawn a new agent for a task')\r\n .requiredOption('-t, --task <id>', 'Task ID')\r\n .option('-a, --agent <type>', 'Agent type (opencode, claude-code, aider, codex)', 'opencode')\r\n .action(async (opts) => {\r\n const { agentSpawnCommand } = await import('./agent.js')\r\n await agentSpawnCommand(opts)\r\n }),\r\n )\r\n\r\nprogram.command('list').description('List all projects and active agent statuses').action(listCommand)\r\n\r\nprogram.command('stop <session-id>').description('Stop an agent session safely').action(stopCommand)\r\n\r\nprogram\r\n .command('logs <session-id>')\r\n .description('Tail logs for an agent session')\r\n .option('-f, --follow', 'Follow log output')\r\n .option('-n, --lines <count>', 'Number of lines', '50')\r\n .action(logsCommand)\r\n\r\nprogram.command('config-help').description('Show full config schema reference').action(configHelpCommand)\r\n\r\nprogram\r\n .command('task')\r\n .description('Submit and manage tasks')\r\n .addCommand(\r\n new Command('submit')\r\n .description('Submit a task description for decomposition into a task graph')\r\n .argument('<description>', 'Task description')\r\n .action(taskSubmitCommand),\r\n )\r\n\r\nprogram\r\n .command('ext')\r\n .description('Manage extensions')\r\n .addCommand(\r\n new Command('search').description('Search the extension marketplace').argument('<query>', 'Search query').action(extSearchCommand),\r\n )\r\n .addCommand(\r\n new Command('install')\r\n .description('Install an extension from the marketplace')\r\n .argument('<name>', 'Extension name')\r\n .action(extInstallCommand),\r\n )\r\n .addCommand(new Command('list').description('List installed extensions').action(extListCommand))\r\n .addCommand(\r\n new Command('update')\r\n .description('Update installed extension(s)')\r\n .argument('[name]', 'Extension name (omit to update all)')\r\n .action(extUpdateCommand),\r\n )\r\n .addCommand(\r\n new Command('remove').description('Remove an installed extension').argument('<name>', 'Extension name').action(extRemoveCommand),\r\n )\r\n\r\nprogram\r\n .command('config')\r\n .description('Manage configuration')\r\n .addCommand(new Command('validate').description('Validate current config against schema and check version').action(configValidateCommand))\r\n\r\nprogram\r\n .command('eval')\r\n .description('Run evaluations and reports')\r\n .addCommand(\r\n new Command('decisions').description('Run Decision Quality evaluation and show calibration report').action(evalDecisionsCommand),\r\n )\r\n\r\nprogram.parse(process.argv)\r\n"]}