@brainst0rm/cli 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/{App-SSKWB7CT.js → App-HGJSYIVS.js} +133 -62
  2. package/dist/App-HGJSYIVS.js.map +1 -0
  3. package/dist/{App-DPXJYXKH.js → App-XCJW3A4I.js} +133 -62
  4. package/dist/App-XCJW3A4I.js.map +1 -0
  5. package/dist/brainstorm.js +1428 -150
  6. package/dist/brainstorm.js.map +1 -1
  7. package/dist/{chunk-7D4SUZUM.js → chunk-PR4QN5HX.js} +6 -1
  8. package/dist/{chunk-ZWE3DS7E.js → chunk-SEGVTWSK.js} +6 -1
  9. package/dist/{chunk-5NA3GH6X.js → chunk-WYQU3HAB.js} +175 -10
  10. package/dist/chunk-WYQU3HAB.js.map +1 -0
  11. package/dist/{chunk-55ITCWZZ.js → chunk-Z2QIGVYT.js} +175 -10
  12. package/dist/chunk-Z2QIGVYT.js.map +1 -0
  13. package/dist/{dist-GNHTH2DH.js → dist-3BC75XHW.js} +2 -2
  14. package/dist/dist-42TQFHMB.js +1640 -0
  15. package/dist/dist-42TQFHMB.js.map +1 -0
  16. package/dist/dist-BULARAL3.js +7308 -0
  17. package/dist/dist-BULARAL3.js.map +1 -0
  18. package/dist/{dist-JUDVPE7G.js → dist-ET6CSS7O.js} +2 -2
  19. package/dist/{dist-DUDO3RDM.js → dist-GVK5Q4YK.js} +62 -16
  20. package/dist/{dist-V5DTSTKJ.js.map → dist-GVK5Q4YK.js.map} +1 -1
  21. package/dist/{dist-V5DTSTKJ.js → dist-K7BDAMTO.js} +62 -16
  22. package/dist/{dist-DUDO3RDM.js.map → dist-K7BDAMTO.js.map} +1 -1
  23. package/dist/{dist-WLTQTLFO.js → dist-OYQTULIU.js} +2 -2
  24. package/dist/dist-S5JYXFUW.js +7307 -0
  25. package/dist/dist-S5JYXFUW.js.map +1 -0
  26. package/dist/{dist-YIGU37Q2.js → dist-Y25MC2VO.js} +2 -2
  27. package/dist/dist-Z4SBSK4Q.js +1639 -0
  28. package/dist/dist-Z4SBSK4Q.js.map +1 -0
  29. package/dist/index.js +1428 -150
  30. package/dist/index.js.map +1 -1
  31. package/dist/mcp-server-CROPNYHI.js +4252 -0
  32. package/dist/mcp-server-CROPNYHI.js.map +1 -0
  33. package/dist/mcp-server-IJVEG6CS.js +4251 -0
  34. package/dist/mcp-server-IJVEG6CS.js.map +1 -0
  35. package/dist/{recorder-D6ILEOZP.js → recorder-33N4U6TO.js} +2 -2
  36. package/dist/{recorder-SPYYF4DL.js → recorder-APOOXJYA.js} +2 -2
  37. package/dist/{roles-2DGF4PZU.js → roles-GKDCLP5G.js} +2 -2
  38. package/dist/{roles-UIPX7GBC.js → roles-UUIISXEW.js} +2 -2
  39. package/dist/{slash-PDWKCZOQ.js → slash-4XSR3SJD.js} +3 -3
  40. package/dist/{slash-ZDC4DKL4.js → slash-CVWH3LTR.js} +3 -3
  41. package/package.json +4 -2
  42. package/dist/App-DPXJYXKH.js.map +0 -1
  43. package/dist/App-SSKWB7CT.js.map +0 -1
  44. package/dist/chunk-55ITCWZZ.js.map +0 -1
  45. package/dist/chunk-5NA3GH6X.js.map +0 -1
  46. /package/dist/{chunk-7D4SUZUM.js.map → chunk-PR4QN5HX.js.map} +0 -0
  47. /package/dist/{chunk-ZWE3DS7E.js.map → chunk-SEGVTWSK.js.map} +0 -0
  48. /package/dist/{dist-GNHTH2DH.js.map → dist-3BC75XHW.js.map} +0 -0
  49. /package/dist/{dist-JUDVPE7G.js.map → dist-ET6CSS7O.js.map} +0 -0
  50. /package/dist/{dist-WLTQTLFO.js.map → dist-OYQTULIU.js.map} +0 -0
  51. /package/dist/{dist-YIGU37Q2.js.map → dist-Y25MC2VO.js.map} +0 -0
  52. /package/dist/{recorder-D6ILEOZP.js.map → recorder-33N4U6TO.js.map} +0 -0
  53. /package/dist/{recorder-SPYYF4DL.js.map → recorder-APOOXJYA.js.map} +0 -0
  54. /package/dist/{roles-2DGF4PZU.js.map → roles-GKDCLP5G.js.map} +0 -0
  55. /package/dist/{roles-UIPX7GBC.js.map → roles-UUIISXEW.js.map} +0 -0
  56. /package/dist/{slash-PDWKCZOQ.js.map → slash-4XSR3SJD.js.map} +0 -0
  57. /package/dist/{slash-ZDC4DKL4.js.map → slash-CVWH3LTR.js.map} +0 -0
@@ -204,9 +204,17 @@ ${cmd.description}${aliases}`;
204
204
  " /recommend [type] Get model recommendation from BR",
205
205
  " /stats Session analytics + BR usage",
206
206
  "",
207
+ "God Mode",
208
+ " /godmode Control plane status",
209
+ " /godmode tools List God Mode tools",
210
+ " /godmode changesets Pending ChangeSets",
211
+ " /godmode audit ChangeSet audit log",
212
+ " /serve Start HTTP API server",
213
+ "",
207
214
  "System",
208
215
  " /vault [action] Manage API keys",
209
216
  " /dream Consolidate memory files",
217
+ " /daemon [action] Daemon control (status/pause/resume/stop/log)",
210
218
  "",
211
219
  "Modes: Esc toggles Dashboard \u2502 Shift+Tab cycles permission"
212
220
  ];
@@ -374,7 +382,7 @@ Tokens: ${tokens.input.toLocaleString()} in / ${tokens.output.toLocaleString()}
374
382
  description: "Manage projects \u2014 switch, list, show dashboard",
375
383
  usage: "/project [name|list|register|show <name>]",
376
384
  execute: async (args, ctx) => {
377
- const { ProjectManager } = await import("./dist-WLTQTLFO.js");
385
+ const { ProjectManager } = await import("./dist-OYQTULIU.js");
378
386
  const { getDb } = await import("@brainst0rm/db");
379
387
  const db = getDb();
380
388
  const pm = new ProjectManager(db);
@@ -486,8 +494,8 @@ ${lines.join("\n")}`;
486
494
  description: "Coordinate work across multiple projects",
487
495
  usage: '/orchestrate "<description>" [project1,project2,...]',
488
496
  execute: async (args) => {
489
- const { OrchestrationEngine } = await import("./dist-GNHTH2DH.js");
490
- const { ProjectManager } = await import("./dist-WLTQTLFO.js");
497
+ const { OrchestrationEngine } = await import("./dist-3BC75XHW.js");
498
+ const { ProjectManager } = await import("./dist-OYQTULIU.js");
491
499
  const { getDb } = await import("@brainst0rm/db");
492
500
  const db = getDb();
493
501
  const engine = new OrchestrationEngine(db);
@@ -665,7 +673,7 @@ function createRoleCommand(roleId) {
665
673
  ctx.setOutputStyle?.(role.outputStyle);
666
674
  ctx.setMode?.(role.permissionMode);
667
675
  ctx.setStrategy?.(role.routingStrategy);
668
- const { getRolePrompt } = await import("./roles-2DGF4PZU.js");
676
+ const { getRolePrompt } = await import("./roles-GKDCLP5G.js");
669
677
  ctx.rebuildSystemPrompt?.(getRolePrompt(roleId, modelId));
670
678
  ctx.setActiveRole?.(roleId);
671
679
  return formatRoleConfirmation(roleId, modelId);
@@ -1156,9 +1164,9 @@ commands.push({
1156
1164
  if (!args.trim()) {
1157
1165
  return "Usage: /architect-edit <task description>\n\nA reasoning model (Opus/GPT-5.4) will plan the change, then a fast model (Sonnet/GPT-4.1) will apply it.";
1158
1166
  }
1159
- const { ROLES: ROLES2, getRolePrompt } = await import("./roles-2DGF4PZU.js");
1167
+ const { ROLES: ROLES2, getRolePrompt } = await import("./roles-GKDCLP5G.js");
1160
1168
  const architect = ROLES2.architect;
1161
- const planModel = architect.modelChoices[0]?.models[0] ?? "anthropic/claude-opus-4.6";
1169
+ const planModel = architect.modelChoices[0]?.modelId ?? "anthropic/claude-opus-4.6";
1162
1170
  ctx.setModel?.(planModel);
1163
1171
  ctx.setMode?.("plan");
1164
1172
  ctx.rebuildSystemPrompt?.(
@@ -1187,9 +1195,9 @@ commands.push({
1187
1195
  description: "Switch from architect plan phase to coding apply phase",
1188
1196
  usage: "/ae-apply",
1189
1197
  execute: async (_args, ctx) => {
1190
- const { ROLES: ROLES2 } = await import("./roles-2DGF4PZU.js");
1198
+ const { ROLES: ROLES2 } = await import("./roles-GKDCLP5G.js");
1191
1199
  const dev = ROLES2["sr-developer"];
1192
- const codeModel = dev.modelChoices[0]?.models[0] ?? "anthropic/claude-sonnet-4.6";
1200
+ const codeModel = dev.modelChoices[0]?.modelId ?? "anthropic/claude-sonnet-4.6";
1193
1201
  ctx.setModel?.(codeModel);
1194
1202
  ctx.setMode?.("auto");
1195
1203
  ctx.rebuildSystemPrompt?.();
@@ -1250,7 +1258,7 @@ commands.push({
1250
1258
  description: "Record voice input and transcribe via Whisper (requires sox)",
1251
1259
  usage: "/voice",
1252
1260
  execute: async () => {
1253
- const { AudioRecorder } = await import("./recorder-SPYYF4DL.js");
1261
+ const { AudioRecorder } = await import("./recorder-APOOXJYA.js");
1254
1262
  if (!AudioRecorder.isAvailable()) {
1255
1263
  return "Voice input requires `sox`. Install: brew install sox (macOS) or apt install sox (Linux).";
1256
1264
  }
@@ -1267,6 +1275,163 @@ commands.push({
1267
1275
  ].join("\n");
1268
1276
  }
1269
1277
  });
1278
+ commands.push({
1279
+ name: "daemon",
1280
+ aliases: [],
1281
+ description: "Daemon mode control \u2014 status, pause, resume, stop, log",
1282
+ usage: "/daemon [status|pause|resume|stop|log]",
1283
+ execute: () => {
1284
+ return [
1285
+ "Daemon commands (only active in --daemon mode):",
1286
+ "",
1287
+ " /daemon status Show daemon state (ticks, cost, sleep status)",
1288
+ " /daemon pause Pause tick loop",
1289
+ " /daemon resume Resume tick loop",
1290
+ " /daemon log Show today's daemon log",
1291
+ " /daemon stop Stop daemon",
1292
+ "",
1293
+ "Start daemon mode: brainstorm chat --simple --daemon",
1294
+ "Resume crashed daemon: brainstorm chat --simple --daemon --continue"
1295
+ ].join("\n");
1296
+ }
1297
+ });
1298
+ commands.push({
1299
+ name: "godmode",
1300
+ aliases: ["gm"],
1301
+ description: "God Mode status \u2014 connected systems, tools, pending changesets",
1302
+ usage: "/godmode [tools|connectors|changesets|audit]",
1303
+ execute: async (args) => {
1304
+ const subcommand = args?.trim().toLowerCase();
1305
+ if (subcommand === "tools") {
1306
+ try {
1307
+ const { listChangeSets } = await import("@brainst0rm/godmode");
1308
+ return [
1309
+ "God Mode Tools:",
1310
+ "",
1311
+ " ChangeSet tools (always available):",
1312
+ " gm_changeset_list \u2014 List pending changesets",
1313
+ " gm_changeset_approve \u2014 Approve + execute a changeset",
1314
+ " gm_changeset_reject \u2014 Reject a changeset draft",
1315
+ "",
1316
+ " Connector tools are registered dynamically when systems",
1317
+ " connect. Use natural language to discover them:",
1318
+ ' "list all devices" \u2192 MSP device tools',
1319
+ ' "quarantine email" \u2192 Email security tools',
1320
+ ' "create VM snapshot" \u2192 VM tools'
1321
+ ].join("\n");
1322
+ } catch {
1323
+ return "God Mode package not available.";
1324
+ }
1325
+ }
1326
+ if (subcommand === "changesets" || subcommand === "cs") {
1327
+ try {
1328
+ const { listChangeSets } = await import("@brainst0rm/godmode");
1329
+ const active = listChangeSets();
1330
+ if (active.length === 0) return "No active changesets.";
1331
+ const lines = ["Pending ChangeSets:", ""];
1332
+ for (const cs of active) {
1333
+ lines.push(
1334
+ ` [${cs.id}] ${cs.connector}/${cs.action} \u2014 risk: ${cs.riskScore}/100 \u2014 ${cs.status}`
1335
+ );
1336
+ lines.push(` ${cs.description}`);
1337
+ if (cs.riskFactors.length > 0)
1338
+ lines.push(` Risks: ${cs.riskFactors.join(", ")}`);
1339
+ lines.push("");
1340
+ }
1341
+ return lines.join("\n");
1342
+ } catch {
1343
+ return "God Mode package not available.";
1344
+ }
1345
+ }
1346
+ if (subcommand === "audit") {
1347
+ try {
1348
+ const { getAuditLog } = await import("@brainst0rm/godmode");
1349
+ const log = getAuditLog();
1350
+ if (log.length === 0) return "No God Mode audit entries this session.";
1351
+ const lines = ["God Mode Audit Log (this session):", ""];
1352
+ for (const entry of log.slice(-10)) {
1353
+ const ts = new Date(entry.createdAt).toLocaleTimeString();
1354
+ lines.push(
1355
+ ` ${ts} ${entry.connector}/${entry.action} \u2014 ${entry.status} \u2014 risk: ${entry.riskScore}`
1356
+ );
1357
+ }
1358
+ if (log.length > 10) lines.push(` ... and ${log.length - 10} more`);
1359
+ return lines.join("\n");
1360
+ } catch {
1361
+ return "God Mode package not available.";
1362
+ }
1363
+ }
1364
+ return [
1365
+ "God Mode \u2014 Natural Language Control Plane",
1366
+ "",
1367
+ " Status: enabled (connectors load at session start)",
1368
+ " Config: [godmode] section in config.toml",
1369
+ "",
1370
+ " Subcommands:",
1371
+ " /godmode tools \u2014 List available God Mode tools",
1372
+ " /godmode changesets \u2014 Show pending ChangeSets",
1373
+ " /godmode audit \u2014 Show changeset audit log",
1374
+ "",
1375
+ " Usage: Just describe what you want in natural language.",
1376
+ " The agent will use God Mode tools automatically.",
1377
+ "",
1378
+ " HTTP API: brainstorm serve --port 8000"
1379
+ ].join("\n");
1380
+ }
1381
+ });
1382
+ commands.push({
1383
+ name: "serve",
1384
+ aliases: ["api"],
1385
+ description: "Start/stop the HTTP API server from within chat",
1386
+ usage: "/serve [stop|status]",
1387
+ execute: async (args) => {
1388
+ const subcommand = args?.trim().toLowerCase();
1389
+ if (subcommand === "stop") {
1390
+ const pid = globalThis.__brainstorm_serve_pid;
1391
+ if (!pid) return "No serve process running.";
1392
+ try {
1393
+ process.kill(pid, "SIGTERM");
1394
+ globalThis.__brainstorm_serve_pid = void 0;
1395
+ return "API server stopped.";
1396
+ } catch {
1397
+ return "Failed to stop server (may have already exited).";
1398
+ }
1399
+ }
1400
+ if (subcommand === "status") {
1401
+ const pid = globalThis.__brainstorm_serve_pid;
1402
+ if (!pid) return "API server is not running. Use /serve to start.";
1403
+ try {
1404
+ process.kill(pid, 0);
1405
+ return `API server running (pid: ${pid}).`;
1406
+ } catch {
1407
+ globalThis.__brainstorm_serve_pid = void 0;
1408
+ return "API server is not running (process exited).";
1409
+ }
1410
+ }
1411
+ const { fork } = await import("child_process");
1412
+ const { join } = await import("path");
1413
+ const { dirname } = await import("path");
1414
+ const { fileURLToPath } = await import("url");
1415
+ const binDir = join(dirname(fileURLToPath(import.meta.url)));
1416
+ const binPath = join(binDir, "brainstorm.js");
1417
+ const child = fork(binPath, ["serve", "--cors"], {
1418
+ stdio: "ignore",
1419
+ detached: true
1420
+ });
1421
+ child.unref();
1422
+ globalThis.__brainstorm_serve_pid = child.pid;
1423
+ return [
1424
+ `API server starting (pid: ${child.pid})`,
1425
+ "",
1426
+ " http://127.0.0.1:8000/health",
1427
+ " http://127.0.0.1:8000/api/v1/tools",
1428
+ " http://127.0.0.1:8000/api/v1/products",
1429
+ "",
1430
+ " /serve status \u2014 check if running",
1431
+ " /serve stop \u2014 stop the server"
1432
+ ].join("\n");
1433
+ }
1434
+ });
1270
1435
  var commandMap = /* @__PURE__ */ new Map();
1271
1436
  for (const cmd of commands) {
1272
1437
  commandMap.set(cmd.name, cmd);
@@ -1304,4 +1469,4 @@ export {
1304
1469
  executeSlashCommand,
1305
1470
  getSlashCommands
1306
1471
  };
1307
- //# sourceMappingURL=chunk-55ITCWZZ.js.map
1472
+ //# sourceMappingURL=chunk-Z2QIGVYT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/build-wizard.ts","../src/commands/slash.ts"],"sourcesContent":["/**\n * Multi-Model Workflow Wizard — conversational team assembly.\n *\n * State machine that collects a task description, auto-detects the\n * workflow type, lets users assign models per pipeline step, shows\n * cost estimates, and executes via the workflow engine.\n */\n\nimport { ROLES, type RoleId, type ModelChoice } from \"./roles.js\";\nimport { autoSelectPreset, getPresetWorkflow } from \"@brainst0rm/workflow\";\nimport type { WorkflowDefinition, WorkflowStepDef } from \"@brainst0rm/shared\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport type WizardStep =\n | \"describe\"\n | \"confirm\"\n | \"assign-models\"\n | \"summary\"\n | \"executing\"\n | \"done\";\n\nexport interface ModelAssignment {\n stepId: string;\n stepRole: string;\n modelId: string;\n modelLabel: string;\n estimatedCost: number;\n}\n\nexport interface WizardState {\n step: WizardStep;\n description: string;\n detectedPreset: string | null;\n workflow: WorkflowDefinition | null;\n assignments: ModelAssignment[];\n currentAssignIdx: number;\n totalCost: number;\n complexity: string;\n}\n\n// ── Role mapping ─────────────────────────────────────────────────────\n\n/** Map workflow agent roles to the role system's curated model lists. */\nconst ROLE_FOR_AGENT: Record<string, RoleId> = {\n architect: \"architect\",\n coder: \"sr-developer\",\n reviewer: \"qa\",\n debugger: \"sr-developer\",\n analyst: \"architect\",\n orchestrator: \"architect\",\n \"product-manager\": \"product-manager\",\n};\n\n// ── State machine ────────────────────────────────────────────────────\n\nexport function createWizardState(): WizardState {\n return {\n step: \"describe\",\n description: \"\",\n detectedPreset: null,\n workflow: null,\n assignments: [],\n currentAssignIdx: 0,\n totalCost: 0,\n complexity: \"moderate\",\n };\n}\n\n/**\n * Process the user's task description.\n * Auto-detects the workflow type and builds default model assignments.\n */\nexport function processDescription(\n state: WizardState,\n description: string,\n classify?: (text: string) => { complexity: string },\n): WizardState {\n const detectedPreset = autoSelectPreset(description) ?? \"implement-feature\";\n const workflow = getPresetWorkflow(detectedPreset);\n\n if (!workflow) {\n return { ...state, step: \"describe\", description };\n }\n\n // Classify complexity for smart defaults\n let complexity = \"moderate\";\n if (classify) {\n try {\n const profile = classify(description);\n complexity = profile.complexity ?? \"moderate\";\n } catch {\n // fallback\n }\n }\n\n // Build default model assignments\n const assignments = workflow.steps.map((step) => {\n const roleId = ROLE_FOR_AGENT[step.agentRole] ?? \"sr-developer\";\n const defaultModel = getDefaultModelForStep(roleId, complexity);\n const pricing = getModelPricing(defaultModel.modelId);\n const estimatedCost = estimateStepCost(complexity, pricing);\n\n return {\n stepId: step.id,\n stepRole: step.agentRole,\n modelId: defaultModel.modelId,\n modelLabel: defaultModel.label,\n estimatedCost,\n };\n });\n\n const totalCost = assignments.reduce((sum, a) => sum + a.estimatedCost, 0);\n\n return {\n ...state,\n step: \"confirm\",\n description,\n detectedPreset,\n workflow,\n assignments,\n currentAssignIdx: 0,\n totalCost,\n complexity,\n };\n}\n\n/**\n * Get the curated model choices for a workflow step.\n */\nexport function getModelChoicesForStep(agentRole: string): ModelChoice[] {\n const roleId = ROLE_FOR_AGENT[agentRole] ?? \"sr-developer\";\n const role = ROLES[roleId];\n return role?.modelChoices ?? [];\n}\n\n/**\n * Get the default model for a step based on complexity.\n */\nfunction getDefaultModelForStep(\n roleId: RoleId,\n complexity: string,\n): ModelChoice {\n const role = ROLES[roleId];\n if (!role)\n return { modelId: \"brainstormrouter/auto\", label: \"Auto\", cost: \"$0\" };\n\n // High complexity → use the role's default (usually the best model)\n // Low complexity → use a cheaper option\n if (complexity === \"trivial\" || complexity === \"simple\") {\n // Pick the cheapest option for simple tasks\n return (\n role.modelChoices[role.modelChoices.length - 1] ?? role.modelChoices[0]\n );\n }\n\n // Default: use the role's default choice\n return role.modelChoices.find((m) => m.default) ?? role.modelChoices[0];\n}\n\n// ── Cost estimation ──────────────────────────────────────────────────\n\nconst MODEL_PRICING: Record<string, { input: number; output: number }> = {\n \"anthropic/claude-opus-4-6\": { input: 15, output: 75 },\n \"anthropic/claude-sonnet-4-6\": { input: 3, output: 15 },\n \"anthropic/claude-haiku-4-5-20251001\": { input: 0.8, output: 4 },\n \"openai/gpt-5.4\": { input: 2.5, output: 10 },\n \"openai/gpt-4.1-mini\": { input: 0.4, output: 1.6 },\n \"google/gemini-3.1-pro\": { input: 1.25, output: 5 },\n \"google/gemini-3.1-flash\": { input: 0.15, output: 0.6 },\n \"deepseek/deepseek-chat\": { input: 0.27, output: 1.1 },\n \"moonshot/kimi-k2.5\": { input: 0.6, output: 2.4 },\n};\n\nfunction getModelPricing(modelId: string): { input: number; output: number } {\n return MODEL_PRICING[modelId] ?? { input: 1, output: 4 };\n}\n\nconst COMPLEXITY_TOKENS: Record<string, { input: number; output: number }> = {\n trivial: { input: 500, output: 200 },\n simple: { input: 1000, output: 500 },\n moderate: { input: 3000, output: 1500 },\n complex: { input: 8000, output: 4000 },\n expert: { input: 15000, output: 8000 },\n};\n\nfunction estimateStepCost(\n complexity: string,\n pricing: { input: number; output: number },\n): number {\n const tokens = COMPLEXITY_TOKENS[complexity] ?? COMPLEXITY_TOKENS.moderate;\n return (\n (tokens.input / 1_000_000) * pricing.input +\n (tokens.output / 1_000_000) * pricing.output\n );\n}\n\n/**\n * Update a model assignment for a specific step.\n */\nexport function updateAssignment(\n state: WizardState,\n stepIdx: number,\n modelChoice: ModelChoice,\n): WizardState {\n const assignments = [...state.assignments];\n const pricing = getModelPricing(modelChoice.modelId);\n assignments[stepIdx] = {\n ...assignments[stepIdx],\n modelId: modelChoice.modelId,\n modelLabel: modelChoice.label,\n estimatedCost: estimateStepCost(state.complexity, pricing),\n };\n const totalCost = assignments.reduce((sum, a) => sum + a.estimatedCost, 0);\n return { ...state, assignments, totalCost };\n}\n\n// ── Pipeline visualization ───────────────────────────────────────────\n\nconst ROLE_ICONS: Record<string, string> = {\n architect: \"🏗\",\n coder: \"👨‍💻\",\n reviewer: \"🔍\",\n debugger: \"🔧\",\n analyst: \"📊\",\n};\n\n/**\n * Format the pipeline as a visual string for the terminal.\n */\nexport function formatPipeline(state: WizardState): string {\n if (!state.workflow || state.assignments.length === 0) return \"\";\n\n const lines: string[] = [];\n lines.push(`${state.detectedPreset}`);\n\n for (let i = 0; i < state.assignments.length; i++) {\n const a = state.assignments[i];\n const step = state.workflow.steps[i];\n const icon = ROLE_ICONS[a.stepRole] ?? \"⚙\";\n // Short model name (drop provider prefix)\n const shortModel = a.modelLabel\n .replace(/^Claude /, \"\")\n .replace(/^GPT-/, \"GPT-\");\n lines.push(\n `${i + 1}. ${icon} ${a.stepRole} → ${shortModel} ~$${a.estimatedCost.toFixed(3)}`,\n );\n\n if (step?.isReviewStep && step.loopBackTo) {\n lines.push(` ↺ loops to ${step.loopBackTo}`);\n }\n }\n\n lines.push(`Total: ~$${state.totalCost.toFixed(3)}`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Build the overrides for runWorkflow from wizard assignments.\n */\nexport function buildWorkflowOverrides(state: WizardState): {\n agentOverrides: Record<string, string>;\n stepModelOverrides: Record<string, string>;\n} {\n const agentOverrides: Record<string, string> = {};\n const stepModelOverrides: Record<string, string> = {};\n\n for (const a of state.assignments) {\n stepModelOverrides[a.stepId] = a.modelId;\n }\n\n return { agentOverrides, stepModelOverrides };\n}\n","/**\n * Slash command registry and dispatcher.\n *\n * Commands are pure functions that receive a mutable session context and\n * return a string result to display to the user. The ChatApp detects the\n * `/` prefix and routes here instead of sending to the agent loop.\n */\n\nexport interface SlashContext {\n /** Switch the active model (name or provider:model format) */\n setModel?: (model: string) => void;\n /** Get the current model name */\n getModel?: () => string | undefined;\n /** Switch routing strategy */\n setStrategy?: (strategy: string) => void;\n /** Get the current routing strategy */\n getStrategy?: () => string;\n /** Switch permission mode */\n setMode?: (mode: string) => void;\n /** Get the current permission mode */\n getMode?: () => string;\n /** Get session cost so far */\n getSessionCost?: () => number;\n /** Get session token counts */\n getTokenCount?: () => { input: number; output: number };\n /** Get remaining budget */\n getBudget?: () => { remaining: number; limit: number } | null;\n /** Clear conversation history */\n clearHistory?: () => void;\n /** Trigger context compaction, optionally with focus instruction */\n compact?: (focusInstruction?: string) => Promise<void>;\n /** Exit the application */\n exit?: () => void;\n /** Set output style */\n setOutputStyle?: (style: string) => void;\n /** Get current output style */\n getOutputStyle?: () => string;\n /** Run memory consolidation (dream) */\n dream?: () => Promise<string>;\n /** Vault operations (list, add, get) */\n vault?: (action: string, args: string) => Promise<string>;\n /** Rebuild system prompt with optional base prompt override */\n rebuildSystemPrompt?: (basePromptOverride?: string) => void;\n /** Get/set active role */\n getActiveRole?: () => string | undefined;\n setActiveRole?: (role: string | undefined) => void;\n /** BrainstormRouter gateway client for /recommend, /stats, /compare */\n gateway?: any;\n /** Get the context window size of the current model */\n getContextWindow?: () => number;\n /** Push an inline interactive prompt (SelectPrompt). Returns user's selection. */\n prompt?: (\n question: string,\n options: Array<{\n label: string;\n value: string;\n description?: string;\n recommended?: boolean;\n }>,\n ) => Promise<string>;\n /** Remove last user message + assistant response */\n undoLastTurn?: () => number;\n}\n\ninterface SlashCommand {\n name: string;\n aliases: string[];\n description: string;\n usage: string;\n execute: (\n args: string,\n ctx: SlashContext,\n invokedAs?: string,\n ) => string | Promise<string>;\n}\n\nconst commands: SlashCommand[] = [\n {\n name: \"help\",\n aliases: [\"h\", \"?\"],\n description: \"Show available slash commands\",\n usage: \"/help [command]\",\n execute: (args) => {\n if (args) {\n // Detailed help for specific command\n const cmd = commandMap.get(args.toLowerCase());\n if (!cmd)\n return `Unknown command: /${args}. Type /help for all commands.`;\n const aliases =\n cmd.aliases.length > 0\n ? `\\nAliases: ${cmd.aliases.map((a) => \"/\" + a).join(\", \")}`\n : \"\";\n return `${cmd.usage}\\n${cmd.description}${aliases}`;\n }\n\n // Group commands by category\n const lines = [\n \"Commands:\",\n \"\",\n \"Chat\",\n \" /help [cmd] Show help (detail for specific command)\",\n \" /model [name] Switch model\",\n \" /strategy [name] Switch routing strategy\",\n \" /mode [mode] Switch permission (auto/confirm/plan)\",\n \" /style [style] Switch output style\",\n \" /compact [focus] Compact context with optional focus\",\n \" /context Show token breakdown\",\n \" /cost Show session cost\",\n \" /plan Toggle plan mode (describe before execute)\",\n \" /efficiency Token usage and routing savings\",\n \" /clear Clear conversation\",\n \"\",\n \"Roles\",\n \" /architect [N] Deep thinking, read-only\",\n \" /sr-developer [N] Quality implementation\",\n \" /jr-developer [N] Fast, cheap coding\",\n \" /qa [N] Testing and review\",\n \" /role Show current role\",\n \" /default Reset to defaults\",\n \"\",\n \"Build\",\n \" /build [desc] Multi-model workflow wizard\",\n \" /build-go Execute pending pipeline\",\n \" /build-customize See model options per step\",\n \"\",\n \"Intelligence\",\n \" /recommend [type] Get model recommendation from BR\",\n \" /stats Session analytics + BR usage\",\n \"\",\n \"God Mode\",\n \" /godmode Control plane status\",\n \" /godmode tools List God Mode tools\",\n \" /godmode changesets Pending ChangeSets\",\n \" /godmode audit ChangeSet audit log\",\n \" /serve Start HTTP API server\",\n \"\",\n \"System\",\n \" /vault [action] Manage API keys\",\n \" /dream Consolidate memory files\",\n \" /daemon [action] Daemon control (status/pause/resume/stop/log)\",\n \"\",\n \"Modes: Esc toggles Dashboard │ Shift+Tab cycles permission\",\n ];\n return lines.join(\"\\n\");\n },\n },\n {\n name: \"model\",\n aliases: [\"m\"],\n description: \"Switch or show the active model\",\n usage: \"/model [name]\",\n execute: (args, ctx) => {\n if (!args) {\n const current = ctx.getModel?.() ?? \"auto (router-selected)\";\n return `Current model: ${current}`;\n }\n ctx.setModel?.(args);\n return `Model switched to: ${args}`;\n },\n },\n {\n name: \"strategy\",\n aliases: [\"fast\"],\n description: \"Switch routing strategy\",\n usage:\n \"/strategy [cost-first|quality-first|combined|capability|rule-based]\",\n execute: (args, ctx, invokedAs) => {\n const valid = [\n \"cost-first\",\n \"quality-first\",\n \"combined\",\n \"capability\",\n \"rule-based\",\n ];\n // /fast with no args → toggle (backward compat)\n if (!args && invokedAs === \"fast\") {\n const current = ctx.getStrategy?.() ?? \"combined\";\n const next = current === \"cost-first\" ? \"quality-first\" : \"cost-first\";\n ctx.setStrategy?.(next);\n return `Routing strategy: ${next}`;\n }\n if (!args) {\n return `Current strategy: ${ctx.getStrategy?.() ?? \"combined\"}. Options: ${valid.join(\", \")}`;\n }\n if (!valid.includes(args)) {\n return `Unknown strategy: ${args}. Options: ${valid.join(\", \")}`;\n }\n ctx.setStrategy?.(args);\n return `Routing strategy: ${args}`;\n },\n },\n {\n name: \"mode\",\n aliases: [],\n description: \"Switch permission mode\",\n usage: \"/mode [auto|confirm|plan]\",\n execute: (args, ctx) => {\n const valid = [\"auto\", \"confirm\", \"plan\"];\n if (!args) {\n return `Current mode: ${ctx.getMode?.() ?? \"confirm\"}. Options: ${valid.join(\", \")}`;\n }\n if (!valid.includes(args)) {\n return `Invalid mode: ${args}. Options: ${valid.join(\", \")}`;\n }\n ctx.setMode?.(args);\n return `Permission mode: ${args}`;\n },\n },\n {\n name: \"cost\",\n aliases: [\"$\"],\n description: \"Show session cost so far\",\n usage: \"/cost\",\n execute: (_args, ctx) => {\n const cost = ctx.getSessionCost?.() ?? 0;\n const tokens = ctx.getTokenCount?.() ?? { input: 0, output: 0 };\n return `Session cost: $${cost.toFixed(4)}\\nTokens: ${tokens.input.toLocaleString()} in / ${tokens.output.toLocaleString()} out`;\n },\n },\n {\n name: \"budget\",\n aliases: [],\n description: \"Show remaining budget\",\n usage: \"/budget\",\n execute: (_args, ctx) => {\n const budget = ctx.getBudget?.();\n if (!budget) return \"No budget limit set.\";\n const pct = ((budget.remaining / budget.limit) * 100).toFixed(1);\n return `Budget: $${budget.remaining.toFixed(4)} remaining of $${budget.limit.toFixed(4)} (${pct}%)`;\n },\n },\n {\n name: \"clear\",\n aliases: [],\n description: \"Clear conversation history\",\n usage: \"/clear\",\n execute: (_args, ctx) => {\n ctx.clearHistory?.();\n return \"Conversation cleared.\";\n },\n },\n {\n name: \"compact\",\n aliases: [],\n description: \"Compact context, optionally with focus instruction\",\n usage: \"/compact [focus instruction]\",\n execute: async (args, ctx) => {\n if (!ctx.compact) return \"Compaction not available.\";\n await ctx.compact(args || undefined);\n return args ? `Context compacted (focus: ${args})` : \"Context compacted.\";\n },\n },\n {\n name: \"style\",\n aliases: [],\n description: \"Switch output style\",\n usage: \"/style [concise|detailed|learning]\",\n execute: (args, ctx) => {\n const valid = [\"concise\", \"detailed\", \"learning\"];\n if (!args) {\n return `Current style: ${ctx.getOutputStyle?.() ?? \"concise\"}. Options: ${valid.join(\", \")}`;\n }\n if (!valid.includes(args)) {\n return `Invalid style: ${args}. Options: ${valid.join(\", \")}`;\n }\n ctx.setOutputStyle?.(args);\n return `Output style: ${args}`;\n },\n },\n {\n name: \"quit\",\n aliases: [\"exit\", \"q\"],\n description: \"Exit Brainstorm\",\n usage: \"/quit\",\n execute: (_args, ctx) => {\n ctx.exit?.();\n return \"Goodbye.\";\n },\n },\n {\n name: \"vault\",\n aliases: [\"keys\"],\n description: \"Manage API keys in the encrypted vault\",\n usage: \"/vault [list|add <name>|get <name>|remove <name>|status]\",\n execute: async (args, ctx) => {\n if (!ctx.vault) return \"Vault not available in this mode.\";\n const parts = args.split(/\\s+/);\n const action = parts[0] || \"list\";\n const rest = parts.slice(1).join(\" \");\n return ctx.vault(action, rest);\n },\n },\n {\n name: \"dream\",\n aliases: [\"consolidate\"],\n description:\n \"Consolidate memory files — merge duplicates, fix dates, prune stale refs\",\n usage: \"/dream\",\n execute: async (_args, ctx) => {\n if (!ctx.dream) return \"Dream not available in this mode.\";\n return ctx.dream();\n },\n },\n {\n name: \"project\",\n aliases: [\"proj\"],\n description: \"Manage projects — switch, list, show dashboard\",\n usage: \"/project [name|list|register|show <name>]\",\n execute: async (args, ctx) => {\n const { ProjectManager } = await import(\"@brainst0rm/projects\");\n const { getDb } = await import(\"@brainst0rm/db\");\n const db = getDb();\n const pm = new ProjectManager(db);\n\n const parts = args.trim().split(/\\s+/);\n const action = parts[0] || \"\";\n\n if (!action || action === \"list\") {\n const projects = pm.projects.list();\n if (projects.length === 0) {\n return \"No projects registered. Run: /project register or storm projects import ~/Projects\";\n }\n const active = pm.getActive();\n const lines = projects.map((p) => {\n const marker = active && active.id === p.id ? \" ← active\" : \"\";\n return ` ${p.name.padEnd(25)} ${p.path}${marker}`;\n });\n return `Projects:\\n${lines.join(\"\\n\")}`;\n }\n\n if (action === \"register\") {\n const path = parts[1] || process.cwd();\n try {\n const project = pm.register(path);\n return `✓ Registered \"${project.name}\" → ${project.path}`;\n } catch (err) {\n return `✗ ${err instanceof Error ? err.message : String(err)}`;\n }\n }\n\n if (action === \"show\") {\n const name = parts[1];\n if (!name) return \"Usage: /project show <name>\";\n const project = pm.projects.getByName(name);\n if (!project) return `Project \"${name}\" not found.`;\n const dash = pm.dashboard(project.id);\n if (!dash) return \"Failed to load dashboard.\";\n const lines = [\n `── ${project.name} ──`,\n `Path: ${project.path}`,\n project.description ? `Description: ${project.description}` : \"\",\n `Sessions: ${dash.sessionCount}`,\n `Cost today: $${dash.costToday.toFixed(4)}`,\n `Cost month: $${dash.costThisMonth.toFixed(4)}`,\n ].filter(Boolean);\n if (project.budgetDaily)\n lines.push(\n `Budget daily: $${project.budgetDaily.toFixed(2)} (${dash.budgetDailyUsed.toFixed(0)}% used)`,\n );\n if (project.budgetMonthly)\n lines.push(\n `Budget month: $${project.budgetMonthly.toFixed(2)} (${dash.budgetMonthlyUsed.toFixed(0)}% used)`,\n );\n return lines.join(\"\\n\");\n }\n\n // Default: treat arg as project name to switch to\n try {\n const project = pm.switch(action);\n ctx.rebuildSystemPrompt?.();\n return `✓ Switched to \"${project.name}\" (${project.path})`;\n } catch (err) {\n return `✗ ${err instanceof Error ? err.message : String(err)}`;\n }\n },\n },\n {\n name: \"schedule\",\n aliases: [\"sched\", \"cron\"],\n description: \"Manage scheduled tasks for the active project\",\n usage: \"/schedule [list|add|history]\",\n execute: async (args) => {\n const parts = args.trim().split(/\\s+/);\n const action = parts[0] || \"list\";\n\n if (action === \"list\" || !action) {\n // Lazy-load scheduler\n const { getDb } = await import(\"@brainst0rm/db\");\n const db = getDb();\n const tasks = db\n .prepare(\n \"SELECT * FROM scheduled_tasks WHERE status = 'active' ORDER BY name\",\n )\n .all() as any[];\n\n if (tasks.length === 0) {\n return 'No scheduled tasks. Use: storm schedule add \"<prompt>\" --project <name> --cron \"0 9 * * *\"';\n }\n\n const lines = tasks.map((t: any) => {\n const cron = t.cron_expression || \"one-shot\";\n const mutations = t.allow_mutations ? \"read+write\" : \"read-only\";\n return ` ${t.name.padEnd(25)} ${cron.padEnd(15)} ${mutations.padEnd(12)} $${(t.budget_limit ?? 0).toFixed(2)}`;\n });\n return `Scheduled Tasks:\\n${lines.join(\"\\n\")}`;\n }\n\n if (action === \"history\") {\n const { getDb } = await import(\"@brainst0rm/db\");\n const db = getDb();\n const runs = db\n .prepare(\n \"SELECT r.*, t.name as task_name FROM scheduled_task_runs r JOIN scheduled_tasks t ON r.task_id = t.id ORDER BY r.created_at DESC LIMIT 10\",\n )\n .all() as any[];\n\n if (runs.length === 0) return \"No task run history yet.\";\n\n const lines = runs.map((r: any) => {\n const status =\n r.status === \"completed\"\n ? \"✓\"\n : r.status === \"failed\"\n ? \"✗\"\n : r.status;\n const cost = `$${r.cost.toFixed(4)}`;\n const date = new Date(r.created_at * 1000).toLocaleDateString();\n return ` ${status} ${(r.task_name ?? \"\").padEnd(20)} ${cost.padEnd(10)} ${date}`;\n });\n return `Recent Runs:\\n${lines.join(\"\\n\")}`;\n }\n\n return `Unknown action \"${action}\". Usage: /schedule [list|history]`;\n },\n },\n {\n name: \"orchestrate\",\n aliases: [\"orch\"],\n description: \"Coordinate work across multiple projects\",\n usage: '/orchestrate \"<description>\" [project1,project2,...]',\n execute: async (args) => {\n const { OrchestrationEngine } = await import(\"@brainst0rm/orchestrator\");\n const { ProjectManager } = await import(\"@brainst0rm/projects\");\n const { getDb } = await import(\"@brainst0rm/db\");\n const db = getDb();\n const engine = new OrchestrationEngine(db);\n const pm = new ProjectManager(db);\n\n if (!args.trim()) {\n // Show recent runs\n const runs = engine.listRecent(5);\n if (runs.length === 0) {\n return 'No orchestrations yet. Usage: /orchestrate \"do something\" project1,project2';\n }\n const lines = runs.map((r) => {\n const icon =\n r.status === \"completed\" ? \"✓\" : r.status === \"failed\" ? \"✗\" : \"●\";\n return ` ${icon} ${r.name.slice(0, 50)} — ${r.status} ($${r.totalCost.toFixed(4)})`;\n });\n return `Recent orchestrations:\\n${lines.join(\"\\n\")}`;\n }\n\n // Parse: \"description\" project1,project2\n const match =\n args.match(/^\"([^\"]+)\"\\s+(.+)$/) ?? args.match(/^(.+?)\\s+([\\w,-]+)$/);\n if (!match) {\n return 'Usage: /orchestrate \"description\" project1,project2';\n }\n\n const description = match[1];\n const projectNames = match[2].split(\",\").map((s: string) => s.trim());\n\n const lines: string[] = [\n `Orchestrating: \"${description}\"`,\n `Projects: ${projectNames.join(\", \")}`,\n \"\",\n ];\n\n for await (const event of engine.run({ description, projectNames })) {\n if (event.type === \"task-started\") {\n lines.push(`● ${event.project.name} — starting...`);\n } else if (event.type === \"task-completed\") {\n lines.push(`✓ ${event.project.name} — $${event.cost.toFixed(4)}`);\n } else if (event.type === \"task-failed\") {\n lines.push(`✗ ${event.project.name} — ${event.error}`);\n } else if (event.type === \"orchestration-completed\") {\n lines.push(\"\", `Complete: $${event.run.totalCost.toFixed(4)} total`);\n }\n }\n\n return lines.join(\"\\n\");\n },\n },\n {\n name: \"intelligence\",\n aliases: [\"intel\"],\n description: \"Show what BrainstormRouter has learned\",\n usage: \"/intelligence [--json]\",\n execute: async (args, _ctx) => {\n const { createGatewayClient, createIntelligenceClient } =\n await import(\"@brainst0rm/gateway\");\n const gw = createGatewayClient();\n if (!gw) return \"No BRAINSTORM_API_KEY set.\";\n\n const intel = createIntelligenceClient();\n const asJson = args.includes(\"--json\");\n\n const [leaderboard, usage, waste, forecast] = await Promise.all([\n gw.getLeaderboard().catch(() => []),\n gw.getUsageSummary(\"weekly\").catch(() => null),\n gw.getWasteInsights().catch(() => null),\n gw.getForecast().catch(() => null),\n ]);\n\n if (asJson) {\n return JSON.stringify({ leaderboard, usage, waste, forecast }, null, 2);\n }\n\n const lines: string[] = [];\n lines.push(\"BrainstormRouter Intelligence Report\");\n lines.push(\"══════════════════════════════════════\");\n\n const ud = (usage as any)?.data?.[0];\n const reqs = ud?.requestCount ?? 0;\n lines.push(\n `\\nRequests: ${reqs.toLocaleString()} | Cost: $${(ud?.totalCostUsd ?? 0).toFixed(2)}`,\n );\n\n const real = leaderboard.filter(\n (m: any) => m.id && !m.id.startsWith(\"cache/\"),\n );\n if (real.length > 0) {\n lines.push(\"\\nTop Models:\");\n for (const m of real.slice(0, 5) as any[]) {\n const name = m.model_id ?? m.id ?? \"?\";\n const reward =\n m.reward_score != null\n ? (m.reward_score * 100).toFixed(0) + \"%\"\n : \"n/a\";\n lines.push(\n ` ${name} — reward:${reward} (${m.sample_count ?? 0} samples)`,\n );\n }\n }\n\n const fc = (forecast as any)?.forecast;\n if (fc) {\n const trend =\n fc.trend === \"increasing\"\n ? \"↑\"\n : fc.trend === \"decreasing\"\n ? \"↓\"\n : \"→\";\n lines.push(\n `\\nForecast: $${(fc.avgDailySpendUsd ?? 0).toFixed(2)}/day ${trend}`,\n );\n }\n\n const w = waste as any;\n if (w?.estimatedWasteUsd > 0) {\n lines.push(`\\nRecoverable waste: $${w.estimatedWasteUsd.toFixed(4)}`);\n }\n\n return lines.join(\"\\n\");\n },\n },\n {\n name: \"plan\",\n aliases: [],\n description: \"Toggle plan mode — agent describes changes before executing\",\n usage: \"/plan\",\n execute: async (_args, ctx) => {\n const current = ctx.getMode?.() ?? \"auto\";\n if (current === \"plan\") {\n ctx.setMode?.(\"auto\");\n return \"Plan mode OFF — agent will execute directly.\";\n }\n ctx.setMode?.(\"plan\");\n return \"Plan mode ON — agent will describe changes before executing. Approve to proceed.\";\n },\n },\n {\n name: \"efficiency\",\n aliases: [\"eff\"],\n description: \"Show token efficiency and cost savings from routing\",\n usage: \"/efficiency\",\n execute: async (_args, ctx) => {\n const tokens = ctx.getTokenCount?.() ?? { input: 0, output: 0 };\n const cost = ctx.getSessionCost?.() ?? 0;\n const totalTokens = tokens.input + tokens.output;\n\n // Estimate what single-model costs would be\n const opusCostPer1M = 75; // output price\n const sonnetCostPer1M = 15;\n const haikuCostPer1M = 4;\n\n const opusCost = (totalTokens / 1_000_000) * opusCostPer1M;\n const sonnetCost = (totalTokens / 1_000_000) * sonnetCostPer1M;\n const haikuCost = (totalTokens / 1_000_000) * haikuCostPer1M;\n\n const savings =\n opusCost > 0 ? Math.round((1 - cost / opusCost) * 100) : 0;\n\n const lines = [\n \"Token Efficiency Report\",\n \"══════════════════════════════════════\",\n \"\",\n `Tokens used: ${totalTokens.toLocaleString()} (${tokens.input.toLocaleString()} in / ${tokens.output.toLocaleString()} out)`,\n `Actual cost: $${cost.toFixed(4)} (with routing)`,\n \"\",\n \"If you used a single model for everything:\",\n ` Opus only: $${opusCost.toFixed(4)}`,\n ` Sonnet only: $${sonnetCost.toFixed(4)}`,\n ` Haiku only: $${haikuCost.toFixed(4)}`,\n \"\",\n `Savings vs Opus: ${savings}%`,\n ];\n return lines.join(\"\\n\");\n },\n },\n];\n\n// ── Role Commands ─────────────────────────────────────────────────────\nimport {\n ROLES,\n formatModelMenu,\n getModelForRole,\n formatRoleConfirmation,\n type RoleId,\n} from \"./roles.js\";\n\nfunction createRoleCommand(roleId: RoleId): SlashCommand {\n const role = ROLES[roleId];\n return {\n name: roleId,\n aliases: [],\n description: role.description,\n usage: `/${roleId} [model-number]`,\n execute: async (args, ctx) => {\n let modelId: string;\n\n if (args) {\n // Direct: /architect 2\n modelId = getModelForRole(roleId, parseInt(args, 10));\n } else if (ctx.prompt) {\n // Interactive: show inline SelectPrompt\n const selected = await ctx.prompt(\n `${role.icon} ${role.displayName} — pick model`,\n role.modelChoices.map((m) => ({\n label: m.label,\n value: m.modelId,\n description: `${m.cost} per 1M tokens`,\n recommended: m.default,\n })),\n );\n modelId = selected;\n } else {\n // Fallback: show text menu\n return formatModelMenu(roleId);\n }\n\n // Apply role atomically\n ctx.setModel?.(modelId);\n ctx.setOutputStyle?.(role.outputStyle);\n ctx.setMode?.(role.permissionMode);\n ctx.setStrategy?.(role.routingStrategy);\n // Use persona-composed prompt (model-tuned expert playbook)\n const { getRolePrompt } = await import(\"./roles.js\");\n ctx.rebuildSystemPrompt?.(getRolePrompt(roleId, modelId));\n ctx.setActiveRole?.(roleId);\n return formatRoleConfirmation(roleId, modelId);\n },\n };\n}\n\nfor (const roleId of Object.keys(ROLES) as RoleId[]) {\n commands.push(createRoleCommand(roleId));\n}\n\ncommands.push({\n name: \"role\",\n aliases: [],\n description: \"Show current role or list available roles\",\n usage: \"/role\",\n execute: (_args, ctx) => {\n const current = ctx.getActiveRole?.();\n if (current && ROLES[current as RoleId]) {\n const role = ROLES[current as RoleId];\n const model = ctx.getModel?.() ?? \"auto\";\n const lines = [\n `${role.icon} ${role.displayName} (active)`,\n ` Model: ${model}`,\n ` Tools: ${role.allowedTools ? `only: ${role.allowedTools.join(\", \")}` : role.blockedTools ? `all except: ${role.blockedTools.join(\", \")}` : \"all\"}`,\n ` Style: ${role.outputStyle}`,\n ` Strategy: ${role.routingStrategy}`,\n ` Permission: ${role.permissionMode}`,\n ``,\n `Models: ${role.modelChoices.map((m, i) => `${i + 1}.${m.label}`).join(\", \")}`,\n `Switch: /${current} N │ /default to reset`,\n ];\n return lines.join(\"\\n\");\n }\n const lines = Object.values(ROLES).map(\n (r) =>\n ` /${r.id.padEnd(18)} ${r.icon} ${r.displayName} — ${r.description}`,\n );\n return `Available roles:\\n${lines.join(\"\\n\")}\\n\\nUsage: /<role> [model-number]`;\n },\n});\n\ncommands.push({\n name: \"default\",\n aliases: [\"reset\"],\n description: \"Reset to default session state (no role)\",\n usage: \"/default\",\n execute: (_args, ctx) => {\n ctx.setActiveRole?.(undefined);\n ctx.rebuildSystemPrompt?.();\n ctx.setMode?.(\"confirm\");\n ctx.setOutputStyle?.(\"concise\");\n ctx.setStrategy?.(\"combined\");\n return \"Session reset to defaults.\";\n },\n});\n\ncommands.push({\n name: \"context\",\n aliases: [\"ctx\"],\n description: \"Show context window token breakdown\",\n usage: \"/context\",\n execute: (_args, ctx) => {\n const tokens = ctx.getTokenCount?.() ?? { input: 0, output: 0 };\n const total = tokens.input + tokens.output;\n const limit = ctx.getContextWindow?.() ?? 128000;\n const percent = Math.round((total / limit) * 100);\n const barWidth = 20;\n const filled = Math.round((percent / 100) * barWidth);\n const bar = \"█\".repeat(filled) + \"░\".repeat(barWidth - filled);\n\n const lines = [\n \"Context Window Usage\",\n \"\",\n ` [${bar}] ${percent}%`,\n \"\",\n ` Input tokens: ${tokens.input.toLocaleString()}`,\n ` Output tokens: ${tokens.output.toLocaleString()}`,\n ` Total: ${total.toLocaleString()} / ${limit.toLocaleString()}`,\n ` Remaining: ${(limit - total).toLocaleString()}`,\n \"\",\n percent >= 80\n ? \" ⚠ Context is high. Run /compact to free space.\"\n : percent >= 60\n ? \" Consider running /compact soon.\"\n : \" Context usage is healthy.\",\n ];\n return lines.join(\"\\n\");\n },\n});\n\ncommands.push({\n name: \"undo\",\n aliases: [],\n description: \"Remove the last user message and assistant response\",\n usage: \"/undo\",\n execute: (_args, ctx) => {\n const removed = ctx.undoLastTurn?.() ?? 0;\n if (removed === 0) return \"Nothing to undo.\";\n return `Removed ${removed} message${removed > 1 ? \"s\" : \"\"}.`;\n },\n});\n\ncommands.push({\n name: \"changelog\",\n aliases: [\"whatsnew\"],\n description: \"Show recent features and changes\",\n usage: \"/changelog\",\n execute: () => {\n return [\n \"What's New in Brainstorm\",\n \"\",\n \"v11 — Claude Code Parity\",\n \" /context Token breakdown with visual gauge\",\n \" /insights Session intelligence + BR waste tips\",\n \" /undo Remove last turn\",\n \" /build Multi-model workflow wizard\",\n \" Shift+Tab Cycle permission modes\",\n \" SelectPrompt Model asks you to pick from options\",\n \" Autocomplete Type / to see command suggestions\",\n \" Multi-line End line with \\\\ to continue\",\n \" Error badges [NETWORK] [BUDGET] [AUTH] with hints\",\n \" ? Shortcut overlay (in non-chat modes)\",\n \"\",\n \"v10 — DeerFlow Gaps\",\n \" Artifacts Workflow outputs persist to disk\",\n \" Temporal System prompt includes current date\",\n \" Style Detects comment style, JSDoc, line length\",\n \" Test parsing vitest/jest/pytest structured results\",\n \"\",\n \"v9 — Build Wizard\",\n \" /build desc Auto-detect workflow + assign models\",\n \"\",\n \"v7 — Dashboard\",\n \" 4 modes: Chat [1] Dashboard [2] Models [3] Config [4]\",\n \" BR leaderboard, waste detection, guardian audit\",\n \"\",\n \"v6 — Roles\",\n \" /architect /sr-developer /jr-developer /qa\",\n ].join(\"\\n\");\n },\n});\n\ncommands.push({\n name: \"insights\",\n aliases: [],\n description: \"Session intelligence — what Brainstorm learned\",\n usage: \"/insights\",\n execute: async (_args, ctx) => {\n const cost = ctx.getSessionCost?.() ?? 0;\n const tokens = ctx.getTokenCount?.() ?? { input: 0, output: 0 };\n const model = ctx.getModel?.() ?? \"auto\";\n const strategy = ctx.getStrategy?.() ?? \"combined\";\n const role = ctx.getActiveRole?.();\n\n const lines = [\n \"Session Insights\",\n \"\",\n ` Model: ${model}`,\n ` Strategy: ${strategy}`,\n ` Cost: $${cost.toFixed(4)}`,\n ` Tokens: ${tokens.input.toLocaleString()} in / ${tokens.output.toLocaleString()} out`,\n ];\n\n if (role) lines.push(` Role: ${role}`);\n\n // Cost efficiency\n const totalTokens = tokens.input + tokens.output;\n if (totalTokens > 0) {\n const costPer1k = (cost / totalTokens) * 1000;\n lines.push(\"\");\n lines.push(` Cost efficiency: $${costPer1k.toFixed(4)} per 1K tokens`);\n }\n\n // Try BR insights\n if (ctx.gateway) {\n try {\n const waste = await ctx.gateway.getWasteInsights();\n if (waste?.suggestions?.length > 0) {\n lines.push(\"\");\n lines.push(\" Optimization suggestions:\");\n for (const s of waste.suggestions.slice(0, 3)) {\n lines.push(\n ` → ${s.description} (save ~$${s.savings_usd?.toFixed(2) ?? \"?\"})`,\n );\n }\n }\n } catch {\n /* BR unavailable */\n }\n }\n\n return lines.join(\"\\n\");\n },\n});\n\n// ── Build Wizard ─────────────────────────────────────────────────────\n\nimport {\n createWizardState,\n processDescription,\n getModelChoicesForStep,\n updateAssignment,\n formatPipeline,\n buildWorkflowOverrides,\n type WizardState,\n} from \"./build-wizard.js\";\n\ncommands.push({\n name: \"build\",\n aliases: [\"b\"],\n description: \"Multi-model workflow wizard — assemble a dev team\",\n usage: \"/build [description]\",\n execute: async (args, ctx) => {\n if (!args) {\n return \"Usage: /build <what you want to build>\\nExample: /build add OAuth login\";\n }\n\n // Process description and build the pipeline\n let state = createWizardState();\n state = processDescription(state, args);\n\n if (!state.workflow) {\n return `Could not detect workflow type for: \"${args}\"`;\n }\n\n // If prompt() is available, use interactive inline selection\n if (ctx.prompt) {\n // Step 1: Confirm workflow type\n const action = await ctx.prompt(\n `Detected: ${state.detectedPreset} (${state.assignments.length} steps)`,\n [\n {\n label: \"Go with defaults\",\n value: \"defaults\",\n description: formatPipeline(state),\n recommended: true,\n },\n { label: \"Customize models\", value: \"customize\" },\n { label: \"Cancel\", value: \"cancel\" },\n ],\n );\n\n if (action === \"cancel\") return \"Build cancelled.\";\n\n if (action === \"customize\") {\n // Step 2: For each pipeline step, let user pick model\n for (let i = 0; i < state.assignments.length; i++) {\n const a = state.assignments[i];\n const choices = getModelChoicesForStep(a.stepRole);\n const selected = await ctx.prompt(\n `Step ${i + 1}: ${a.stepRole}`,\n choices.map((m) => ({\n label: m.label,\n value: m.modelId,\n description: `${m.cost} per 1M tokens`,\n recommended: m.modelId === a.modelId,\n })),\n );\n const choice = choices.find((m) => m.modelId === selected);\n if (choice) state = updateAssignment(state, i, choice);\n }\n }\n\n // Show final pipeline\n return `${formatPipeline(state)}\\n\\nReady to execute. Use /build-go to start.`;\n }\n\n // Fallback: text-based menu (no prompt() available)\n _pendingWizard = state;\n return `${formatPipeline(state)}\\n\\n/build-go to run │ /build-customize for options`;\n },\n});\n\n// Module-level cache for pending wizard state\nlet _pendingWizard: WizardState | null = null;\n\ncommands.push({\n name: \"build-go\",\n aliases: [\"bg\"],\n description: \"Execute the pending build workflow\",\n usage: \"/build-go\",\n execute: async (_args, ctx) => {\n if (!_pendingWizard || !_pendingWizard.workflow) {\n return \"No pending build. Use /build <description> first.\";\n }\n\n const state = _pendingWizard;\n _pendingWizard = null;\n\n const { stepModelOverrides } = buildWorkflowOverrides(state);\n\n // Format the execution plan\n const lines = [`Executing: ${state.detectedPreset}`, \"\"];\n for (const a of state.assignments) {\n lines.push(\n ` ${ROLE_ICONS_SLASH[a.stepRole] ?? \"⚙\"} ${a.stepRole}: ${a.modelLabel}`,\n );\n }\n lines.push(\"\");\n lines.push(`Estimated cost: ~$${state.totalCost.toFixed(4)}`);\n lines.push(\"\");\n lines.push(\"Workflow started — results will appear in chat.\");\n\n return lines.join(\"\\n\");\n },\n});\n\nconst ROLE_ICONS_SLASH: Record<string, string> = {\n architect: \"🏗\",\n coder: \"👨‍💻\",\n reviewer: \"🔍\",\n debugger: \"🔧\",\n analyst: \"📊\",\n};\n\ncommands.push({\n name: \"build-customize\",\n aliases: [\"bc\"],\n description: \"Show model options for each pipeline step\",\n usage: \"/build-customize\",\n execute: (_args, ctx) => {\n if (!_pendingWizard || !_pendingWizard.workflow) {\n return \"No pending build. Use /build <description> first.\";\n }\n\n const lines = [\"Model options per step:\", \"\"];\n for (let i = 0; i < _pendingWizard.assignments.length; i++) {\n const a = _pendingWizard.assignments[i];\n const choices = getModelChoicesForStep(a.stepRole);\n lines.push(`${i + 1}. ${a.stepRole} [${a.modelLabel}]`);\n choices.forEach((m, j) => {\n const cur = m.modelId === a.modelId ? \" ←\" : \"\";\n lines.push(` ${j + 1}. ${m.label} ${m.cost}${cur}`);\n });\n lines.push(` /build-set ${i + 1} N`);\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n },\n});\n\ncommands.push({\n name: \"build-set\",\n aliases: [\"bs\"],\n description: \"Set model for a pipeline step\",\n usage: \"/build-set <step> <model-number>\",\n execute: (_args, ctx) => {\n if (!_pendingWizard || !_pendingWizard.workflow) {\n return \"No pending build. Use /build <description> first.\";\n }\n\n const parts = _args.split(/\\s+/);\n const stepIdx = parseInt(parts[0], 10) - 1;\n const modelIdx = parseInt(parts[1], 10) - 1;\n\n if (\n isNaN(stepIdx) ||\n stepIdx < 0 ||\n stepIdx >= _pendingWizard.assignments.length\n ) {\n return `Invalid step. Use 1-${_pendingWizard.assignments.length}.`;\n }\n\n const a = _pendingWizard.assignments[stepIdx];\n const choices = getModelChoicesForStep(a.stepRole);\n\n if (isNaN(modelIdx) || modelIdx < 0 || modelIdx >= choices.length) {\n return `Invalid model. Use 1-${choices.length}.`;\n }\n\n _pendingWizard = updateAssignment(\n _pendingWizard,\n stepIdx,\n choices[modelIdx],\n );\n const updated = _pendingWizard.assignments[stepIdx];\n\n return `${a.stepRole} → ${updated.modelLabel}\\n\\n${formatPipeline(_pendingWizard)}\\n\\n/build-go to run`;\n },\n});\n\n// ── Plan & Efficiency Commands ────────────────────────────────────────\n\ncommands.push({\n name: \"plan\",\n aliases: [],\n description: \"Toggle plan mode — agent describes changes before executing\",\n usage: \"/plan\",\n execute: (_args, ctx) => {\n const current = ctx.getMode?.() ?? \"confirm\";\n if (current === \"plan\") {\n ctx.setMode?.(\"confirm\");\n return \"Plan mode OFF — agent will execute changes directly (with confirmation).\";\n }\n ctx.setMode?.(\"plan\");\n return \"Plan mode ON — agent will describe changes before executing. Approve to proceed.\";\n },\n});\n\ncommands.push({\n name: \"efficiency\",\n aliases: [\"eff\"],\n description: \"Show token efficiency and routing savings\",\n usage: \"/efficiency\",\n execute: (_args, ctx) => {\n const tokens = ctx.getTokenCount?.() ?? { input: 0, output: 0 };\n const cost = ctx.getSessionCost?.() ?? 0;\n const totalTokens = tokens.input + tokens.output;\n\n // Opus 4.6 pricing: $15/1M input, $75/1M output\n const opusInputCost = (tokens.input / 1_000_000) * 15;\n const opusOutputCost = (tokens.output / 1_000_000) * 75;\n const opusCost = opusInputCost + opusOutputCost;\n\n const savings = opusCost > 0 ? ((opusCost - cost) / opusCost) * 100 : 0;\n\n const lines = [\n \"Token Efficiency Report\",\n \"\",\n ` Input tokens: ${tokens.input.toLocaleString()}`,\n ` Output tokens: ${tokens.output.toLocaleString()}`,\n ` Total tokens: ${totalTokens.toLocaleString()}`,\n \"\",\n ` Session cost: $${cost.toFixed(4)}`,\n ];\n\n if (totalTokens > 0) {\n lines.push(\n ` Cost per 1K: $${((cost / totalTokens) * 1000).toFixed(4)}`,\n );\n }\n\n lines.push(\"\");\n lines.push(` If you used Opus for everything: $${opusCost.toFixed(4)}`);\n lines.push(` With routing: $${cost.toFixed(4)}`);\n lines.push(\n ` Savings: ${savings > 0 ? savings.toFixed(1) : \"0\"}%`,\n );\n\n if (savings > 50) {\n lines.push(\"\");\n lines.push(\" Routing is saving you significant cost.\");\n } else if (savings > 0) {\n lines.push(\"\");\n lines.push(\n \" Tip: Use /strategy cost-first for cheaper tasks to increase savings.\",\n );\n }\n\n return lines.join(\"\\n\");\n },\n});\n\n// ── Utility Commands ──────────────────────────────────────────────────\n\ncommands.push({\n name: \"history\",\n aliases: [\"hist\"],\n description: \"Show recent input history\",\n usage: \"/history\",\n execute: (_args, ctx) => {\n // History is managed in ChatApp's InputHistory — show what's accessible\n return \"Input history:\\n Use ↑/↓ arrow keys to navigate previous inputs.\\n History persists across sessions in ~/.brainstorm/input-history.json\";\n },\n});\n\n// ── BR-Powered Commands ───────────────────────────────────────────────\n\ncommands.push({\n name: \"recommend\",\n aliases: [\"rec\"],\n description: \"Get model recommendation from BrainstormRouter\",\n usage: \"/recommend [task-type]\",\n execute: async (args, ctx) => {\n if (!ctx.gateway) return \"No BrainstormRouter API key configured.\";\n try {\n const { IntelligenceAPIClient } = await import(\"@brainst0rm/gateway\");\n const key =\n process.env._BR_RESOLVED_KEY ?? process.env.BRAINSTORM_API_KEY;\n if (!key) return \"No BR API key available.\";\n const intel = new IntelligenceAPIClient(\n \"https://api.brainstormrouter.com\",\n key,\n );\n const taskType = args || \"code-generation\";\n const recs = await intel.getRecommendations(taskType, \"typescript\");\n if (!recs || recs.length === 0)\n return `No recommendations for task type: ${taskType}`;\n const lines = recs.slice(0, 3).map((r: any, i: number) => {\n return ` ${i + 1}. ${r.recommendedModel ?? r.model} (${Math.round((r.confidence ?? r.score ?? 0) * 100)}% confidence)\\n ${r.reasoning ?? \"\"}`;\n });\n return `Model recommendations for \"${taskType}\":\\n${lines.join(\"\\n\")}\\n\\nUse: /model <id> to switch`;\n } catch (err: any) {\n return `Recommendation failed: ${err.message}`;\n }\n },\n});\n\ncommands.push({\n name: \"stats\",\n aliases: [],\n description: \"Show session analytics and BR usage summary\",\n usage: \"/stats\",\n execute: async (_args, ctx) => {\n const cost = ctx.getSessionCost?.() ?? 0;\n const tokens = ctx.getTokenCount?.() ?? { input: 0, output: 0 };\n const model = ctx.getModel?.() ?? \"auto\";\n const role = ctx.getActiveRole?.();\n const strategy = ctx.getStrategy?.() ?? \"combined\";\n\n const lines = [\n \"Session Stats\",\n ` Cost: $${cost.toFixed(4)}`,\n ` Tokens: ${tokens.input.toLocaleString()} in / ${tokens.output.toLocaleString()} out`,\n ` Model: ${model}`,\n ` Strategy: ${strategy}`,\n ];\n if (role) lines.push(` Role: ${role}`);\n\n // Try to get BR usage summary\n if (ctx.gateway) {\n try {\n const summary = await ctx.gateway.getUsageSummary(\"daily\");\n if (summary) {\n lines.push(\"\");\n lines.push(\"BrainstormRouter (today)\");\n lines.push(` Requests: ${summary.total_requests ?? 0}`);\n lines.push(\n ` Cost: $${(summary.total_cost_usd ?? 0).toFixed(4)}`,\n );\n if (summary.by_model?.length > 0) {\n lines.push(\" By model:\");\n for (const m of summary.by_model.slice(0, 5)) {\n lines.push(\n ` ${m.model}: $${m.cost_usd?.toFixed(4) ?? \"0\"} (${m.request_count ?? 0} reqs)`,\n );\n }\n }\n }\n } catch {\n // BR data unavailable — skip silently\n }\n }\n\n return lines.join(\"\\n\");\n },\n});\n\ncommands.push({\n name: \"compare\",\n aliases: [],\n description: \"Compare two models side by side\",\n usage: \"/compare <model1> <model2>\",\n execute: (_args, ctx) => {\n const parts = _args.split(/\\s+/);\n if (parts.length < 2)\n return \"Usage: /compare model1 model2\\nExample: /compare anthropic/claude-sonnet-4-6 deepseek/deepseek-chat\";\n\n // This is a local comparison using registry data — no BR call needed\n return `Model comparison for: ${parts[0]} vs ${parts[1]}\\n (Switch to Models mode [Esc → 3] for detailed comparison with gauges)`;\n },\n});\n\n// ── Architect-Edit: dual-model pattern ────────────────────────────────\n// Opus plans the change, Sonnet applies it. Two routing decisions per task.\n\ncommands.push({\n name: \"architect-edit\",\n aliases: [\"ae\", \"dual\"],\n description:\n \"Dual-model mode: reasoning model plans, fast model applies (Aider-style)\",\n usage: \"/architect-edit [task description]\",\n execute: async (args, ctx) => {\n if (!args.trim()) {\n return \"Usage: /architect-edit <task description>\\n\\nA reasoning model (Opus/GPT-5.4) will plan the change, then a fast model (Sonnet/GPT-4.1) will apply it.\";\n }\n\n // Phase 1: Switch to architect role for planning\n const { ROLES, getRolePrompt } = await import(\"./roles.js\");\n const architect = ROLES.architect;\n const planModel =\n architect.modelChoices[0]?.modelId ?? \"anthropic/claude-opus-4.6\";\n\n ctx.setModel?.(planModel);\n ctx.setMode?.(\"plan\");\n ctx.rebuildSystemPrompt?.(\n getRolePrompt(\"architect\", planModel) +\n \"\\n\\n## Architect-Edit Mode\\n\\n\" +\n \"You are in Phase 1 (PLAN). Your job is to analyze the codebase and produce a detailed, \" +\n \"actionable implementation plan. Do NOT make any changes — only read files and produce the plan. \" +\n \"Include specific file paths, function names, and code snippets. \" +\n \"After you present the plan, the user will approve it and a fast coding model will execute it.\\n\\n\" +\n `Task: ${args.trim()}`,\n );\n\n return [\n `🏗️ Architect-Edit mode activated`,\n ``,\n ` Phase 1 (PLAN): ${planModel}`,\n ` Phase 2 (EDIT): will auto-switch to fast model after approval`,\n ``,\n `Describe your changes and the architect will plan them.`,\n `After approving the plan, type /ae-apply to switch to the coding model.`,\n ].join(\"\\n\");\n },\n});\n\ncommands.push({\n name: \"ae-apply\",\n aliases: [\"apply\"],\n description: \"Switch from architect plan phase to coding apply phase\",\n usage: \"/ae-apply\",\n execute: async (_args, ctx) => {\n // Phase 2: Switch to fast coding model\n const { ROLES } = await import(\"./roles.js\");\n const dev = ROLES[\"sr-developer\"];\n const codeModel =\n dev.modelChoices[0]?.modelId ?? \"anthropic/claude-sonnet-4.6\";\n\n ctx.setModel?.(codeModel);\n ctx.setMode?.(\"auto\");\n ctx.rebuildSystemPrompt?.();\n\n return [\n `⚡ Switched to coding model: ${codeModel}`,\n ``,\n `The plan from the architect is in your conversation history.`,\n `Now implement it. Auto-verify after each edit.`,\n ].join(\"\\n\");\n },\n});\n\n// ── Recipe commands ──────────────────────────────────────────────────\n\ncommands.push({\n name: \"recipe\",\n aliases: [\"recipes\"],\n description: \"List, run, or init shareable YAML workflow recipes\",\n usage: \"/recipe [list|run <name>|init]\",\n execute: async (args, ctx) => {\n const { listRecipes, loadRecipe, initRecipeDir } =\n await import(\"@brainst0rm/workflow\");\n const cwd = process.cwd();\n const parts = args.trim().split(/\\s+/);\n const subcommand = parts[0]?.toLowerCase() ?? \"list\";\n\n if (subcommand === \"init\") {\n const dir = initRecipeDir(cwd);\n return `Recipe directory initialized: ${dir}\\nAn example recipe was created. Edit it or add new .yaml files.`;\n }\n\n if (subcommand === \"run\") {\n const name = parts[1];\n if (!name) return \"Usage: /recipe run <name>\";\n const recipe = loadRecipe(cwd, name);\n if (!recipe)\n return `Recipe '${name}' not found. Run /recipe list to see available recipes.`;\n return [\n `Recipe loaded: ${recipe.name}`,\n ` ${recipe.description}`,\n ` Steps: ${recipe.steps.map((s: any) => s.id).join(\" → \")}`,\n ` Max iterations: ${recipe.maxIterations}`,\n ``,\n `To execute, describe the task and the workflow engine will use this recipe.`,\n ].join(\"\\n\");\n }\n\n // Default: list\n const recipes = listRecipes(cwd);\n if (recipes.length === 0) {\n return \"No recipes found. Run /recipe init to create the recipe directory with an example.\";\n }\n const lines = recipes.map(\n (r: any) =>\n ` ${r.id.padEnd(20)} ${r.name} (${r.source}) — ${r.description}`,\n );\n return `Available recipes:\\n${lines.join(\"\\n\")}\\n\\nUsage: /recipe run <name>`;\n },\n});\n\n// ── Voice command ─────────────────────────────────────────────────\n\ncommands.push({\n name: \"voice\",\n aliases: [\"mic\"],\n description: \"Record voice input and transcribe via Whisper (requires sox)\",\n usage: \"/voice\",\n execute: async () => {\n const { AudioRecorder } = await import(\"../voice/recorder.js\");\n\n if (!AudioRecorder.isAvailable()) {\n return \"Voice input requires `sox`. Install: brew install sox (macOS) or apt install sox (Linux).\";\n }\n\n const recorder = new AudioRecorder();\n const outputPath = recorder.start();\n return [\n \"🎙️ Recording... Press Enter to stop.\",\n \"\",\n ` Audio file: ${outputPath}`,\n ` Transcription will be sent via BrainstormRouter Whisper API.`,\n \"\",\n \" Note: Full voice loop (record → transcribe → send) is coming in a future update.\",\n \" For now, the audio file is saved for manual transcription.\",\n ].join(\"\\n\");\n },\n});\n\n// ── Daemon ────────────────────────────────────────────────────────\ncommands.push({\n name: \"daemon\",\n aliases: [],\n description: \"Daemon mode control — status, pause, resume, stop, log\",\n usage: \"/daemon [status|pause|resume|stop|log]\",\n execute: () => {\n return [\n \"Daemon commands (only active in --daemon mode):\",\n \"\",\n \" /daemon status Show daemon state (ticks, cost, sleep status)\",\n \" /daemon pause Pause tick loop\",\n \" /daemon resume Resume tick loop\",\n \" /daemon log Show today's daemon log\",\n \" /daemon stop Stop daemon\",\n \"\",\n \"Start daemon mode: brainstorm chat --simple --daemon\",\n \"Resume crashed daemon: brainstorm chat --simple --daemon --continue\",\n ].join(\"\\n\");\n },\n});\n\n// ── God Mode ─────────────────────────────────────────────────────\n\ncommands.push({\n name: \"godmode\",\n aliases: [\"gm\"],\n description: \"God Mode status — connected systems, tools, pending changesets\",\n usage: \"/godmode [tools|connectors|changesets|audit]\",\n execute: async (args) => {\n const subcommand = args?.trim().toLowerCase();\n\n if (subcommand === \"tools\") {\n try {\n const { listChangeSets } = await import(\"@brainst0rm/godmode\");\n // List all God Mode tools (gm_* prefix)\n return [\n \"God Mode Tools:\",\n \"\",\n \" ChangeSet tools (always available):\",\n \" gm_changeset_list — List pending changesets\",\n \" gm_changeset_approve — Approve + execute a changeset\",\n \" gm_changeset_reject — Reject a changeset draft\",\n \"\",\n \" Connector tools are registered dynamically when systems\",\n \" connect. Use natural language to discover them:\",\n ' \"list all devices\" → MSP device tools',\n ' \"quarantine email\" → Email security tools',\n ' \"create VM snapshot\" → VM tools',\n ].join(\"\\n\");\n } catch {\n return \"God Mode package not available.\";\n }\n }\n\n if (subcommand === \"changesets\" || subcommand === \"cs\") {\n try {\n const { listChangeSets } = await import(\"@brainst0rm/godmode\");\n const active = listChangeSets();\n if (active.length === 0) return \"No active changesets.\";\n const lines = [\"Pending ChangeSets:\", \"\"];\n for (const cs of active) {\n lines.push(\n ` [${cs.id}] ${cs.connector}/${cs.action} — risk: ${cs.riskScore}/100 — ${cs.status}`,\n );\n lines.push(` ${cs.description}`);\n if (cs.riskFactors.length > 0)\n lines.push(` Risks: ${cs.riskFactors.join(\", \")}`);\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n } catch {\n return \"God Mode package not available.\";\n }\n }\n\n if (subcommand === \"audit\") {\n try {\n const { getAuditLog } = await import(\"@brainst0rm/godmode\");\n const log = getAuditLog();\n if (log.length === 0) return \"No God Mode audit entries this session.\";\n const lines = [\"God Mode Audit Log (this session):\", \"\"];\n for (const entry of log.slice(-10)) {\n const ts = new Date(entry.createdAt).toLocaleTimeString();\n lines.push(\n ` ${ts} ${entry.connector}/${entry.action} — ${entry.status} — risk: ${entry.riskScore}`,\n );\n }\n if (log.length > 10) lines.push(` ... and ${log.length - 10} more`);\n return lines.join(\"\\n\");\n } catch {\n return \"God Mode package not available.\";\n }\n }\n\n // Default: show status overview\n return [\n \"God Mode — Natural Language Control Plane\",\n \"\",\n \" Status: enabled (connectors load at session start)\",\n \" Config: [godmode] section in config.toml\",\n \"\",\n \" Subcommands:\",\n \" /godmode tools — List available God Mode tools\",\n \" /godmode changesets — Show pending ChangeSets\",\n \" /godmode audit — Show changeset audit log\",\n \"\",\n \" Usage: Just describe what you want in natural language.\",\n \" The agent will use God Mode tools automatically.\",\n \"\",\n \" HTTP API: brainstorm serve --port 8000\",\n ].join(\"\\n\");\n },\n});\n\n// ── Serve ────────────────────────────────────────────────────────\n\ncommands.push({\n name: \"serve\",\n aliases: [\"api\"],\n description: \"Start/stop the HTTP API server from within chat\",\n usage: \"/serve [stop|status]\",\n execute: async (args) => {\n const subcommand = args?.trim().toLowerCase();\n\n if (subcommand === \"stop\") {\n const pid = (globalThis as any).__brainstorm_serve_pid;\n if (!pid) return \"No serve process running.\";\n try {\n process.kill(pid, \"SIGTERM\");\n (globalThis as any).__brainstorm_serve_pid = undefined;\n return \"API server stopped.\";\n } catch {\n return \"Failed to stop server (may have already exited).\";\n }\n }\n\n if (subcommand === \"status\") {\n const pid = (globalThis as any).__brainstorm_serve_pid;\n if (!pid) return \"API server is not running. Use /serve to start.\";\n try {\n process.kill(pid, 0); // check if alive\n return `API server running (pid: ${pid}).`;\n } catch {\n (globalThis as any).__brainstorm_serve_pid = undefined;\n return \"API server is not running (process exited).\";\n }\n }\n\n // Start the server as a child process\n const { fork } = await import(\"node:child_process\");\n const { join } = await import(\"node:path\");\n const { dirname } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n\n const binDir = join(dirname(fileURLToPath(import.meta.url)));\n const binPath = join(binDir, \"brainstorm.js\");\n\n const child = fork(binPath, [\"serve\", \"--cors\"], {\n stdio: \"ignore\",\n detached: true,\n });\n\n child.unref();\n (globalThis as any).__brainstorm_serve_pid = child.pid;\n\n return [\n `API server starting (pid: ${child.pid})`,\n \"\",\n \" http://127.0.0.1:8000/health\",\n \" http://127.0.0.1:8000/api/v1/tools\",\n \" http://127.0.0.1:8000/api/v1/products\",\n \"\",\n \" /serve status — check if running\",\n \" /serve stop — stop the server\",\n ].join(\"\\n\");\n },\n});\n\n// Build lookup map: command name and aliases → handler\nconst commandMap = new Map<string, SlashCommand>();\nfor (const cmd of commands) {\n commandMap.set(cmd.name, cmd);\n for (const alias of cmd.aliases) {\n commandMap.set(alias, cmd);\n }\n}\n\n/**\n * Check if a string is a slash command.\n */\nexport function isSlashCommand(input: string): boolean {\n const trimmed = input.trim();\n if (!trimmed.startsWith(\"/\")) return false;\n const name = trimmed.slice(1).split(/\\s+/)[0].toLowerCase();\n return commandMap.has(name);\n}\n\n/**\n * Execute a slash command. Returns the display result.\n * Throws if the command is not recognized.\n */\nexport async function executeSlashCommand(\n input: string,\n ctx: SlashContext,\n): Promise<string> {\n const trimmed = input.trim();\n const parts = trimmed.slice(1).split(/\\s+/);\n const name = parts[0].toLowerCase();\n const args = parts.slice(1).join(\" \");\n\n const cmd = commandMap.get(name);\n if (!cmd) {\n return `Unknown command: /${name}. Type /help for available commands.`;\n }\n\n // Pass the invoked name so commands can detect alias invocation (e.g., /fast vs /strategy)\n return cmd.execute(args, ctx, name);\n}\n\n/**\n * Get all registered slash commands (for autocomplete, etc.)\n */\nexport function getSlashCommands(): Array<{\n name: string;\n description: string;\n usage: string;\n}> {\n return commands.map(({ name, description, usage }) => ({\n name,\n description,\n usage,\n }));\n}\n"],"mappings":"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","names":["lines","ROLES"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ProjectRepository
3
3
  } from "./chunk-VY6MPJXL.js";
4
- import "./chunk-7D4SUZUM.js";
4
+ import "./chunk-PR4QN5HX.js";
5
5
 
6
6
  // ../orchestrator/dist/index.js
7
7
  import { randomUUID } from "crypto";
@@ -289,4 +289,4 @@ export {
289
289
  aggregateResults,
290
290
  formatAggregatedResults
291
291
  };
292
- //# sourceMappingURL=dist-GNHTH2DH.js.map
292
+ //# sourceMappingURL=dist-3BC75XHW.js.map