adversarial-mirror 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -766,7 +766,7 @@ var MirrorEngine = class {
766
766
  yield { type: "stream_chunk", brainId: this.original.id, chunk };
767
767
  }
768
768
  const response = accumulator.complete();
769
- yield { type: "brain_complete", brainId: this.original.id, response, completedAt: Date.now() };
769
+ yield { type: "brain_complete", brainId: this.original.id, response };
770
770
  yield { type: "all_complete" };
771
771
  }
772
772
  async *runMirror(userInput, history2, options) {
@@ -798,7 +798,6 @@ ${message.content}`
798
798
  );
799
799
  const originalAccumulator = createAccumulator();
800
800
  const challengerAccumulator = createAccumulator();
801
- const completionTimes = /* @__PURE__ */ new Map();
802
801
  for await (const item of mergeStreams([
803
802
  { brainId: this.original.id, stream: originalStream, accumulator: originalAccumulator },
804
803
  {
@@ -806,7 +805,7 @@ ${message.content}`
806
805
  stream: challengerStream,
807
806
  accumulator: challengerAccumulator
808
807
  }
809
- ], completionTimes)) {
808
+ ])) {
810
809
  yield item;
811
810
  }
812
811
  const originalResponse = originalAccumulator.complete();
@@ -814,14 +813,12 @@ ${message.content}`
814
813
  yield {
815
814
  type: "brain_complete",
816
815
  brainId: this.original.id,
817
- response: originalResponse,
818
- completedAt: completionTimes.get(this.original.id) ?? Date.now()
816
+ response: originalResponse
819
817
  };
820
818
  yield {
821
819
  type: "brain_complete",
822
820
  brainId: this.challenger.id,
823
- response: challengerResponse,
824
- completedAt: completionTimes.get(this.challenger.id) ?? Date.now()
821
+ response: challengerResponse
825
822
  };
826
823
  if (this.judge) {
827
824
  yield* this.runJudge(userInput, originalResponse.text, challengerResponse.text, options);
@@ -898,7 +895,7 @@ function createAccumulator() {
898
895
  }
899
896
  };
900
897
  }
901
- async function* mergeStreams(entries, completionTimes) {
898
+ async function* mergeStreams(entries) {
902
899
  const pending = entries.map((entry) => ({
903
900
  entry,
904
901
  next: entry.stream.next()
@@ -910,7 +907,6 @@ async function* mergeStreams(entries, completionTimes) {
910
907
  const { index, result } = await Promise.race(race);
911
908
  const current = pending[index];
912
909
  if (result.done) {
913
- completionTimes.set(current.entry.brainId, Date.now());
914
910
  pending.splice(index, 1);
915
911
  continue;
916
912
  }
@@ -1032,7 +1028,7 @@ function IntentBadge({ category, mirrored }) {
1032
1028
  import { Text as Text3 } from "ink";
1033
1029
  import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
1034
1030
  function StreamingText({ value, dim }) {
1035
- return /* @__PURE__ */ jsxs3(Text3, { dimColor: dim, wrap: "wrap", children: [
1031
+ return /* @__PURE__ */ jsxs3(Text3, { dimColor: dim, wrap: "truncate", children: [
1036
1032
  value,
1037
1033
  /* @__PURE__ */ jsx3(Text3, { color: "cyan", children: "\u258C" })
1038
1034
  ] });
@@ -1259,6 +1255,7 @@ function MirrorApp({
1259
1255
  const pendingSynthRef = useRef("");
1260
1256
  const pendingExchangeRef = useRef(null);
1261
1257
  const startTimesRef = useRef(/* @__PURE__ */ new Map());
1258
+ const lastChunkTimesRef = useRef(/* @__PURE__ */ new Map());
1262
1259
  const columnsRef = useRef(columns);
1263
1260
  useEffect(() => {
1264
1261
  columnsRef.current = columns;
@@ -1329,6 +1326,7 @@ function MirrorApp({
1329
1326
  [originalId, Date.now()],
1330
1327
  ...challengerId ? [[challengerId, Date.now()]] : []
1331
1328
  ]);
1329
+ lastChunkTimesRef.current = /* @__PURE__ */ new Map();
1332
1330
  try {
1333
1331
  for await (const event of engine.run(question, history2, { signal: controller.signal })) {
1334
1332
  if (event.type === "classifying") {
@@ -1341,6 +1339,7 @@ function MirrorApp({
1341
1339
  isMirrored = event.result.shouldMirror && Boolean(challengerId);
1342
1340
  }
1343
1341
  if (event.type === "stream_chunk") {
1342
+ lastChunkTimesRef.current.set(event.brainId, Date.now());
1344
1343
  if (event.brainId === originalId) {
1345
1344
  originalBuffer += event.chunk.delta;
1346
1345
  pendingOrigRef.current = originalBuffer;
@@ -1350,7 +1349,8 @@ function MirrorApp({
1350
1349
  }
1351
1350
  }
1352
1351
  if (event.type === "brain_complete") {
1353
- const latency = event.completedAt - (startTimesRef.current.get(event.brainId) ?? event.completedAt);
1352
+ const completedAt = lastChunkTimesRef.current.get(event.brainId) ?? Date.now();
1353
+ const latency = completedAt - (startTimesRef.current.get(event.brainId) ?? completedAt);
1354
1354
  if (event.brainId === originalId) {
1355
1355
  const text = event.response.text || originalBuffer;
1356
1356
  originalResult = {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/chat.ts","../src/brains/anthropic.ts","../src/brains/gemini.ts","../src/brains/mock.ts","../src/brains/openai.ts","../src/brains/factory.ts","../src/config/loader.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/engine/intent-classifier.ts","../src/engine/classifier-factory.ts","../src/engine/prompt-builder.ts","../src/engine/judge.ts","../src/engine/mirror-engine.ts","../src/engine/session.ts","../src/ui/mirror-app.tsx","../src/history/store.ts","../src/ui/components/BrainPanel.tsx","../src/ui/components/IntentBadge.tsx","../src/ui/components/StreamingText.tsx","../src/ui/utils/highlight.ts","../src/cli/commands/mirror.ts","../src/cli/commands/config.ts","../src/cli/commands/brains.ts","../src/cli/commands/history.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { runChat } from './commands/chat.js'\nimport { runMirror } from './commands/mirror.js'\nimport {\n runConfigInit,\n runConfigSet,\n runConfigShow\n} from './commands/config.js'\nimport {\n runBrainsAdd,\n runBrainsList,\n runBrainsTest\n} from './commands/brains.js'\nimport {\n runHistoryExport,\n runHistoryList,\n runHistoryShow\n} from './commands/history.js'\n\nconst program = new Command()\n\nprogram\n .name('mirror')\n .description('Adversarial Mirror CLI')\n .version('0.1.0')\n .option('--intensity <level>', 'mild|moderate|aggressive')\n .option('--original <brainId>', 'override original brain')\n .option('--challenger <brainId>', 'override challenger brain')\n .option('--no-mirror', 'disable mirroring')\n .option('--no-classify', 'disable intent classification')\n .option('--no-judge', 'disable judge synthesis pass')\n .option('--judge-brain <brainId>', 'override judge brain id')\n .option('--persona <name>', 'persona lens: vc-skeptic|security-auditor|end-user|regulator|contrarian')\n .option('--debug', 'enable debug logging')\n\nprogram\n .command('chat')\n .description('Interactive session')\n .option('--file <path>', 'load file as context before the session starts')\n .action(runChat)\n\nprogram\n .command('mirror <question>')\n .description('One-shot query')\n .option('--file <path>', 'load file as context (or pipe via stdin)')\n .action(runMirror)\n\nconst config = program.command('config').description('Config commands')\nconfig.action(runConfigShow)\nconfig.command('show').description('Show current config').action(runConfigShow)\nconfig.command('init').description('Interactive setup wizard').action(runConfigInit)\nconfig\n .command('set <key> <value>')\n .description('Set config value by key path')\n .action(runConfigSet)\n\nconst brains = program.command('brains').description('Brain management commands')\nbrains.action(runBrainsList)\nbrains.command('list').description('List configured brains').action(runBrainsList)\nbrains.command('test <id>').description('Test a brain').action(runBrainsTest)\nbrains.command('add').description('Add a new brain').action(runBrainsAdd)\n\nconst history = program.command('history').description('History commands')\nhistory.action(runHistoryList)\nhistory.command('list').description('List history').action(runHistoryList)\nhistory.command('show <id>').description('Show history entry').action(runHistoryShow)\nhistory\n .command('export <id> <file>')\n .description('Export history entry to a file')\n .action(runHistoryExport)\n\n// Default to 'chat' when no subcommand is given.\n// Appending at the end (after any flags) lets Commander parse global flags at the\n// program level before routing to the chat subcommand. This means:\n// mirror → mirror chat\n// mirror --intensity aggressive → mirror --intensity aggressive chat (global flags preserved)\n// mirror --help → shows program help (not intercepted)\n// mirror --version → shows version (not intercepted)\nconst rawArgs = process.argv.slice(2)\nconst knownSubcommands = new Set(['chat', 'mirror', 'config', 'brains', 'history'])\nconst hasVersionOrHelp = rawArgs.some(a => ['-V', '--version', '-h', '--help'].includes(a))\nconst hasSubcommand = rawArgs.some(a => knownSubcommands.has(a))\n\nif (!hasVersionOrHelp && !hasSubcommand) {\n process.argv.push('chat')\n}\n\nprogram.parse()\n","import { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport React from 'react'\nimport type { Command } from 'commander'\nimport { render } from 'ink'\nimport { createAdapter } from '../../brains/factory.js'\nimport { loadConfig } from '../../config/loader.js'\nimport { buildIntentClassifier } from '../../engine/classifier-factory.js'\nimport { MirrorEngine } from '../../engine/mirror-engine.js'\nimport { Session } from '../../engine/session.js'\nimport { MirrorApp } from '../../ui/mirror-app.js'\n\n// Commander v12 passes (localOptions, command) for commands with no positional args.\n// Global flags live on command.parent.opts() — reading from localOptions would always be {}.\nexport function runChat(_localOpts: Record<string, unknown>, command: Command): void {\n // Merge local and parent opts — local opts come from command-level flags (--file)\n const parentOpts = command.parent?.opts() ?? {}\n const localOpts = command.opts()\n const opts = { ...parentOpts, ...localOpts }\n\n try {\n const config = loadConfig()\n const originalId =\n (opts['original'] as string | undefined) ?? config.session.originalBrainId\n const challengerId =\n (opts['challenger'] as string | undefined) ?? config.session.challengerBrainId\n const mirrorEnabled = opts['mirror'] !== false\n const classifyEnabled = opts['classify'] !== false\n const intensity =\n (opts['intensity'] as string | undefined) ?? config.session.defaultIntensity\n const judgeEnabled = opts['judge'] !== false && config.session.judgeEnabled\n const persona = (opts['persona'] as string | undefined) ?? config.session.defaultPersona\n const filePath = opts['file'] as string | undefined\n\n const brainConfig = config.brains.find(b => b.id === originalId)\n if (!brainConfig) {\n throw new Error(`Original brain not found: ${originalId}`)\n }\n\n const originalAdapter = createAdapter(brainConfig)\n const challengerConfig = config.brains.find(b => b.id === challengerId)\n const challengerAdapter =\n mirrorEnabled && challengerConfig ? createAdapter(challengerConfig) : undefined\n\n // Build judge adapter when mirroring is enabled and judge is requested\n let judgeAdapter = undefined\n if (mirrorEnabled && challengerAdapter && judgeEnabled) {\n const judgeId = (opts['judgeBrain'] as string | undefined) ?? config.session.judgeBrainId\n const judgeConfig = config.brains.find(b => b.id === judgeId)\n if (judgeConfig) {\n judgeAdapter = createAdapter(judgeConfig)\n }\n }\n\n const session = new Session(config.session.historyWindowSize)\n\n // Inject file content as the first exchange if --file is provided\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf8')\n const name = basename(filePath)\n session.addUser(`[FILE: ${name}]\\n${content}`)\n session.addAssistant(`I have read the file \"${name}\". Ask me anything about it.`)\n } catch (err) {\n throw new Error(`Could not read file: ${filePath} — ${(err as Error).message}`)\n }\n }\n\n const classifier = buildIntentClassifier(config, Boolean(opts['debug']))\n const engine = new MirrorEngine({\n original: originalAdapter,\n challenger: challengerAdapter,\n intensity: intensity as 'mild' | 'moderate' | 'aggressive',\n autoClassify:\n mirrorEnabled && classifyEnabled && config.session.autoClassify,\n classifier,\n debug: Boolean(opts['debug']),\n judge: judgeAdapter,\n persona,\n })\n\n const app = render(\n React.createElement(MirrorApp, {\n engine,\n session,\n originalId: originalAdapter.id,\n challengerId: challengerAdapter?.id,\n judgerId: judgeAdapter?.id,\n intensity,\n layout: config.ui.layout,\n showTokenCounts: config.ui.showTokenCounts,\n showLatency: config.ui.showLatency,\n syntaxHighlighting: config.ui.syntaxHighlighting,\n })\n )\n void app.waitUntilExit()\n } catch (error) {\n process.stderr.write(`Failed to start chat: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class AnthropicAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'anthropic' as const\n readonly capabilities = { streaming: true }\n private readonly client: Anthropic\n private readonly model: string\n\n constructor(id: string, model: string, apiKeyEnvVar: string) {\n this.id = id\n this.model = model\n const apiKey = process.env[apiKeyEnvVar]\n if (!apiKey) {\n throw new Error(\n `Missing API key. Set ${apiKeyEnvVar} or enable MOCK_BRAINS=true.`\n )\n }\n this.client = new Anthropic({ apiKey })\n }\n\n async ping(): Promise<PingResult> {\n const start = Date.now()\n try {\n await this.client.messages.create({\n model: this.model,\n max_tokens: 1,\n messages: [{ role: 'user', content: 'ping' }],\n })\n return { ok: true, latencyMs: Date.now() - start }\n } catch (err) {\n return { ok: false, error: (err as Error).message }\n }\n }\n\n async *chat(\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n const filtered = messages\n .filter(m => m.role !== 'system')\n .map(m => ({\n role: m.role === 'assistant' ? ('assistant' as const) : ('user' as const),\n content: m.content,\n }))\n\n // streaming helper — yields text deltas token-by-token, abortable\n const stream = this.client.messages.stream(\n {\n model: this.model,\n max_tokens: options?.maxTokens ?? 1024,\n system: systemPrompt,\n messages: filtered,\n },\n { signal: options?.signal }\n )\n\n let text = ''\n\n for await (const event of stream) {\n if (\n event.type === 'content_block_delta' &&\n event.delta.type === 'text_delta'\n ) {\n const delta = event.delta.text\n text += delta\n yield { delta, isFinal: false }\n }\n }\n\n const finalMessage = await stream.finalMessage()\n const inputTokens = finalMessage.usage.input_tokens\n const outputTokens = finalMessage.usage.output_tokens\n\n yield { delta: '', isFinal: true, inputTokens, outputTokens }\n return { text, inputTokens, outputTokens }\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import { GoogleGenerativeAI } from '@google/generative-ai'\nimport type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class GeminiAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'gemini' as const\n readonly capabilities = { streaming: true }\n private readonly model: string\n private readonly client: GoogleGenerativeAI\n\n constructor(id: string, model: string, apiKeyEnvVar: string) {\n this.id = id\n this.model = model\n const apiKey = process.env[apiKeyEnvVar]\n if (!apiKey) {\n throw new Error(\n `Missing API key. Set ${apiKeyEnvVar} or enable MOCK_BRAINS=true.`\n )\n }\n this.client = new GoogleGenerativeAI(apiKey)\n }\n\n async ping(): Promise<PingResult> {\n return { ok: true }\n }\n\n async *chat(\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n const model = this.client.getGenerativeModel({ model: this.model })\n const contents = messages\n .filter((message) => message.role !== 'system')\n .map((message) => ({\n role: message.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: message.content }]\n }))\n\n const result = await model.generateContentStream({\n contents,\n systemInstruction: {\n role: 'system',\n parts: [{ text: systemPrompt }]\n },\n generationConfig: {\n temperature: options?.temperature,\n maxOutputTokens: options?.maxTokens\n }\n })\n\n let text = ''\n for await (const chunk of result.stream) {\n const delta = chunk.text()\n if (delta) {\n text += delta\n yield { delta, isFinal: false }\n }\n }\n\n let inputTokens: number | undefined\n let outputTokens: number | undefined\n\n try {\n const response = await result.response\n const usage = (response as any).usageMetadata\n if (usage) {\n inputTokens = usage.promptTokenCount\n outputTokens =\n usage.candidatesTokenCount ?? usage.totalTokenCount ?? undefined\n }\n } catch {\n // usage metadata not available\n }\n\n const response: CompletedResponse = { text, inputTokens, outputTokens }\n yield { delta: '', isFinal: true, inputTokens, outputTokens }\n return response\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class MockAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'mock' as const\n readonly capabilities = { streaming: true }\n private readonly responseText: string\n\n constructor(id: string, responseText = 'Mock response.') {\n this.id = id\n this.responseText = responseText\n }\n\n async ping(): Promise<PingResult> {\n return { ok: true, latencyMs: 1 }\n }\n\n async *chat(\n _messages: ConversationMessage[],\n _systemPrompt: string,\n _options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n for (const chunk of this.responseText.split(' ')) {\n yield { delta: `${chunk} `, isFinal: false }\n }\n const response: CompletedResponse = { text: this.responseText }\n yield { delta: '', isFinal: true }\n return response\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import OpenAI from 'openai'\nimport type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class OpenAIAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'openai' as const\n readonly capabilities = { streaming: true }\n private readonly model: string\n private readonly client: OpenAI\n\n constructor(id: string, model: string, apiKeyEnvVar: string) {\n this.id = id\n this.model = model\n const apiKey = process.env[apiKeyEnvVar]\n if (!apiKey) {\n throw new Error(\n `Missing API key. Set ${apiKeyEnvVar} or enable MOCK_BRAINS=true.`\n )\n }\n this.client = new OpenAI({ apiKey })\n }\n\n async ping(): Promise<PingResult> {\n const start = Date.now()\n try {\n await this.client.models.list()\n return { ok: true, latencyMs: Date.now() - start }\n } catch (err) {\n return { ok: false, error: (err as Error).message }\n }\n }\n\n async *chat(\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n const stream = await this.client.chat.completions.create(\n {\n model: this.model,\n stream: true,\n stream_options: { include_usage: true },\n temperature: options?.temperature,\n max_tokens: options?.maxTokens,\n messages: [\n { role: 'system', content: systemPrompt },\n ...messages\n .filter((message) => message.role !== 'system')\n .map((message) => ({\n role: message.role === 'assistant' ? 'assistant' : 'user',\n content: message.content\n }))\n ]\n },\n { signal: options?.signal }\n )\n\n let text = ''\n let inputTokens: number | undefined\n let outputTokens: number | undefined\n\n for await (const chunk of stream) {\n const delta = chunk.choices?.[0]?.delta?.content ?? ''\n if (delta) {\n text += delta\n yield { delta, isFinal: false }\n }\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens\n outputTokens = chunk.usage.completion_tokens\n }\n }\n\n const response: CompletedResponse = {\n text,\n inputTokens,\n outputTokens\n }\n\n yield { delta: '', isFinal: true, inputTokens, outputTokens }\n return response\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import type { BrainConfig } from '../config/schema.js'\nimport type { BrainAdapter } from './adapter.js'\nimport { AnthropicAdapter } from './anthropic.js'\nimport { GeminiAdapter } from './gemini.js'\nimport { MockAdapter } from './mock.js'\nimport { OpenAIAdapter } from './openai.js'\n\nexport function createAdapter(\n config: BrainConfig,\n overrides: Partial<Pick<BrainConfig, 'model' | 'apiKeyEnvVar'>> = {}\n): BrainAdapter {\n const effective = { ...config, ...overrides }\n if (process.env.MOCK_BRAINS) {\n return new MockAdapter(effective.id, `Mock response from ${effective.id}.`)\n }\n\n switch (effective.provider) {\n case 'anthropic':\n return new AnthropicAdapter(\n effective.id,\n effective.model,\n effective.apiKeyEnvVar\n )\n case 'openai':\n return new OpenAIAdapter(\n effective.id,\n effective.model,\n effective.apiKeyEnvVar\n )\n case 'gemini':\n return new GeminiAdapter(\n effective.id,\n effective.model,\n effective.apiKeyEnvVar\n )\n case 'mock':\n return new MockAdapter(effective.id, `Mock response from ${effective.id}.`)\n default:\n throw new Error(`Unsupported provider: ${effective.provider}`)\n }\n}\n","import Conf from 'conf'\nimport { configSchema, type AppConfig } from './schema.js'\nimport { defaultConfig } from './defaults.js'\n\nconst store = new Conf<AppConfig>({\n projectName: 'adversarial-mirror',\n configName: 'config',\n defaults: defaultConfig\n})\n\nexport function loadConfig(): AppConfig {\n return configSchema.parse(store.store)\n}\n\nexport function saveConfig(next: AppConfig): void {\n store.store = configSchema.parse(next)\n}\n\nexport function setConfigValue(path: string, value: unknown): AppConfig {\n const current = loadConfig()\n const updated = setByPath({ ...current }, path, value)\n saveConfig(updated)\n return updated\n}\n\nfunction setByPath(config: AppConfig, path: string, value: unknown): AppConfig {\n const keys = path.split('.').filter(Boolean)\n if (keys.length === 0) {\n return config\n }\n\n let cursor: any = config\n for (let i = 0; i < keys.length - 1; i += 1) {\n const key = keys[i]\n if (typeof cursor[key] !== 'object' || cursor[key] === null) {\n cursor[key] = {}\n }\n cursor = cursor[key]\n }\n\n cursor[keys[keys.length - 1]] = value\n return config\n}\n","import { z } from 'zod'\n\nconst brainConfigSchema = z.object({\n id: z.string().min(1),\n provider: z.enum(['anthropic', 'openai', 'gemini', 'mock']),\n model: z.string().min(1),\n apiKeyEnvVar: z.string().min(1)\n})\n\nexport const configSchema = z.object({\n version: z.number().int().positive(),\n session: z.object({\n originalBrainId: z.string().min(1),\n challengerBrainId: z.string().min(1),\n defaultIntensity: z.enum(['mild', 'moderate', 'aggressive']),\n historyWindowSize: z.number().int().positive(),\n autoClassify: z.boolean(),\n judgeEnabled: z.boolean().default(true),\n judgeBrainId: z.string().min(1).default('claude-sonnet-4-6'),\n defaultPersona: z.string().optional()\n }),\n ui: z.object({\n layout: z.enum(['side-by-side', 'stacked']),\n showTokenCounts: z.boolean(),\n showLatency: z.boolean(),\n syntaxHighlighting: z.boolean()\n }),\n brains: z.array(brainConfigSchema).min(1),\n classifier: z.object({\n brainId: z.string().min(1),\n model: z.string().min(1),\n confidenceThreshold: z.number().min(0).max(1)\n })\n})\n\nexport type AppConfig = z.infer<typeof configSchema>\nexport type BrainConfig = z.infer<typeof brainConfigSchema>\n","import type { AppConfig } from './schema.js'\n\nexport const defaultConfig: AppConfig = {\n version: 1,\n session: {\n originalBrainId: 'claude-sonnet-4-6',\n challengerBrainId: 'gpt-4o',\n defaultIntensity: 'moderate',\n historyWindowSize: 20,\n autoClassify: true,\n judgeEnabled: true,\n judgeBrainId: 'claude-sonnet-4-6',\n defaultPersona: undefined\n },\n ui: {\n layout: 'side-by-side',\n showTokenCounts: false,\n showLatency: true,\n syntaxHighlighting: true\n },\n brains: [\n {\n id: 'claude-sonnet-4-6',\n provider: 'anthropic',\n model: 'claude-sonnet-4-6',\n apiKeyEnvVar: 'ANTHROPIC_API_KEY'\n },\n {\n id: 'gpt-4o',\n provider: 'openai',\n model: 'gpt-4o',\n apiKeyEnvVar: 'OPENAI_API_KEY'\n },\n {\n id: 'o3-mini',\n provider: 'openai',\n model: 'o3-mini',\n apiKeyEnvVar: 'OPENAI_API_KEY'\n },\n {\n id: 'gemini-pro',\n provider: 'gemini',\n model: 'gemini-2.5-pro',\n apiKeyEnvVar: 'GOOGLE_API_KEY'\n }\n ],\n classifier: {\n brainId: 'claude-sonnet-4-6',\n model: 'claude-haiku-4-5-20251001',\n confidenceThreshold: 0.75\n }\n}\n","import type {\n ChatOptions,\n IntentCategory,\n IntentResult\n} from '../types/index.js'\nimport type { BrainAdapter } from '../brains/adapter.js'\n\nexport interface IntentClassifier {\n classify(input: string): Promise<IntentResult>\n}\n\nconst intentSystemPrompt = `You are an intent classifier for a CLI assistant. \nReturn strict JSON with keys: category, shouldMirror, confidence, reason.\nCategories: factual_lookup, math_computation, code_task, conversational, opinion_advice, analysis, interpretation, prediction.\nRules:\n- factual_lookup, math_computation, code_task, conversational => shouldMirror false\n- opinion_advice, analysis, interpretation, prediction => shouldMirror true\nConfidence is 0-1.\nReturn ONLY JSON.`\n\nexport class HeuristicIntentClassifier implements IntentClassifier {\n async classify(input: string): Promise<IntentResult> {\n const trimmed = input.trim().toLowerCase()\n const looksFactual =\n trimmed.startsWith('who ') ||\n trimmed.startsWith('what ') ||\n trimmed.startsWith('when ') ||\n trimmed.startsWith('where ')\n\n const category: IntentCategory = looksFactual ? 'factual_lookup' : 'analysis'\n const shouldMirror = !looksFactual\n\n return {\n category,\n shouldMirror,\n confidence: looksFactual ? 0.55 : 0.45,\n reason: looksFactual\n ? 'Heuristic: question starts with who/what/when/where.'\n : 'Heuristic: default to analysis for open-ended prompts.'\n }\n }\n}\n\nexport class BrainIntentClassifier implements IntentClassifier {\n private readonly adapter: BrainAdapter\n private readonly threshold: number\n\n constructor(adapter: BrainAdapter, threshold = 0.75) {\n this.adapter = adapter\n this.threshold = threshold\n }\n\n async classify(input: string): Promise<IntentResult> {\n const messages = [{ role: 'user', content: input }] as const\n const options: ChatOptions = { temperature: 0 }\n const stream = this.adapter.chat(messages, intentSystemPrompt, options)\n let text = ''\n\n for await (const chunk of stream) {\n if (chunk.delta) {\n text += chunk.delta\n }\n }\n\n const parsed = safeParseIntent(text)\n const category = parsed.category\n const shouldMirror = parsed.shouldMirror\n const confidence = parsed.confidence\n\n if (confidence < this.threshold) {\n return {\n ...parsed,\n shouldMirror: true,\n reason: `${parsed.reason} (below confidence threshold ${this.threshold}).`\n }\n }\n\n return {\n category,\n shouldMirror,\n confidence,\n reason: parsed.reason\n }\n }\n}\n\nfunction safeParseIntent(text: string): IntentResult {\n const trimmed = text.trim()\n const start = trimmed.indexOf('{')\n const end = trimmed.lastIndexOf('}')\n if (start === -1 || end === -1 || end <= start) {\n throw new Error('Classifier returned non-JSON output.')\n }\n const json = trimmed.slice(start, end + 1)\n const parsed = JSON.parse(json) as Partial<IntentResult>\n\n const category = normalizeCategory(parsed.category)\n const confidence = clamp(\n typeof parsed.confidence === 'number' ? parsed.confidence : 0\n )\n const shouldMirror =\n typeof parsed.shouldMirror === 'boolean'\n ? parsed.shouldMirror\n : ['opinion_advice', 'analysis', 'interpretation', 'prediction'].includes(\n category\n )\n const reason =\n typeof parsed.reason === 'string' && parsed.reason\n ? parsed.reason\n : 'No reason provided.'\n\n return { category, shouldMirror, confidence, reason }\n}\n\nfunction normalizeCategory(value: unknown): IntentCategory {\n const allowed: IntentCategory[] = [\n 'factual_lookup',\n 'math_computation',\n 'code_task',\n 'conversational',\n 'opinion_advice',\n 'analysis',\n 'interpretation',\n 'prediction'\n ]\n if (typeof value === 'string' && allowed.includes(value as IntentCategory)) {\n return value as IntentCategory\n }\n return 'analysis'\n}\n\nfunction clamp(value: number): number {\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n","import type { AppConfig } from '../config/schema.js'\nimport { createAdapter } from '../brains/factory.js'\nimport type { IntentClassifier } from './intent-classifier.js'\nimport { BrainIntentClassifier, HeuristicIntentClassifier } from './intent-classifier.js'\n\nexport function buildIntentClassifier(\n config: AppConfig,\n debug = false\n): IntentClassifier {\n const classifierConfig = config.classifier\n const brainConfig = config.brains.find(\n (brain) => brain.id === classifierConfig.brainId\n )\n\n if (!brainConfig) {\n if (debug) {\n process.stderr.write(\n `[debug] Classifier brain not found: ${classifierConfig.brainId}. Using heuristic.\\n`\n )\n }\n return new HeuristicIntentClassifier()\n }\n\n try {\n const adapter = createAdapter(brainConfig, { model: classifierConfig.model })\n return new BrainIntentClassifier(\n adapter,\n classifierConfig.confidenceThreshold\n )\n } catch (error) {\n if (debug) {\n process.stderr.write(\n `[debug] Failed to init classifier: ${(error as Error).message}. Using heuristic.\\n`\n )\n }\n return new HeuristicIntentClassifier()\n }\n}\n","import type { Intensity } from '../types/index.js'\n\nconst baseRule =\n 'Every point must have a specific mechanism. Vague doubt is useless.'\n\nconst mild = `You are a gentle critic. Provide a full answer, then 1-2 real gaps and a steelman alternative. ${baseRule}`\nconst moderate = `You are a devil's advocate.\\n1. REFRAME the implicit assumption.\\n2. CHALLENGE THE FRAME with the question the user should have asked.\\n3. SURFACE HIDDEN COSTS that are under-weighted.\\n4. STRONGEST COUNTERPOSITION (no straw man).\\n5. VERDICT with honest synthesis.\\n${baseRule}`\nconst aggressive = `You are adversarial.\\n1. BURIED ASSUMPTION: the most consequential unstated assumption.\\n2. STRONGEST REFUTATION against the dominant view.\\n3. FAILURE CASES: 2-3 concrete scenarios where standard advice fails.\\n4. EXPERT DISSENT: represent serious dissenting thinkers.\\n5. HONEST SYNTHESIS with calibrated confidence.\\n${baseRule}`\n\nexport function buildChallengerPrompt(intensity: Intensity): string {\n switch (intensity) {\n case 'mild':\n return mild\n case 'moderate':\n return moderate\n case 'aggressive':\n return aggressive\n default:\n return moderate\n }\n}\n\nexport function buildOriginalPrompt(): string {\n return 'You are the primary assistant. Provide the best direct answer.'\n}\n\n// ── Persona definitions ────────────────────────────────────────────────────────\n\nexport type PersonaName = 'vc-skeptic' | 'security-auditor' | 'end-user' | 'regulator' | 'contrarian'\n\ninterface PersonaDef {\n label: string\n lens: string\n focusAreas: string[]\n}\n\nconst PERSONAS: Record<PersonaName, PersonaDef> = {\n 'vc-skeptic': {\n label: 'VC Skeptic',\n lens: 'Investor/VC scrutiny',\n focusAreas: [\n 'Market sizing assumptions — are they realistic or aspirational?',\n 'Unit economics — does the math work at scale?',\n 'Competitive moat — what stops a well-funded competitor from copying this?',\n 'Defensibility — what makes this durable beyond 18 months?',\n ],\n },\n 'security-auditor': {\n label: 'Security Auditor',\n lens: 'Security and risk analysis',\n focusAreas: [\n 'Attack surfaces — what can be exploited externally or internally?',\n 'Trust boundaries — where are credentials, data, or permissions crossing lines?',\n 'Failure modes — what happens when this breaks under adversarial conditions?',\n 'Blast radius — what is the worst-case scope of a breach or failure?',\n ],\n },\n 'end-user': {\n label: 'End User',\n lens: 'Real user perspective',\n focusAreas: [\n 'Real needs vs stated needs — what does the user actually want vs what they said?',\n 'Adoption friction — what will cause users to abandon this in the first week?',\n 'Actual behavior — what do users do vs what you think they will do?',\n 'Comprehension gaps — what will users misunderstand or misuse?',\n ],\n },\n 'regulator': {\n label: 'Regulator',\n lens: 'Compliance and legal exposure',\n focusAreas: [\n 'Regulatory exposure — what laws, rules, or frameworks apply and are being ignored?',\n 'Liability — who bears legal responsibility when this causes harm?',\n 'Stakeholder harm — who could be injured, defrauded, or discriminated against?',\n 'Unintended consequences — what second-order effects could trigger enforcement action?',\n ],\n },\n 'contrarian': {\n label: 'Contrarian',\n lens: 'Pure intellectual opposition',\n focusAreas: [\n 'Historical failures — name similar ideas that failed and why this is the same.',\n 'Second-order effects — what happens after the first-order success plays out?',\n 'Inverted premise — what if the opposite assumption is actually correct?',\n 'Consensus trap — why might the conventional wisdom here be exactly wrong?',\n ],\n },\n}\n\nexport function buildPersonaChallengerPrompt(persona: PersonaName, intensity: Intensity): string {\n const def = PERSONAS[persona]\n if (!def) return buildChallengerPrompt(intensity)\n\n const focusList = def.focusAreas.map((area, i) => `${i + 1}. ${area}`).join('\\n')\n const basePrompt = buildChallengerPrompt(intensity)\n\n return `You are applying the lens of a ${def.label} (${def.lens}).\n\nYour specific focus areas for this lens:\n${focusList}\n\nApply this lens rigorously throughout your response. Every critique must flow from this professional perspective.\n\n---\n\n${basePrompt}`\n}\n\nexport function isValidPersona(name: string): name is PersonaName {\n return name in PERSONAS\n}\n","import type { ConversationMessage } from '../types/index.js'\n\nexport function buildJudgeSystemPrompt(): string {\n return `You are a neutral synthesis judge evaluating two AI responses to the same question.\n\nYour output MUST follow this exact structure:\n\nAGREEMENT: <number>%\n<One sentence explaining what drives the score — where they converge or diverge>\n\nSYNTHESIS\n<The actual synthesized recommendation — the verdict after weighing both responses. Be concrete and actionable.>\n\nBLIND SPOT\n<What both models missed or assumed without questioning. Be specific — name the assumption or gap.>\n\nScoring guide for AGREEMENT:\n- 90–100%: Substantively identical conclusions, only stylistic differences\n- 70–89%: Same core answer, meaningful differences in emphasis or caveats\n- 50–69%: Partial overlap, notable disagreement on key points\n- 30–49%: Different conclusions but some shared premises\n- 0–29%: Fundamentally opposed positions\n\nBe direct and critical. Do not praise either response.`\n}\n\nexport function buildJudgeMessages(\n question: string,\n originalText: string,\n challengerText: string\n): ConversationMessage[] {\n return [\n {\n role: 'user',\n content: `QUESTION\n${question}\n\n---\n\nRESPONSE A (Original)\n${originalText}\n\n---\n\nRESPONSE B (Challenger)\n${challengerText}\n\n---\n\nProvide your synthesis following the required format exactly.`,\n },\n ]\n}\n\nexport function extractAgreementScore(text: string): number | undefined {\n const match = /AGREEMENT:\\s*(-?\\d+)%/i.exec(text)\n if (!match) return undefined\n const n = parseInt(match[1], 10)\n if (isNaN(n)) return undefined\n return Math.max(0, Math.min(100, n))\n}\n","import type {\n ChatOptions,\n ConversationMessage,\n Intensity,\n MirrorEvent,\n SynthesisResult\n} from '../types/index.js'\nimport type { BrainAdapter } from '../brains/adapter.js'\nimport type { IntentClassifier } from './intent-classifier.js'\nimport {\n buildChallengerPrompt,\n buildOriginalPrompt,\n buildPersonaChallengerPrompt,\n isValidPersona,\n} from './prompt-builder.js'\nimport {\n buildJudgeMessages,\n buildJudgeSystemPrompt,\n extractAgreementScore,\n} from './judge.js'\n\nexport interface MirrorEngineOptions {\n original: BrainAdapter\n challenger?: BrainAdapter\n intensity: Intensity\n autoClassify: boolean\n classifier: IntentClassifier\n debug?: boolean\n judge?: BrainAdapter\n persona?: string\n}\n\nexport class MirrorEngine {\n private readonly original: BrainAdapter\n private readonly challenger?: BrainAdapter\n private readonly intensity: Intensity\n private readonly autoClassify: boolean\n private readonly classifier: IntentClassifier\n private readonly debug: boolean\n private readonly judge?: BrainAdapter\n private readonly persona?: string\n\n constructor(options: MirrorEngineOptions) {\n this.original = options.original\n this.challenger = options.challenger\n this.intensity = options.intensity\n this.autoClassify = options.autoClassify\n this.classifier = options.classifier\n this.debug = options.debug ?? false\n this.judge = options.judge\n this.persona = options.persona\n }\n\n async *run(\n userInput: string,\n history: ConversationMessage[],\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n try {\n if (this.autoClassify) {\n yield { type: 'classifying' }\n let result\n try {\n result = await this.classifier.classify(userInput)\n } catch (error) {\n this.log(`Classifier error: ${(error as Error).message}`)\n result = {\n category: 'analysis' as const,\n shouldMirror: true,\n confidence: 0,\n reason: 'Classifier error; defaulting to mirror.'\n }\n }\n yield { type: 'classified', result }\n if (!result.shouldMirror || !this.challenger) {\n this.log('Classifier chose direct path.')\n yield* this.runSingle(userInput, history, options)\n return\n }\n }\n\n if (!this.challenger) {\n yield* this.runSingle(userInput, history, options)\n return\n }\n\n yield* this.runMirror(userInput, history, options)\n } catch (error) {\n yield { type: 'error', error: error as Error }\n }\n }\n\n private async *runSingle(\n userInput: string,\n history: ConversationMessage[],\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n const messages = [...history, { role: 'user', content: userInput }]\n const systemPrompt = buildOriginalPrompt()\n const stream = this.streamWithRetry(\n this.original,\n messages,\n systemPrompt,\n options\n )\n const accumulator = createAccumulator()\n\n for await (const chunk of stream) {\n accumulator.add(chunk)\n yield { type: 'stream_chunk', brainId: this.original.id, chunk }\n }\n\n const response = accumulator.complete()\n\n yield { type: 'brain_complete', brainId: this.original.id, response, completedAt: Date.now() }\n yield { type: 'all_complete' }\n }\n\n private async *runMirror(\n userInput: string,\n history: ConversationMessage[],\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n const originalMessages = [...history, { role: 'user', content: userInput }]\n const challengerHistory = history.map((message) =>\n message.role === 'assistant'\n ? {\n ...message,\n content: `[PREVIOUS ORIGINAL RESPONSE]\\n${message.content}`\n }\n : message\n )\n const challengerMessages = [\n ...challengerHistory,\n { role: 'user', content: userInput }\n ]\n const originalPrompt = buildOriginalPrompt()\n const challengerPrompt = this.persona && isValidPersona(this.persona)\n ? buildPersonaChallengerPrompt(this.persona, this.intensity)\n : buildChallengerPrompt(this.intensity)\n\n const originalStream = this.streamWithRetry(\n this.original,\n originalMessages,\n originalPrompt,\n options\n )\n const challengerStream = this.streamWithRetry(\n this.challenger!,\n challengerMessages,\n challengerPrompt,\n options\n )\n\n const originalAccumulator = createAccumulator()\n const challengerAccumulator = createAccumulator()\n\n const completionTimes = new Map<string, number>()\n\n for await (const item of mergeStreams([\n { brainId: this.original.id, stream: originalStream, accumulator: originalAccumulator },\n {\n brainId: this.challenger!.id,\n stream: challengerStream,\n accumulator: challengerAccumulator\n }\n ], completionTimes)) {\n yield item\n }\n\n const originalResponse = originalAccumulator.complete()\n const challengerResponse = challengerAccumulator.complete()\n\n yield {\n type: 'brain_complete',\n brainId: this.original.id,\n response: originalResponse,\n completedAt: completionTimes.get(this.original.id) ?? Date.now()\n }\n yield {\n type: 'brain_complete',\n brainId: this.challenger!.id,\n response: challengerResponse,\n completedAt: completionTimes.get(this.challenger!.id) ?? Date.now()\n }\n\n // ── Judge pass ───────────────────────────────────────────────────────────\n if (this.judge) {\n yield* this.runJudge(userInput, originalResponse.text, challengerResponse.text, options)\n }\n\n yield { type: 'all_complete' }\n }\n\n private async *runJudge(\n question: string,\n originalText: string,\n challengerText: string,\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n yield { type: 'synthesizing' }\n\n const messages = buildJudgeMessages(question, originalText, challengerText)\n const systemPrompt = buildJudgeSystemPrompt()\n const stream = this.streamWithRetry(this.judge!, messages, systemPrompt, options)\n const accumulator = createAccumulator()\n\n for await (const chunk of stream) {\n accumulator.add(chunk)\n yield { type: 'synthesis_chunk', chunk }\n }\n\n const response = accumulator.complete()\n const agreementScore = extractAgreementScore(response.text)\n\n const result: SynthesisResult = {\n text: response.text,\n agreementScore,\n inputTokens: response.inputTokens,\n outputTokens: response.outputTokens,\n }\n\n yield { type: 'synthesis_complete', result }\n }\n\n private async *streamWithRetry(\n adapter: BrainAdapter,\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions,\n retries = 1\n ): AsyncGenerator<\n { delta: string; isFinal: boolean; inputTokens?: number; outputTokens?: number },\n { text: string; inputTokens?: number; outputTokens?: number }\n > {\n let attempt = 0\n while (true) {\n try {\n if (attempt > 0) {\n this.log(`Retrying ${adapter.id} (attempt ${attempt + 1}).`)\n }\n const stream = adapter.chat(messages, systemPrompt, options)\n for await (const chunk of stream) {\n yield chunk\n }\n return { text: '' }\n } catch (error) {\n if (attempt >= retries) {\n throw error\n }\n attempt += 1\n await delay(300 * attempt)\n }\n }\n }\n\n private log(message: string): void {\n if (!this.debug) {\n return\n }\n process.stderr.write(`[debug] ${message}\\n`)\n }\n}\n\ntype StreamChunk = {\n delta: string\n isFinal: boolean\n inputTokens?: number\n outputTokens?: number\n}\n\ninterface MergeEntry {\n brainId: string\n stream: AsyncGenerator<StreamChunk, { text: string; inputTokens?: number; outputTokens?: number }>\n accumulator: ReturnType<typeof createAccumulator>\n}\n\nfunction createAccumulator() {\n let text = ''\n let inputTokens: number | undefined\n let outputTokens: number | undefined\n\n return {\n add(chunk: StreamChunk) {\n if (chunk.delta) {\n text += chunk.delta\n }\n if (chunk.inputTokens !== undefined) {\n inputTokens = chunk.inputTokens\n }\n if (chunk.outputTokens !== undefined) {\n outputTokens = chunk.outputTokens\n }\n },\n complete() {\n return { text, inputTokens, outputTokens }\n }\n }\n}\n\nasync function* mergeStreams(\n entries: MergeEntry[],\n completionTimes: Map<string, number>\n): AsyncGenerator<MirrorEvent, void> {\n const pending = entries.map((entry) => ({\n entry,\n next: entry.stream.next()\n }))\n\n while (pending.length > 0) {\n const race = pending.map((item, index) =>\n item.next.then((result) => ({ index, result }))\n )\n const { index, result } = await Promise.race(race)\n const current = pending[index]\n\n if (result.done) {\n completionTimes.set(current.entry.brainId, Date.now())\n pending.splice(index, 1)\n continue\n }\n\n current.entry.accumulator.add(result.value)\n yield {\n type: 'stream_chunk',\n brainId: current.entry.brainId,\n chunk: result.value\n }\n current.next = current.entry.stream.next()\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import type { ConversationMessage } from '../types/index.js'\n\nexport class Session {\n private readonly maxHistory: number\n private readonly messages: ConversationMessage[] = []\n\n constructor(maxHistory = 20) {\n this.maxHistory = maxHistory\n }\n\n addUser(content: string): void {\n this.push({ role: 'user', content })\n }\n\n addAssistant(content: string): void {\n this.push({ role: 'assistant', content })\n }\n\n getHistory(): ConversationMessage[] {\n return [...this.messages]\n }\n\n clear(): void {\n this.messages.length = 0\n }\n\n private push(message: ConversationMessage): void {\n this.messages.push(message)\n // Evict oldest Q&A pair at a time so the buffer never starts with an\n // assistant message that has no preceding user turn (which causes API errors).\n while (this.messages.length > this.maxHistory) {\n this.messages.splice(0, 2)\n }\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Box, Static, Text, useInput, useStdout } from 'ink'\nimport type { BrainResult, IntentResult, SynthesisResult } from '../types/index.js'\nimport type { MirrorEngine } from '../engine/mirror-engine.js'\nimport { Session } from '../engine/session.js'\nimport { addHistoryEntry } from '../history/store.js'\nimport { BrainPanel } from './components/BrainPanel.js'\nimport { IntentBadge } from './components/IntentBadge.js'\nimport { StreamingText } from './components/StreamingText.js'\nimport { highlightCodeBlocks } from './utils/highlight.js'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface CompletedExchange {\n id: string\n question: string\n intent?: IntentResult\n original: string\n challenger?: string\n synthesis?: string\n agreementScore?: number\n isMirrored: boolean\n}\n\n// StaticItem union — items written permanently to stdout via <Static>.\n// The header is the first item (added at mount); exchanges are appended as queries complete.\ntype StaticItem =\n | { type: 'header'; id: 'header' }\n | { type: 'exchange'; id: string; exchange: CompletedExchange; originalId: string; challengerId?: string; columns: number }\n\nexport interface MirrorAppProps {\n engine: MirrorEngine\n session: Session\n originalId: string\n challengerId?: string\n judgerId?: string\n intensity: string\n layout?: 'side-by-side' | 'stacked'\n showTokenCounts?: boolean\n showLatency?: boolean\n syntaxHighlighting?: boolean\n}\n\n// ── Gradient helpers ───────────────────────────────────────────────────────────\n\nconst GRAD = ['#00D2FF', '#3A7BD5', '#7F5AF0', '#FF6EC7', '#FFB86C']\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const n = hex.replace('#', '')\n const v = parseInt(n.length === 3 ? n.split('').map(c => c + c).join('') : n, 16)\n return { r: (v >> 16) & 0xff, g: (v >> 8) & 0xff, b: v & 0xff }\n}\n\nfunction gradColor(pos: number): string {\n const p = Math.max(0, Math.min(1, pos))\n const steps = GRAD.length - 1\n const scaled = p * steps\n const i = Math.min(Math.floor(scaled), steps - 1)\n const t = scaled - i\n const a = hexToRgb(GRAD[i])\n const b = hexToRgb(GRAD[i + 1])\n const r = Math.round(a.r + (b.r - a.r) * t)\n const g = Math.round(a.g + (b.g - a.g) * t)\n const bv = Math.round(a.b + (b.b - a.b) * t)\n return `#${[r, g, bv].map(v => v.toString(16).padStart(2, '0')).join('')}`\n}\n\nfunction GradientLine({ line, bold }: { line: string; bold?: boolean }): JSX.Element {\n if (!line.trim()) return <Text> </Text>\n const chars = Array.from(line)\n const last = Math.max(chars.length - 1, 1)\n return (\n <Text bold={bold} wrap=\"truncate\">\n {chars.map((ch, idx) => (\n <Text key={idx} color={gradColor(idx / last)}>{ch}</Text>\n ))}\n </Text>\n )\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────────────\n\n// Wrapped in memo so re-renders during streaming don't touch the header.\nconst HeaderView = React.memo(function HeaderView({\n lines, originalId, challengerId, intensity\n}: {\n lines: string[]; originalId: string; challengerId?: string; intensity: string\n}): JSX.Element {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {lines.map((line, i) => <GradientLine key={i} line={line} bold />)}\n <Text color=\"gray\" dimColor>\n {' '}{originalId}{challengerId ? ` vs ${challengerId}` : ' [direct mode]'}{' '}[{intensity}]\n </Text>\n </Box>\n )\n})\n\n// Strip the \"AGREEMENT: X%\" metadata line — the score is already in the panel\n// title, so showing it again inside the panel body is redundant noise.\nfunction stripAgreementHeader(text: string): string {\n return text.replace(/^AGREEMENT:\\s*-?\\d+%[^\\n]*\\n?\\n?/i, '').trimStart()\n}\n\n// Wrapped in memo: completed exchanges never change after they're added, so\n// they should never re-render during the next query's streaming updates.\nconst ExchangeView = React.memo(function ExchangeView({\n exchange, originalId, challengerId, columns\n}: {\n exchange: CompletedExchange\n originalId: string\n challengerId?: string\n columns: number\n}): JSX.Element {\n const sideBySide = exchange.isMirrored && Boolean(exchange.challenger) && columns >= 80\n const panelWidth = sideBySide ? Math.floor((columns - 1) / 2) : columns\n\n const scoreLabel = exchange.agreementScore !== undefined\n ? ` [agreement: ${exchange.agreementScore}%]`\n : ''\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>\n <Text color=\"cyan\">You: </Text>\n <Text>{exchange.question}</Text>\n </Text>\n {exchange.intent && (\n <Box>\n <IntentBadge category={exchange.intent.category} mirrored={exchange.intent.shouldMirror} />\n <Text color=\"gray\"> {Math.round(exchange.intent.confidence * 100)}%</Text>\n </Box>\n )}\n <Box marginTop={1} flexDirection={sideBySide ? 'row' : 'column'}>\n <BrainPanel\n title={`ORIGINAL ${originalId}`}\n width={panelWidth}\n marginRight={sideBySide ? 1 : 0}\n >\n <Text wrap=\"wrap\">{exchange.original}</Text>\n </BrainPanel>\n {exchange.isMirrored && exchange.challenger && (\n <BrainPanel\n title={`CHALLENGER ${challengerId}`}\n width={panelWidth}\n >\n <Text wrap=\"wrap\">{exchange.challenger}</Text>\n </BrainPanel>\n )}\n </Box>\n {exchange.synthesis && (\n <Box marginTop={1}>\n <BrainPanel\n title={`SYNTHESIS${scoreLabel}`}\n width={columns}\n borderColor=\"yellow\"\n >\n <Text wrap=\"wrap\">{stripAgreementHeader(exchange.synthesis)}</Text>\n </BrainPanel>\n </Box>\n )}\n </Box>\n )\n})\n\n// ── Header file loading ────────────────────────────────────────────────────────\n\nfunction loadRawHeaderLines(): string[] {\n const cwd = process.cwd()\n const candidates = [\n resolve(cwd, 'src', 'ui', 'header.txt'),\n resolve(cwd, 'header.txt'),\n ]\n for (const f of candidates) {\n if (!existsSync(f)) continue\n try {\n const lines = readFileSync(f, 'utf8').split(/\\r?\\n/)\n while (lines.length > 0 && !lines[lines.length - 1].trim()) lines.pop()\n return lines\n } catch { continue }\n }\n try {\n const p = fileURLToPath(new URL('./header.txt', import.meta.url))\n if (existsSync(p)) {\n const lines = readFileSync(p, 'utf8').split(/\\r?\\n/)\n while (lines.length > 0 && !lines[lines.length - 1].trim()) lines.pop()\n return lines\n }\n } catch { /* no header file bundled */ }\n return []\n}\n\nfunction fitLines(lines: string[], cols: number): string[] {\n if (!lines.length || cols <= 0) return []\n const trimmed = lines.map(l => l.replace(/\\s+$/, ''))\n const nonEmpty = trimmed.filter(l => l.trim().length > 0)\n const indent = nonEmpty.length\n ? Math.min(...nonEmpty.map(l => l.match(/^\\s*/)?.[0].length ?? 0))\n : 0\n const aligned = indent > 0 ? trimmed.map(l => l.slice(indent)) : trimmed\n return aligned.map(l => (l.length > cols ? l.slice(0, cols) : l))\n}\n\nfunction tailLines(text: string, maxLines: number): string {\n if (maxLines <= 0) return ''\n const lines = text.split(/\\r?\\n/)\n if (lines.length <= maxLines) return text\n return lines.slice(-maxLines).join('\\n')\n}\n\n// ── Formatting ─────────────────────────────────────────────────────────────────\n\nfunction formatTokens(input?: number, output?: number): string | null {\n if (input === undefined && output === undefined) return null\n return `${input ?? 0}/${output ?? 0}tok`\n}\n\n// ── Main component ─────────────────────────────────────────────────────────────\n\nexport function MirrorApp({\n engine,\n session,\n originalId,\n challengerId,\n judgerId,\n intensity,\n showTokenCounts = false,\n showLatency = true,\n syntaxHighlighting = true,\n}: MirrorAppProps): JSX.Element {\n const { stdout } = useStdout()\n const columns = stdout?.columns ?? 120\n const rows = stdout?.rows ?? 40\n\n const headerLines = useMemo(() => {\n const raw = loadRawHeaderLines()\n return fitLines(raw, Math.max(1, columns - 1))\n }, [])\n\n // -- Static content (header + completed exchanges) --\n const [staticItems, setStaticItems] = useState<StaticItem[]>([\n { type: 'header', id: 'header' }\n ])\n\n // ── Dynamic UI state ─────────────────────────────────────────────────────────\n const [input, setInput] = useState('')\n const [activeQuestion, setActiveQuestion] = useState('')\n const [currentOriginal, setCurrentOriginal] = useState('')\n const [currentChallenger, setCurrentChallenger] = useState('')\n const [currentSynthesis, setCurrentSynthesis] = useState('')\n const [isThinking, setIsThinking] = useState(false)\n const [isClassifying, setIsClassifying] = useState(false)\n const [isSynthesizing, setIsSynthesizing] = useState(false)\n const [intent, setIntent] = useState<IntentResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [originalStats, setOriginalStats] = useState<BrainResult | null>(null)\n const [challengerStats, setChallengerStats] = useState<BrainResult | null>(null)\n const [synthesisStats, setSynthesisStats] = useState<SynthesisResult | null>(null)\n const [turnCount, setTurnCount] = useState(0)\n const [commitTick, setCommitTick] = useState(0)\n\n // ── Refs ─────────────────────────────────────────────────────────────────────\n const runningRef = useRef(false)\n const abortRef = useRef<AbortController | null>(null)\n const pendingOrigRef = useRef('')\n const pendingChalRef = useRef('')\n const pendingSynthRef = useRef('')\n const pendingExchangeRef = useRef<StaticItem | null>(null)\n const startTimesRef = useRef(new Map<string, number>())\n const columnsRef = useRef(columns)\n\n useEffect(() => { columnsRef.current = columns }, [columns])\n\n // Defer Static writes until after streaming panels are cleared.\n useEffect(() => {\n if (isThinking) return\n if (!pendingExchangeRef.current) return\n setCommitTick(tick => tick + 1)\n }, [isThinking])\n\n useEffect(() => {\n if (!pendingExchangeRef.current) return\n const item = pendingExchangeRef.current\n pendingExchangeRef.current = null\n setStaticItems(prev => [...prev, item])\n }, [commitTick])\n\n // Batch streaming text updates at 60 ms to avoid a re-render on every token.\n useEffect(() => {\n const id = setInterval(() => {\n setCurrentOriginal(pendingOrigRef.current)\n setCurrentChallenger(pendingChalRef.current)\n setCurrentSynthesis(pendingSynthRef.current)\n }, 60)\n return () => clearInterval(id)\n }, [])\n\n // ── Layout ───────────────────────────────────────────────────────────────────\n const showChallengerPanel = Boolean(challengerId) && (intent?.shouldMirror ?? true)\n const showSideBySide = showChallengerPanel && columns >= 80\n const panelWidth = showSideBySide ? Math.floor((columns - 1) / 2) : columns\n const liveLineLimit = Math.max(6, Math.min(18, rows - 10))\n\n const formatText = useCallback(\n (text: string) => (syntaxHighlighting ? highlightCodeBlocks(text) : text),\n [syntaxHighlighting]\n )\n\n // ── Submit ───────────────────────────────────────────────────────────────────\n const submit = useCallback(async () => {\n if (runningRef.current) return\n const question = input.trim()\n if (!question) return\n\n runningRef.current = true\n setInput('')\n setError(null)\n setIntent(null)\n setActiveQuestion(question)\n setIsThinking(true)\n setIsClassifying(false)\n setIsSynthesizing(false)\n setOriginalStats(null)\n setChallengerStats(null)\n setSynthesisStats(null)\n pendingOrigRef.current = ''\n pendingChalRef.current = ''\n pendingSynthRef.current = ''\n setCurrentOriginal('')\n setCurrentChallenger('')\n setCurrentSynthesis('')\n\n const history = session.getHistory()\n session.addUser(question)\n\n let originalBuffer = ''\n let challengerBuffer = ''\n let synthesisBuffer = ''\n let originalResult: BrainResult | null = null\n let challengerResult: BrainResult | undefined\n let synthResult: SynthesisResult | undefined\n let intentResult: IntentResult | undefined\n let isMirrored = Boolean(challengerId)\n\n const entryId = randomUUID()\n const createdAt = new Date().toISOString()\n const controller = new AbortController()\n abortRef.current = controller\n\n startTimesRef.current = new Map<string, number>([\n [originalId, Date.now()],\n ...(challengerId ? [[challengerId, Date.now()] as [string, number]] : []),\n ])\n\n try {\n for await (const event of engine.run(question, history, { signal: controller.signal })) {\n if (event.type === 'classifying') {\n setIsClassifying(true)\n }\n\n if (event.type === 'classified') {\n setIsClassifying(false)\n setIntent(event.result)\n intentResult = event.result\n isMirrored = event.result.shouldMirror && Boolean(challengerId)\n }\n\n if (event.type === 'stream_chunk') {\n if (event.brainId === originalId) {\n originalBuffer += event.chunk.delta\n pendingOrigRef.current = originalBuffer\n } else if (event.brainId === challengerId) {\n challengerBuffer += event.chunk.delta\n pendingChalRef.current = challengerBuffer\n }\n }\n\n if (event.type === 'brain_complete') {\n const latency = event.completedAt - (startTimesRef.current.get(event.brainId) ?? event.completedAt)\n if (event.brainId === originalId) {\n const text = event.response.text || originalBuffer\n originalResult = {\n brainId: originalId,\n text,\n inputTokens: event.response.inputTokens,\n outputTokens: event.response.outputTokens,\n latencyMs: latency,\n }\n setOriginalStats(originalResult)\n session.addAssistant(text)\n } else if (event.brainId === challengerId) {\n const text = event.response.text || challengerBuffer\n challengerResult = {\n brainId: challengerId!,\n text,\n inputTokens: event.response.inputTokens,\n outputTokens: event.response.outputTokens,\n latencyMs: latency,\n }\n setChallengerStats(challengerResult)\n }\n }\n\n if (event.type === 'synthesizing') {\n setIsSynthesizing(true)\n }\n\n if (event.type === 'synthesis_chunk') {\n synthesisBuffer += event.chunk.delta\n pendingSynthRef.current = synthesisBuffer\n }\n\n if (event.type === 'synthesis_complete') {\n setIsSynthesizing(false)\n synthResult = event.result\n setSynthesisStats(event.result)\n }\n\n if (event.type === 'all_complete' && originalResult) {\n addHistoryEntry({\n id: entryId,\n createdAt,\n question,\n original: originalResult,\n challenger: challengerResult,\n intent: intentResult,\n })\n\n const exchange: CompletedExchange = {\n id: entryId,\n question,\n intent: intentResult,\n original: formatText(originalResult.text),\n challenger: challengerResult ? formatText(challengerResult.text) : undefined,\n synthesis: synthResult ? formatText(synthResult.text) : undefined,\n agreementScore: synthResult?.agreementScore,\n isMirrored,\n }\n\n // Defer Static write until after the streaming panels are cleared.\n pendingExchangeRef.current = {\n type: 'exchange',\n id: entryId,\n exchange,\n originalId,\n challengerId,\n columns: columnsRef.current\n }\n setTurnCount(prev => prev + 1)\n setActiveQuestion('')\n pendingOrigRef.current = ''\n pendingChalRef.current = ''\n pendingSynthRef.current = ''\n setCurrentOriginal('')\n setCurrentChallenger('')\n setCurrentSynthesis('')\n setIsSynthesizing(false)\n setIsClassifying(false)\n }\n\n if (event.type === 'error') {\n setError(event.error.message)\n }\n }\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n setError((err as Error).message ?? 'Unknown error')\n }\n } finally {\n setIsThinking(false)\n setIsClassifying(false)\n setIsSynthesizing(false)\n runningRef.current = false\n abortRef.current = null\n }\n }, [challengerId, engine, formatText, input, originalId, session])\n\n // ── Input handling ───────────────────────────────────────────────────────────\n useInput((ch, key) => {\n if (key.ctrl && ch === 'c') {\n if (isThinking && abortRef.current) {\n abortRef.current.abort()\n return\n }\n process.exit(0)\n }\n if (key.return) { void submit(); return }\n if (key.backspace || key.delete) { setInput(p => p.slice(0, -1)); return }\n if (ch && !key.ctrl && !key.meta) setInput(p => p + ch)\n })\n\n // ── Status bar ───────────────────────────────────────────────────────────────\n const statusParts: string[] = []\n if (isClassifying) statusParts.push('Classifying...')\n else if (isSynthesizing) statusParts.push('Synthesizing...')\n else if (isThinking) statusParts.push('Thinking...')\n else statusParts.push('Ready')\n\n if (showTokenCounts) {\n const origT = formatTokens(originalStats?.inputTokens, originalStats?.outputTokens)\n if (origT) statusParts.push(`orig ${origT}`)\n if (challengerStats) {\n const chalT = formatTokens(challengerStats.inputTokens, challengerStats.outputTokens)\n if (chalT) statusParts.push(`chal ${chalT}`)\n }\n if (synthesisStats) {\n const synthT = formatTokens(synthesisStats.inputTokens, synthesisStats.outputTokens)\n if (synthT) statusParts.push(`synth ${synthT}`)\n }\n }\n if (showLatency && originalStats?.latencyMs != null) {\n statusParts.push(`orig ${(originalStats.latencyMs / 1000).toFixed(1)}s`)\n }\n if (showLatency && challengerStats?.latencyMs != null) {\n statusParts.push(`chal ${(challengerStats.latencyMs / 1000).toFixed(1)}s`)\n }\n if (synthesisStats?.agreementScore !== undefined) {\n statusParts.push(`agreement ${synthesisStats.agreementScore}%`)\n }\n statusParts.push(`${turnCount} turn${turnCount !== 1 ? 's' : ''}`)\n statusParts.push('Ctrl+C to exit')\n\n const synthScoreLabel = synthesisStats?.agreementScore !== undefined\n ? ` [agreement: ${synthesisStats.agreementScore}%]`\n : ''\n\n // ── Render ───────────────────────────────────────────────────────────────────\n // Header + completed exchanges are written via <Static> so they never redraw,\n // eliminating the flash on every keystroke in the input field.\n return (\n <Box flexDirection=\"column\">\n\n <Static items={staticItems}>\n {(item) => (\n <React.Fragment key={item.id}>\n {item.type === 'header' ? (\n <HeaderView\n lines={headerLines}\n originalId={originalId}\n challengerId={challengerId}\n intensity={intensity}\n />\n ) : (\n <ExchangeView\n exchange={item.exchange}\n originalId={item.originalId}\n challengerId={item.challengerId}\n columns={item.columns}\n />\n )}\n </React.Fragment>\n )}\n </Static>\n {/* In-progress streaming — only present while a query is running */}\n {isThinking && activeQuestion && (\n <Box flexDirection=\"column\">\n <Text bold>\n <Text color=\"cyan\">You: </Text>\n <Text>{activeQuestion}</Text>\n </Text>\n\n {intent ? (\n <Box>\n <IntentBadge category={intent.category} mirrored={intent.shouldMirror} />\n <Text color=\"gray\"> {Math.round(intent.confidence * 100)}%</Text>\n </Box>\n ) : isClassifying ? (\n <Text color=\"gray\" dimColor>Classifying...</Text>\n ) : null}\n\n <Box marginTop={1} flexDirection={showSideBySide ? 'row' : 'column'}>\n <BrainPanel\n title={`ORIGINAL ${originalId}`}\n width={panelWidth}\n marginRight={showSideBySide && showChallengerPanel ? 1 : 0}\n >\n <StreamingText value={tailLines(currentOriginal, liveLineLimit)} />\n </BrainPanel>\n\n {showChallengerPanel && (\n <BrainPanel\n title={`CHALLENGER ${challengerId} [${intensity}]`}\n width={panelWidth}\n >\n <StreamingText value={tailLines(currentChallenger, liveLineLimit)} />\n </BrainPanel>\n )}\n </Box>\n\n {/* Live synthesis panel — streams the judge's response in real time.\n Appears only while the judge is running or has streamed content.\n Disappears atomically in the same render that shows the completed\n exchange, so it never overlaps with the static panel below. */}\n {(isSynthesizing || currentSynthesis) && (\n <Box marginTop={1}>\n <BrainPanel\n title={`SYNTHESIS${isSynthesizing ? ' synthesizing...' : synthScoreLabel} ${judgerId ?? ''}`}\n width={columns}\n borderColor=\"yellow\"\n >\n <StreamingText value={tailLines(stripAgreementHeader(currentSynthesis), liveLineLimit)} />\n </BrainPanel>\n </Box>\n )}\n </Box>\n )}\n\n {/* Error */}\n {error && (\n <Box marginTop={1}>\n <Text color=\"red\">Error: {error}</Text>\n </Box>\n )}\n\n {/* Status */}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>{statusParts.join(' · ')}</Text>\n </Box>\n\n {/* Input prompt */}\n <Box>\n <Text color=\"cyan\" bold>{'> '}</Text>\n <Text>{input}</Text>\n <Text color={isThinking ? 'gray' : 'cyan'}>█</Text>\n </Box>\n\n </Box>\n )\n}\n","import Conf from 'conf'\nimport type { HistoryEntry } from '../types/index.js'\n\ninterface HistoryStore {\n entries: HistoryEntry[]\n}\n\nconst store = new Conf<HistoryStore>({\n projectName: 'adversarial-mirror',\n configName: 'history',\n defaults: { entries: [] }\n})\n\nconst MAX_ENTRIES = 200\n\nexport function addHistoryEntry(entry: HistoryEntry): void {\n const entries = store.store.entries ?? []\n const next = [entry, ...entries]\n if (next.length > MAX_ENTRIES) {\n next.length = MAX_ENTRIES\n }\n store.store = { entries: next }\n}\n\nexport function listHistory(): HistoryEntry[] {\n return store.store.entries ?? []\n}\n\nexport function getHistory(id: string): HistoryEntry | undefined {\n return (store.store.entries ?? []).find((entry) => entry.id === id)\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\n\ninterface BrainPanelProps {\n title: string\n children?: React.ReactNode\n /** Explicit column width (outer, including border + padding). */\n width?: number\n marginRight?: number\n /** Border and title color. Defaults to 'cyan'. */\n borderColor?: string\n}\n\nexport function BrainPanel({\n title,\n children,\n width,\n marginRight,\n borderColor = 'cyan',\n}: BrainPanelProps): JSX.Element {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n padding={1}\n flexGrow={width ? 0 : 1}\n flexShrink={1}\n minWidth={0}\n width={width}\n marginRight={marginRight}\n >\n <Text bold color={borderColor}>{title}</Text>\n {children}\n </Box>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\nimport type { IntentCategory } from '../../types/index.js'\n\ninterface IntentBadgeProps {\n category: IntentCategory\n mirrored: boolean\n}\n\nexport function IntentBadge({ category, mirrored }: IntentBadgeProps): JSX.Element {\n return (\n <Text>\n <Text backgroundColor={mirrored ? 'blue' : 'blackBright'} color=\"white\">\n {` ${mirrored ? 'MIRRORING' : 'DIRECT'} `}\n </Text>\n <Text color=\"gray\"> {category}</Text>\n </Text>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\n\ninterface StreamingTextProps {\n value: string\n dim?: boolean\n}\n\nexport function StreamingText({ value, dim }: StreamingTextProps): JSX.Element {\n return (\n <Text dimColor={dim} wrap=\"wrap\">\n {value}\n <Text color=\"cyan\">▌</Text>\n </Text>\n )\n}\n","import { highlight } from 'cli-highlight'\n\n// IMPORTANT: Do NOT declare the regex at module scope with the /g flag.\n// A module-level /g regex retains its lastIndex between calls, causing every\n// other invocation of highlightCodeBlocks to silently skip all matches.\n// The regex is created fresh inside the function to avoid this.\n\nexport function highlightCodeBlocks(text: string): string {\n if (!text.includes('```')) {\n return text\n }\n\n // Fresh regex instance per call — no shared lastIndex state\n const fenceRegex = /```(\\w+)?\\n([\\s\\S]*?)```/g\n\n let result = ''\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = fenceRegex.exec(text)) !== null) {\n const [block, lang, code] = match\n result += text.slice(lastIndex, match.index)\n try {\n const highlighted = highlight(code, {\n language: lang || undefined,\n ignoreIllegals: true,\n })\n result += `\\n${highlighted}\\n`\n } catch {\n // Fallback: emit the raw code block if highlighting fails\n result += `\\n${code}\\n`\n }\n lastIndex = match.index + block.length\n }\n\n result += text.slice(lastIndex)\n return result\n}\n","import { randomUUID } from 'node:crypto'\nimport { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport type { Command } from 'commander'\nimport { createAdapter } from '../../brains/factory.js'\nimport { loadConfig } from '../../config/loader.js'\nimport { buildIntentClassifier } from '../../engine/classifier-factory.js'\nimport { MirrorEngine } from '../../engine/mirror-engine.js'\nimport { Session } from '../../engine/session.js'\nimport { addHistoryEntry } from '../../history/store.js'\nimport type { BrainResult, IntentResult } from '../../types/index.js'\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n process.stdin.on('data', (chunk: Buffer) => chunks.push(chunk))\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')))\n process.stdin.on('error', reject)\n })\n}\n\n// Commander v12: for \"mirror <question>\", the action receives (question, localOpts, command).\n// Global flags live on command.parent.opts().\nexport async function runMirror(\n question: string,\n _localOpts: Record<string, unknown>,\n command: Command\n): Promise<void> {\n // Merge parent (global) opts with local command opts\n const parentOpts = command.parent?.opts() ?? {}\n const localOpts = command.opts()\n const opts = { ...parentOpts, ...localOpts }\n\n try {\n const config = loadConfig()\n const originalId =\n (opts['original'] as string | undefined) ?? config.session.originalBrainId\n const challengerId =\n (opts['challenger'] as string | undefined) ?? config.session.challengerBrainId\n const intensity =\n (opts['intensity'] as string | undefined) ?? config.session.defaultIntensity\n const mirrorEnabled = opts['mirror'] !== false\n const classifyEnabled = opts['classify'] !== false\n const judgeEnabled = opts['judge'] !== false && config.session.judgeEnabled\n const persona = (opts['persona'] as string | undefined) ?? config.session.defaultPersona\n const filePath = opts['file'] as string | undefined\n\n // Build file context prefix\n let filePrefix = ''\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf8')\n const name = basename(filePath)\n filePrefix = `[FILE: ${name}]\\n${content}\\n\\n---\\n`\n } catch (err) {\n throw new Error(`Could not read file: ${filePath} — ${(err as Error).message}`)\n }\n } else if (!process.stdin.isTTY) {\n // Piped stdin\n const content = await readStdin()\n if (content.trim()) {\n filePrefix = `[STDIN]\\n${content}\\n\\n---\\n`\n }\n }\n\n const fullQuestion = filePrefix ? `${filePrefix}${question}` : question\n\n const originalConfig = config.brains.find(b => b.id === originalId)\n if (!originalConfig) throw new Error(`Original brain not found: ${originalId}`)\n\n const originalAdapter = createAdapter(originalConfig)\n const challengerConfig = config.brains.find(b => b.id === challengerId)\n const challengerAdapter =\n mirrorEnabled && challengerConfig ? createAdapter(challengerConfig) : undefined\n\n // Build judge adapter\n let judgeAdapter = undefined\n if (mirrorEnabled && challengerAdapter && judgeEnabled) {\n const judgeId = (opts['judgeBrain'] as string | undefined) ?? config.session.judgeBrainId\n const judgeConfig = config.brains.find(b => b.id === judgeId)\n if (judgeConfig) {\n judgeAdapter = createAdapter(judgeConfig)\n }\n }\n\n const classifier = buildIntentClassifier(config, Boolean(opts['debug']))\n const engine = new MirrorEngine({\n original: originalAdapter,\n challenger: challengerAdapter,\n intensity: intensity as 'mild' | 'moderate' | 'aggressive',\n autoClassify: mirrorEnabled && classifyEnabled,\n classifier,\n debug: Boolean(opts['debug']),\n judge: judgeAdapter,\n persona,\n })\n\n const session = new Session(1)\n const results = new Map<string, BrainResult>()\n let intentResult: IntentResult | undefined\n const entryId = randomUUID()\n const createdAt = new Date().toISOString()\n const startTimes = new Map<string, number>([\n [originalAdapter.id, Date.now()],\n ...(challengerAdapter ? [[challengerAdapter.id, Date.now()] as [string, number]] : []),\n ])\n\n // Stream the original response in real time. Buffer the challenger so the\n // two parallel streams don't interleave into unreadable output.\n let originalHeaderPrinted = false\n let synthBuffer = ''\n let synthScore: number | undefined\n\n for await (const event of engine.run(fullQuestion, session.getHistory())) {\n if (event.type === 'classifying') {\n process.stdout.write('Classifying...\\n')\n }\n\n if (event.type === 'classified') {\n const label = event.result.shouldMirror ? 'MIRRORING' : 'DIRECT'\n process.stdout.write(\n `[${label}] ${event.result.category} (${Math.round(event.result.confidence * 100)}%)\\n`\n )\n intentResult = event.result\n }\n\n if (event.type === 'stream_chunk' && !event.chunk.isFinal) {\n if (event.brainId === originalAdapter.id) {\n if (!originalHeaderPrinted) {\n process.stdout.write(`\\nORIGINAL (${originalAdapter.id})\\n`)\n originalHeaderPrinted = true\n }\n process.stdout.write(event.chunk.delta)\n }\n // Challenger chunks are buffered; we print the complete text after brain_complete.\n }\n\n if (event.type === 'brain_complete') {\n const latency = Date.now() - (startTimes.get(event.brainId) ?? Date.now())\n results.set(event.brainId, {\n brainId: event.brainId,\n text: event.response.text,\n inputTokens: event.response.inputTokens,\n outputTokens: event.response.outputTokens,\n latencyMs: latency,\n })\n }\n\n if (event.type === 'synthesizing') {\n // Ensure original output ends with a newline before challenger block.\n if (originalHeaderPrinted) process.stdout.write('\\n')\n if (challengerAdapter) {\n const challengerResult = results.get(challengerAdapter.id)\n process.stdout.write(`\\nCHALLENGER (${challengerAdapter.id})\\n`)\n process.stdout.write(`${challengerResult?.text ?? ''}\\n`)\n }\n process.stdout.write('\\nSYNTHESIS (judge)\\n')\n }\n\n if (event.type === 'synthesis_chunk' && !event.chunk.isFinal) {\n synthBuffer += event.chunk.delta\n process.stdout.write(event.chunk.delta)\n }\n\n if (event.type === 'synthesis_complete') {\n synthScore = event.result.agreementScore\n process.stdout.write('\\n')\n if (synthScore !== undefined) {\n process.stdout.write(`\\nAgreement score: ${synthScore}%\\n`)\n }\n }\n\n if (event.type === 'all_complete') {\n // Print challenger if judge pass didn't already do it\n if (!judgeAdapter) {\n if (originalHeaderPrinted) process.stdout.write('\\n')\n if (challengerAdapter) {\n const challengerResult = results.get(challengerAdapter.id)\n process.stdout.write(`\\nCHALLENGER (${challengerAdapter.id})\\n`)\n process.stdout.write(`${challengerResult?.text ?? ''}\\n`)\n }\n }\n }\n\n if (event.type === 'error') throw event.error\n }\n\n const originalResult = results.get(originalAdapter.id)\n if (originalResult) {\n addHistoryEntry({\n id: entryId,\n createdAt,\n question: fullQuestion,\n original: originalResult,\n challenger: challengerAdapter ? results.get(challengerAdapter.id) : undefined,\n intent: intentResult,\n })\n }\n } catch (error) {\n process.stderr.write(`Failed to run mirror: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { promisify } from 'node:util'\nimport { loadConfig, saveConfig, setConfigValue } from '../../config/loader.js'\nimport type { AppConfig } from '../../config/schema.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport function runConfigShow(): void {\n const config = loadConfig()\n process.stdout.write(JSON.stringify(config, null, 2))\n process.stdout.write('\\n')\n}\n\nexport async function runConfigInit(): Promise<void> {\n const rl = createInterface({ input, output })\n\n try {\n const config = loadConfig()\n if (config.brains.length === 0) {\n throw new Error('No brains configured. Run mirror brains add first.')\n }\n const intensity = (await askRequired(\n rl,\n `Default intensity (mild|moderate|aggressive) [${config.session.defaultIntensity}]: `,\n config.session.defaultIntensity\n )) as AppConfig['session']['defaultIntensity']\n\n if (!['mild', 'moderate', 'aggressive'].includes(intensity)) {\n throw new Error(`Invalid intensity: ${intensity}`)\n }\n\n const layout = (await askRequired(\n rl,\n `Layout (side-by-side|stacked) [${config.ui.layout}]: `,\n config.ui.layout\n )) as AppConfig['ui']['layout']\n\n if (!['side-by-side', 'stacked'].includes(layout)) {\n throw new Error(`Invalid layout: ${layout}`)\n }\n\n const showTokenCounts = await askYesNo(\n rl,\n `Show token counts? (y/n) [${config.ui.showTokenCounts ? 'y' : 'n'}]: `,\n config.ui.showTokenCounts\n )\n\n const showLatency = await askYesNo(\n rl,\n `Show latency? (y/n) [${config.ui.showLatency ? 'y' : 'n'}]: `,\n config.ui.showLatency\n )\n\n const syntaxHighlighting = await askYesNo(\n rl,\n `Syntax highlighting? (y/n) [${config.ui.syntaxHighlighting ? 'y' : 'n'}]: `,\n config.ui.syntaxHighlighting\n )\n\n const autoClassify = await askYesNo(\n rl,\n `Auto-classify intent? (y/n) [${config.session.autoClassify ? 'y' : 'n'}]: `,\n config.session.autoClassify\n )\n\n const historyWindowSize = Number(\n await askRequired(\n rl,\n `History window size [${config.session.historyWindowSize}]: `,\n String(config.session.historyWindowSize)\n )\n )\n\n if (!Number.isInteger(historyWindowSize) || historyWindowSize <= 0) {\n throw new Error('History window size must be a positive integer.')\n }\n\n const availableBrains = config.brains.map((brain) => brain.id).join(', ')\n const originalBrainId = await askRequired(\n rl,\n `Original brain id (${availableBrains}) [${config.session.originalBrainId}]: `,\n config.session.originalBrainId\n )\n\n const challengerBrainId = await askRequired(\n rl,\n `Challenger brain id (${availableBrains}) [${config.session.challengerBrainId}]: `,\n config.session.challengerBrainId\n )\n\n if (!config.brains.some((brain) => brain.id === originalBrainId)) {\n throw new Error(`Unknown original brain id: ${originalBrainId}`)\n }\n if (!config.brains.some((brain) => brain.id === challengerBrainId)) {\n throw new Error(`Unknown challenger brain id: ${challengerBrainId}`)\n }\n\n const judgeEnabled = await askYesNo(\n rl,\n `Enable judge synthesis pass? (y/n) [${config.session.judgeEnabled ? 'y' : 'n'}]: `,\n config.session.judgeEnabled\n )\n\n let judgeBrainId = config.session.judgeBrainId\n if (judgeEnabled) {\n judgeBrainId = await askRequired(\n rl,\n `Judge brain id (${availableBrains}) [${config.session.judgeBrainId}]: `,\n config.session.judgeBrainId\n )\n if (!config.brains.some((brain) => brain.id === judgeBrainId)) {\n throw new Error(`Unknown judge brain id: ${judgeBrainId}`)\n }\n }\n\n const personaNames = 'vc-skeptic|security-auditor|end-user|regulator|contrarian'\n const currentPersona = config.session.defaultPersona ?? 'none'\n const personaAnswer = await askOptional(\n rl,\n `Default persona (${personaNames}|none) [${currentPersona}]: `,\n currentPersona\n )\n const defaultPersona = (personaAnswer === 'none' || !personaAnswer) ? undefined : personaAnswer\n\n const updatedKeys = await promptForApiKeys(rl, config)\n if (Object.keys(updatedKeys).length > 0) {\n const persist = await askYesNo(\n rl,\n 'Persist API keys to environment variables? (y/n) [y]: ',\n true\n )\n if (persist) {\n await persistEnvVars(updatedKeys)\n process.stdout.write(\n 'Keys saved. Open a new terminal session to pick them up.\\n'\n )\n }\n }\n\n await validateGeminiModels(rl, config, updatedKeys)\n\n saveConfig({\n ...config,\n session: {\n ...config.session,\n originalBrainId,\n challengerBrainId,\n defaultIntensity: intensity,\n historyWindowSize,\n autoClassify,\n judgeEnabled,\n judgeBrainId,\n defaultPersona,\n },\n ui: {\n ...config.ui,\n layout,\n showTokenCounts,\n showLatency,\n syntaxHighlighting\n }\n })\n\n process.stdout.write('Config saved.\\n')\n } catch (error) {\n process.stderr.write(\n `Failed to initialize config: ${(error as Error).message}\\n`\n )\n process.exit(1)\n } finally {\n rl.close()\n }\n}\n\nexport function runConfigSet(key: string, value: string): void {\n try {\n const parsed = parseValue(value)\n const updated = setConfigValue(key, parsed)\n process.stdout.write(JSON.stringify(updated, null, 2))\n process.stdout.write('\\n')\n } catch (error) {\n process.stderr.write(`Failed to set config: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n\nfunction parseValue(value: string): unknown {\n const trimmed = value.trim()\n if (!trimmed) {\n return value\n }\n\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (!Number.isNaN(Number(trimmed))) return Number(trimmed)\n\n try {\n return JSON.parse(trimmed)\n } catch {\n return value\n }\n}\n\nasync function askRequired(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback?: string\n): Promise<string> {\n const answer = (await rl.question(prompt)).trim()\n if (answer) {\n return answer\n }\n if (fallback) {\n return fallback\n }\n return askRequired(rl, prompt, fallback)\n}\n\nasync function askOptional(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback: string\n): Promise<string> {\n const answer = (await rl.question(prompt)).trim()\n return answer || fallback\n}\n\nasync function askYesNo(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback: boolean\n): Promise<boolean> {\n const answer = (await rl.question(prompt)).trim().toLowerCase()\n if (!answer) {\n return fallback\n }\n if (['y', 'yes'].includes(answer)) {\n return true\n }\n if (['n', 'no'].includes(answer)) {\n return false\n }\n return askYesNo(rl, prompt, fallback)\n}\n\nasync function promptForApiKeys(\n rl: ReturnType<typeof createInterface>,\n config: AppConfig\n): Promise<Record<string, string>> {\n const updated: Record<string, string> = {}\n const uniqueEnvVars = Array.from(\n new Set(config.brains.map((brain) => brain.apiKeyEnvVar))\n )\n\n process.stdout.write('\\nAPI key setup (stored in environment variables):\\n')\n\n for (const envVar of uniqueEnvVars) {\n const alreadySet = Boolean(process.env[envVar])\n const shouldSet = await askYesNo(\n rl,\n `${envVar} ${alreadySet ? '(already set)' : '(missing)'} - set now? (y/n) [${\n alreadySet ? 'n' : 'y'\n }]: `,\n !alreadySet\n )\n if (!shouldSet) {\n continue\n }\n\n const secret = await askSecret(rl, `Enter value for ${envVar}: `)\n if (!secret) {\n continue\n }\n process.env[envVar] = secret\n updated[envVar] = secret\n }\n\n return updated\n}\n\nasync function askSecret(\n rl: ReturnType<typeof createInterface>,\n prompt: string\n): Promise<string> {\n if (!input.isTTY) {\n return askRequired(rl, prompt)\n }\n\n output.write(prompt)\n rl.pause()\n input.setRawMode(true)\n input.resume()\n\n let value = ''\n\n return new Promise((resolve) => {\n const onData = (chunk: Buffer) => {\n const char = chunk.toString()\n if (char === '\\r' || char === '\\n') {\n input.setRawMode(false)\n input.pause()\n input.removeListener('data', onData)\n output.write('\\n')\n rl.resume()\n resolve(value)\n return\n }\n if (char === '\\u0003') {\n process.exit(1)\n }\n if (char === '\\u0008' || char === '\\u007f') {\n value = value.slice(0, -1)\n return\n }\n value += char\n }\n\n input.on('data', onData)\n })\n}\n\nasync function persistEnvVars(vars: Record<string, string>): Promise<void> {\n if (process.platform === 'win32') {\n for (const [key, value] of Object.entries(vars)) {\n await execFileAsync('setx', [key, value])\n }\n return\n }\n\n process.stdout.write(\n 'Non-Windows detected. Please export your keys in your shell profile.\\n'\n )\n}\n\nasync function validateGeminiModels(\n rl: ReturnType<typeof createInterface>,\n config: AppConfig,\n updatedKeys: Record<string, string>\n): Promise<void> {\n const geminiBrains = config.brains.filter((brain) => brain.provider === 'gemini')\n if (geminiBrains.length === 0) {\n return\n }\n\n const geminiEnvVar = geminiBrains[0].apiKeyEnvVar\n const apiKey = updatedKeys[geminiEnvVar] ?? process.env[geminiEnvVar]\n if (!apiKey) {\n return\n }\n\n const shouldCheck = await askYesNo(\n rl,\n 'Check Gemini model availability now? (y/n) [y]: ',\n true\n )\n if (!shouldCheck) {\n return\n }\n\n try {\n const models = await listGeminiModels(apiKey)\n const supported = models.filter((model) =>\n model.supportedGenerationMethods.some((method) =>\n ['generateContent', 'streamGenerateContent'].includes(method)\n )\n )\n\n for (const brain of geminiBrains) {\n const exists = supported.some((model) => model.name.endsWith(`/${brain.model}`))\n if (exists) {\n continue\n }\n process.stdout.write(\n `Gemini model not found for ${brain.id}: ${brain.model}\\n`\n )\n const suggestion = supported.find((model) =>\n model.name.endsWith('/gemini-2.5-pro')\n )\n const recommended = suggestion?.name.split('/').pop() ?? 'gemini-2.5-pro'\n const nextModel = await askRequired(\n rl,\n `Enter a supported Gemini model [${recommended}]: `,\n recommended\n )\n brain.model = nextModel\n }\n } catch (error) {\n process.stderr.write(\n `Failed to validate Gemini models: ${(error as Error).message}\\n`\n )\n }\n}\n\nasync function listGeminiModels(apiKey: string): Promise<GeminiModel[]> {\n const res = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`\n )\n if (!res.ok) {\n throw new Error(`Gemini ListModels failed: ${res.status}`)\n }\n const data = (await res.json()) as { models?: GeminiModel[] }\n return data.models ?? []\n}\n\ninterface GeminiModel {\n name: string\n supportedGenerationMethods: string[]\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { createAdapter } from '../../brains/factory.js'\nimport { loadConfig, saveConfig } from '../../config/loader.js'\nimport type { BrainConfig } from '../../config/schema.js'\n\nexport function runBrainsList(): void {\n const config = loadConfig()\n const lines = config.brains.map(\n (brain) =>\n `${brain.id}\\t${brain.provider}\\t${brain.model}\\t${brain.apiKeyEnvVar}`\n )\n\n if (lines.length === 0) {\n process.stdout.write('No brains configured.\\n')\n return\n }\n\n process.stdout.write('ID\\tPROVIDER\\tMODEL\\tAPI_KEY_ENV\\n')\n process.stdout.write(`${lines.join('\\n')}\\n`)\n}\n\nexport async function runBrainsTest(id: string): Promise<void> {\n try {\n const config = loadConfig()\n const brain = config.brains.find((entry) => entry.id === id)\n if (!brain) {\n throw new Error(`Brain not found: ${id}`)\n }\n\n const adapter = createAdapter(brain)\n const result = await adapter.ping()\n if (!result.ok) {\n throw new Error(result.error ?? 'Ping failed')\n }\n\n process.stdout.write(\n `Brain ${id} ok${result.latencyMs ? ` (${result.latencyMs}ms)` : ''}\\n`\n )\n } catch (error) {\n process.stderr.write(`Brain test failed: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n\nexport async function runBrainsAdd(): Promise<void> {\n const rl = createInterface({ input, output })\n\n try {\n const config = loadConfig()\n\n const id = await askRequired(rl, 'Brain id (unique): ')\n if (config.brains.some((brain) => brain.id === id)) {\n throw new Error(`Brain id already exists: ${id}`)\n }\n\n const provider = (await askRequired(\n rl,\n 'Provider (anthropic|openai|gemini|mock): '\n )) as BrainConfig['provider']\n\n if (!['anthropic', 'openai', 'gemini', 'mock'].includes(provider)) {\n throw new Error(`Unsupported provider: ${provider}`)\n }\n\n const model = await askRequired(rl, 'Model name: ')\n const suggestedEnv = defaultEnvVar(provider)\n const apiKeyEnvVar = await askRequired(\n rl,\n `API key env var (${suggestedEnv}): `,\n suggestedEnv\n )\n\n const next: BrainConfig = {\n id,\n provider,\n model,\n apiKeyEnvVar\n }\n\n saveConfig({\n ...config,\n brains: [...config.brains, next]\n })\n\n process.stdout.write(`Added brain ${id}.\\n`)\n } catch (error) {\n process.stderr.write(`Failed to add brain: ${(error as Error).message}\\n`)\n process.exit(1)\n } finally {\n rl.close()\n }\n}\n\nasync function askRequired(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback?: string\n): Promise<string> {\n const answer = (await rl.question(prompt)).trim()\n if (answer) {\n return answer\n }\n if (fallback) {\n return fallback\n }\n return askRequired(rl, prompt, fallback)\n}\n\nfunction defaultEnvVar(provider: BrainConfig['provider']): string {\n switch (provider) {\n case 'anthropic':\n return 'ANTHROPIC_API_KEY'\n case 'openai':\n return 'OPENAI_API_KEY'\n case 'gemini':\n return 'GOOGLE_API_KEY'\n case 'mock':\n return 'MOCK_API_KEY'\n default:\n return 'API_KEY'\n }\n}\n","import { writeFile } from 'node:fs/promises'\nimport { getHistory, listHistory } from '../../history/store.js'\n\nexport function runHistoryList(): void {\n const entries = listHistory()\n if (entries.length === 0) {\n process.stdout.write('No history yet.\\n')\n return\n }\n\n process.stdout.write('ID\\tCREATED\\tQUESTION\\n')\n for (const entry of entries) {\n const question = entry.question.length > 80\n ? `${entry.question.slice(0, 77)}...`\n : entry.question\n process.stdout.write(`${entry.id}\\t${entry.createdAt}\\t${question}\\n`)\n }\n}\n\nexport function runHistoryShow(id: string): void {\n const entry = getHistory(id)\n if (!entry) {\n process.stderr.write(`History entry not found: ${id}\\n`)\n process.exit(1)\n }\n\n process.stdout.write(JSON.stringify(entry, null, 2))\n process.stdout.write('\\n')\n}\n\nexport async function runHistoryExport(id: string, file: string): Promise<void> {\n const entry = getHistory(id)\n if (!entry) {\n process.stderr.write(`History entry not found: ${id}\\n`)\n process.exit(1)\n }\n\n const payload = JSON.stringify(entry, null, 2)\n await writeFile(file, payload)\n process.stdout.write(`Exported history ${id} to ${file}.\\n`)\n}\n"],"mappings":"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","names":["readFileSync","React","response","config","config","input","config","history","index","result","resolve","Box","Text","Conf","store","Text","jsx","jsxs","Text","jsx","jsxs","jsx","jsxs","Text","HeaderView","Box","ExchangeView","input","output","history","config","readFileSync","React","randomUUID","readFileSync","basename","resolve","config","readFileSync","basename","randomUUID","config","resolve","createInterface","input","output","config","createInterface","input","output","askRequired"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/cli/commands/chat.ts","../src/brains/anthropic.ts","../src/brains/gemini.ts","../src/brains/mock.ts","../src/brains/openai.ts","../src/brains/factory.ts","../src/config/loader.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/engine/intent-classifier.ts","../src/engine/classifier-factory.ts","../src/engine/prompt-builder.ts","../src/engine/judge.ts","../src/engine/mirror-engine.ts","../src/engine/session.ts","../src/ui/mirror-app.tsx","../src/history/store.ts","../src/ui/components/BrainPanel.tsx","../src/ui/components/IntentBadge.tsx","../src/ui/components/StreamingText.tsx","../src/ui/utils/highlight.ts","../src/cli/commands/mirror.ts","../src/cli/commands/config.ts","../src/cli/commands/brains.ts","../src/cli/commands/history.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { runChat } from './commands/chat.js'\nimport { runMirror } from './commands/mirror.js'\nimport {\n runConfigInit,\n runConfigSet,\n runConfigShow\n} from './commands/config.js'\nimport {\n runBrainsAdd,\n runBrainsList,\n runBrainsTest\n} from './commands/brains.js'\nimport {\n runHistoryExport,\n runHistoryList,\n runHistoryShow\n} from './commands/history.js'\n\nconst program = new Command()\n\nprogram\n .name('mirror')\n .description('Adversarial Mirror CLI')\n .version('0.1.0')\n .option('--intensity <level>', 'mild|moderate|aggressive')\n .option('--original <brainId>', 'override original brain')\n .option('--challenger <brainId>', 'override challenger brain')\n .option('--no-mirror', 'disable mirroring')\n .option('--no-classify', 'disable intent classification')\n .option('--no-judge', 'disable judge synthesis pass')\n .option('--judge-brain <brainId>', 'override judge brain id')\n .option('--persona <name>', 'persona lens: vc-skeptic|security-auditor|end-user|regulator|contrarian')\n .option('--debug', 'enable debug logging')\n\nprogram\n .command('chat')\n .description('Interactive session')\n .option('--file <path>', 'load file as context before the session starts')\n .action(runChat)\n\nprogram\n .command('mirror <question>')\n .description('One-shot query')\n .option('--file <path>', 'load file as context (or pipe via stdin)')\n .action(runMirror)\n\nconst config = program.command('config').description('Config commands')\nconfig.action(runConfigShow)\nconfig.command('show').description('Show current config').action(runConfigShow)\nconfig.command('init').description('Interactive setup wizard').action(runConfigInit)\nconfig\n .command('set <key> <value>')\n .description('Set config value by key path')\n .action(runConfigSet)\n\nconst brains = program.command('brains').description('Brain management commands')\nbrains.action(runBrainsList)\nbrains.command('list').description('List configured brains').action(runBrainsList)\nbrains.command('test <id>').description('Test a brain').action(runBrainsTest)\nbrains.command('add').description('Add a new brain').action(runBrainsAdd)\n\nconst history = program.command('history').description('History commands')\nhistory.action(runHistoryList)\nhistory.command('list').description('List history').action(runHistoryList)\nhistory.command('show <id>').description('Show history entry').action(runHistoryShow)\nhistory\n .command('export <id> <file>')\n .description('Export history entry to a file')\n .action(runHistoryExport)\n\n// Default to 'chat' when no subcommand is given.\n// Appending at the end (after any flags) lets Commander parse global flags at the\n// program level before routing to the chat subcommand. This means:\n// mirror → mirror chat\n// mirror --intensity aggressive → mirror --intensity aggressive chat (global flags preserved)\n// mirror --help → shows program help (not intercepted)\n// mirror --version → shows version (not intercepted)\nconst rawArgs = process.argv.slice(2)\nconst knownSubcommands = new Set(['chat', 'mirror', 'config', 'brains', 'history'])\nconst hasVersionOrHelp = rawArgs.some(a => ['-V', '--version', '-h', '--help'].includes(a))\nconst hasSubcommand = rawArgs.some(a => knownSubcommands.has(a))\n\nif (!hasVersionOrHelp && !hasSubcommand) {\n process.argv.push('chat')\n}\n\nprogram.parse()\n","import { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport React from 'react'\nimport type { Command } from 'commander'\nimport { render } from 'ink'\nimport { createAdapter } from '../../brains/factory.js'\nimport { loadConfig } from '../../config/loader.js'\nimport { buildIntentClassifier } from '../../engine/classifier-factory.js'\nimport { MirrorEngine } from '../../engine/mirror-engine.js'\nimport { Session } from '../../engine/session.js'\nimport { MirrorApp } from '../../ui/mirror-app.js'\n\n// Commander v12 passes (localOptions, command) for commands with no positional args.\n// Global flags live on command.parent.opts() — reading from localOptions would always be {}.\nexport function runChat(_localOpts: Record<string, unknown>, command: Command): void {\n // Merge local and parent opts — local opts come from command-level flags (--file)\n const parentOpts = command.parent?.opts() ?? {}\n const localOpts = command.opts()\n const opts = { ...parentOpts, ...localOpts }\n\n try {\n const config = loadConfig()\n const originalId =\n (opts['original'] as string | undefined) ?? config.session.originalBrainId\n const challengerId =\n (opts['challenger'] as string | undefined) ?? config.session.challengerBrainId\n const mirrorEnabled = opts['mirror'] !== false\n const classifyEnabled = opts['classify'] !== false\n const intensity =\n (opts['intensity'] as string | undefined) ?? config.session.defaultIntensity\n const judgeEnabled = opts['judge'] !== false && config.session.judgeEnabled\n const persona = (opts['persona'] as string | undefined) ?? config.session.defaultPersona\n const filePath = opts['file'] as string | undefined\n\n const brainConfig = config.brains.find(b => b.id === originalId)\n if (!brainConfig) {\n throw new Error(`Original brain not found: ${originalId}`)\n }\n\n const originalAdapter = createAdapter(brainConfig)\n const challengerConfig = config.brains.find(b => b.id === challengerId)\n const challengerAdapter =\n mirrorEnabled && challengerConfig ? createAdapter(challengerConfig) : undefined\n\n // Build judge adapter when mirroring is enabled and judge is requested\n let judgeAdapter = undefined\n if (mirrorEnabled && challengerAdapter && judgeEnabled) {\n const judgeId = (opts['judgeBrain'] as string | undefined) ?? config.session.judgeBrainId\n const judgeConfig = config.brains.find(b => b.id === judgeId)\n if (judgeConfig) {\n judgeAdapter = createAdapter(judgeConfig)\n }\n }\n\n const session = new Session(config.session.historyWindowSize)\n\n // Inject file content as the first exchange if --file is provided\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf8')\n const name = basename(filePath)\n session.addUser(`[FILE: ${name}]\\n${content}`)\n session.addAssistant(`I have read the file \"${name}\". Ask me anything about it.`)\n } catch (err) {\n throw new Error(`Could not read file: ${filePath} — ${(err as Error).message}`)\n }\n }\n\n const classifier = buildIntentClassifier(config, Boolean(opts['debug']))\n const engine = new MirrorEngine({\n original: originalAdapter,\n challenger: challengerAdapter,\n intensity: intensity as 'mild' | 'moderate' | 'aggressive',\n autoClassify:\n mirrorEnabled && classifyEnabled && config.session.autoClassify,\n classifier,\n debug: Boolean(opts['debug']),\n judge: judgeAdapter,\n persona,\n })\n\n const app = render(\n React.createElement(MirrorApp, {\n engine,\n session,\n originalId: originalAdapter.id,\n challengerId: challengerAdapter?.id,\n judgerId: judgeAdapter?.id,\n intensity,\n layout: config.ui.layout,\n showTokenCounts: config.ui.showTokenCounts,\n showLatency: config.ui.showLatency,\n syntaxHighlighting: config.ui.syntaxHighlighting,\n })\n )\n void app.waitUntilExit()\n } catch (error) {\n process.stderr.write(`Failed to start chat: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class AnthropicAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'anthropic' as const\n readonly capabilities = { streaming: true }\n private readonly client: Anthropic\n private readonly model: string\n\n constructor(id: string, model: string, apiKeyEnvVar: string) {\n this.id = id\n this.model = model\n const apiKey = process.env[apiKeyEnvVar]\n if (!apiKey) {\n throw new Error(\n `Missing API key. Set ${apiKeyEnvVar} or enable MOCK_BRAINS=true.`\n )\n }\n this.client = new Anthropic({ apiKey })\n }\n\n async ping(): Promise<PingResult> {\n const start = Date.now()\n try {\n await this.client.messages.create({\n model: this.model,\n max_tokens: 1,\n messages: [{ role: 'user', content: 'ping' }],\n })\n return { ok: true, latencyMs: Date.now() - start }\n } catch (err) {\n return { ok: false, error: (err as Error).message }\n }\n }\n\n async *chat(\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n const filtered = messages\n .filter(m => m.role !== 'system')\n .map(m => ({\n role: m.role === 'assistant' ? ('assistant' as const) : ('user' as const),\n content: m.content,\n }))\n\n // streaming helper — yields text deltas token-by-token, abortable\n const stream = this.client.messages.stream(\n {\n model: this.model,\n max_tokens: options?.maxTokens ?? 1024,\n system: systemPrompt,\n messages: filtered,\n },\n { signal: options?.signal }\n )\n\n let text = ''\n\n for await (const event of stream) {\n if (\n event.type === 'content_block_delta' &&\n event.delta.type === 'text_delta'\n ) {\n const delta = event.delta.text\n text += delta\n yield { delta, isFinal: false }\n }\n }\n\n const finalMessage = await stream.finalMessage()\n const inputTokens = finalMessage.usage.input_tokens\n const outputTokens = finalMessage.usage.output_tokens\n\n yield { delta: '', isFinal: true, inputTokens, outputTokens }\n return { text, inputTokens, outputTokens }\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import { GoogleGenerativeAI } from '@google/generative-ai'\nimport type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class GeminiAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'gemini' as const\n readonly capabilities = { streaming: true }\n private readonly model: string\n private readonly client: GoogleGenerativeAI\n\n constructor(id: string, model: string, apiKeyEnvVar: string) {\n this.id = id\n this.model = model\n const apiKey = process.env[apiKeyEnvVar]\n if (!apiKey) {\n throw new Error(\n `Missing API key. Set ${apiKeyEnvVar} or enable MOCK_BRAINS=true.`\n )\n }\n this.client = new GoogleGenerativeAI(apiKey)\n }\n\n async ping(): Promise<PingResult> {\n return { ok: true }\n }\n\n async *chat(\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n const model = this.client.getGenerativeModel({ model: this.model })\n const contents = messages\n .filter((message) => message.role !== 'system')\n .map((message) => ({\n role: message.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: message.content }]\n }))\n\n const result = await model.generateContentStream({\n contents,\n systemInstruction: {\n role: 'system',\n parts: [{ text: systemPrompt }]\n },\n generationConfig: {\n temperature: options?.temperature,\n maxOutputTokens: options?.maxTokens\n }\n })\n\n let text = ''\n for await (const chunk of result.stream) {\n const delta = chunk.text()\n if (delta) {\n text += delta\n yield { delta, isFinal: false }\n }\n }\n\n let inputTokens: number | undefined\n let outputTokens: number | undefined\n\n try {\n const response = await result.response\n const usage = (response as any).usageMetadata\n if (usage) {\n inputTokens = usage.promptTokenCount\n outputTokens =\n usage.candidatesTokenCount ?? usage.totalTokenCount ?? undefined\n }\n } catch {\n // usage metadata not available\n }\n\n const response: CompletedResponse = { text, inputTokens, outputTokens }\n yield { delta: '', isFinal: true, inputTokens, outputTokens }\n return response\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class MockAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'mock' as const\n readonly capabilities = { streaming: true }\n private readonly responseText: string\n\n constructor(id: string, responseText = 'Mock response.') {\n this.id = id\n this.responseText = responseText\n }\n\n async ping(): Promise<PingResult> {\n return { ok: true, latencyMs: 1 }\n }\n\n async *chat(\n _messages: ConversationMessage[],\n _systemPrompt: string,\n _options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n for (const chunk of this.responseText.split(' ')) {\n yield { delta: `${chunk} `, isFinal: false }\n }\n const response: CompletedResponse = { text: this.responseText }\n yield { delta: '', isFinal: true }\n return response\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import OpenAI from 'openai'\nimport type {\n ChatOptions,\n CompletedResponse,\n ConversationMessage,\n PingResult,\n StreamChunk\n} from '../types/index.js'\nimport type { BrainAdapter } from './adapter.js'\n\nexport class OpenAIAdapter implements BrainAdapter {\n readonly id: string\n readonly provider = 'openai' as const\n readonly capabilities = { streaming: true }\n private readonly model: string\n private readonly client: OpenAI\n\n constructor(id: string, model: string, apiKeyEnvVar: string) {\n this.id = id\n this.model = model\n const apiKey = process.env[apiKeyEnvVar]\n if (!apiKey) {\n throw new Error(\n `Missing API key. Set ${apiKeyEnvVar} or enable MOCK_BRAINS=true.`\n )\n }\n this.client = new OpenAI({ apiKey })\n }\n\n async ping(): Promise<PingResult> {\n const start = Date.now()\n try {\n await this.client.models.list()\n return { ok: true, latencyMs: Date.now() - start }\n } catch (err) {\n return { ok: false, error: (err as Error).message }\n }\n }\n\n async *chat(\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions\n ): AsyncGenerator<StreamChunk, CompletedResponse> {\n const stream = await this.client.chat.completions.create(\n {\n model: this.model,\n stream: true,\n stream_options: { include_usage: true },\n temperature: options?.temperature,\n max_tokens: options?.maxTokens,\n messages: [\n { role: 'system', content: systemPrompt },\n ...messages\n .filter((message) => message.role !== 'system')\n .map((message) => ({\n role: message.role === 'assistant' ? 'assistant' : 'user',\n content: message.content\n }))\n ]\n },\n { signal: options?.signal }\n )\n\n let text = ''\n let inputTokens: number | undefined\n let outputTokens: number | undefined\n\n for await (const chunk of stream) {\n const delta = chunk.choices?.[0]?.delta?.content ?? ''\n if (delta) {\n text += delta\n yield { delta, isFinal: false }\n }\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens\n outputTokens = chunk.usage.completion_tokens\n }\n }\n\n const response: CompletedResponse = {\n text,\n inputTokens,\n outputTokens\n }\n\n yield { delta: '', isFinal: true, inputTokens, outputTokens }\n return response\n }\n\n estimateTokens(messages: ConversationMessage[]): number {\n return messages.reduce((sum, msg) => sum + msg.content.length, 0)\n }\n\n async dispose(): Promise<void> {\n return\n }\n}\n","import type { BrainConfig } from '../config/schema.js'\nimport type { BrainAdapter } from './adapter.js'\nimport { AnthropicAdapter } from './anthropic.js'\nimport { GeminiAdapter } from './gemini.js'\nimport { MockAdapter } from './mock.js'\nimport { OpenAIAdapter } from './openai.js'\n\nexport function createAdapter(\n config: BrainConfig,\n overrides: Partial<Pick<BrainConfig, 'model' | 'apiKeyEnvVar'>> = {}\n): BrainAdapter {\n const effective = { ...config, ...overrides }\n if (process.env.MOCK_BRAINS) {\n return new MockAdapter(effective.id, `Mock response from ${effective.id}.`)\n }\n\n switch (effective.provider) {\n case 'anthropic':\n return new AnthropicAdapter(\n effective.id,\n effective.model,\n effective.apiKeyEnvVar\n )\n case 'openai':\n return new OpenAIAdapter(\n effective.id,\n effective.model,\n effective.apiKeyEnvVar\n )\n case 'gemini':\n return new GeminiAdapter(\n effective.id,\n effective.model,\n effective.apiKeyEnvVar\n )\n case 'mock':\n return new MockAdapter(effective.id, `Mock response from ${effective.id}.`)\n default:\n throw new Error(`Unsupported provider: ${effective.provider}`)\n }\n}\n","import Conf from 'conf'\nimport { configSchema, type AppConfig } from './schema.js'\nimport { defaultConfig } from './defaults.js'\n\nconst store = new Conf<AppConfig>({\n projectName: 'adversarial-mirror',\n configName: 'config',\n defaults: defaultConfig\n})\n\nexport function loadConfig(): AppConfig {\n return configSchema.parse(store.store)\n}\n\nexport function saveConfig(next: AppConfig): void {\n store.store = configSchema.parse(next)\n}\n\nexport function setConfigValue(path: string, value: unknown): AppConfig {\n const current = loadConfig()\n const updated = setByPath({ ...current }, path, value)\n saveConfig(updated)\n return updated\n}\n\nfunction setByPath(config: AppConfig, path: string, value: unknown): AppConfig {\n const keys = path.split('.').filter(Boolean)\n if (keys.length === 0) {\n return config\n }\n\n let cursor: any = config\n for (let i = 0; i < keys.length - 1; i += 1) {\n const key = keys[i]\n if (typeof cursor[key] !== 'object' || cursor[key] === null) {\n cursor[key] = {}\n }\n cursor = cursor[key]\n }\n\n cursor[keys[keys.length - 1]] = value\n return config\n}\n","import { z } from 'zod'\n\nconst brainConfigSchema = z.object({\n id: z.string().min(1),\n provider: z.enum(['anthropic', 'openai', 'gemini', 'mock']),\n model: z.string().min(1),\n apiKeyEnvVar: z.string().min(1)\n})\n\nexport const configSchema = z.object({\n version: z.number().int().positive(),\n session: z.object({\n originalBrainId: z.string().min(1),\n challengerBrainId: z.string().min(1),\n defaultIntensity: z.enum(['mild', 'moderate', 'aggressive']),\n historyWindowSize: z.number().int().positive(),\n autoClassify: z.boolean(),\n judgeEnabled: z.boolean().default(true),\n judgeBrainId: z.string().min(1).default('claude-sonnet-4-6'),\n defaultPersona: z.string().optional()\n }),\n ui: z.object({\n layout: z.enum(['side-by-side', 'stacked']),\n showTokenCounts: z.boolean(),\n showLatency: z.boolean(),\n syntaxHighlighting: z.boolean()\n }),\n brains: z.array(brainConfigSchema).min(1),\n classifier: z.object({\n brainId: z.string().min(1),\n model: z.string().min(1),\n confidenceThreshold: z.number().min(0).max(1)\n })\n})\n\nexport type AppConfig = z.infer<typeof configSchema>\nexport type BrainConfig = z.infer<typeof brainConfigSchema>\n","import type { AppConfig } from './schema.js'\n\nexport const defaultConfig: AppConfig = {\n version: 1,\n session: {\n originalBrainId: 'claude-sonnet-4-6',\n challengerBrainId: 'gpt-4o',\n defaultIntensity: 'moderate',\n historyWindowSize: 20,\n autoClassify: true,\n judgeEnabled: true,\n judgeBrainId: 'claude-sonnet-4-6',\n defaultPersona: undefined\n },\n ui: {\n layout: 'side-by-side',\n showTokenCounts: false,\n showLatency: true,\n syntaxHighlighting: true\n },\n brains: [\n {\n id: 'claude-sonnet-4-6',\n provider: 'anthropic',\n model: 'claude-sonnet-4-6',\n apiKeyEnvVar: 'ANTHROPIC_API_KEY'\n },\n {\n id: 'gpt-4o',\n provider: 'openai',\n model: 'gpt-4o',\n apiKeyEnvVar: 'OPENAI_API_KEY'\n },\n {\n id: 'o3-mini',\n provider: 'openai',\n model: 'o3-mini',\n apiKeyEnvVar: 'OPENAI_API_KEY'\n },\n {\n id: 'gemini-pro',\n provider: 'gemini',\n model: 'gemini-2.5-pro',\n apiKeyEnvVar: 'GOOGLE_API_KEY'\n }\n ],\n classifier: {\n brainId: 'claude-sonnet-4-6',\n model: 'claude-haiku-4-5-20251001',\n confidenceThreshold: 0.75\n }\n}\n","import type {\n ChatOptions,\n IntentCategory,\n IntentResult\n} from '../types/index.js'\nimport type { BrainAdapter } from '../brains/adapter.js'\n\nexport interface IntentClassifier {\n classify(input: string): Promise<IntentResult>\n}\n\nconst intentSystemPrompt = `You are an intent classifier for a CLI assistant. \nReturn strict JSON with keys: category, shouldMirror, confidence, reason.\nCategories: factual_lookup, math_computation, code_task, conversational, opinion_advice, analysis, interpretation, prediction.\nRules:\n- factual_lookup, math_computation, code_task, conversational => shouldMirror false\n- opinion_advice, analysis, interpretation, prediction => shouldMirror true\nConfidence is 0-1.\nReturn ONLY JSON.`\n\nexport class HeuristicIntentClassifier implements IntentClassifier {\n async classify(input: string): Promise<IntentResult> {\n const trimmed = input.trim().toLowerCase()\n const looksFactual =\n trimmed.startsWith('who ') ||\n trimmed.startsWith('what ') ||\n trimmed.startsWith('when ') ||\n trimmed.startsWith('where ')\n\n const category: IntentCategory = looksFactual ? 'factual_lookup' : 'analysis'\n const shouldMirror = !looksFactual\n\n return {\n category,\n shouldMirror,\n confidence: looksFactual ? 0.55 : 0.45,\n reason: looksFactual\n ? 'Heuristic: question starts with who/what/when/where.'\n : 'Heuristic: default to analysis for open-ended prompts.'\n }\n }\n}\n\nexport class BrainIntentClassifier implements IntentClassifier {\n private readonly adapter: BrainAdapter\n private readonly threshold: number\n\n constructor(adapter: BrainAdapter, threshold = 0.75) {\n this.adapter = adapter\n this.threshold = threshold\n }\n\n async classify(input: string): Promise<IntentResult> {\n const messages = [{ role: 'user', content: input }] as const\n const options: ChatOptions = { temperature: 0 }\n const stream = this.adapter.chat(messages, intentSystemPrompt, options)\n let text = ''\n\n for await (const chunk of stream) {\n if (chunk.delta) {\n text += chunk.delta\n }\n }\n\n const parsed = safeParseIntent(text)\n const category = parsed.category\n const shouldMirror = parsed.shouldMirror\n const confidence = parsed.confidence\n\n if (confidence < this.threshold) {\n return {\n ...parsed,\n shouldMirror: true,\n reason: `${parsed.reason} (below confidence threshold ${this.threshold}).`\n }\n }\n\n return {\n category,\n shouldMirror,\n confidence,\n reason: parsed.reason\n }\n }\n}\n\nfunction safeParseIntent(text: string): IntentResult {\n const trimmed = text.trim()\n const start = trimmed.indexOf('{')\n const end = trimmed.lastIndexOf('}')\n if (start === -1 || end === -1 || end <= start) {\n throw new Error('Classifier returned non-JSON output.')\n }\n const json = trimmed.slice(start, end + 1)\n const parsed = JSON.parse(json) as Partial<IntentResult>\n\n const category = normalizeCategory(parsed.category)\n const confidence = clamp(\n typeof parsed.confidence === 'number' ? parsed.confidence : 0\n )\n const shouldMirror =\n typeof parsed.shouldMirror === 'boolean'\n ? parsed.shouldMirror\n : ['opinion_advice', 'analysis', 'interpretation', 'prediction'].includes(\n category\n )\n const reason =\n typeof parsed.reason === 'string' && parsed.reason\n ? parsed.reason\n : 'No reason provided.'\n\n return { category, shouldMirror, confidence, reason }\n}\n\nfunction normalizeCategory(value: unknown): IntentCategory {\n const allowed: IntentCategory[] = [\n 'factual_lookup',\n 'math_computation',\n 'code_task',\n 'conversational',\n 'opinion_advice',\n 'analysis',\n 'interpretation',\n 'prediction'\n ]\n if (typeof value === 'string' && allowed.includes(value as IntentCategory)) {\n return value as IntentCategory\n }\n return 'analysis'\n}\n\nfunction clamp(value: number): number {\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n","import type { AppConfig } from '../config/schema.js'\nimport { createAdapter } from '../brains/factory.js'\nimport type { IntentClassifier } from './intent-classifier.js'\nimport { BrainIntentClassifier, HeuristicIntentClassifier } from './intent-classifier.js'\n\nexport function buildIntentClassifier(\n config: AppConfig,\n debug = false\n): IntentClassifier {\n const classifierConfig = config.classifier\n const brainConfig = config.brains.find(\n (brain) => brain.id === classifierConfig.brainId\n )\n\n if (!brainConfig) {\n if (debug) {\n process.stderr.write(\n `[debug] Classifier brain not found: ${classifierConfig.brainId}. Using heuristic.\\n`\n )\n }\n return new HeuristicIntentClassifier()\n }\n\n try {\n const adapter = createAdapter(brainConfig, { model: classifierConfig.model })\n return new BrainIntentClassifier(\n adapter,\n classifierConfig.confidenceThreshold\n )\n } catch (error) {\n if (debug) {\n process.stderr.write(\n `[debug] Failed to init classifier: ${(error as Error).message}. Using heuristic.\\n`\n )\n }\n return new HeuristicIntentClassifier()\n }\n}\n","import type { Intensity } from '../types/index.js'\n\nconst baseRule =\n 'Every point must have a specific mechanism. Vague doubt is useless.'\n\nconst mild = `You are a gentle critic. Provide a full answer, then 1-2 real gaps and a steelman alternative. ${baseRule}`\nconst moderate = `You are a devil's advocate.\\n1. REFRAME the implicit assumption.\\n2. CHALLENGE THE FRAME with the question the user should have asked.\\n3. SURFACE HIDDEN COSTS that are under-weighted.\\n4. STRONGEST COUNTERPOSITION (no straw man).\\n5. VERDICT with honest synthesis.\\n${baseRule}`\nconst aggressive = `You are adversarial.\\n1. BURIED ASSUMPTION: the most consequential unstated assumption.\\n2. STRONGEST REFUTATION against the dominant view.\\n3. FAILURE CASES: 2-3 concrete scenarios where standard advice fails.\\n4. EXPERT DISSENT: represent serious dissenting thinkers.\\n5. HONEST SYNTHESIS with calibrated confidence.\\n${baseRule}`\n\nexport function buildChallengerPrompt(intensity: Intensity): string {\n switch (intensity) {\n case 'mild':\n return mild\n case 'moderate':\n return moderate\n case 'aggressive':\n return aggressive\n default:\n return moderate\n }\n}\n\nexport function buildOriginalPrompt(): string {\n return 'You are the primary assistant. Provide the best direct answer.'\n}\n\n// ── Persona definitions ────────────────────────────────────────────────────────\n\nexport type PersonaName = 'vc-skeptic' | 'security-auditor' | 'end-user' | 'regulator' | 'contrarian'\n\ninterface PersonaDef {\n label: string\n lens: string\n focusAreas: string[]\n}\n\nconst PERSONAS: Record<PersonaName, PersonaDef> = {\n 'vc-skeptic': {\n label: 'VC Skeptic',\n lens: 'Investor/VC scrutiny',\n focusAreas: [\n 'Market sizing assumptions — are they realistic or aspirational?',\n 'Unit economics — does the math work at scale?',\n 'Competitive moat — what stops a well-funded competitor from copying this?',\n 'Defensibility — what makes this durable beyond 18 months?',\n ],\n },\n 'security-auditor': {\n label: 'Security Auditor',\n lens: 'Security and risk analysis',\n focusAreas: [\n 'Attack surfaces — what can be exploited externally or internally?',\n 'Trust boundaries — where are credentials, data, or permissions crossing lines?',\n 'Failure modes — what happens when this breaks under adversarial conditions?',\n 'Blast radius — what is the worst-case scope of a breach or failure?',\n ],\n },\n 'end-user': {\n label: 'End User',\n lens: 'Real user perspective',\n focusAreas: [\n 'Real needs vs stated needs — what does the user actually want vs what they said?',\n 'Adoption friction — what will cause users to abandon this in the first week?',\n 'Actual behavior — what do users do vs what you think they will do?',\n 'Comprehension gaps — what will users misunderstand or misuse?',\n ],\n },\n 'regulator': {\n label: 'Regulator',\n lens: 'Compliance and legal exposure',\n focusAreas: [\n 'Regulatory exposure — what laws, rules, or frameworks apply and are being ignored?',\n 'Liability — who bears legal responsibility when this causes harm?',\n 'Stakeholder harm — who could be injured, defrauded, or discriminated against?',\n 'Unintended consequences — what second-order effects could trigger enforcement action?',\n ],\n },\n 'contrarian': {\n label: 'Contrarian',\n lens: 'Pure intellectual opposition',\n focusAreas: [\n 'Historical failures — name similar ideas that failed and why this is the same.',\n 'Second-order effects — what happens after the first-order success plays out?',\n 'Inverted premise — what if the opposite assumption is actually correct?',\n 'Consensus trap — why might the conventional wisdom here be exactly wrong?',\n ],\n },\n}\n\nexport function buildPersonaChallengerPrompt(persona: PersonaName, intensity: Intensity): string {\n const def = PERSONAS[persona]\n if (!def) return buildChallengerPrompt(intensity)\n\n const focusList = def.focusAreas.map((area, i) => `${i + 1}. ${area}`).join('\\n')\n const basePrompt = buildChallengerPrompt(intensity)\n\n return `You are applying the lens of a ${def.label} (${def.lens}).\n\nYour specific focus areas for this lens:\n${focusList}\n\nApply this lens rigorously throughout your response. Every critique must flow from this professional perspective.\n\n---\n\n${basePrompt}`\n}\n\nexport function isValidPersona(name: string): name is PersonaName {\n return name in PERSONAS\n}\n","import type { ConversationMessage } from '../types/index.js'\n\nexport function buildJudgeSystemPrompt(): string {\n return `You are a neutral synthesis judge evaluating two AI responses to the same question.\n\nYour output MUST follow this exact structure:\n\nAGREEMENT: <number>%\n<One sentence explaining what drives the score — where they converge or diverge>\n\nSYNTHESIS\n<The actual synthesized recommendation — the verdict after weighing both responses. Be concrete and actionable.>\n\nBLIND SPOT\n<What both models missed or assumed without questioning. Be specific — name the assumption or gap.>\n\nScoring guide for AGREEMENT:\n- 90–100%: Substantively identical conclusions, only stylistic differences\n- 70–89%: Same core answer, meaningful differences in emphasis or caveats\n- 50–69%: Partial overlap, notable disagreement on key points\n- 30–49%: Different conclusions but some shared premises\n- 0–29%: Fundamentally opposed positions\n\nBe direct and critical. Do not praise either response.`\n}\n\nexport function buildJudgeMessages(\n question: string,\n originalText: string,\n challengerText: string\n): ConversationMessage[] {\n return [\n {\n role: 'user',\n content: `QUESTION\n${question}\n\n---\n\nRESPONSE A (Original)\n${originalText}\n\n---\n\nRESPONSE B (Challenger)\n${challengerText}\n\n---\n\nProvide your synthesis following the required format exactly.`,\n },\n ]\n}\n\nexport function extractAgreementScore(text: string): number | undefined {\n const match = /AGREEMENT:\\s*(-?\\d+)%/i.exec(text)\n if (!match) return undefined\n const n = parseInt(match[1], 10)\n if (isNaN(n)) return undefined\n return Math.max(0, Math.min(100, n))\n}\n","import type {\n ChatOptions,\n ConversationMessage,\n Intensity,\n MirrorEvent,\n SynthesisResult\n} from '../types/index.js'\nimport type { BrainAdapter } from '../brains/adapter.js'\nimport type { IntentClassifier } from './intent-classifier.js'\nimport {\n buildChallengerPrompt,\n buildOriginalPrompt,\n buildPersonaChallengerPrompt,\n isValidPersona,\n} from './prompt-builder.js'\nimport {\n buildJudgeMessages,\n buildJudgeSystemPrompt,\n extractAgreementScore,\n} from './judge.js'\n\nexport interface MirrorEngineOptions {\n original: BrainAdapter\n challenger?: BrainAdapter\n intensity: Intensity\n autoClassify: boolean\n classifier: IntentClassifier\n debug?: boolean\n judge?: BrainAdapter\n persona?: string\n}\n\nexport class MirrorEngine {\n private readonly original: BrainAdapter\n private readonly challenger?: BrainAdapter\n private readonly intensity: Intensity\n private readonly autoClassify: boolean\n private readonly classifier: IntentClassifier\n private readonly debug: boolean\n private readonly judge?: BrainAdapter\n private readonly persona?: string\n\n constructor(options: MirrorEngineOptions) {\n this.original = options.original\n this.challenger = options.challenger\n this.intensity = options.intensity\n this.autoClassify = options.autoClassify\n this.classifier = options.classifier\n this.debug = options.debug ?? false\n this.judge = options.judge\n this.persona = options.persona\n }\n\n async *run(\n userInput: string,\n history: ConversationMessage[],\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n try {\n if (this.autoClassify) {\n yield { type: 'classifying' }\n let result\n try {\n result = await this.classifier.classify(userInput)\n } catch (error) {\n this.log(`Classifier error: ${(error as Error).message}`)\n result = {\n category: 'analysis' as const,\n shouldMirror: true,\n confidence: 0,\n reason: 'Classifier error; defaulting to mirror.'\n }\n }\n yield { type: 'classified', result }\n if (!result.shouldMirror || !this.challenger) {\n this.log('Classifier chose direct path.')\n yield* this.runSingle(userInput, history, options)\n return\n }\n }\n\n if (!this.challenger) {\n yield* this.runSingle(userInput, history, options)\n return\n }\n\n yield* this.runMirror(userInput, history, options)\n } catch (error) {\n yield { type: 'error', error: error as Error }\n }\n }\n\n private async *runSingle(\n userInput: string,\n history: ConversationMessage[],\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n const messages = [...history, { role: 'user', content: userInput }]\n const systemPrompt = buildOriginalPrompt()\n const stream = this.streamWithRetry(\n this.original,\n messages,\n systemPrompt,\n options\n )\n const accumulator = createAccumulator()\n\n for await (const chunk of stream) {\n accumulator.add(chunk)\n yield { type: 'stream_chunk', brainId: this.original.id, chunk }\n }\n\n const response = accumulator.complete()\n\n yield { type: 'brain_complete', brainId: this.original.id, response }\n yield { type: 'all_complete' }\n }\n\n private async *runMirror(\n userInput: string,\n history: ConversationMessage[],\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n const originalMessages = [...history, { role: 'user', content: userInput }]\n const challengerHistory = history.map((message) =>\n message.role === 'assistant'\n ? {\n ...message,\n content: `[PREVIOUS ORIGINAL RESPONSE]\\n${message.content}`\n }\n : message\n )\n const challengerMessages = [\n ...challengerHistory,\n { role: 'user', content: userInput }\n ]\n const originalPrompt = buildOriginalPrompt()\n const challengerPrompt = this.persona && isValidPersona(this.persona)\n ? buildPersonaChallengerPrompt(this.persona, this.intensity)\n : buildChallengerPrompt(this.intensity)\n\n const originalStream = this.streamWithRetry(\n this.original,\n originalMessages,\n originalPrompt,\n options\n )\n const challengerStream = this.streamWithRetry(\n this.challenger!,\n challengerMessages,\n challengerPrompt,\n options\n )\n\n const originalAccumulator = createAccumulator()\n const challengerAccumulator = createAccumulator()\n\n for await (const item of mergeStreams([\n { brainId: this.original.id, stream: originalStream, accumulator: originalAccumulator },\n {\n brainId: this.challenger!.id,\n stream: challengerStream,\n accumulator: challengerAccumulator\n }\n ])) {\n yield item\n }\n\n const originalResponse = originalAccumulator.complete()\n const challengerResponse = challengerAccumulator.complete()\n\n yield {\n type: 'brain_complete',\n brainId: this.original.id,\n response: originalResponse\n }\n yield {\n type: 'brain_complete',\n brainId: this.challenger!.id,\n response: challengerResponse\n }\n\n // ── Judge pass ───────────────────────────────────────────────────────────\n if (this.judge) {\n yield* this.runJudge(userInput, originalResponse.text, challengerResponse.text, options)\n }\n\n yield { type: 'all_complete' }\n }\n\n private async *runJudge(\n question: string,\n originalText: string,\n challengerText: string,\n options?: ChatOptions\n ): AsyncGenerator<MirrorEvent, void> {\n yield { type: 'synthesizing' }\n\n const messages = buildJudgeMessages(question, originalText, challengerText)\n const systemPrompt = buildJudgeSystemPrompt()\n const stream = this.streamWithRetry(this.judge!, messages, systemPrompt, options)\n const accumulator = createAccumulator()\n\n for await (const chunk of stream) {\n accumulator.add(chunk)\n yield { type: 'synthesis_chunk', chunk }\n }\n\n const response = accumulator.complete()\n const agreementScore = extractAgreementScore(response.text)\n\n const result: SynthesisResult = {\n text: response.text,\n agreementScore,\n inputTokens: response.inputTokens,\n outputTokens: response.outputTokens,\n }\n\n yield { type: 'synthesis_complete', result }\n }\n\n private async *streamWithRetry(\n adapter: BrainAdapter,\n messages: ConversationMessage[],\n systemPrompt: string,\n options?: ChatOptions,\n retries = 1\n ): AsyncGenerator<\n { delta: string; isFinal: boolean; inputTokens?: number; outputTokens?: number },\n { text: string; inputTokens?: number; outputTokens?: number }\n > {\n let attempt = 0\n while (true) {\n try {\n if (attempt > 0) {\n this.log(`Retrying ${adapter.id} (attempt ${attempt + 1}).`)\n }\n const stream = adapter.chat(messages, systemPrompt, options)\n for await (const chunk of stream) {\n yield chunk\n }\n return { text: '' }\n } catch (error) {\n if (attempt >= retries) {\n throw error\n }\n attempt += 1\n await delay(300 * attempt)\n }\n }\n }\n\n private log(message: string): void {\n if (!this.debug) {\n return\n }\n process.stderr.write(`[debug] ${message}\\n`)\n }\n}\n\ntype StreamChunk = {\n delta: string\n isFinal: boolean\n inputTokens?: number\n outputTokens?: number\n}\n\ninterface MergeEntry {\n brainId: string\n stream: AsyncGenerator<StreamChunk, { text: string; inputTokens?: number; outputTokens?: number }>\n accumulator: ReturnType<typeof createAccumulator>\n}\n\nfunction createAccumulator() {\n let text = ''\n let inputTokens: number | undefined\n let outputTokens: number | undefined\n\n return {\n add(chunk: StreamChunk) {\n if (chunk.delta) {\n text += chunk.delta\n }\n if (chunk.inputTokens !== undefined) {\n inputTokens = chunk.inputTokens\n }\n if (chunk.outputTokens !== undefined) {\n outputTokens = chunk.outputTokens\n }\n },\n complete() {\n return { text, inputTokens, outputTokens }\n }\n }\n}\n\nasync function* mergeStreams(\n entries: MergeEntry[]\n): AsyncGenerator<MirrorEvent, void> {\n const pending = entries.map((entry) => ({\n entry,\n next: entry.stream.next()\n }))\n\n while (pending.length > 0) {\n const race = pending.map((item, index) =>\n item.next.then((result) => ({ index, result }))\n )\n const { index, result } = await Promise.race(race)\n const current = pending[index]\n\n if (result.done) {\n pending.splice(index, 1)\n continue\n }\n\n current.entry.accumulator.add(result.value)\n yield {\n type: 'stream_chunk',\n brainId: current.entry.brainId,\n chunk: result.value\n }\n current.next = current.entry.stream.next()\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import type { ConversationMessage } from '../types/index.js'\n\nexport class Session {\n private readonly maxHistory: number\n private readonly messages: ConversationMessage[] = []\n\n constructor(maxHistory = 20) {\n this.maxHistory = maxHistory\n }\n\n addUser(content: string): void {\n this.push({ role: 'user', content })\n }\n\n addAssistant(content: string): void {\n this.push({ role: 'assistant', content })\n }\n\n getHistory(): ConversationMessage[] {\n return [...this.messages]\n }\n\n clear(): void {\n this.messages.length = 0\n }\n\n private push(message: ConversationMessage): void {\n this.messages.push(message)\n // Evict oldest Q&A pair at a time so the buffer never starts with an\n // assistant message that has no preceding user turn (which causes API errors).\n while (this.messages.length > this.maxHistory) {\n this.messages.splice(0, 2)\n }\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Box, Static, Text, useInput, useStdout } from 'ink'\nimport type { BrainResult, IntentResult, SynthesisResult } from '../types/index.js'\nimport type { MirrorEngine } from '../engine/mirror-engine.js'\nimport { Session } from '../engine/session.js'\nimport { addHistoryEntry } from '../history/store.js'\nimport { BrainPanel } from './components/BrainPanel.js'\nimport { IntentBadge } from './components/IntentBadge.js'\nimport { StreamingText } from './components/StreamingText.js'\nimport { highlightCodeBlocks } from './utils/highlight.js'\n\n// ── Types ──────────────────────────────────────────────────────────────────────\n\ninterface CompletedExchange {\n id: string\n question: string\n intent?: IntentResult\n original: string\n challenger?: string\n synthesis?: string\n agreementScore?: number\n isMirrored: boolean\n}\n\n// StaticItem union — items written permanently to stdout via <Static>.\n// The header is the first item (added at mount); exchanges are appended as queries complete.\ntype StaticItem =\n | { type: 'header'; id: 'header' }\n | { type: 'exchange'; id: string; exchange: CompletedExchange; originalId: string; challengerId?: string; columns: number }\n\nexport interface MirrorAppProps {\n engine: MirrorEngine\n session: Session\n originalId: string\n challengerId?: string\n judgerId?: string\n intensity: string\n layout?: 'side-by-side' | 'stacked'\n showTokenCounts?: boolean\n showLatency?: boolean\n syntaxHighlighting?: boolean\n}\n\n// ── Gradient helpers ───────────────────────────────────────────────────────────\n\nconst GRAD = ['#00D2FF', '#3A7BD5', '#7F5AF0', '#FF6EC7', '#FFB86C']\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const n = hex.replace('#', '')\n const v = parseInt(n.length === 3 ? n.split('').map(c => c + c).join('') : n, 16)\n return { r: (v >> 16) & 0xff, g: (v >> 8) & 0xff, b: v & 0xff }\n}\n\nfunction gradColor(pos: number): string {\n const p = Math.max(0, Math.min(1, pos))\n const steps = GRAD.length - 1\n const scaled = p * steps\n const i = Math.min(Math.floor(scaled), steps - 1)\n const t = scaled - i\n const a = hexToRgb(GRAD[i])\n const b = hexToRgb(GRAD[i + 1])\n const r = Math.round(a.r + (b.r - a.r) * t)\n const g = Math.round(a.g + (b.g - a.g) * t)\n const bv = Math.round(a.b + (b.b - a.b) * t)\n return `#${[r, g, bv].map(v => v.toString(16).padStart(2, '0')).join('')}`\n}\n\nfunction GradientLine({ line, bold }: { line: string; bold?: boolean }): JSX.Element {\n if (!line.trim()) return <Text> </Text>\n const chars = Array.from(line)\n const last = Math.max(chars.length - 1, 1)\n return (\n <Text bold={bold} wrap=\"truncate\">\n {chars.map((ch, idx) => (\n <Text key={idx} color={gradColor(idx / last)}>{ch}</Text>\n ))}\n </Text>\n )\n}\n\n// ── Sub-components ─────────────────────────────────────────────────────────────\n\n// Wrapped in memo so re-renders during streaming don't touch the header.\nconst HeaderView = React.memo(function HeaderView({\n lines, originalId, challengerId, intensity\n}: {\n lines: string[]; originalId: string; challengerId?: string; intensity: string\n}): JSX.Element {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n {lines.map((line, i) => <GradientLine key={i} line={line} bold />)}\n <Text color=\"gray\" dimColor>\n {' '}{originalId}{challengerId ? ` vs ${challengerId}` : ' [direct mode]'}{' '}[{intensity}]\n </Text>\n </Box>\n )\n})\n\n// Strip the \"AGREEMENT: X%\" metadata line — the score is already in the panel\n// title, so showing it again inside the panel body is redundant noise.\nfunction stripAgreementHeader(text: string): string {\n return text.replace(/^AGREEMENT:\\s*-?\\d+%[^\\n]*\\n?\\n?/i, '').trimStart()\n}\n\n// Wrapped in memo: completed exchanges never change after they're added, so\n// they should never re-render during the next query's streaming updates.\nconst ExchangeView = React.memo(function ExchangeView({\n exchange, originalId, challengerId, columns\n}: {\n exchange: CompletedExchange\n originalId: string\n challengerId?: string\n columns: number\n}): JSX.Element {\n const sideBySide = exchange.isMirrored && Boolean(exchange.challenger) && columns >= 80\n const panelWidth = sideBySide ? Math.floor((columns - 1) / 2) : columns\n\n const scoreLabel = exchange.agreementScore !== undefined\n ? ` [agreement: ${exchange.agreementScore}%]`\n : ''\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Text bold>\n <Text color=\"cyan\">You: </Text>\n <Text>{exchange.question}</Text>\n </Text>\n {exchange.intent && (\n <Box>\n <IntentBadge category={exchange.intent.category} mirrored={exchange.intent.shouldMirror} />\n <Text color=\"gray\"> {Math.round(exchange.intent.confidence * 100)}%</Text>\n </Box>\n )}\n <Box marginTop={1} flexDirection={sideBySide ? 'row' : 'column'}>\n <BrainPanel\n title={`ORIGINAL ${originalId}`}\n width={panelWidth}\n marginRight={sideBySide ? 1 : 0}\n >\n <Text wrap=\"wrap\">{exchange.original}</Text>\n </BrainPanel>\n {exchange.isMirrored && exchange.challenger && (\n <BrainPanel\n title={`CHALLENGER ${challengerId}`}\n width={panelWidth}\n >\n <Text wrap=\"wrap\">{exchange.challenger}</Text>\n </BrainPanel>\n )}\n </Box>\n {exchange.synthesis && (\n <Box marginTop={1}>\n <BrainPanel\n title={`SYNTHESIS${scoreLabel}`}\n width={columns}\n borderColor=\"yellow\"\n >\n <Text wrap=\"wrap\">{stripAgreementHeader(exchange.synthesis)}</Text>\n </BrainPanel>\n </Box>\n )}\n </Box>\n )\n})\n\n// ── Header file loading ────────────────────────────────────────────────────────\n\nfunction loadRawHeaderLines(): string[] {\n const cwd = process.cwd()\n const candidates = [\n resolve(cwd, 'src', 'ui', 'header.txt'),\n resolve(cwd, 'header.txt'),\n ]\n for (const f of candidates) {\n if (!existsSync(f)) continue\n try {\n const lines = readFileSync(f, 'utf8').split(/\\r?\\n/)\n while (lines.length > 0 && !lines[lines.length - 1].trim()) lines.pop()\n return lines\n } catch { continue }\n }\n try {\n const p = fileURLToPath(new URL('./header.txt', import.meta.url))\n if (existsSync(p)) {\n const lines = readFileSync(p, 'utf8').split(/\\r?\\n/)\n while (lines.length > 0 && !lines[lines.length - 1].trim()) lines.pop()\n return lines\n }\n } catch { /* no header file bundled */ }\n return []\n}\n\nfunction fitLines(lines: string[], cols: number): string[] {\n if (!lines.length || cols <= 0) return []\n const trimmed = lines.map(l => l.replace(/\\s+$/, ''))\n const nonEmpty = trimmed.filter(l => l.trim().length > 0)\n const indent = nonEmpty.length\n ? Math.min(...nonEmpty.map(l => l.match(/^\\s*/)?.[0].length ?? 0))\n : 0\n const aligned = indent > 0 ? trimmed.map(l => l.slice(indent)) : trimmed\n return aligned.map(l => (l.length > cols ? l.slice(0, cols) : l))\n}\n\nfunction tailLines(text: string, maxLines: number): string {\n if (maxLines <= 0) return ''\n const lines = text.split(/\\r?\\n/)\n if (lines.length <= maxLines) return text\n return lines.slice(-maxLines).join('\\n')\n}\n\n// ── Formatting ─────────────────────────────────────────────────────────────────\n\nfunction formatTokens(input?: number, output?: number): string | null {\n if (input === undefined && output === undefined) return null\n return `${input ?? 0}/${output ?? 0}tok`\n}\n\n// ── Main component ─────────────────────────────────────────────────────────────\n\nexport function MirrorApp({\n engine,\n session,\n originalId,\n challengerId,\n judgerId,\n intensity,\n showTokenCounts = false,\n showLatency = true,\n syntaxHighlighting = true,\n}: MirrorAppProps): JSX.Element {\n const { stdout } = useStdout()\n const columns = stdout?.columns ?? 120\n const rows = stdout?.rows ?? 40\n\n const headerLines = useMemo(() => {\n const raw = loadRawHeaderLines()\n return fitLines(raw, Math.max(1, columns - 1))\n }, [])\n\n // -- Static content (header + completed exchanges) --\n const [staticItems, setStaticItems] = useState<StaticItem[]>([\n { type: 'header', id: 'header' }\n ])\n\n // ── Dynamic UI state ─────────────────────────────────────────────────────────\n const [input, setInput] = useState('')\n const [activeQuestion, setActiveQuestion] = useState('')\n const [currentOriginal, setCurrentOriginal] = useState('')\n const [currentChallenger, setCurrentChallenger] = useState('')\n const [currentSynthesis, setCurrentSynthesis] = useState('')\n const [isThinking, setIsThinking] = useState(false)\n const [isClassifying, setIsClassifying] = useState(false)\n const [isSynthesizing, setIsSynthesizing] = useState(false)\n const [intent, setIntent] = useState<IntentResult | null>(null)\n const [error, setError] = useState<string | null>(null)\n const [originalStats, setOriginalStats] = useState<BrainResult | null>(null)\n const [challengerStats, setChallengerStats] = useState<BrainResult | null>(null)\n const [synthesisStats, setSynthesisStats] = useState<SynthesisResult | null>(null)\n const [turnCount, setTurnCount] = useState(0)\n const [commitTick, setCommitTick] = useState(0)\n\n // ── Refs ─────────────────────────────────────────────────────────────────────\n const runningRef = useRef(false)\n const abortRef = useRef<AbortController | null>(null)\n const pendingOrigRef = useRef('')\n const pendingChalRef = useRef('')\n const pendingSynthRef = useRef('')\n const pendingExchangeRef = useRef<StaticItem | null>(null)\n const startTimesRef = useRef(new Map<string, number>())\n const lastChunkTimesRef = useRef(new Map<string, number>())\n const columnsRef = useRef(columns)\n\n useEffect(() => { columnsRef.current = columns }, [columns])\n\n // Defer Static writes until after streaming panels are cleared.\n useEffect(() => {\n if (isThinking) return\n if (!pendingExchangeRef.current) return\n setCommitTick(tick => tick + 1)\n }, [isThinking])\n\n useEffect(() => {\n if (!pendingExchangeRef.current) return\n const item = pendingExchangeRef.current\n pendingExchangeRef.current = null\n setStaticItems(prev => [...prev, item])\n }, [commitTick])\n\n // Batch streaming text updates at 60 ms to avoid a re-render on every token.\n useEffect(() => {\n const id = setInterval(() => {\n setCurrentOriginal(pendingOrigRef.current)\n setCurrentChallenger(pendingChalRef.current)\n setCurrentSynthesis(pendingSynthRef.current)\n }, 60)\n return () => clearInterval(id)\n }, [])\n\n // ── Layout ───────────────────────────────────────────────────────────────────\n const showChallengerPanel = Boolean(challengerId) && (intent?.shouldMirror ?? true)\n const showSideBySide = showChallengerPanel && columns >= 80\n const panelWidth = showSideBySide ? Math.floor((columns - 1) / 2) : columns\n const liveLineLimit = Math.max(6, Math.min(18, rows - 10))\n\n const formatText = useCallback(\n (text: string) => (syntaxHighlighting ? highlightCodeBlocks(text) : text),\n [syntaxHighlighting]\n )\n\n // ── Submit ───────────────────────────────────────────────────────────────────\n const submit = useCallback(async () => {\n if (runningRef.current) return\n const question = input.trim()\n if (!question) return\n\n runningRef.current = true\n setInput('')\n setError(null)\n setIntent(null)\n setActiveQuestion(question)\n setIsThinking(true)\n setIsClassifying(false)\n setIsSynthesizing(false)\n setOriginalStats(null)\n setChallengerStats(null)\n setSynthesisStats(null)\n pendingOrigRef.current = ''\n pendingChalRef.current = ''\n pendingSynthRef.current = ''\n setCurrentOriginal('')\n setCurrentChallenger('')\n setCurrentSynthesis('')\n\n const history = session.getHistory()\n session.addUser(question)\n\n let originalBuffer = ''\n let challengerBuffer = ''\n let synthesisBuffer = ''\n let originalResult: BrainResult | null = null\n let challengerResult: BrainResult | undefined\n let synthResult: SynthesisResult | undefined\n let intentResult: IntentResult | undefined\n let isMirrored = Boolean(challengerId)\n\n const entryId = randomUUID()\n const createdAt = new Date().toISOString()\n const controller = new AbortController()\n abortRef.current = controller\n\n startTimesRef.current = new Map<string, number>([\n [originalId, Date.now()],\n ...(challengerId ? [[challengerId, Date.now()] as [string, number]] : []),\n ])\n lastChunkTimesRef.current = new Map<string, number>()\n\n try {\n for await (const event of engine.run(question, history, { signal: controller.signal })) {\n if (event.type === 'classifying') {\n setIsClassifying(true)\n }\n\n if (event.type === 'classified') {\n setIsClassifying(false)\n setIntent(event.result)\n intentResult = event.result\n isMirrored = event.result.shouldMirror && Boolean(challengerId)\n }\n\n if (event.type === 'stream_chunk') {\n lastChunkTimesRef.current.set(event.brainId, Date.now())\n if (event.brainId === originalId) {\n originalBuffer += event.chunk.delta\n pendingOrigRef.current = originalBuffer\n } else if (event.brainId === challengerId) {\n challengerBuffer += event.chunk.delta\n pendingChalRef.current = challengerBuffer\n }\n }\n\n if (event.type === 'brain_complete') {\n const completedAt = lastChunkTimesRef.current.get(event.brainId) ?? Date.now()\n const latency = completedAt - (startTimesRef.current.get(event.brainId) ?? completedAt)\n if (event.brainId === originalId) {\n const text = event.response.text || originalBuffer\n originalResult = {\n brainId: originalId,\n text,\n inputTokens: event.response.inputTokens,\n outputTokens: event.response.outputTokens,\n latencyMs: latency,\n }\n setOriginalStats(originalResult)\n session.addAssistant(text)\n } else if (event.brainId === challengerId) {\n const text = event.response.text || challengerBuffer\n challengerResult = {\n brainId: challengerId!,\n text,\n inputTokens: event.response.inputTokens,\n outputTokens: event.response.outputTokens,\n latencyMs: latency,\n }\n setChallengerStats(challengerResult)\n }\n }\n\n if (event.type === 'synthesizing') {\n setIsSynthesizing(true)\n }\n\n if (event.type === 'synthesis_chunk') {\n synthesisBuffer += event.chunk.delta\n pendingSynthRef.current = synthesisBuffer\n }\n\n if (event.type === 'synthesis_complete') {\n setIsSynthesizing(false)\n synthResult = event.result\n setSynthesisStats(event.result)\n }\n\n if (event.type === 'all_complete' && originalResult) {\n addHistoryEntry({\n id: entryId,\n createdAt,\n question,\n original: originalResult,\n challenger: challengerResult,\n intent: intentResult,\n })\n\n const exchange: CompletedExchange = {\n id: entryId,\n question,\n intent: intentResult,\n original: formatText(originalResult.text),\n challenger: challengerResult ? formatText(challengerResult.text) : undefined,\n synthesis: synthResult ? formatText(synthResult.text) : undefined,\n agreementScore: synthResult?.agreementScore,\n isMirrored,\n }\n\n // Defer Static write until after the streaming panels are cleared.\n pendingExchangeRef.current = {\n type: 'exchange',\n id: entryId,\n exchange,\n originalId,\n challengerId,\n columns: columnsRef.current\n }\n setTurnCount(prev => prev + 1)\n setActiveQuestion('')\n pendingOrigRef.current = ''\n pendingChalRef.current = ''\n pendingSynthRef.current = ''\n setCurrentOriginal('')\n setCurrentChallenger('')\n setCurrentSynthesis('')\n setIsSynthesizing(false)\n setIsClassifying(false)\n }\n\n if (event.type === 'error') {\n setError(event.error.message)\n }\n }\n } catch (err) {\n if ((err as Error).name !== 'AbortError') {\n setError((err as Error).message ?? 'Unknown error')\n }\n } finally {\n setIsThinking(false)\n setIsClassifying(false)\n setIsSynthesizing(false)\n runningRef.current = false\n abortRef.current = null\n }\n }, [challengerId, engine, formatText, input, originalId, session])\n\n // ── Input handling ───────────────────────────────────────────────────────────\n useInput((ch, key) => {\n if (key.ctrl && ch === 'c') {\n if (isThinking && abortRef.current) {\n abortRef.current.abort()\n return\n }\n process.exit(0)\n }\n if (key.return) { void submit(); return }\n if (key.backspace || key.delete) { setInput(p => p.slice(0, -1)); return }\n if (ch && !key.ctrl && !key.meta) setInput(p => p + ch)\n })\n\n // ── Status bar ───────────────────────────────────────────────────────────────\n const statusParts: string[] = []\n if (isClassifying) statusParts.push('Classifying...')\n else if (isSynthesizing) statusParts.push('Synthesizing...')\n else if (isThinking) statusParts.push('Thinking...')\n else statusParts.push('Ready')\n\n if (showTokenCounts) {\n const origT = formatTokens(originalStats?.inputTokens, originalStats?.outputTokens)\n if (origT) statusParts.push(`orig ${origT}`)\n if (challengerStats) {\n const chalT = formatTokens(challengerStats.inputTokens, challengerStats.outputTokens)\n if (chalT) statusParts.push(`chal ${chalT}`)\n }\n if (synthesisStats) {\n const synthT = formatTokens(synthesisStats.inputTokens, synthesisStats.outputTokens)\n if (synthT) statusParts.push(`synth ${synthT}`)\n }\n }\n if (showLatency && originalStats?.latencyMs != null) {\n statusParts.push(`orig ${(originalStats.latencyMs / 1000).toFixed(1)}s`)\n }\n if (showLatency && challengerStats?.latencyMs != null) {\n statusParts.push(`chal ${(challengerStats.latencyMs / 1000).toFixed(1)}s`)\n }\n if (synthesisStats?.agreementScore !== undefined) {\n statusParts.push(`agreement ${synthesisStats.agreementScore}%`)\n }\n statusParts.push(`${turnCount} turn${turnCount !== 1 ? 's' : ''}`)\n statusParts.push('Ctrl+C to exit')\n\n const synthScoreLabel = synthesisStats?.agreementScore !== undefined\n ? ` [agreement: ${synthesisStats.agreementScore}%]`\n : ''\n\n // ── Render ───────────────────────────────────────────────────────────────────\n // Header + completed exchanges are written via <Static> so they never redraw,\n // eliminating the flash on every keystroke in the input field.\n return (\n <Box flexDirection=\"column\">\n\n <Static items={staticItems}>\n {(item) => (\n <React.Fragment key={item.id}>\n {item.type === 'header' ? (\n <HeaderView\n lines={headerLines}\n originalId={originalId}\n challengerId={challengerId}\n intensity={intensity}\n />\n ) : (\n <ExchangeView\n exchange={item.exchange}\n originalId={item.originalId}\n challengerId={item.challengerId}\n columns={item.columns}\n />\n )}\n </React.Fragment>\n )}\n </Static>\n {/* In-progress streaming — only present while a query is running */}\n {isThinking && activeQuestion && (\n <Box flexDirection=\"column\">\n <Text bold>\n <Text color=\"cyan\">You: </Text>\n <Text>{activeQuestion}</Text>\n </Text>\n\n {intent ? (\n <Box>\n <IntentBadge category={intent.category} mirrored={intent.shouldMirror} />\n <Text color=\"gray\"> {Math.round(intent.confidence * 100)}%</Text>\n </Box>\n ) : isClassifying ? (\n <Text color=\"gray\" dimColor>Classifying...</Text>\n ) : null}\n\n <Box marginTop={1} flexDirection={showSideBySide ? 'row' : 'column'}>\n <BrainPanel\n title={`ORIGINAL ${originalId}`}\n width={panelWidth}\n marginRight={showSideBySide && showChallengerPanel ? 1 : 0}\n >\n <StreamingText value={tailLines(currentOriginal, liveLineLimit)} />\n </BrainPanel>\n\n {showChallengerPanel && (\n <BrainPanel\n title={`CHALLENGER ${challengerId} [${intensity}]`}\n width={panelWidth}\n >\n <StreamingText value={tailLines(currentChallenger, liveLineLimit)} />\n </BrainPanel>\n )}\n </Box>\n\n {/* Live synthesis panel — streams the judge's response in real time.\n Appears only while the judge is running or has streamed content.\n Disappears atomically in the same render that shows the completed\n exchange, so it never overlaps with the static panel below. */}\n {(isSynthesizing || currentSynthesis) && (\n <Box marginTop={1}>\n <BrainPanel\n title={`SYNTHESIS${isSynthesizing ? ' synthesizing...' : synthScoreLabel} ${judgerId ?? ''}`}\n width={columns}\n borderColor=\"yellow\"\n >\n <StreamingText value={tailLines(stripAgreementHeader(currentSynthesis), liveLineLimit)} />\n </BrainPanel>\n </Box>\n )}\n </Box>\n )}\n\n {/* Error */}\n {error && (\n <Box marginTop={1}>\n <Text color=\"red\">Error: {error}</Text>\n </Box>\n )}\n\n {/* Status */}\n <Box marginTop={1}>\n <Text color=\"gray\" dimColor>{statusParts.join(' · ')}</Text>\n </Box>\n\n {/* Input prompt */}\n <Box>\n <Text color=\"cyan\" bold>{'> '}</Text>\n <Text>{input}</Text>\n <Text color={isThinking ? 'gray' : 'cyan'}>█</Text>\n </Box>\n\n </Box>\n )\n}\n","import Conf from 'conf'\nimport type { HistoryEntry } from '../types/index.js'\n\ninterface HistoryStore {\n entries: HistoryEntry[]\n}\n\nconst store = new Conf<HistoryStore>({\n projectName: 'adversarial-mirror',\n configName: 'history',\n defaults: { entries: [] }\n})\n\nconst MAX_ENTRIES = 200\n\nexport function addHistoryEntry(entry: HistoryEntry): void {\n const entries = store.store.entries ?? []\n const next = [entry, ...entries]\n if (next.length > MAX_ENTRIES) {\n next.length = MAX_ENTRIES\n }\n store.store = { entries: next }\n}\n\nexport function listHistory(): HistoryEntry[] {\n return store.store.entries ?? []\n}\n\nexport function getHistory(id: string): HistoryEntry | undefined {\n return (store.store.entries ?? []).find((entry) => entry.id === id)\n}\n","import React from 'react'\nimport { Box, Text } from 'ink'\n\ninterface BrainPanelProps {\n title: string\n children?: React.ReactNode\n /** Explicit column width (outer, including border + padding). */\n width?: number\n marginRight?: number\n /** Border and title color. Defaults to 'cyan'. */\n borderColor?: string\n}\n\nexport function BrainPanel({\n title,\n children,\n width,\n marginRight,\n borderColor = 'cyan',\n}: BrainPanelProps): JSX.Element {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={borderColor}\n padding={1}\n flexGrow={width ? 0 : 1}\n flexShrink={1}\n minWidth={0}\n width={width}\n marginRight={marginRight}\n >\n <Text bold color={borderColor}>{title}</Text>\n {children}\n </Box>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\nimport type { IntentCategory } from '../../types/index.js'\n\ninterface IntentBadgeProps {\n category: IntentCategory\n mirrored: boolean\n}\n\nexport function IntentBadge({ category, mirrored }: IntentBadgeProps): JSX.Element {\n return (\n <Text>\n <Text backgroundColor={mirrored ? 'blue' : 'blackBright'} color=\"white\">\n {` ${mirrored ? 'MIRRORING' : 'DIRECT'} `}\n </Text>\n <Text color=\"gray\"> {category}</Text>\n </Text>\n )\n}\n","import React from 'react'\nimport { Text } from 'ink'\n\ninterface StreamingTextProps {\n value: string\n dim?: boolean\n}\n\nexport function StreamingText({ value, dim }: StreamingTextProps): JSX.Element {\n return (\n <Text dimColor={dim} wrap=\"truncate\">\n {value}\n <Text color=\"cyan\">▌</Text>\n </Text>\n )\n}\n","import { highlight } from 'cli-highlight'\n\n// IMPORTANT: Do NOT declare the regex at module scope with the /g flag.\n// A module-level /g regex retains its lastIndex between calls, causing every\n// other invocation of highlightCodeBlocks to silently skip all matches.\n// The regex is created fresh inside the function to avoid this.\n\nexport function highlightCodeBlocks(text: string): string {\n if (!text.includes('```')) {\n return text\n }\n\n // Fresh regex instance per call — no shared lastIndex state\n const fenceRegex = /```(\\w+)?\\n([\\s\\S]*?)```/g\n\n let result = ''\n let lastIndex = 0\n let match: RegExpExecArray | null\n\n while ((match = fenceRegex.exec(text)) !== null) {\n const [block, lang, code] = match\n result += text.slice(lastIndex, match.index)\n try {\n const highlighted = highlight(code, {\n language: lang || undefined,\n ignoreIllegals: true,\n })\n result += `\\n${highlighted}\\n`\n } catch {\n // Fallback: emit the raw code block if highlighting fails\n result += `\\n${code}\\n`\n }\n lastIndex = match.index + block.length\n }\n\n result += text.slice(lastIndex)\n return result\n}\n","import { randomUUID } from 'node:crypto'\nimport { readFileSync } from 'node:fs'\nimport { basename } from 'node:path'\nimport type { Command } from 'commander'\nimport { createAdapter } from '../../brains/factory.js'\nimport { loadConfig } from '../../config/loader.js'\nimport { buildIntentClassifier } from '../../engine/classifier-factory.js'\nimport { MirrorEngine } from '../../engine/mirror-engine.js'\nimport { Session } from '../../engine/session.js'\nimport { addHistoryEntry } from '../../history/store.js'\nimport type { BrainResult, IntentResult } from '../../types/index.js'\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n process.stdin.on('data', (chunk: Buffer) => chunks.push(chunk))\n process.stdin.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')))\n process.stdin.on('error', reject)\n })\n}\n\n// Commander v12: for \"mirror <question>\", the action receives (question, localOpts, command).\n// Global flags live on command.parent.opts().\nexport async function runMirror(\n question: string,\n _localOpts: Record<string, unknown>,\n command: Command\n): Promise<void> {\n // Merge parent (global) opts with local command opts\n const parentOpts = command.parent?.opts() ?? {}\n const localOpts = command.opts()\n const opts = { ...parentOpts, ...localOpts }\n\n try {\n const config = loadConfig()\n const originalId =\n (opts['original'] as string | undefined) ?? config.session.originalBrainId\n const challengerId =\n (opts['challenger'] as string | undefined) ?? config.session.challengerBrainId\n const intensity =\n (opts['intensity'] as string | undefined) ?? config.session.defaultIntensity\n const mirrorEnabled = opts['mirror'] !== false\n const classifyEnabled = opts['classify'] !== false\n const judgeEnabled = opts['judge'] !== false && config.session.judgeEnabled\n const persona = (opts['persona'] as string | undefined) ?? config.session.defaultPersona\n const filePath = opts['file'] as string | undefined\n\n // Build file context prefix\n let filePrefix = ''\n if (filePath) {\n try {\n const content = readFileSync(filePath, 'utf8')\n const name = basename(filePath)\n filePrefix = `[FILE: ${name}]\\n${content}\\n\\n---\\n`\n } catch (err) {\n throw new Error(`Could not read file: ${filePath} — ${(err as Error).message}`)\n }\n } else if (!process.stdin.isTTY) {\n // Piped stdin\n const content = await readStdin()\n if (content.trim()) {\n filePrefix = `[STDIN]\\n${content}\\n\\n---\\n`\n }\n }\n\n const fullQuestion = filePrefix ? `${filePrefix}${question}` : question\n\n const originalConfig = config.brains.find(b => b.id === originalId)\n if (!originalConfig) throw new Error(`Original brain not found: ${originalId}`)\n\n const originalAdapter = createAdapter(originalConfig)\n const challengerConfig = config.brains.find(b => b.id === challengerId)\n const challengerAdapter =\n mirrorEnabled && challengerConfig ? createAdapter(challengerConfig) : undefined\n\n // Build judge adapter\n let judgeAdapter = undefined\n if (mirrorEnabled && challengerAdapter && judgeEnabled) {\n const judgeId = (opts['judgeBrain'] as string | undefined) ?? config.session.judgeBrainId\n const judgeConfig = config.brains.find(b => b.id === judgeId)\n if (judgeConfig) {\n judgeAdapter = createAdapter(judgeConfig)\n }\n }\n\n const classifier = buildIntentClassifier(config, Boolean(opts['debug']))\n const engine = new MirrorEngine({\n original: originalAdapter,\n challenger: challengerAdapter,\n intensity: intensity as 'mild' | 'moderate' | 'aggressive',\n autoClassify: mirrorEnabled && classifyEnabled,\n classifier,\n debug: Boolean(opts['debug']),\n judge: judgeAdapter,\n persona,\n })\n\n const session = new Session(1)\n const results = new Map<string, BrainResult>()\n let intentResult: IntentResult | undefined\n const entryId = randomUUID()\n const createdAt = new Date().toISOString()\n const startTimes = new Map<string, number>([\n [originalAdapter.id, Date.now()],\n ...(challengerAdapter ? [[challengerAdapter.id, Date.now()] as [string, number]] : []),\n ])\n\n // Stream the original response in real time. Buffer the challenger so the\n // two parallel streams don't interleave into unreadable output.\n let originalHeaderPrinted = false\n let synthBuffer = ''\n let synthScore: number | undefined\n\n for await (const event of engine.run(fullQuestion, session.getHistory())) {\n if (event.type === 'classifying') {\n process.stdout.write('Classifying...\\n')\n }\n\n if (event.type === 'classified') {\n const label = event.result.shouldMirror ? 'MIRRORING' : 'DIRECT'\n process.stdout.write(\n `[${label}] ${event.result.category} (${Math.round(event.result.confidence * 100)}%)\\n`\n )\n intentResult = event.result\n }\n\n if (event.type === 'stream_chunk' && !event.chunk.isFinal) {\n if (event.brainId === originalAdapter.id) {\n if (!originalHeaderPrinted) {\n process.stdout.write(`\\nORIGINAL (${originalAdapter.id})\\n`)\n originalHeaderPrinted = true\n }\n process.stdout.write(event.chunk.delta)\n }\n // Challenger chunks are buffered; we print the complete text after brain_complete.\n }\n\n if (event.type === 'brain_complete') {\n const latency = Date.now() - (startTimes.get(event.brainId) ?? Date.now())\n results.set(event.brainId, {\n brainId: event.brainId,\n text: event.response.text,\n inputTokens: event.response.inputTokens,\n outputTokens: event.response.outputTokens,\n latencyMs: latency,\n })\n }\n\n if (event.type === 'synthesizing') {\n // Ensure original output ends with a newline before challenger block.\n if (originalHeaderPrinted) process.stdout.write('\\n')\n if (challengerAdapter) {\n const challengerResult = results.get(challengerAdapter.id)\n process.stdout.write(`\\nCHALLENGER (${challengerAdapter.id})\\n`)\n process.stdout.write(`${challengerResult?.text ?? ''}\\n`)\n }\n process.stdout.write('\\nSYNTHESIS (judge)\\n')\n }\n\n if (event.type === 'synthesis_chunk' && !event.chunk.isFinal) {\n synthBuffer += event.chunk.delta\n process.stdout.write(event.chunk.delta)\n }\n\n if (event.type === 'synthesis_complete') {\n synthScore = event.result.agreementScore\n process.stdout.write('\\n')\n if (synthScore !== undefined) {\n process.stdout.write(`\\nAgreement score: ${synthScore}%\\n`)\n }\n }\n\n if (event.type === 'all_complete') {\n // Print challenger if judge pass didn't already do it\n if (!judgeAdapter) {\n if (originalHeaderPrinted) process.stdout.write('\\n')\n if (challengerAdapter) {\n const challengerResult = results.get(challengerAdapter.id)\n process.stdout.write(`\\nCHALLENGER (${challengerAdapter.id})\\n`)\n process.stdout.write(`${challengerResult?.text ?? ''}\\n`)\n }\n }\n }\n\n if (event.type === 'error') throw event.error\n }\n\n const originalResult = results.get(originalAdapter.id)\n if (originalResult) {\n addHistoryEntry({\n id: entryId,\n createdAt,\n question: fullQuestion,\n original: originalResult,\n challenger: challengerAdapter ? results.get(challengerAdapter.id) : undefined,\n intent: intentResult,\n })\n }\n } catch (error) {\n process.stderr.write(`Failed to run mirror: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n","import { execFile } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { promisify } from 'node:util'\nimport { loadConfig, saveConfig, setConfigValue } from '../../config/loader.js'\nimport type { AppConfig } from '../../config/schema.js'\n\nconst execFileAsync = promisify(execFile)\n\nexport function runConfigShow(): void {\n const config = loadConfig()\n process.stdout.write(JSON.stringify(config, null, 2))\n process.stdout.write('\\n')\n}\n\nexport async function runConfigInit(): Promise<void> {\n const rl = createInterface({ input, output })\n\n try {\n const config = loadConfig()\n if (config.brains.length === 0) {\n throw new Error('No brains configured. Run mirror brains add first.')\n }\n const intensity = (await askRequired(\n rl,\n `Default intensity (mild|moderate|aggressive) [${config.session.defaultIntensity}]: `,\n config.session.defaultIntensity\n )) as AppConfig['session']['defaultIntensity']\n\n if (!['mild', 'moderate', 'aggressive'].includes(intensity)) {\n throw new Error(`Invalid intensity: ${intensity}`)\n }\n\n const layout = (await askRequired(\n rl,\n `Layout (side-by-side|stacked) [${config.ui.layout}]: `,\n config.ui.layout\n )) as AppConfig['ui']['layout']\n\n if (!['side-by-side', 'stacked'].includes(layout)) {\n throw new Error(`Invalid layout: ${layout}`)\n }\n\n const showTokenCounts = await askYesNo(\n rl,\n `Show token counts? (y/n) [${config.ui.showTokenCounts ? 'y' : 'n'}]: `,\n config.ui.showTokenCounts\n )\n\n const showLatency = await askYesNo(\n rl,\n `Show latency? (y/n) [${config.ui.showLatency ? 'y' : 'n'}]: `,\n config.ui.showLatency\n )\n\n const syntaxHighlighting = await askYesNo(\n rl,\n `Syntax highlighting? (y/n) [${config.ui.syntaxHighlighting ? 'y' : 'n'}]: `,\n config.ui.syntaxHighlighting\n )\n\n const autoClassify = await askYesNo(\n rl,\n `Auto-classify intent? (y/n) [${config.session.autoClassify ? 'y' : 'n'}]: `,\n config.session.autoClassify\n )\n\n const historyWindowSize = Number(\n await askRequired(\n rl,\n `History window size [${config.session.historyWindowSize}]: `,\n String(config.session.historyWindowSize)\n )\n )\n\n if (!Number.isInteger(historyWindowSize) || historyWindowSize <= 0) {\n throw new Error('History window size must be a positive integer.')\n }\n\n const availableBrains = config.brains.map((brain) => brain.id).join(', ')\n const originalBrainId = await askRequired(\n rl,\n `Original brain id (${availableBrains}) [${config.session.originalBrainId}]: `,\n config.session.originalBrainId\n )\n\n const challengerBrainId = await askRequired(\n rl,\n `Challenger brain id (${availableBrains}) [${config.session.challengerBrainId}]: `,\n config.session.challengerBrainId\n )\n\n if (!config.brains.some((brain) => brain.id === originalBrainId)) {\n throw new Error(`Unknown original brain id: ${originalBrainId}`)\n }\n if (!config.brains.some((brain) => brain.id === challengerBrainId)) {\n throw new Error(`Unknown challenger brain id: ${challengerBrainId}`)\n }\n\n const judgeEnabled = await askYesNo(\n rl,\n `Enable judge synthesis pass? (y/n) [${config.session.judgeEnabled ? 'y' : 'n'}]: `,\n config.session.judgeEnabled\n )\n\n let judgeBrainId = config.session.judgeBrainId\n if (judgeEnabled) {\n judgeBrainId = await askRequired(\n rl,\n `Judge brain id (${availableBrains}) [${config.session.judgeBrainId}]: `,\n config.session.judgeBrainId\n )\n if (!config.brains.some((brain) => brain.id === judgeBrainId)) {\n throw new Error(`Unknown judge brain id: ${judgeBrainId}`)\n }\n }\n\n const personaNames = 'vc-skeptic|security-auditor|end-user|regulator|contrarian'\n const currentPersona = config.session.defaultPersona ?? 'none'\n const personaAnswer = await askOptional(\n rl,\n `Default persona (${personaNames}|none) [${currentPersona}]: `,\n currentPersona\n )\n const defaultPersona = (personaAnswer === 'none' || !personaAnswer) ? undefined : personaAnswer\n\n const updatedKeys = await promptForApiKeys(rl, config)\n if (Object.keys(updatedKeys).length > 0) {\n const persist = await askYesNo(\n rl,\n 'Persist API keys to environment variables? (y/n) [y]: ',\n true\n )\n if (persist) {\n await persistEnvVars(updatedKeys)\n process.stdout.write(\n 'Keys saved. Open a new terminal session to pick them up.\\n'\n )\n }\n }\n\n await validateGeminiModels(rl, config, updatedKeys)\n\n saveConfig({\n ...config,\n session: {\n ...config.session,\n originalBrainId,\n challengerBrainId,\n defaultIntensity: intensity,\n historyWindowSize,\n autoClassify,\n judgeEnabled,\n judgeBrainId,\n defaultPersona,\n },\n ui: {\n ...config.ui,\n layout,\n showTokenCounts,\n showLatency,\n syntaxHighlighting\n }\n })\n\n process.stdout.write('Config saved.\\n')\n } catch (error) {\n process.stderr.write(\n `Failed to initialize config: ${(error as Error).message}\\n`\n )\n process.exit(1)\n } finally {\n rl.close()\n }\n}\n\nexport function runConfigSet(key: string, value: string): void {\n try {\n const parsed = parseValue(value)\n const updated = setConfigValue(key, parsed)\n process.stdout.write(JSON.stringify(updated, null, 2))\n process.stdout.write('\\n')\n } catch (error) {\n process.stderr.write(`Failed to set config: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n\nfunction parseValue(value: string): unknown {\n const trimmed = value.trim()\n if (!trimmed) {\n return value\n }\n\n if (trimmed === 'true') return true\n if (trimmed === 'false') return false\n if (!Number.isNaN(Number(trimmed))) return Number(trimmed)\n\n try {\n return JSON.parse(trimmed)\n } catch {\n return value\n }\n}\n\nasync function askRequired(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback?: string\n): Promise<string> {\n const answer = (await rl.question(prompt)).trim()\n if (answer) {\n return answer\n }\n if (fallback) {\n return fallback\n }\n return askRequired(rl, prompt, fallback)\n}\n\nasync function askOptional(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback: string\n): Promise<string> {\n const answer = (await rl.question(prompt)).trim()\n return answer || fallback\n}\n\nasync function askYesNo(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback: boolean\n): Promise<boolean> {\n const answer = (await rl.question(prompt)).trim().toLowerCase()\n if (!answer) {\n return fallback\n }\n if (['y', 'yes'].includes(answer)) {\n return true\n }\n if (['n', 'no'].includes(answer)) {\n return false\n }\n return askYesNo(rl, prompt, fallback)\n}\n\nasync function promptForApiKeys(\n rl: ReturnType<typeof createInterface>,\n config: AppConfig\n): Promise<Record<string, string>> {\n const updated: Record<string, string> = {}\n const uniqueEnvVars = Array.from(\n new Set(config.brains.map((brain) => brain.apiKeyEnvVar))\n )\n\n process.stdout.write('\\nAPI key setup (stored in environment variables):\\n')\n\n for (const envVar of uniqueEnvVars) {\n const alreadySet = Boolean(process.env[envVar])\n const shouldSet = await askYesNo(\n rl,\n `${envVar} ${alreadySet ? '(already set)' : '(missing)'} - set now? (y/n) [${\n alreadySet ? 'n' : 'y'\n }]: `,\n !alreadySet\n )\n if (!shouldSet) {\n continue\n }\n\n const secret = await askSecret(rl, `Enter value for ${envVar}: `)\n if (!secret) {\n continue\n }\n process.env[envVar] = secret\n updated[envVar] = secret\n }\n\n return updated\n}\n\nasync function askSecret(\n rl: ReturnType<typeof createInterface>,\n prompt: string\n): Promise<string> {\n if (!input.isTTY) {\n return askRequired(rl, prompt)\n }\n\n output.write(prompt)\n rl.pause()\n input.setRawMode(true)\n input.resume()\n\n let value = ''\n\n return new Promise((resolve) => {\n const onData = (chunk: Buffer) => {\n const char = chunk.toString()\n if (char === '\\r' || char === '\\n') {\n input.setRawMode(false)\n input.pause()\n input.removeListener('data', onData)\n output.write('\\n')\n rl.resume()\n resolve(value)\n return\n }\n if (char === '\\u0003') {\n process.exit(1)\n }\n if (char === '\\u0008' || char === '\\u007f') {\n value = value.slice(0, -1)\n return\n }\n value += char\n }\n\n input.on('data', onData)\n })\n}\n\nasync function persistEnvVars(vars: Record<string, string>): Promise<void> {\n if (process.platform === 'win32') {\n for (const [key, value] of Object.entries(vars)) {\n await execFileAsync('setx', [key, value])\n }\n return\n }\n\n process.stdout.write(\n 'Non-Windows detected. Please export your keys in your shell profile.\\n'\n )\n}\n\nasync function validateGeminiModels(\n rl: ReturnType<typeof createInterface>,\n config: AppConfig,\n updatedKeys: Record<string, string>\n): Promise<void> {\n const geminiBrains = config.brains.filter((brain) => brain.provider === 'gemini')\n if (geminiBrains.length === 0) {\n return\n }\n\n const geminiEnvVar = geminiBrains[0].apiKeyEnvVar\n const apiKey = updatedKeys[geminiEnvVar] ?? process.env[geminiEnvVar]\n if (!apiKey) {\n return\n }\n\n const shouldCheck = await askYesNo(\n rl,\n 'Check Gemini model availability now? (y/n) [y]: ',\n true\n )\n if (!shouldCheck) {\n return\n }\n\n try {\n const models = await listGeminiModels(apiKey)\n const supported = models.filter((model) =>\n model.supportedGenerationMethods.some((method) =>\n ['generateContent', 'streamGenerateContent'].includes(method)\n )\n )\n\n for (const brain of geminiBrains) {\n const exists = supported.some((model) => model.name.endsWith(`/${brain.model}`))\n if (exists) {\n continue\n }\n process.stdout.write(\n `Gemini model not found for ${brain.id}: ${brain.model}\\n`\n )\n const suggestion = supported.find((model) =>\n model.name.endsWith('/gemini-2.5-pro')\n )\n const recommended = suggestion?.name.split('/').pop() ?? 'gemini-2.5-pro'\n const nextModel = await askRequired(\n rl,\n `Enter a supported Gemini model [${recommended}]: `,\n recommended\n )\n brain.model = nextModel\n }\n } catch (error) {\n process.stderr.write(\n `Failed to validate Gemini models: ${(error as Error).message}\\n`\n )\n }\n}\n\nasync function listGeminiModels(apiKey: string): Promise<GeminiModel[]> {\n const res = await fetch(\n `https://generativelanguage.googleapis.com/v1beta/models?key=${apiKey}`\n )\n if (!res.ok) {\n throw new Error(`Gemini ListModels failed: ${res.status}`)\n }\n const data = (await res.json()) as { models?: GeminiModel[] }\n return data.models ?? []\n}\n\ninterface GeminiModel {\n name: string\n supportedGenerationMethods: string[]\n}\n","import { createInterface } from 'node:readline/promises'\nimport { stdin as input, stdout as output } from 'node:process'\nimport { createAdapter } from '../../brains/factory.js'\nimport { loadConfig, saveConfig } from '../../config/loader.js'\nimport type { BrainConfig } from '../../config/schema.js'\n\nexport function runBrainsList(): void {\n const config = loadConfig()\n const lines = config.brains.map(\n (brain) =>\n `${brain.id}\\t${brain.provider}\\t${brain.model}\\t${brain.apiKeyEnvVar}`\n )\n\n if (lines.length === 0) {\n process.stdout.write('No brains configured.\\n')\n return\n }\n\n process.stdout.write('ID\\tPROVIDER\\tMODEL\\tAPI_KEY_ENV\\n')\n process.stdout.write(`${lines.join('\\n')}\\n`)\n}\n\nexport async function runBrainsTest(id: string): Promise<void> {\n try {\n const config = loadConfig()\n const brain = config.brains.find((entry) => entry.id === id)\n if (!brain) {\n throw new Error(`Brain not found: ${id}`)\n }\n\n const adapter = createAdapter(brain)\n const result = await adapter.ping()\n if (!result.ok) {\n throw new Error(result.error ?? 'Ping failed')\n }\n\n process.stdout.write(\n `Brain ${id} ok${result.latencyMs ? ` (${result.latencyMs}ms)` : ''}\\n`\n )\n } catch (error) {\n process.stderr.write(`Brain test failed: ${(error as Error).message}\\n`)\n process.exit(1)\n }\n}\n\nexport async function runBrainsAdd(): Promise<void> {\n const rl = createInterface({ input, output })\n\n try {\n const config = loadConfig()\n\n const id = await askRequired(rl, 'Brain id (unique): ')\n if (config.brains.some((brain) => brain.id === id)) {\n throw new Error(`Brain id already exists: ${id}`)\n }\n\n const provider = (await askRequired(\n rl,\n 'Provider (anthropic|openai|gemini|mock): '\n )) as BrainConfig['provider']\n\n if (!['anthropic', 'openai', 'gemini', 'mock'].includes(provider)) {\n throw new Error(`Unsupported provider: ${provider}`)\n }\n\n const model = await askRequired(rl, 'Model name: ')\n const suggestedEnv = defaultEnvVar(provider)\n const apiKeyEnvVar = await askRequired(\n rl,\n `API key env var (${suggestedEnv}): `,\n suggestedEnv\n )\n\n const next: BrainConfig = {\n id,\n provider,\n model,\n apiKeyEnvVar\n }\n\n saveConfig({\n ...config,\n brains: [...config.brains, next]\n })\n\n process.stdout.write(`Added brain ${id}.\\n`)\n } catch (error) {\n process.stderr.write(`Failed to add brain: ${(error as Error).message}\\n`)\n process.exit(1)\n } finally {\n rl.close()\n }\n}\n\nasync function askRequired(\n rl: ReturnType<typeof createInterface>,\n prompt: string,\n fallback?: string\n): Promise<string> {\n const answer = (await rl.question(prompt)).trim()\n if (answer) {\n return answer\n }\n if (fallback) {\n return fallback\n }\n return askRequired(rl, prompt, fallback)\n}\n\nfunction defaultEnvVar(provider: BrainConfig['provider']): string {\n switch (provider) {\n case 'anthropic':\n return 'ANTHROPIC_API_KEY'\n case 'openai':\n return 'OPENAI_API_KEY'\n case 'gemini':\n return 'GOOGLE_API_KEY'\n case 'mock':\n return 'MOCK_API_KEY'\n default:\n return 'API_KEY'\n }\n}\n","import { writeFile } from 'node:fs/promises'\nimport { getHistory, listHistory } from '../../history/store.js'\n\nexport function runHistoryList(): void {\n const entries = listHistory()\n if (entries.length === 0) {\n process.stdout.write('No history yet.\\n')\n return\n }\n\n process.stdout.write('ID\\tCREATED\\tQUESTION\\n')\n for (const entry of entries) {\n const question = entry.question.length > 80\n ? `${entry.question.slice(0, 77)}...`\n : entry.question\n process.stdout.write(`${entry.id}\\t${entry.createdAt}\\t${question}\\n`)\n }\n}\n\nexport function runHistoryShow(id: string): void {\n const entry = getHistory(id)\n if (!entry) {\n process.stderr.write(`History entry not found: ${id}\\n`)\n process.exit(1)\n }\n\n process.stdout.write(JSON.stringify(entry, null, 2))\n process.stdout.write('\\n')\n}\n\nexport async function runHistoryExport(id: string, file: string): Promise<void> {\n const entry = getHistory(id)\n if (!entry) {\n process.stderr.write(`History entry not found: ${id}\\n`)\n process.exit(1)\n }\n\n const payload = JSON.stringify(entry, null, 2)\n await writeFile(file, payload)\n process.stdout.write(`Exported history ${id} to ${file}.\\n`)\n}\n"],"mappings":"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","names":["readFileSync","React","response","config","config","input","config","history","index","result","resolve","Box","Text","Conf","store","Text","jsx","jsxs","Text","jsx","jsxs","jsx","jsxs","Text","HeaderView","Box","ExchangeView","input","output","history","config","readFileSync","React","randomUUID","readFileSync","basename","resolve","config","readFileSync","basename","randomUUID","config","resolve","createInterface","input","output","config","createInterface","input","output","askRequired"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "adversarial-mirror",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "description": "Terminal-first adversarial AI middleware. Routes open-ended prompts to two models in parallel, forces a challenger to surface blind spots, and synthesizes a verdict.",
5
5
  "author": "Stephen Marullo",
6
6
  "license": "MIT",