@wrongstack/core 0.1.7 → 0.1.9

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/color.ts","../../src/defaults/logger.ts","../../src/defaults/path-resolver.ts","../../src/defaults/token-counter.ts","../../src/utils/atomic-write.ts","../../src/defaults/session-store.ts","../../src/defaults/queue-store.ts","../../src/defaults/attachment-store.ts","../../src/defaults/memory-store.ts","../../src/defaults/secret-scrubber.ts","../../src/types/secret-vault.ts","../../src/defaults/secret-vault.ts","../../src/utils/glob-match.ts","../../src/utils/safe-json.ts","../../src/defaults/permission-policy.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/defaults/retry-policy.ts","../../src/defaults/error-handler.ts","../../src/defaults/skill-loader.ts","../../src/defaults/config-loader.ts","../../src/defaults/config-store.ts","../../src/defaults/config-migration.ts","../../src/utils/token-estimate.ts","../../src/defaults/compactor.ts","../../src/types/blocks.ts","../../src/defaults/intelligent-compactor.ts","../../src/defaults/llm-selector.ts","../../src/defaults/selective-compactor.ts","../../src/defaults/auto-compaction-middleware.ts","../../src/defaults/models-registry.ts","../../src/types/mode.ts","../../src/defaults/mode-store.ts","../../src/defaults/subagent-budget.ts","../../src/defaults/multi-agent-coordinator.ts","../../src/defaults/agent-subagent-runner.ts","../../src/defaults/transport/in-memory-transport.ts","../../src/defaults/agent-bridge.ts","../../src/defaults/autonomous-runner.ts","../../src/defaults/spec-parser.ts","../../src/defaults/task-generator.ts","../../src/types/task-graph.ts","../../src/defaults/task-tracker.ts","../../src/defaults/task-flow.ts","../../src/defaults/recovery-lock.ts","../../src/utils/tool-output-serializer.ts","../../src/defaults/tool-executor.ts","../../src/defaults/session-reader.ts","../../src/defaults/observability/metrics.ts","../../src/defaults/observability/health.ts","../../src/defaults/observability/tracer.ts","../../src/defaults/observability/otel-tracer.ts","../../src/defaults/observability/event-bridge.ts","../../src/defaults/observability/prometheus.ts","../../src/defaults/observability/otlp-metrics.ts","../../src/defaults/observability/otlp-traces.ts","../../src/defaults/context-manager.ts","../../src/defaults/mcp-servers.ts"],"names":["open","fs","path","fs2","path3","fs3","stat","randomBytes","path4","path5","fsp2","fsp3","path6","fs4","path7","path8","fsp4","fs6","fs7","path9","FORBIDDEN_PROTO_KEYS","deepMerge","fs8","afterTokens","fs9","path10","path11","fs10","handlers","resolve","randomUUID","path12","fsp5","DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint"],"mappings":"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","file":"index.js","sourcesContent":["const isColorTty = (): boolean => {\n if (process.env.NO_COLOR) return false;\n if (process.env.FORCE_COLOR) return true;\n return Boolean(process.stdout?.isTTY);\n};\n\nconst COLOR = isColorTty();\n\nconst wrap = (open: string, close: string) =>\n (s: string): string =>\n COLOR ? `\\x1b[${open}m${s}\\x1b[${close}m` : s;\n\nexport const color = {\n reset: wrap('0', '0'),\n bold: wrap('1', '22'),\n dim: wrap('2', '22'),\n italic: wrap('3', '23'),\n underline: wrap('4', '24'),\n red: wrap('31', '39'),\n green: wrap('32', '39'),\n yellow: wrap('33', '39'),\n blue: wrap('34', '39'),\n magenta: wrap('35', '39'),\n cyan: wrap('36', '39'),\n gray: wrap('90', '39'),\n amber: wrap('38;5;214', '39'),\n pink: wrap('38;5;205', '39'),\n bgRed: wrap('41', '49'),\n bgGreen: wrap('42', '49'),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape regex\n /\\x1b\\[[0-9;]*[A-Za-z]/g,\n '',\n );\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { color } from '../utils/color.js';\nimport type { Logger, LogLevel } from '../types/logger.js';\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\nconst COLORS: Record<LogLevel, (s: string) => string> = {\n error: color.red,\n warn: color.yellow,\n info: color.cyan,\n debug: color.gray,\n trace: color.dim,\n};\n\nexport interface DefaultLoggerOptions {\n level?: LogLevel;\n file?: string;\n pretty?: boolean;\n bindings?: Record<string, unknown>;\n}\n\nexport class DefaultLogger implements Logger {\n level: LogLevel;\n private readonly file?: string;\n private readonly bindings: Record<string, unknown>;\n private readonly pretty: boolean;\n\n constructor(opts: DefaultLoggerOptions = {}) {\n this.level = opts.level ?? (process.env.WRONGSTACK_LOG_LEVEL as LogLevel) ?? 'info';\n this.file = opts.file;\n this.bindings = opts.bindings ?? {};\n this.pretty = opts.pretty ?? true;\n if (this.file) {\n try {\n fs.mkdirSync(path.dirname(this.file), { recursive: true });\n } catch {\n // best-effort\n }\n }\n }\n\n error(msg: string, ctx?: unknown): void {\n this.log('error', msg, ctx);\n }\n warn(msg: string, ctx?: unknown): void {\n this.log('warn', msg, ctx);\n }\n info(msg: string, ctx?: unknown): void {\n this.log('info', msg, ctx);\n }\n debug(msg: string, ctx?: unknown): void {\n this.log('debug', msg, ctx);\n }\n trace(msg: string, ctx?: unknown): void {\n this.log('trace', msg, ctx);\n }\n\n child(bindings: Record<string, unknown>): Logger {\n return new DefaultLogger({\n level: this.level,\n file: this.file,\n pretty: this.pretty,\n bindings: { ...this.bindings, ...bindings },\n });\n }\n\n private log(level: LogLevel, msg: string, ctx?: unknown): void {\n const r = LEVEL_RANK[level];\n const allowed = LEVEL_RANK[this.level];\n if (r > allowed) return;\n const ts = new Date().toISOString();\n const entry: Record<string, unknown> = { ts, level, msg, ...this.bindings };\n if (ctx !== undefined) {\n entry.ctx = ctx instanceof Error ? { message: ctx.message, stack: ctx.stack } : ctx;\n }\n // Disk: JSON line\n if (this.file) {\n try {\n fs.appendFileSync(this.file, `${JSON.stringify(entry)}\\n`);\n } catch {\n // ignore\n }\n }\n // Stderr: pretty or json\n if (r <= LEVEL_RANK.warn || this.level === 'debug' || this.level === 'trace') {\n const head = `${color.dim(ts)} ${COLORS[level](level.toUpperCase().padEnd(5))} ${msg}`;\n if (ctx !== undefined) {\n process.stderr.write(`${head} ${formatCtx(ctx)}\\n`);\n } else {\n process.stderr.write(`${head}\\n`);\n }\n }\n }\n}\n\nfunction formatCtx(ctx: unknown): string {\n if (ctx instanceof Error) return color.dim(ctx.message);\n if (typeof ctx === 'string') return color.dim(ctx);\n try {\n return color.dim(JSON.stringify(ctx));\n } catch {\n return color.dim(String(ctx));\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PathResolver } from '../types/path-resolver.js';\n\nconst PROJECT_MARKERS = [\n '.git',\n 'package.json',\n 'pnpm-workspace.yaml',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n '.wrongstack',\n];\n\nexport class DefaultPathResolver implements PathResolver {\n readonly projectRoot: string;\n readonly cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = path.resolve(cwd);\n this.projectRoot = this.detectProjectRoot(this.cwd);\n }\n\n detectProjectRoot(start: string): string {\n let dir = path.resolve(start);\n const root = path.parse(dir).root;\n while (dir !== root) {\n for (const marker of PROJECT_MARKERS) {\n try {\n fs.accessSync(path.join(dir, marker));\n return dir;\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return path.resolve(start);\n }\n\n resolve(input: string): string {\n const abs = path.isAbsolute(input) ? input : path.resolve(this.cwd, input);\n let real: string;\n try {\n real = fs.realpathSync(abs);\n } catch {\n // path doesn't exist yet; normalize without resolving symlinks\n real = path.normalize(abs);\n }\n return real;\n }\n\n isInsideRoot(absPath: string): boolean {\n const normalized = path.normalize(absPath);\n const root = path.normalize(this.projectRoot);\n if (normalized === root) return true;\n const rel = path.relative(root, normalized);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n }\n\n ensureInsideRoot(absPath: string): string {\n const resolved = this.resolve(absPath);\n if (!this.isInsideRoot(resolved)) {\n // Render the input as a project-relative-looking string when possible\n // so the error message can flow through telemetry / LLM transcripts\n // without leaking the absolute project root layout.\n const display = path.isAbsolute(absPath)\n ? path.basename(absPath)\n : absPath;\n const err = new Error(`Path \"${display}\" resolves outside the project root`);\n // Keep the full information available to programmatic callers; only\n // the user-facing `message` is sanitized.\n (err as Error & { fullPath?: string; projectRoot?: string }).fullPath = absPath;\n (err as Error & { fullPath?: string; projectRoot?: string }).projectRoot = this.projectRoot;\n throw err;\n }\n return resolved;\n }\n}\n","import type { CacheStats, TokenCounter } from '../types/token-counter.js';\nimport type { Usage } from '../types/provider.js';\nimport type { ModelsRegistry, ResolvedModel } from '../types/models-registry.js';\nimport type { EventBus } from '../kernel/events.js';\n\ninterface PriceEntry {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\n/**\n * Token counter that derives pricing from the ModelsRegistry instead of a\n * hardcoded table. If a model is unknown to the registry (or the registry is\n * unavailable) the counter still tracks token totals but reports zero cost.\n */\nexport class DefaultTokenCounter implements TokenCounter {\n private input = 0;\n private output = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private costInput = 0;\n private costOutput = 0;\n private readonly registry?: ModelsRegistry;\n private readonly providerId?: string;\n private readonly events?: EventBus;\n private priceCache = new Map<string, PriceEntry>();\n\n constructor(opts: { registry?: ModelsRegistry; providerId?: string; events?: EventBus } = {}) {\n this.registry = opts.registry;\n this.providerId = opts.providerId;\n this.events = opts.events;\n }\n\n account(usage: Usage, model?: string): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n\n const price = model ? this.priceCache.get(model) : undefined;\n if (price) {\n this.applyPrice(usage, price);\n } else if (this.registry && this.providerId && model) {\n // Async lookup — populate cache, but don't block this call.\n void this.registry\n .getModel(this.providerId, model)\n .then((m) => {\n if (m) {\n const p = priceFromModel(m);\n this.priceCache.set(model, p);\n this.applyPrice(usage, p);\n }\n })\n .catch(() => {\n // Emit so observability tooling can detect unknown models.\n this.events?.emit('token.cost_estimate_unavailable', { model: model ?? '<unknown>' });\n return undefined;\n });\n }\n }\n\n /** Synchronous variant for code paths that have already resolved the model. */\n accountWithModel(usage: Usage, resolved: ResolvedModel): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n const price = priceFromModel(resolved);\n this.priceCache.set(resolved.modelId, price);\n this.applyPrice(usage, price);\n }\n\n total(): Usage {\n return {\n input: this.input,\n output: this.output,\n cacheRead: this.cacheRead,\n cacheWrite: this.cacheWrite,\n };\n }\n\n estimateCost(): { input: number; output: number; total: number; currency: 'USD' } {\n return {\n input: round4(this.costInput),\n output: round4(this.costOutput),\n total: round4(this.costInput + this.costOutput),\n currency: 'USD',\n };\n }\n\n cacheStats(): CacheStats {\n // Hit ratio: cacheRead / (cacheRead + input). `input` from the provider\n // is the count of fresh-token reads, so this answers \"what fraction of\n // the prompt did we get for the cache price?\"\n const denom = this.cacheRead + this.input;\n return {\n readTokens: this.cacheRead,\n writeTokens: this.cacheWrite,\n hitRatio: denom === 0 ? 0 : this.cacheRead / denom,\n };\n }\n\n /** Invalidate cached prices so the next account() call fetches fresh data. */\n invalidateCache(): void {\n this.priceCache.clear();\n }\n\n reset(): void {\n this.input = 0;\n this.output = 0;\n this.cacheRead = 0;\n this.cacheWrite = 0;\n this.costInput = 0;\n this.costOutput = 0;\n }\n\n private applyPrice(usage: Usage, price: PriceEntry): void {\n if (price.input) this.costInput += (usage.input / 1_000_000) * price.input;\n if (price.output) this.costOutput += (usage.output / 1_000_000) * price.output;\n if (usage.cacheRead && price.cacheRead) {\n this.costInput += (usage.cacheRead / 1_000_000) * price.cacheRead;\n }\n if (usage.cacheWrite && price.cacheWrite) {\n this.costInput += (usage.cacheWrite / 1_000_000) * price.cacheWrite;\n }\n }\n}\n\nfunction priceFromModel(m: ResolvedModel): PriceEntry {\n return {\n input: m.cost?.input,\n output: m.cost?.output,\n cacheRead: m.cost?.cache_read,\n cacheWrite: m.cost?.cache_write,\n };\n}\n\nfunction round4(n: number): number {\n return Math.round(n * 10_000) / 10_000;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n // target may not exist yet; mode stays undefined\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await fs.rename(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport type { EventBus } from '../kernel/events.js';\nimport type {\n ResumedSession,\n SessionData,\n SessionEvent,\n SessionMetadata,\n SessionStore,\n SessionSummary,\n SessionWriter,\n} from '../types/session.js';\nimport type { Message } from '../types/messages.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\nexport interface SessionStoreOptions {\n dir: string;\n /** Optional EventBus for emitting session diagnostics. */\n events?: EventBus;\n}\n\nexport class DefaultSessionStore implements SessionStore {\n private readonly dir: string;\n private readonly events?: EventBus;\n\n constructor(opts: SessionStoreOptions) {\n this.dir = opts.dir;\n this.events = opts.events;\n }\n\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\n await ensureDir(this.dir);\n const startedAt = new Date().toISOString();\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n // Preserve cause + errno so callers can branch on EACCES vs EMFILE\n // vs ENOSPC etc. instead of substring-matching the error message.\n throw new Error(`Failed to open session file: ${err instanceof Error ? err.message : String(err)}`, {\n cause: err,\n });\n }\n try {\n return new FileSessionWriter(id, handle, startedAt, meta, { dir: this.dir, filePath: file });\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async resume(id: string): Promise<ResumedSession> {\n const data = await this.load(id);\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n const writer = new FileSessionWriter(\n id,\n handle,\n new Date().toISOString(),\n {\n id,\n model: data.metadata.model,\n provider: data.metadata.provider,\n },\n { resumed: true, dir: this.dir, filePath: file },\n );\n return { writer, data };\n }\n\n async load(id: string): Promise<SessionData> {\n const file = path.join(this.dir, `${id}.jsonl`);\n const raw = await fsp.readFile(file, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.trim());\n const events: SessionEvent[] = [];\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n // Session JSONL is on-disk user-writable state; downstream replay\n // trusts `e.type` / `e.ts` etc. and would TypeError on a malformed\n // shape. Validate the discriminator + timestamp before pushing.\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string' &&\n typeof (parsed as { ts?: unknown }).ts === 'string'\n ) {\n events.push(parsed as SessionEvent);\n }\n // else: skip — a hand-edited file with a partial object should not\n // crash replay, just lose that one event.\n } catch {\n // skip malformed JSON\n }\n }\n const meta = this.metaFromEvents(id, events);\n const { messages, usage } = this.replay(events, id);\n return { metadata: meta, events, messages, usage };\n }\n\n async list(limit = 20): Promise<SessionSummary[]> {\n try {\n await ensureDir(this.dir);\n const files = await fsp.readdir(this.dir);\n const ids = files\n .filter((f) => f.endsWith('.jsonl'))\n .map((f) => f.replace(/\\.jsonl$/, ''));\n // Read all manifests in parallel; fall back to full load only for\n // sessions that haven't been closed cleanly (or predate the manifest).\n const sessions = await Promise.all(\n ids.map((id) => this.summaryFor(id).catch(() => null)),\n );\n const out = sessions.filter((s): s is SessionSummary => s !== null);\n out.sort((a, b) => {\n if (a.startedAt < b.startedAt) return 1;\n if (a.startedAt > b.startedAt) return -1;\n // Equal timestamps — use id as tiebreaker for stable sort\n return a.id.localeCompare(b.id);\n });\n return out.slice(0, limit);\n } catch {\n return [];\n }\n }\n\n private async summaryFor(id: string): Promise<SessionSummary> {\n const manifest = path.join(this.dir, `${id}.summary.json`);\n try {\n const raw = await fsp.readFile(manifest, 'utf8');\n return JSON.parse(raw) as SessionSummary;\n } catch {\n // Manifest missing/corrupt — fall back to a full parse and backfill\n // the manifest so the next `list()` hits the fast path.\n const full = path.join(this.dir, `${id}.jsonl`);\n const stat = await fsp.stat(full);\n const summary = await this.summarize(id, stat.mtime.toISOString());\n await fsp.writeFile(manifest, JSON.stringify(summary), { mode: 0o600 }).catch(() => undefined);\n return summary;\n }\n }\n\n async delete(id: string): Promise<void> {\n await fsp.unlink(path.join(this.dir, `${id}.jsonl`));\n await fsp.unlink(path.join(this.dir, `${id}.summary.json`)).catch(() => undefined);\n }\n\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\n try {\n const data = await this.load(id);\n const firstUser = data.events.find((e) => e.type === 'user_input');\n const title =\n firstUser && firstUser.type === 'user_input'\n ? userInputTitle(firstUser.content)\n : '(empty session)';\n return {\n id,\n title,\n startedAt: data.metadata.startedAt,\n model: data.metadata.model ?? 'unknown',\n provider: data.metadata.provider ?? 'unknown',\n tokenTotal: data.usage.input + data.usage.output,\n };\n } catch {\n return {\n id,\n title: '(damaged)',\n startedAt: mtime,\n model: 'unknown',\n provider: 'unknown',\n tokenTotal: 0,\n };\n }\n }\n\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\n const start = events.find((e) => e.type === 'session_start');\n const end = events.find((e) => e.type === 'session_end');\n return {\n id,\n startedAt: start?.ts ?? new Date(0).toISOString(),\n endedAt: end?.ts,\n model: start?.model,\n provider: start?.provider,\n };\n }\n\n private replay(events: SessionEvent[], sessionId = 'unknown'): { messages: Message[]; usage: SessionData['usage'] } {\n const messages: Message[] = [];\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n const openToolUses = new Set<string>();\n for (const e of events) {\n if (e.type === 'user_input') {\n openToolUses.clear();\n messages.push({ role: 'user', content: e.content });\n } else if (e.type === 'llm_response') {\n messages.push({ role: 'assistant', content: e.content });\n for (const b of e.content) {\n if (b.type === 'tool_use') openToolUses.add(b.id);\n }\n usage = {\n input: usage.input + (e.usage.input ?? 0),\n output: usage.output + (e.usage.output ?? 0),\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\n };\n } else if (e.type === 'tool_result') {\n if (!openToolUses.has(e.id)) {\n // Orphan tool_result: tool_use was never seen. Skip to avoid\n // corrupting the replayed message sequence.\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\n });\n continue;\n }\n openToolUses.delete(e.id);\n const content: ContentBlock[] = [\n {\n type: 'tool_result',\n tool_use_id: e.id,\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\n is_error: e.isError,\n },\n ];\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n if (Array.isArray(last.content)) {\n last.content.push(...content);\n } else if (typeof last.content === 'string') {\n // Convert string content to blocks and append\n last.content = [{ type: 'text', text: last.content }, ...content];\n } else {\n messages.push({ role: 'user', content });\n }\n } else {\n messages.push({ role: 'user', content });\n }\n }\n }\n if (openToolUses.size > 0) {\n throw new Error(\n `Session damaged: ${openToolUses.size} tool_use blocks without matching results`,\n );\n }\n return { messages, usage };\n }\n}\n\nclass FileSessionWriter implements SessionWriter {\n private closed = false;\n private manifestFile: string;\n private summary: SessionSummary;\n private tokenIn = 0;\n private tokenOut = 0;\n private readonly filePath: string;\n private initDone = false;\n private readonly resumed: boolean;\n private appendFailCount = 0;\n private lastAppendWarnAt = 0;\n\n constructor(\n public readonly id: string,\n private readonly handle: fsp.FileHandle,\n private readonly startedAt: string,\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\n opts: { resumed?: boolean; dir?: string; filePath?: string } = {},\n ) {\n this.resumed = opts.resumed ?? false;\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\n this.filePath = opts.filePath ?? '';\n this.summary = {\n id,\n title: '(empty session)',\n startedAt,\n model: meta.model ?? 'unknown',\n provider: meta.provider ?? 'unknown',\n tokenTotal: 0,\n };\n // Session start is written lazily on first append to avoid sync I/O\n // in constructor and eliminate reliance on FileHandle.fd private property.\n }\n\n private async writeSessionStart(): Promise<void> {\n if (this.initDone || this.closed) return;\n this.initDone = true;\n const record = `${JSON.stringify({\n type: this.resumed ? 'session_resumed' : 'session_start',\n ts: this.startedAt,\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n try {\n if (this.filePath) {\n // Use fs.promises.writeFile directly to avoid FileHandle.fd private access\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\n }\n } catch {\n // best-effort; session will still be usable without the start event logged\n }\n }\n\n async append(event: SessionEvent): Promise<void> {\n if (this.closed) return;\n if (!this.initDone) {\n await this.writeSessionStart();\n }\n this.observeForSummary(event);\n try {\n await this.handle.appendFile(`${JSON.stringify(event)}\\n`, 'utf8');\n } catch (err) {\n // A persistent failure (full disk, broken pipe) would otherwise log\n // once per appended event — which for a chatty agent run is a lot.\n // Debounce to one log per 5 s and surface the suppressed count.\n this.appendFailCount++;\n const now = Date.now();\n if (now - this.lastAppendWarnAt > 5000) {\n const suppressed = this.appendFailCount - 1;\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\n console.warn(\n '[session] append failed:',\n err instanceof Error ? err.message : String(err),\n tail,\n );\n this.lastAppendWarnAt = now;\n this.appendFailCount = 0;\n }\n }\n }\n\n /**\n * Watch events as they're appended and keep the summary state hot, so\n * `close()` can flush a `<id>.summary.json` manifest without re-reading\n * the JSONL. `list()` reads only manifests, turning a per-session full\n * parse into a single stat+read.\n */\n private observeForSummary(event: SessionEvent): void {\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\n } else if (event.type === 'llm_response') {\n this.tokenIn += event.usage.input;\n this.tokenOut += event.usage.output;\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\n } else if (event.type === 'session_end') {\n // session_end usage is the canonical total — prefer it if non-zero.\n const total = event.usage.input + event.usage.output;\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.manifestFile) {\n try {\n await fsp.writeFile(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\n } catch {\n // manifest write is best-effort; list() falls back to full load.\n }\n }\n try {\n await this.handle.close();\n } catch {\n // ignore\n }\n }\n}\n\nfunction userInputTitle(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content.slice(0, 60);\n const text = content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join(' ');\n return (text || '(non-text input)').slice(0, 60);\n}","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * The persisted form of a single queued user message. The TUI's\n * in-memory QueueItem has a render id; that's pure UI bookkeeping, so\n * we drop it when serializing — fresh ids are assigned on rehydrate.\n */\nexport interface PersistedQueueItem {\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/**\n * Side-file storage for a session's pending input queue. Lives at\n * `<sessionDir>/queue.json` next to the attachment spool. Reads are\n * tolerant (missing/malformed file → empty array); writes are atomic\n * (tmp + rename) so a crash mid-write can never leave a partial file\n * the next launch would choke on.\n *\n * The contract is \"snapshot replacement\": every mutation hands the\n * full queue and we rewrite the file. The queue is small (rarely more\n * than a handful of messages), so this is cheaper than delta logging\n * and avoids the replay complexity.\n */\nexport class QueueStore {\n private readonly file: string;\n\n constructor(opts: { dir: string }) {\n this.file = path.join(opts.dir, 'queue.json');\n }\n\n async write(items: PersistedQueueItem[]): Promise<void> {\n if (items.length === 0) {\n // Empty queue → remove the file rather than write `[]`. Keeps\n // a clean idle state on disk and makes `read()` cheaper.\n await this.clear();\n return;\n }\n await atomicWrite(this.file, JSON.stringify(items), { mode: 0o600 });\n }\n\n async read(): Promise<PersistedQueueItem[]> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return [];\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PersistedQueueItem[] = [];\n for (const v of parsed) {\n if (isPersistedQueueItem(v)) out.push(v);\n }\n return out;\n }\n\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n // Best-effort: a permission/lock error during clear is rare and\n // the queue slash command is non-critical. Warn so it's observable\n // but don't throw so the slash command doesn't crash.\n console.warn(`QueueStore.clear() failed for ${this.file}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction isPersistedQueueItem(v: unknown): v is PersistedQueueItem {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o['displayText'] === 'string' && Array.isArray(o['blocks']);\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport type { ContentBlock } from '../types/blocks.js';\nimport type {\n AddAttachmentInput,\n Attachment,\n AttachmentKind,\n AttachmentRef,\n AttachmentStore,\n} from '../types/attachment.js';\n\nexport interface AttachmentStoreOptions {\n /**\n * Directory for spooling payloads larger than `spoolThresholdBytes`.\n * When omitted, all payloads stay in memory.\n */\n spoolDir?: string;\n spoolThresholdBytes?: number;\n}\n\nconst DEFAULT_SPOOL_THRESHOLD = 256 * 1024; // 256 KB\nconst PLACEHOLDER_RE = /\\[(pasted|image|file) #(\\d+)\\]/g;\n\n/**\n * In-memory attachment store with optional disk spool. Placeholder syntax\n * is `[<kind> #<seq>]` where kind is `pasted` / `image` / `file`. Unknown\n * placeholders are passed through as-is so users can write that literal\n * text without losing it.\n */\nexport class DefaultAttachmentStore implements AttachmentStore {\n private readonly items = new Map<string, Attachment>();\n private readonly refs: AttachmentRef[] = [];\n private nextSeq: Record<AttachmentKind, number> = { text: 0, image: 0, file: 0 };\n private readonly spoolDir: string | undefined;\n private readonly spoolThreshold: number;\n\n constructor(opts: AttachmentStoreOptions = {}) {\n this.spoolDir = opts.spoolDir;\n this.spoolThreshold = opts.spoolThresholdBytes ?? DEFAULT_SPOOL_THRESHOLD;\n }\n\n async add(input: AddAttachmentInput): Promise<AttachmentRef> {\n const seq = ++this.nextSeq[input.kind];\n const id = `${kindPrefix(input.kind)}-${seq}-${randomBytes(3).toString('hex')}`;\n const bytes = Buffer.byteLength(input.data, input.kind === 'image' ? 'base64' : 'utf8');\n let spooledPath: string | undefined;\n let data: string | undefined = input.data;\n if (this.spoolDir && bytes >= this.spoolThreshold) {\n await fsp.mkdir(this.spoolDir, { recursive: true });\n spooledPath = path.join(this.spoolDir, `${id}.bin`);\n await fsp.writeFile(spooledPath, input.data, input.kind === 'image' ? 'base64' : 'utf8');\n data = undefined;\n }\n const att: Attachment = {\n id,\n kind: input.kind,\n meta: input.meta ?? {},\n data,\n path: spooledPath,\n bytes,\n createdAt: new Date().toISOString(),\n };\n this.items.set(id, att);\n const ref: AttachmentRef = { id, kind: input.kind, seq, meta: att.meta };\n this.refs.push(ref);\n return ref;\n }\n\n async get(id: string): Promise<Attachment | undefined> {\n return this.items.get(id);\n }\n\n list(): AttachmentRef[] {\n return [...this.refs];\n }\n\n async expand(text: string): Promise<ContentBlock[]> {\n const matches = [...text.matchAll(PLACEHOLDER_RE)];\n if (matches.length === 0) return text ? [{ type: 'text', text }] : [];\n const blocks: ContentBlock[] = [];\n let lastIndex = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n const before = text.slice(lastIndex, idx);\n if (before) blocks.push({ type: 'text', text: before });\n const kind = prefixToKind(m[1] as string);\n const seq = Number(m[2]);\n const ref = this.refs.find((r) => r.kind === kind && r.seq === seq);\n const att = ref ? this.items.get(ref.id) : undefined;\n if (!att) {\n blocks.push({ type: 'text', text: m[0] });\n } else {\n blocks.push(await this.toBlock(att));\n }\n lastIndex = idx + m[0].length;\n }\n const tail = text.slice(lastIndex);\n if (tail) blocks.push({ type: 'text', text: tail });\n return mergeAdjacentText(blocks);\n }\n\n async clear(): Promise<void> {\n this.items.clear();\n this.refs.length = 0;\n this.nextSeq = { text: 0, image: 0, file: 0 };\n }\n\n private async toBlock(att: Attachment): Promise<ContentBlock> {\n if (att.kind === 'image') {\n const data = att.data ?? (att.path ? await fsp.readFile(att.path, { encoding: 'base64' }) : '');\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: att.meta.mediaType ?? 'image/png',\n data,\n },\n };\n }\n const raw = att.data ?? (att.path ? await fsp.readFile(att.path, 'utf8') : '');\n const label = att.meta.filename ? `<file path=\"${att.meta.filename}\">` : '<pasted>';\n const close = att.meta.filename ? '</file>' : '</pasted>';\n return { type: 'text', text: `${label}\\n${raw}\\n${close}` };\n }\n}\n\nfunction kindPrefix(kind: AttachmentKind): string {\n return kind === 'text' ? 'pasted' : kind;\n}\n\nfunction prefixToKind(prefix: string): AttachmentKind {\n if (prefix === 'pasted') return 'text';\n if (prefix === 'image') return 'image';\n return 'file';\n}\n\nfunction mergeAdjacentText(blocks: ContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n const prev = out[out.length - 1];\n if (b.type === 'text' && prev && prev.type === 'text') {\n prev.text += b.text;\n } else {\n out.push(b);\n }\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MemoryScope, MemoryStore } from '../types/memory.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nconst MAX_BYTES_TOTAL = 32_000; // ~8K tokens\n\nexport interface MemoryStoreOptions {\n paths: WstackPaths;\n}\n\n/**\n * Three scopes:\n * project-agents → <project>/.wrongstack/AGENTS.md (committed)\n * project-memory → ~/.wrongstack/projects/<hash>/memory.md (per-project agent notes)\n * user-memory → ~/.wrongstack/memory.md (global personal memory)\n */\nexport class DefaultMemoryStore implements MemoryStore {\n private readonly files: Record<MemoryScope, string>;\n /**\n * Per-scope serialization queue. `remember` / `forget` / `consolidate` /\n * `clear` are read-modify-write against a single file; without a lock,\n * two concurrent calls on the same scope can read the same baseline and\n * the later write silently drops the earlier entry. We chain each\n * mutation onto the prior promise for the same scope so they run in\n * issue order. Different scopes still proceed in parallel.\n */\n private readonly writeChain = new Map<MemoryScope, Promise<unknown>>();\n\n constructor(opts: MemoryStoreOptions) {\n this.files = {\n 'project-agents': opts.paths.inProjectAgentsFile,\n 'project-memory': opts.paths.projectMemory,\n 'user-memory': opts.paths.globalMemory,\n };\n }\n\n private async runSerialized<T>(scope: MemoryScope, work: () => Promise<T>): Promise<T> {\n const prior = this.writeChain.get(scope) ?? Promise.resolve();\n // Swallow prior errors here so one failed write doesn't poison the\n // chain — the failed call has already rejected to its own caller.\n const next = prior.catch(() => undefined).then(work);\n this.writeChain.set(scope, next);\n try {\n return await next;\n } finally {\n // Clear the chain reference once this call finishes so memory doesn't\n // grow unboundedly across long-lived processes. If another call\n // queued behind us, it's already captured in next; the map entry\n // serves only as the \"what should the next caller wait on\" pointer.\n if (this.writeChain.get(scope) === next) {\n this.writeChain.delete(scope);\n }\n }\n }\n\n async readAll(): Promise<string> {\n const parts: string[] = [];\n for (const scope of ['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]) {\n const body = await this.read(scope);\n if (body.trim()) parts.push(`## ${labelOf(scope)}\\n\\n${body.trim()}`);\n }\n return parts.join('\\n\\n');\n }\n\n async read(scope: MemoryScope): Promise<string> {\n try {\n return await fs.readFile(this.files[scope], 'utf8');\n } catch {\n return '';\n }\n }\n\n async remember(text: string, scope: MemoryScope = 'project-memory'): Promise<void> {\n return this.runSerialized(scope, async () => {\n const file = this.files[scope];\n await ensureDir(path.dirname(file));\n let existing = '';\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n // new file\n }\n const ts = new Date().toISOString();\n // Use a stable ID so forget() can target exact entries regardless of content.\n const id = `mem_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n const entry = `\\n- [${ts}] ${id} ${text.replace(/\\n/g, ' ')}\\n`;\n const next = existing.trim()\n ? existing.replace(/\\n+$/, '') + entry\n : `# WrongStack Memory\\n${entry}`;\n await atomicWrite(file, next);\n const buf = Buffer.byteLength(next, 'utf8');\n if (buf > MAX_BYTES_TOTAL) {\n // consolidate enqueues onto the same chain — call directly into the\n // inner implementation to avoid deadlocking on our own queue slot.\n await this.consolidateUnsafe(scope);\n }\n });\n }\n\n async forget(query: string, scope: MemoryScope = 'project-memory'): Promise<number> {\n return this.runSerialized(scope, async () => this.forgetUnsafe(query, scope));\n }\n\n private async forgetUnsafe(query: string, scope: MemoryScope): Promise<number> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return 0;\n }\n // Match by unique ID suffix (mem_<ts>_<rand>) embedded in the entry.\n // Fall back to case-insensitive content match for entries without an ID.\n const needle = query.toLowerCase();\n const idMatcher = /mem_\\d+_\\w+/;\n let removed = 0;\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n // If the query looks like an ID, match exactly; otherwise match content.\n if (idMatcher.test(query)) {\n // The entry ID appears right after the timestamp: \"- [ts] mem_<ts>_<rand> ...\"\n const afterBracket = trimmed.indexOf('] ');\n if (afterBracket !== -1) {\n const afterTs = trimmed.slice(afterBracket + 2);\n const entryIdMatch = /^mem_\\d+_\\w+/.exec(afterTs);\n if (entryIdMatch && entryIdMatch[0] === query) {\n removed++;\n return false;\n }\n }\n }\n // Fall back to content-based match (still useful for project-agents legacy entries)\n if (trimmed.toLowerCase().includes(needle)) {\n removed++;\n return false;\n }\n return true;\n });\n if (removed > 0) {\n await atomicWrite(file, lines.join('\\n'));\n }\n return removed;\n }\n\n async consolidate(scope: MemoryScope): Promise<void> {\n return this.runSerialized(scope, async () => this.consolidateUnsafe(scope));\n }\n\n private async consolidateUnsafe(scope: MemoryScope): Promise<void> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return;\n }\n // Dedupe identical bullet lines (case-insensitive, ignoring per-entry\n // metadata: the leading \"[timestamp]\" and the \"mem_<ts>_<rand>\" ID).\n const seen = new Set<string>();\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n const norm = trimmed\n .replace(/\\[[^\\]]+\\]/, '')\n .replace(/\\bmem_\\d+_\\w+\\s*/, '')\n .trim()\n .toLowerCase();\n if (seen.has(norm)) return false;\n seen.add(norm);\n return true;\n });\n const next = lines.join('\\n');\n // Backup AFTER successful write\n try {\n await atomicWrite(file, next);\n } catch {\n return;\n }\n // Backup only after successful write; if write fails, original is untouched\n const backup = `${file}.bak.${Date.now()}`;\n try {\n await fs.copyFile(file, backup);\n } catch {\n // backup best-effort\n }\n }\n\n async clear(scope?: MemoryScope): Promise<void> {\n if (scope) {\n await this.runSerialized(scope, async () => atomicWrite(this.files[scope], ''));\n return;\n }\n // Clear-all: serialize each scope independently so different scopes\n // still run in parallel, but each one waits for its own pending writes.\n await Promise.all(\n (['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]).map((s) =>\n this.runSerialized(s, async () => atomicWrite(this.files[s], '')),\n ),\n );\n }\n\n}\n\nfunction labelOf(scope: MemoryScope): string {\n switch (scope) {\n case 'project-agents':\n return 'Project AGENTS.md';\n case 'project-memory':\n return 'Project memory';\n case 'user-memory':\n return 'User memory';\n }\n}\n","import type { SecretScrubber } from '../types/secret-scrubber.js';\n\ninterface Pattern {\n type: string;\n regex: RegExp;\n}\n\nconst PATTERNS: Pattern[] = [\n // Anchored at the start where possible so partial matches inside larger\n // strings don't trigger false positives.\n { type: 'anthropic_key', regex: /(?<![A-Za-z0-9])sk-ant-api\\d+-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'openai_key', regex: /(?<![A-Za-z0-9])sk-(?:proj-)?[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'github_pat', regex: /(?<![A-Za-z0-9])ghp_[A-Za-z0-9]{36,}(?![A-Za-z0-9])/g },\n { type: 'github_pat_v2', regex: /(?<![A-Za-z0-9])github_pat_[A-Za-z0-9_]{50,}(?![A-Za-z0-9])/g },\n { type: 'aws_access_key', regex: /(?<![A-Za-z0-9])AKIA[0-9A-Z]{16}(?![A-Za-z0-9])/g },\n { type: 'gcp_key', regex: /(?<![A-Za-z0-9])AIza[0-9A-Za-z_-]{35}(?![A-Za-z0-9])/g },\n { type: 'slack_token', regex: /(?<![A-Za-z0-9-])xox[abpos]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g },\n { type: 'stripe_key', regex: /(?<![A-Za-z0-9])sk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g },\n { type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g },\n {\n type: 'jwt',\n // Anchored: look for literal \"eyJ\" which is unambiguous for JWT header\n regex: /(?<![A-Za-z0-9/+=])eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}(?![A-Za-z0-9/+=])/g,\n },\n {\n type: 'private_key',\n // Anchored: start must be BEGIN, end must be END with no extra dashes after END\n regex: /(?:^|\\n)-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP)? ?PRIVATE KEY-----[\\s\\S]*?-----END[^-]*-----(?:\\n|$)/g,\n },\n { type: 'mongodb_uri', regex: /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'postgres_uri', regex: /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'mysql_uri', regex: /mysql:\\/\\/[^\\s\"'`]+/g },\n { type: 'redis_uri', regex: /redis:\\/\\/[^\\s\"'`]+/g },\n { type: 'bearer_token', regex: /(?<![A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{20,}=*(?![A-Za-z0-9_.~+/-])/g },\n {\n type: 'high_entropy_env',\n // Value-side word boundary + length gate to avoid matching short random strings\n regex: /\\b([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,})['\"]?(?!\\s*[A-Za-z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))/g,\n },\n];\n\n/**\n * Per-chunk cap. The `high_entropy_env` and `bearer_token` patterns use\n * negative lookahead/lookbehind which are theoretically backtracking-prone\n * on adversarial input. Real scrub() inputs (LLM responses, tool outputs)\n * are typically much smaller, but defense-in-depth: split very long inputs\n * into smaller chunks and scrub each independently.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\n // For oversize inputs, scrub in fixed chunks. We split on newlines\n // where possible so secrets that span a few hundred bytes still get\n // matched within a single chunk; only inputs above ~64 KB risk a\n // boundary cutting a secret in half, and those are uncommon.\n if (text.length <= SCRUB_CHUNK_BYTES) {\n return this.scrubOne(text);\n }\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n let end = Math.min(i + SCRUB_CHUNK_BYTES, text.length);\n // Try to break on a newline near the boundary so we don't cut secrets.\n if (end < text.length) {\n const nl = text.lastIndexOf('\\n', end);\n if (nl > i + SCRUB_CHUNK_BYTES / 2) end = nl + 1;\n }\n out.push(this.scrubOne(text.slice(i, end)));\n i = end;\n }\n return out.join('');\n }\n\n private scrubOne(text: string): string {\n let out = text;\n for (const p of PATTERNS) {\n out = out.replace(p.regex, (_match, group1, group2) => {\n if (p.type === 'high_entropy_env' && group1 && group2) {\n return `${group1}=[REDACTED:${p.type}]`;\n }\n return `[REDACTED:${p.type}]`;\n });\n }\n return out;\n }\n\n scrubObject<T>(obj: T): T {\n const seen = new WeakSet();\n const visit = (v: unknown): unknown => {\n if (typeof v === 'string') return this.scrub(v);\n if (v === null || typeof v !== 'object') return v;\n if (seen.has(v as object)) return v;\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(visit);\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) {\n out[k] = visit(val);\n }\n return out;\n };\n return visit(obj) as T;\n }\n}\n","/**\n * SecretVault encrypts secrets-at-rest in config files. The wire format is\n * `enc:v1:<base64-iv>:<base64-tag>:<base64-ciphertext>`. Plaintext strings\n * (those that do not match this prefix) are passed through unchanged so that\n * existing configs and env-var-derived values keep working.\n *\n * The vault is intentionally NOT designed to defeat a determined local\n * attacker who can read both the config file and the key file — that level\n * of secrecy needs the OS keychain. The goal is to keep keys from being\n * visible in screen shares, accidental log captures, and `cat config.json`\n * over someone's shoulder.\n */\nexport interface SecretVault {\n encrypt(plaintext: string): string;\n decrypt(value: string): string;\n isEncrypted(value: string): boolean;\n}\n\nexport const ENCRYPTED_PREFIX = 'enc:v1:';\n","import * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { ENCRYPTED_PREFIX } from '../types/secret-vault.js';\n\nexport interface SecretVaultOptions {\n /** Absolute path to the key file. Created with mode 0o600 if missing. */\n keyFile: string;\n}\n\nconst KEY_BYTES = 32;\nconst IV_BYTES = 12;\nconst TAG_BYTES = 16;\nconst ALGO = 'aes-256-gcm';\n\n/**\n * Default vault: AES-256-GCM with a key stored at `keyFile` (mode 0o600).\n * The key is loaded lazily on first encrypt/decrypt; if it does not exist,\n * a fresh one is generated. Decryption of plaintext values is a no-op so\n * legacy configs continue to work.\n */\nexport class DefaultSecretVault implements SecretVault {\n private readonly keyFile: string;\n private key?: Buffer;\n\n constructor(opts: SecretVaultOptions) {\n this.keyFile = opts.keyFile;\n }\n\n isEncrypted(value: string): boolean {\n return typeof value === 'string' && value.startsWith(ENCRYPTED_PREFIX);\n }\n\n encrypt(plaintext: string): string {\n if (this.isEncrypted(plaintext)) return plaintext;\n const key = this.loadOrCreateKey();\n const iv = randomBytes(IV_BYTES);\n const cipher = createCipheriv(ALGO, key, iv);\n const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `${ENCRYPTED_PREFIX}${iv.toString('base64')}:${tag.toString('base64')}:${ct.toString('base64')}`;\n }\n\n decrypt(value: string): string {\n if (!this.isEncrypted(value)) return value;\n const rest = value.slice(ENCRYPTED_PREFIX.length);\n const parts = rest.split(':');\n if (parts.length !== 3) {\n throw new Error('SecretVault: malformed encrypted value');\n }\n const [ivB64, tagB64, ctB64] = parts as [string, string, string];\n const iv = Buffer.from(ivB64, 'base64');\n const tag = Buffer.from(tagB64, 'base64');\n const ct = Buffer.from(ctB64, 'base64');\n if (iv.length !== IV_BYTES) throw new Error('SecretVault: bad IV length');\n if (tag.length !== TAG_BYTES) throw new Error('SecretVault: bad tag length');\n const key = this.loadOrCreateKey();\n const decipher = createDecipheriv(ALGO, key, iv);\n decipher.setAuthTag(tag);\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\n return pt.toString('utf8');\n }\n\n private loadOrCreateKey(): Buffer {\n if (this.key) return this.key;\n try {\n const buf = fs.readFileSync(this.keyFile);\n if (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n // Create a fresh key. Use sync APIs so the constructor-free getter\n // remains synchronous from the caller's perspective.\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\n const key = randomBytes(KEY_BYTES);\n // Use exclusive-create flag 'wx' to prevent races: if two processes race\n // to create the key file, only one succeeds and the loser gets EEXIST.\n try {\n fs.writeFileSync(this.keyFile, key, { mode: 0o600, flag: 'wx' });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n // Another process won the race — re-read what they wrote.\n const buf = fs.readFileSync(this.keyFile);\n if (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\n }\n this.key = key;\n return key;\n }\n}\n\n/**\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\n * returning a new object. Used by the config loader so the rest of the\n * system never has to know about the wire format.\n */\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n // A single corrupted/malformed encrypted field should not kill the entire\n // config load. Swallow per-field decrypt errors (zero the field so callers\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\n return walk(cfg, vault, (v, key) => {\n try {\n return vault.decrypt(v);\n } catch (err) {\n console.warn(\n `[secret-vault] Failed to decrypt \"${key}\":`,\n err instanceof Error ? err.message : err,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n return walk(cfg, vault, (v) => vault.encrypt(v));\n}\n\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walk(item, vault, transform)) as unknown as T;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k)) {\n out[k] = transform(v, k);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walk(v, vault, transform);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A key is treated as secret-bearing if its name (case-insensitive) contains\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\n * Use a named field with `isSecret: false` annotation if you must opt out —\n * see `NON_SECRET_OVERRIDES` below.\n */\nconst SECRET_KEY_PATTERN = /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\n\n// Field names that contain the literal substring \"key\" but are not secrets.\n// Keep this list short; the substring rule itself is intentionally narrow.\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\n\nfunction isSecretField(name: string): boolean {\n const lc = name.toLowerCase();\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\n return SECRET_KEY_PATTERN.test(lc);\n}\n\n/**\n * Re-write `~/.wrongstack/config.json` (or any path) with all secret-bearing\n * fields encrypted. Used by the `wstack auth` subcommand.\n */\nexport async function rewriteConfigEncrypted(\n configPath: string,\n vault: SecretVault,\n patch?: Record<string, unknown>,\n): Promise<void> {\n let current: Record<string, unknown> = {};\n try {\n const raw = await fsp.readFile(configPath, 'utf8');\n current = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n // start from empty\n }\n const merged = deepMerge(current, patch ?? {});\n const encrypted = encryptConfigSecrets(merged, vault);\n await fsp.mkdir(path.dirname(configPath), { recursive: true });\n await fsp.writeFile(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\n}\n\n/**\n * Scan a config file on disk for plaintext secret-bearing fields and\n * rewrite the file with them encrypted in place. Returns a count of how\n * many fields were migrated. Idempotent — calling on a fully-encrypted\n * file is a no-op and writes nothing. Used by the CLI on every boot so\n * users who had plaintext keys before the vault landed are upgraded\n * transparently.\n */\nexport async function migratePlaintextSecrets(\n configPath: string,\n vault: SecretVault,\n): Promise<{ migrated: number; file: string }> {\n let raw: string;\n try {\n raw = await fsp.readFile(configPath, 'utf8');\n } catch {\n return { migrated: 0, file: configPath };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { migrated: 0, file: configPath };\n }\n const counter = { n: 0 };\n const migrated = walkCount(parsed, vault, counter);\n if (counter.n === 0) return { migrated: 0, file: configPath };\n await fsp.writeFile(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\n return { migrated: counter.n, file: configPath };\n}\n\nfunction walkCount<T>(node: T, vault: SecretVault, counter: { n: number }): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walkCount(item, vault, counter)) as unknown as T;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k) && !vault.isEncrypted(v) && v.length > 0) {\n out[k] = vault.encrypt(v);\n counter.n++;\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkCount(v, vault, counter);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/** Keys that, when written into a plain object, can poison the prototype\n * chain. We never want user config to carry these. */\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T extends Record<string, unknown>>(a: T, b: Record<string, unknown>): T {\n const out: Record<string, unknown> = { ...a };\n for (const [k, v] of Object.entries(b)) {\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n if (\n v !== null &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n existing !== null &&\n typeof existing === 'object' &&\n !Array.isArray(existing)\n ) {\n out[k] = deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n","/**\n * Minimal glob matcher for trust patterns.\n * Supports: *, **, ?, character classes [abc], [a-z], negation [!...] or [^...].\n *\n * Compiled regexes are cached so repeated calls with the same pattern\n * avoid recompilation overhead.\n */\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\n}\n\n// Module-level cache to avoid recompiling the same pattern on every call.\n// LRU-ish eviction keeps unbounded growth in check for long-running processes.\nconst COMPILED_GLOB_CACHE = new Map<string, RegExp>();\nconst CACHE_MAX_SIZE = 2000;\n\nfunction getCachedGlob(pattern: string): RegExp {\n const cached = COMPILED_GLOB_CACHE.get(pattern);\n if (cached) return cached;\n if (COMPILED_GLOB_CACHE.size >= CACHE_MAX_SIZE) {\n // Evict oldest 25% when at capacity\n const keys = [...COMPILED_GLOB_CACHE.keys()];\n for (let i = 0; i < Math.floor(CACHE_MAX_SIZE / 4); i++) {\n COMPILED_GLOB_CACHE.delete(keys[i]!);\n }\n }\n const re = compileGlob(pattern);\n COMPILED_GLOB_CACHE.set(pattern, re);\n return re;\n}\n\nexport function compileGlob(pattern: string): RegExp {\n let i = 0;\n let re = '^';\n while (i < pattern.length) {\n const c = pattern[i];\n if (c === '*') {\n if (pattern[i + 1] === '*') {\n // ** matches any number of chars including /\n re += '.*';\n i += 2;\n // Skip trailing slash so '**/x' matches 'x'\n if (pattern[i] === '/') i++;\n } else {\n // single * matches any chars except /\n re += '[^/]*';\n i++;\n }\n } else if (c === '?') {\n re += '[^/]';\n i++;\n } else if (c === '[') {\n let cls = '[';\n i++;\n if (pattern[i] === '!' || pattern[i] === '^') {\n cls += '^';\n i++;\n }\n while (i < pattern.length && pattern[i] !== ']') {\n const ch = pattern[i] ?? '';\n // Inside a regex class, only `]`, `\\`, and `^`/`-` at boundaries need\n // escaping. We've already consumed the leading `^`; the rest are\n // literal. Escape `\\` defensively and pass the rest through verbatim\n // so ranges like `a-z` continue to work.\n if (ch === '\\\\') {\n cls += '\\\\\\\\';\n } else if (ch === ']' || ch === '^') {\n cls += `\\\\${ch}`;\n } else {\n cls += ch;\n }\n i++;\n }\n cls += ']';\n re += cls;\n i++; // skip closing ]\n } else {\n re += escapeRegex(c ?? '');\n i++;\n }\n }\n re += '$';\n return new RegExp(re);\n}\n\nexport function matchGlob(pattern: string, input: string): boolean {\n return getCachedGlob(pattern).test(input);\n}\n\nexport function matchAny(patterns: string[], input: string): boolean {\n return patterns.some((p) => matchGlob(p, input));\n}","export interface SafeParseResult<T> {\n ok: boolean;\n value?: T;\n error?: string;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s[i + 1] === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s[i] !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","import * as fs from 'node:fs/promises';\r\nimport type { Context } from '../core/context.js';\r\nimport type { PermissionDecision, PermissionPolicy, TrustPolicy } from '../types/permission.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { InputReader } from '../types/input-reader.js';\r\nimport { matchAny, matchGlob } from '../utils/glob-match.js';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\nimport { safeParse } from '../utils/safe-json.js';\r\n\r\nexport interface PermissionPolicyOptions {\r\n trustFile: string;\r\n yolo?: boolean;\r\n promptDelegate?: (\r\n tool: Tool,\r\n input: unknown,\r\n suggestedPattern: string,\r\n ) => Promise<'yes' | 'no' | 'always' | 'deny'>;\r\n inputReader?: InputReader;\r\n}\r\n\r\nexport class DefaultPermissionPolicy implements PermissionPolicy {\r\n private policy: TrustPolicy = {};\r\n private loaded = false;\r\n private readonly trustFile: string;\r\n private readonly yolo: boolean;\r\n private readonly promptDelegate?: PermissionPolicyOptions['promptDelegate'];\r\n\r\n constructor(opts: PermissionPolicyOptions) {\r\n this.trustFile = opts.trustFile;\r\n this.yolo = opts.yolo ?? false;\r\n this.promptDelegate = opts.promptDelegate;\r\n }\r\n\r\n async reload(): Promise<void> {\r\n try {\r\n const raw = await fs.readFile(this.trustFile, 'utf8');\r\n const parsed = safeParse<TrustPolicy>(raw);\r\n if (parsed.ok && parsed.value) this.policy = parsed.value;\r\n } catch {\r\n this.policy = {};\r\n }\r\n this.loaded = true;\r\n }\r\n\r\n async evaluate(tool: Tool, input: unknown, _ctx: Context): Promise<PermissionDecision> {\r\n if (!this.loaded) await this.reload();\r\n\r\n // 1. Tool-namespace matching (mcp__server__* etc.)\r\n const namespaceEntry = this.findNamespaceEntry(tool.name);\r\n\r\n // 2. Tool-name entry\r\n const entry = this.policy[tool.name] ?? namespaceEntry;\r\n\r\n // 3. Compute subject (the thing being matched)\r\n const subject = this.subjectFor(tool.name, input, tool.subjectKey);\r\n\r\n // 4. Deny — absolute\r\n if (entry?.deny && subject && matchAny(entry.deny, subject)) {\r\n return { permission: 'deny', source: 'deny', reason: 'matched deny pattern' };\r\n }\r\n if (tool.permission === 'deny') {\r\n return { permission: 'deny', source: 'default', reason: 'tool default deny' };\r\n }\r\n\r\n // 5. Allow\r\n if (entry?.allow && subject && matchAny(entry.allow, subject)) {\r\n return { permission: 'auto', source: 'trust', reason: 'matched allow pattern' };\r\n }\r\n if (entry?.auto) {\r\n return { permission: 'auto', source: 'trust' };\r\n }\r\n\r\n // 6. YOLO\r\n if (this.yolo) {\r\n return { permission: 'auto', source: 'yolo' };\r\n }\r\n\r\n // 7. Tool default\r\n if (tool.permission === 'auto') {\r\n return { permission: 'auto', source: 'default' };\r\n }\r\n\r\n // 8. Confirm — delegate to prompt\r\n if (this.promptDelegate) {\r\n const decision = await this.promptDelegate(tool, input, subject ?? tool.name);\r\n if (decision === 'always') {\r\n await this.trust({ tool: tool.name, pattern: subject ?? tool.name });\r\n return { permission: 'auto', source: 'user', reason: 'user always-allowed' };\r\n }\r\n if (decision === 'deny') {\r\n return { permission: 'deny', source: 'user', reason: 'user denied' };\r\n }\r\n return { permission: decision === 'yes' ? 'auto' : 'deny', source: 'user' };\r\n }\r\n return { permission: 'confirm', source: 'default' };\r\n }\r\n\r\n async trust(rule: { tool: string; pattern: string }): Promise<void> {\r\n if (!this.loaded) await this.reload();\r\n const entry = this.policy[rule.tool] ?? {};\r\n entry.allow = Array.from(new Set([...(entry.allow ?? []), rule.pattern]));\r\n this.policy[rule.tool] = entry;\r\n try {\r\n await atomicWrite(this.trustFile, JSON.stringify(this.policy, null, 2));\r\n } catch (err) {\r\n // Revert in-memory state since disk write failed\r\n const existing = this.policy[rule.tool];\r\n if (existing?.allow) {\r\n const idx = existing.allow.indexOf(rule.pattern);\r\n if (idx !== -1) existing.allow.splice(idx, 1);\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n private subjectFor(\r\n toolName: string,\r\n input: unknown,\r\n subjectKey?: string,\r\n ): string | undefined {\r\n if (!input || typeof input !== 'object') return undefined;\r\n const obj = input as Record<string, unknown>;\r\n\r\n // Glob metacharacters are dangerous: a crafted subject like \"**\" or \"foo/**/bar\"\r\n // can match too broadly in the allow/deny pattern match. Escape them so the\r\n // matching is done on the literal string.\r\n const globChars = /[*?\\[\\]]/g;\r\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\r\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\r\n\r\n // 1. Explicit subjectKey on the tool wins — eliminates the cross-tool\r\n // collision where e.g. an HTTP tool's `path` field meant \"request\r\n // path\" but was matched against filesystem-path trust rules.\r\n if (subjectKey) {\r\n const v = obj[subjectKey];\r\n if (typeof v === 'string') {\r\n // Heuristic: path-like keys get backslash normalization for glob\r\n // matching on Windows; everything else is treated as opaque.\r\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\r\n ? normalizePath(v)\r\n : escapeGlob(v);\r\n }\r\n // subjectKey was declared but the runtime value isn't a string —\r\n // fall through to the legacy heuristic so the policy still has a\r\n // chance to match on something sensible.\r\n }\r\n\r\n // 2. Legacy heuristic — preserved for tools that haven't migrated.\r\n if (toolName === 'bash' && typeof obj.command === 'string') {\r\n return escapeGlob(obj.command);\r\n }\r\n if (typeof obj.path === 'string') {\r\n return normalizePath(obj.path);\r\n }\r\n if (typeof obj.url === 'string') {\r\n return escapeGlob(obj.url);\r\n }\r\n if (typeof obj.name === 'string') {\r\n return escapeGlob(obj.name);\r\n }\r\n return undefined;\r\n }\r\n\r\n private findNamespaceEntry(toolName: string): TrustPolicy[string] | undefined {\r\n for (const key of Object.keys(this.policy)) {\r\n if (key.includes('*') && matchGlob(key, toolName)) {\r\n return this.policy[key];\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/**\r\n * WrongStack error hierarchy.\r\n *\r\n * Every error thrown by the framework is a `WrongStackError` with a\r\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\r\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\r\n * data instead of parsing error messages.\r\n */\r\n\r\n// ── Error codes ──────────────────────────────────────────────────────\r\n\r\nexport type ErrorCode =\r\n // Provider\r\n | 'PROVIDER_RATE_LIMITED'\r\n | 'PROVIDER_AUTH_FAILED'\r\n | 'PROVIDER_OVERLOADED'\r\n | 'PROVIDER_INVALID_REQUEST'\r\n | 'PROVIDER_SERVER_ERROR'\r\n | 'PROVIDER_NETWORK_ERROR'\r\n | 'PROVIDER_CONTEXT_OVERFLOW'\r\n // Tool\r\n | 'TOOL_NOT_FOUND'\r\n | 'TOOL_PERMISSION_DENIED'\r\n | 'TOOL_EXECUTION_FAILED'\r\n | 'TOOL_TIMEOUT'\r\n | 'TOOL_INPUT_INVALID'\r\n // Config\r\n | 'CONFIG_INVALID'\r\n | 'CONFIG_NOT_FOUND'\r\n | 'CONFIG_PARSE_FAILED'\r\n | 'CONFIG_MIGRATION_NEEDED'\r\n // Plugin\r\n | 'PLUGIN_LOAD_FAILED'\r\n | 'PLUGIN_API_MISMATCH'\r\n | 'PLUGIN_MISSING_DEPENDENCY'\r\n // Agent\r\n | 'AGENT_ITERATION_LIMIT'\r\n | 'AGENT_CONTEXT_OVERFLOW'\r\n | 'AGENT_ABORTED'\r\n | 'AGENT_RUN_FAILED'\r\n // Session\r\n | 'SESSION_NOT_FOUND'\r\n | 'SESSION_CORRUPTED'\r\n | 'SESSION_WRITE_FAILED'\r\n // Container / Registry\r\n | 'CONTAINER_TOKEN_ALREADY_BOUND'\r\n | 'CONTAINER_TOKEN_NOT_BOUND'\r\n | 'REGISTRY_DUPLICATE'\r\n | 'REGISTRY_NOT_FOUND'\r\n // General\r\n | 'UNKNOWN';\r\n\r\nexport type ErrorSubsystem = 'provider' | 'tool' | 'config' | 'plugin' | 'agent' | 'session' | 'container' | 'general';\r\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\r\n\r\n// ── Base error class ─────────────────────────────────────────────────\r\n\r\nexport class WrongStackError extends Error {\r\n readonly code: ErrorCode;\r\n readonly subsystem: ErrorSubsystem;\r\n readonly severity: ErrorSeverity;\r\n readonly recoverable: boolean;\r\n readonly context?: Record<string, unknown>;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: ErrorCode;\r\n subsystem: ErrorSubsystem;\r\n severity?: ErrorSeverity;\r\n recoverable?: boolean;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super(opts.message, { cause: opts.cause });\r\n this.name = 'WrongStackError';\r\n this.code = opts.code;\r\n this.subsystem = opts.subsystem;\r\n this.severity = opts.severity ?? 'error';\r\n this.recoverable = opts.recoverable ?? false;\r\n this.context = opts.context;\r\n }\r\n\r\n /**\r\n * Render a one-line user-facing description.\r\n * Subclasses should override for domain-specific formatting.\r\n */\r\n describe(): string {\r\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\r\n return `${this.code}: ${this.message}${ctx}`;\r\n }\r\n}\r\n\r\nfunction formatContext(ctx: Record<string, unknown>): string {\r\n const parts = Object.entries(ctx)\r\n .filter(([, v]) => v !== undefined)\r\n .slice(0, 3)\r\n .map(([k, v]) => `${k}=${String(v)}`);\r\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\r\n}\r\n\r\n// ── Specific error classes ───────────────────────────────────────────\r\n\r\n/**\r\n * Tool execution errors — thrown by ToolExecutor and individual tools.\r\n */\r\nexport class ToolError extends WrongStackError {\r\n readonly toolName: string;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'TOOL_NOT_FOUND' | 'TOOL_PERMISSION_DENIED' | 'TOOL_EXECUTION_FAILED' | 'TOOL_TIMEOUT' | 'TOOL_INPUT_INVALID'>;\r\n toolName: string;\r\n recoverable?: boolean;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'tool',\r\n recoverable: opts.recoverable,\r\n context: { tool: opts.toolName, ...opts.context },\r\n cause: opts.cause,\r\n });\r\n this.name = 'ToolError';\r\n this.toolName = opts.toolName;\r\n }\r\n}\r\n\r\n/**\r\n * Config loading / validation errors.\r\n */\r\nexport class ConfigError extends WrongStackError {\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'>;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'config',\r\n severity: 'fatal',\r\n recoverable: false,\r\n context: opts.context,\r\n cause: opts.cause,\r\n });\r\n this.name = 'ConfigError';\r\n }\r\n}\r\n\r\n/**\r\n * Plugin loading / lifecycle errors.\r\n */\r\nexport class PluginError extends WrongStackError {\r\n readonly pluginName: string;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'>;\r\n pluginName: string;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'plugin',\r\n severity: 'error',\r\n recoverable: opts.code === 'PLUGIN_MISSING_DEPENDENCY',\r\n context: { plugin: opts.pluginName, ...opts.context },\r\n cause: opts.cause,\r\n });\r\n this.name = 'PluginError';\r\n this.pluginName = opts.pluginName;\r\n }\r\n}\r\n\r\n/**\r\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\r\n * escapes the inner loop, so callers always see a structured error.\r\n */\r\nexport class AgentError extends WrongStackError {\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'>;\r\n recoverable?: boolean;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'agent',\r\n severity: opts.code === 'AGENT_ABORTED' ? 'warning' : 'error',\r\n recoverable: opts.recoverable ?? opts.code === 'AGENT_ITERATION_LIMIT',\r\n context: opts.context,\r\n cause: opts.cause,\r\n });\r\n this.name = 'AgentError';\r\n }\r\n}\r\n\r\n/**\r\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\r\n * always gets a structured error. Pass-throughs WrongStackError instances\r\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\r\n * with the original preserved as `cause`.\r\n */\r\nexport function toWrongStackError(err: unknown, code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = 'AGENT_RUN_FAILED'): WrongStackError {\r\n if (err instanceof WrongStackError) return err;\r\n const message = err instanceof Error ? err.message : String(err);\r\n return new AgentError({\r\n message,\r\n code: code === 'UNKNOWN' ? 'AGENT_RUN_FAILED' : code,\r\n cause: err,\r\n });\r\n}\r\n\r\n/**\r\n * Session storage errors.\r\n */\r\nexport class SessionError extends WrongStackError {\r\n readonly sessionId?: string;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\r\n sessionId?: string;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'session',\r\n severity: opts.code === 'SESSION_WRITE_FAILED' ? 'error' : 'warning',\r\n recoverable: opts.code !== 'SESSION_CORRUPTED',\r\n context: { sessionId: opts.sessionId, ...opts.context },\r\n cause: opts.cause,\r\n });\r\n this.name = 'SessionError';\r\n this.sessionId = opts.sessionId;\r\n }\r\n}\r\n\r\n// ── Type guards ──────────────────────────────────────────────────────\r\n\r\nexport function isWrongStackError(err: unknown): err is WrongStackError {\r\n return err instanceof WrongStackError;\r\n}\r\n\r\nexport function isToolError(err: unknown): err is ToolError {\r\n return err instanceof ToolError;\r\n}\r\n\r\nexport function isConfigError(err: unknown): err is ConfigError {\r\n return err instanceof ConfigError;\r\n}\r\n\r\nexport function isPluginError(err: unknown): err is PluginError {\r\n return err instanceof PluginError;\r\n}\r\n\r\nexport function isSessionError(err: unknown): err is SessionError {\r\n return err instanceof SessionError;\r\n}\r\n\r\nexport function isAgentError(err: unknown): err is AgentError {\r\n return err instanceof AgentError;\r\n}\r\n","import type { ContentBlock, TextBlock } from './blocks.js';\r\nimport type { Message } from './messages.js';\r\nimport type { Tool } from './tool.js';\r\nimport type { ErrorCode } from './errors.js';\r\nimport { WrongStackError } from './errors.js';\r\n\r\nexport interface Usage {\r\n input: number;\r\n output: number;\r\n cacheRead?: number;\r\n cacheWrite?: number;\r\n}\r\n\r\nexport interface Capabilities {\r\n tools: boolean;\r\n parallelTools: boolean;\r\n vision: boolean;\r\n streaming: boolean;\r\n promptCache: boolean;\r\n systemPrompt: boolean;\r\n jsonMode: boolean;\r\n maxContext: number;\r\n cacheControl: 'native' | 'auto' | 'none';\r\n}\r\n\r\nexport interface Request {\r\n model: string;\r\n system?: TextBlock[];\r\n messages: Message[];\r\n tools?: Tool[];\r\n maxTokens: number;\r\n temperature?: number;\r\n topP?: number;\r\n stopSequences?: string[];\r\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\r\n}\r\n\r\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\r\n\r\nexport interface Response {\r\n content: ContentBlock[];\r\n stopReason: StopReason;\r\n usage: Usage;\r\n model: string;\r\n}\r\n\r\nexport type StreamEvent =\r\n | { type: 'message_start'; model: string }\r\n | { type: 'content_block_start'; kind: 'text' | 'tool_use'; id?: string; name?: string }\r\n | { type: 'content_block_stop'; index: number }\r\n | { type: 'text_delta'; text: string }\r\n | { type: 'tool_use_start'; id: string; name: string }\r\n | { type: 'tool_use_input_delta'; id: string; partial: string }\r\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\r\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\r\n\r\nexport interface Provider {\r\n readonly id: string;\r\n readonly capabilities: Capabilities;\r\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\r\n * aggregates this stream — providers may override for non-streaming wires. */\r\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\r\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\r\n}\r\n\r\n/**\r\n * Structured body parsed from a provider's HTTP error response. Populated\r\n * best-effort: providers return JSON shaped differently (Anthropic uses\r\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\r\n * Google uses `{error: {status, message}}`), so the fields here are the\r\n * intersection that's usable for rendering and routing.\r\n */\r\nexport interface ProviderErrorBody {\r\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\r\n type?: string;\r\n /** Human-readable explanation from the provider. */\r\n message?: string;\r\n /** Provider request id, when present in the body or headers. */\r\n requestId?: string;\r\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\r\n retryAfterMs?: number;\r\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\r\n raw?: string;\r\n /** True when `raw` was truncated; check `rawLength` for the original size. */\r\n truncated?: boolean;\r\n /** Original length of the response body in bytes, when `truncated` is true. */\r\n rawLength?: number;\r\n}\r\n\r\nexport class ProviderError extends WrongStackError {\r\n public readonly status: number;\r\n public readonly retryable: boolean;\r\n public readonly providerId: string;\r\n public readonly body?: ProviderErrorBody;\r\n\r\n constructor(\r\n message: string,\r\n status: number,\r\n retryable: boolean,\r\n providerId: string,\r\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\r\n ) {\r\n super({\r\n message,\r\n code: providerStatusToCode(status, opts.body?.type),\r\n subsystem: 'provider',\r\n severity: status >= 500 ? 'error' : 'warning',\r\n recoverable: retryable,\r\n context: { providerId, status },\r\n cause: opts.cause,\r\n });\r\n this.name = 'ProviderError';\r\n this.status = status;\r\n this.retryable = retryable;\r\n this.providerId = providerId;\r\n this.body = opts.body;\r\n }\r\n\r\n /**\r\n * Render a one-line, user-facing description. Designed for the CLI/TUI\r\n * status line and the agent's retry warning. Avoids dumping raw JSON\r\n * (which is what users see today when a 529 lands and the log message\r\n * includes the full `{\"type\":\"error\",...}` body).\r\n *\r\n * Examples:\r\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\r\n * \"openai rate limited (429): Retry after 12s\"\r\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\r\n * \"groq HTTP 500 (server error)\"\r\n */\r\n override describe(): string {\r\n const kind = describeStatus(this.status, this.body?.type);\r\n const head = `${this.providerId} ${kind}`;\r\n const detail = this.body?.message?.trim();\r\n const reqId = this.body?.requestId\r\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\r\n : '';\r\n if (detail && detail.length > 0) {\r\n return `${head}: ${truncate(detail, 240)}${reqId}`;\r\n }\r\n return `${head}${reqId}`;\r\n }\r\n}\r\n\r\nfunction describeStatus(status: number, type?: string): string {\r\n if (status === 0) return 'network error';\r\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\r\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\r\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\r\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\r\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\r\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\r\n if (status === 408) return `timeout (${status})`;\r\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\r\n if (type) return `${type} (${status})`;\r\n return `HTTP ${status}`;\r\n}\r\n\r\nfunction truncate(s: string, n: number): string {\r\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\r\n}\r\n\r\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\r\n if (status === 0) return 'PROVIDER_NETWORK_ERROR';\r\n if (type === 'rate_limit_error' || status === 429) return 'PROVIDER_RATE_LIMITED';\r\n if (type === 'authentication_error' || status === 401) return 'PROVIDER_AUTH_FAILED';\r\n if (type === 'overloaded_error' || status === 529) return 'PROVIDER_OVERLOADED';\r\n if (type === 'invalid_request_error' || status === 400) return 'PROVIDER_INVALID_REQUEST';\r\n if (status === 408) return 'PROVIDER_NETWORK_ERROR';\r\n if (status >= 500) return 'PROVIDER_SERVER_ERROR';\r\n return 'PROVIDER_INVALID_REQUEST';\r\n}\r\n","import { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n private static readonly NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = DefaultRetryPolicy.NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status >= 500) return 3;\n return 0;\n }\n return 2;\n }\n\n delayMs(attempt: number): number {\n const base = 1000;\n const exp = base * 2 ** attempt;\n const jitter = Math.random() * base;\n return Math.min(30_000, exp + jitter);\n }\n}\n","import { ProviderError } from '../types/provider.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport type { Context } from '../core/context.js';\n\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\n\n/**\n * Tiered error recovery strategies.\n * Each strategy is attempted in order until one returns a decision.\n */\nexport interface RecoveryStrategy {\n /** Human-readable label for logs. */\n label: string;\n /** Optional compactor for context_overflow recovery. */\n compactor?: Compactor;\n /** Returns an explicit recovery decision, or null to fall through. */\n attempt: (err: unknown, ctx: Context) => Promise<RecoveryDecision | null>;\n}\n\n// Package-level compiled regex for hot paths — avoids repeated compilation.\nconst CONTEXT_OVERFLOW_RE = /context|too long|tokens/i;\nconst NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\n/**\n * Builds the ordered list of recovery strategies used by DefaultErrorHandler.\n * Exported so callers can customise or extend the strategy chain.\n */\nexport function buildRecoveryStrategies(opts?: {\n compactor?: Compactor;\n modelsRegistry?: ModelsRegistry;\n}): RecoveryStrategy[] {\n return [\n {\n label: 'context_overflow_reduce',\n compactor: opts?.compactor,\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 413 && !CONTEXT_OVERFLOW_RE.test(err.message)) return null;\n\n if (this.compactor) {\n try {\n const report = await this.compactor.compact(ctx, { aggressive: true });\n if (report.after < report.before) {\n return { action: 'retry', reason: 'context_compacted' };\n }\n } catch {\n // compact failed; fall through\n }\n }\n return null;\n },\n },\n {\n label: 'rate_limit_backoff',\n async attempt(err) {\n if (!(err instanceof ProviderError) || err.status !== 429) return null;\n\n // Prefer the parsed Retry-After hint the provider extracted into\n // body.retryAfterMs; fall back to 5s when absent.\n const delayMs = err.body?.retryAfterMs ?? 5_000;\n // Clamp between 1s and 60s.\n const delay = Math.max(1_000, Math.min(delayMs, 60_000));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 429 && err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const candidates = provider.models.filter((m) => {\n const modelCost = m.cost?.input ?? Number.POSITIVE_INFINITY;\n const currentCost = currentModel.cost?.input ?? Number.POSITIVE_INFINITY;\n if (modelCost >= currentCost) return false;\n if (currentModel.capabilities.tools && !m.tool_call) return false;\n if (currentModel.capabilities.vision && !m.modalities?.input?.includes('image')) return false;\n return true;\n });\n\n if (candidates.length === 0) return null;\n\n const fallback = candidates.reduce((prev, curr) =>\n (curr.cost?.input ?? 0) < (prev.cost?.input ?? 0) ? curr : prev,\n );\n\n return {\n action: 'retry',\n reason: 'model_downgrade',\n model: fallback.id,\n };\n } catch {\n return null;\n }\n },\n },\n ];\n}\n\nexport const DEFAULT_RECOVERY_STRATEGIES = buildRecoveryStrategies();\n\nexport class DefaultErrorHandler implements ErrorHandler {\n private readonly strategies: RecoveryStrategy[];\n\n constructor(strategies: RecoveryStrategy[] = DEFAULT_RECOVERY_STRATEGIES) {\n this.strategies = strategies;\n }\n\n classify(err: unknown): {\n kind:\n | 'rate_limit'\n | 'overloaded'\n | 'server'\n | 'client'\n | 'network'\n | 'abort'\n | 'context_overflow'\n | 'unknown';\n retryable: boolean;\n } {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof ProviderError) {\n if (err.status === 429) return { kind: 'rate_limit', retryable: true };\n if (err.status === 529) return { kind: 'overloaded', retryable: true };\n if (err.status >= 500) return { kind: 'server', retryable: true };\n if (err.status === 413 || CONTEXT_OVERFLOW_RE.test(err.message)) {\n return { kind: 'context_overflow', retryable: false };\n }\n if (err.status >= 400) return { kind: 'client', retryable: false };\n }\n if (err instanceof Error && NETWORK_ERR_RE.test(err.message)) {\n return { kind: 'network', retryable: true };\n }\n return { kind: 'unknown', retryable: false };\n }\n\n async recover(err: unknown, ctx: Context): Promise<RecoveryDecision | null> {\n for (const strategy of this.strategies) {\n const result = await strategy.attempt(err, ctx);\n if (result !== null) return result;\n }\n return null;\n }\n}","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillEntry, SkillLoader, SkillManifest } from '../types/skill.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface SkillLoaderOptions {\n paths: WstackPaths;\n bundledDir?: string;\n}\n\n/**\n * Discovery order (later layers shadow earlier ones at boot, but we walk\n * highest priority first and skip names already seen):\n * 1. Project-committed: <project>/.wrongstack/skills/\n * 2. User-global: ~/.wrongstack/skills/\n * 3. Bundled with build: packages/core/skills/\n */\nexport class DefaultSkillLoader implements SkillLoader {\n private readonly dirs: { dir: string; source: SkillManifest['source'] }[];\n private cache?: SkillManifest[];\n\n constructor(opts: SkillLoaderOptions) {\n this.dirs = [\n { dir: opts.paths.inProjectSkills, source: 'project' },\n { dir: opts.paths.globalSkills, source: 'user' },\n ];\n if (opts.bundledDir) {\n this.dirs.push({ dir: opts.bundledDir, source: 'bundled' });\n }\n }\n\n async list(): Promise<SkillManifest[]> {\n if (this.cache) return this.cache;\n const found: SkillManifest[] = [];\n const seen = new Set<string>();\n for (const { dir, source } of this.dirs) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const skillFile = path.join(dir, e.name, 'SKILL.md');\n try {\n const raw = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(raw);\n if (!meta.name || !meta.description) continue;\n if (seen.has(meta.name)) continue;\n seen.add(meta.name);\n found.push({\n name: meta.name,\n description: meta.description,\n version: meta.version,\n path: skillFile,\n source,\n });\n } catch {\n // skip malformed skill\n }\n }\n } catch {\n // directory may not exist\n }\n }\n this.cache = found;\n return found;\n }\n\n async find(name: string): Promise<SkillManifest | undefined> {\n const all = await this.list();\n return all.find((s) => s.name === name);\n }\n\n async manifestText(): Promise<string> {\n const skills = await this.list();\n if (skills.length === 0) return '';\n const entries = await this.listEntries();\n const lines = ['## Available skills'];\n for (const e of entries) {\n const scopeTag = e.scope.length > 0 ? ` — ${e.scope.slice(0, 3).join(', ')}` : '';\n lines.push(`- **${e.name}**${scopeTag}`);\n lines.push(` Use when: ${e.trigger}`);\n }\n return lines.join('\\n');\n }\n\n async listEntries(): Promise<SkillEntry[]> {\n const skills = await this.list();\n const entries: SkillEntry[] = [];\n for (const s of skills) {\n try {\n const raw = await fs.readFile(s.path, 'utf8');\n const { trigger, scope } = parseDescription(raw);\n entries.push({ name: s.name, trigger, scope, source: s.source, path: s.path });\n } catch {\n // skip\n }\n }\n return entries;\n }\n\n async readBody(name: string): Promise<string> {\n const m = await this.find(name);\n if (!m) throw new Error(`Skill \"${name}\" not found`);\n return fs.readFile(m.path, 'utf8');\n }\n}\n\ninterface Frontmatter {\n name?: string;\n description?: string;\n version?: string;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Parse skill description into:\n * - trigger: extracted \"Use when...\" sentence (first sentence of description)\n * - scope: comma-separated items from first line's parenthetical or file-ext list\n */\nfunction parseDescription(raw: string): { trigger: string; scope: string[] } {\n const fm = parseFrontmatter(raw);\n const desc = fm.description ?? '';\n\n // Extract first sentence as trigger\n const firstSentenceEnd = desc.indexOf('. ');\n const trigger = firstSentenceEnd !== -1\n ? desc.slice(0, firstSentenceEnd + 1).trim()\n : desc.trim().split('\\n')[0] ?? '';\n\n // Extract scope from parenthetical: \"Covers X, Y, and Z\" or \"for A, B, C\"\n const scope: string[] = [];\n const coversMatch = /(?:covers|for|including)\\s+([^.]+)/i.exec(desc);\n if (coversMatch) {\n const items = coversMatch[1]!.replace(/[·•]/g, ',').split(',').map((s) => s.trim()).filter(Boolean);\n scope.push(...items);\n }\n\n return { trigger, scope };\n}\n","import * as fs from 'node:fs/promises';\nimport type { Config, ConfigLoader } from '../types/config.js';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { safeParse } from '../utils/safe-json.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\nimport { decryptConfigSecrets } from './secret-vault.js';\n\n/**\n * Defaults express *behavior*, not identity. Provider and model are NOT\n * hardcoded — they must be resolved at runtime from config + env + the\n * ModelsRegistry. A bare Config returned by this loader will throw when\n * the agent tries to construct a provider, with a message that points\n * users at `wstack init`.\n */\nconst BEHAVIOR_DEFAULTS: Omit<Config, 'provider' | 'model'> = {\n version: 1,\n context: {\n warnThreshold: 0.6,\n softThreshold: 0.75,\n hardThreshold: 0.9,\n autoCompact: true,\n preserveK: 10,\n eliseThreshold: 2000,\n },\n tools: {\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n },\n log: { level: 'info' },\n features: {\n mcp: true,\n plugins: true,\n memory: true,\n modelsRegistry: true,\n skills: true,\n },\n};\n\nconst ENV_MAP: Record<string, (cfg: PartialConfig, val: string) => void> = {\n WRONGSTACK_PROVIDER: (c, v) => {\n c.provider = v;\n },\n WRONGSTACK_MODEL: (c, v) => {\n c.model = v;\n },\n WRONGSTACK_API_KEY: (c, v) => {\n c.apiKey = v;\n },\n WRONGSTACK_BASE_URL: (c, v) => {\n c.baseUrl = v;\n },\n WRONGSTACK_LOG_LEVEL: (c, v) => {\n if (!c.log) c.log = { level: 'info' };\n c.log.level = v as Config['log']['level'];\n },\n};\n\ntype PartialConfig = Partial<Config> & { providers?: Record<string, { apiKey?: string; baseUrl?: string; type?: string }> };\n\nfunction isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || typeof v !== 'object');\n}\n\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T>(base: T, patch: Partial<T>): T {\n if (typeof base !== 'object' || base === null) return (patch as T) ?? base;\n if (typeof patch !== 'object' || patch === null) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [k, v] of Object.entries(patch as Record<string, unknown>)) {\n // Defense in depth — user config is parsed from JSON and merged\n // recursively; blocking these keys eliminates prototype-pollution\n // gadgets regardless of where else they might be touched.\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n // Primitive arrays (plugins, tools, etc.) are merged by concatenation.\n // Object arrays (MCP servers, etc.) are replaced wholesale.\n if (Array.isArray(v)) {\n if (Array.isArray(existing) && isPrimitiveArray(v) && isPrimitiveArray(existing)) {\n out[k] = [...new Set([...existing, ...v])];\n } else {\n out[k] = v;\n if (process.env.WRONGSTACK_DEBUG_CONFIG) {\n console.warn(\n `[config] Non-primitive array for \"${k}\" replaced (global + local config merge). ` +\n `Global entries: ${(existing as unknown[] | undefined)?.length ?? 0}, local entries: ${v.length}.`,\n );\n }\n }\n } else if (\n typeof v === 'object' &&\n v !== null &&\n typeof existing === 'object' &&\n existing !== null\n ) {\n out[k] = deepMerge(existing, v as Record<string, unknown>);\n } else if (v !== undefined) {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A single config source. Higher priority wins in merges.\n * Sources are applied in priority order (lowest first), so a source\n * with priority=10 overrides one with priority=1.\n */\nexport interface ConfigSource {\n /** Unique name for debugging and error messages. */\n name: string;\n /** Lower numbers merge first, higher numbers override lower. Default: 50. */\n priority?: number;\n /**\n * Read the raw config patch. Return an empty object if unavailable.\n * Errors are surfaced but do not abort loading — the source is skipped.\n */\n read(): Promise<Partial<Config>>;\n}\n\nexport interface ConfigLoaderOptions {\n paths: WstackPaths;\n strict?: boolean;\n vault?: SecretVault;\n /** Extra sources merged after the built-in layers. */\n sources?: ConfigSource[];\n}\n\nexport class DefaultConfigLoader implements ConfigLoader {\n private readonly paths: WstackPaths;\n private readonly strict: boolean;\n private readonly vault: SecretVault | undefined;\n private readonly extraSources: ConfigSource[];\n\n constructor(opts: ConfigLoaderOptions) {\n this.paths = opts.paths;\n this.strict = opts.strict ?? false;\n this.vault = opts.vault;\n this.extraSources = opts.sources ?? [];\n }\n\n async load(opts: { cliFlags?: Partial<Config>; cwd?: string } = {}): Promise<Config> {\n let cfg: PartialConfig = { ...BEHAVIOR_DEFAULTS } as PartialConfig;\n\n // Layer 2 & 3: global + project-local config — read in parallel\n const [global, local] = await Promise.all([\n this.readJson(this.paths.globalConfig),\n this.readJson(this.paths.projectLocalConfig),\n ]);\n cfg = deepMerge(cfg, global);\n cfg = deepMerge(cfg, local);\n\n // Layer 4: env vars\n for (const [key, fn] of Object.entries(ENV_MAP)) {\n const v = process.env[key];\n if (v) fn(cfg, v);\n }\n\n // Layer 5: extra sources — sorted by priority (lowest first).\n // When priorities tie, sort by name for deterministic order.\n const sorted = [...this.extraSources].sort((a, b) => {\n const pd = (a.priority ?? 50) - (b.priority ?? 50);\n if (pd !== 0) return pd;\n return a.name.localeCompare(b.name);\n });\n for (const src of sorted) {\n try {\n const patch = await src.read();\n if (patch && Object.keys(patch).length > 0) {\n cfg = deepMerge(cfg, patch);\n }\n } catch (err) {\n // Best-effort: skip failing sources so one bad source doesn't block boot.\n console.warn(`Config source \"${src.name}\" failed`, err);\n }\n }\n\n // Layer 6: CLI flags\n if (opts.cliFlags) {\n cfg = deepMerge(cfg, opts.cliFlags);\n }\n\n // Decrypt apiKey-like fields if a vault is configured.\n if (this.vault) {\n cfg = decryptConfigSecrets(cfg, this.vault);\n }\n\n // Multi-key resolution: when a provider has `apiKeys[]` configured,\n // mirror the active entry into `apiKey` so downstream construction\n // code (provider registry, wire adapters) needs no changes. Honors\n // `activeKey` (by label), else falls back to the first entry. A\n // pre-existing `apiKey` set by env/CLI flags wins so an explicit\n // override still beats the saved list.\n if (cfg.providers) {\n for (const pcfg of Object.values(cfg.providers)) {\n if (!pcfg || typeof pcfg !== 'object') continue;\n const rawKeys = (pcfg as { apiKeys?: unknown }).apiKeys;\n if (!Array.isArray(rawKeys) || rawKeys.length === 0) continue;\n // Each apiKeys entry came from arbitrary JSON. Filter to entries\n // that actually have a string apiKey + label so a malformed array\n // (null entry, missing field) doesn't crash the .find / chosen.apiKey\n // path below.\n const keys = rawKeys.filter(\n (k): k is { label: string; apiKey: string } =>\n !!k &&\n typeof k === 'object' &&\n typeof (k as { label?: unknown }).label === 'string' &&\n typeof (k as { apiKey?: unknown }).apiKey === 'string',\n );\n if (keys.length === 0) continue;\n const existing = (pcfg as { apiKey?: string }).apiKey;\n if (existing && existing.length > 0) continue;\n const activeLabel = (pcfg as { activeKey?: string }).activeKey;\n const chosen = activeLabel\n ? keys.find((k) => k.label === activeLabel) ?? keys[0]\n : keys[0];\n if (chosen?.apiKey) {\n (pcfg as { apiKey?: string }).apiKey = chosen.apiKey;\n }\n }\n }\n\n this.validateBehavior(cfg);\n if (this.strict) {\n this.validateIdentity(cfg);\n }\n // In strict mode, validateIdentity has confirmed provider/model are set;\n // it's safe to assert the full Config contract. In non-strict mode the\n // caller (e.g. early-boot wizard) accepts a Partial and constructs the\n // provider later, so we deliberately return without the cast.\n return Object.freeze(cfg) as Config;\n }\n\n private async readJson(file: string): Promise<PartialConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(file, 'utf8');\n } catch (err) {\n // Missing file is the common case (per-project local config rarely\n // exists at start). Surface anything else (EACCES, EISDIR) so a\n // mis-permissioned config doesn't silently fall back to defaults.\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`[config] Failed to read \"${file}\":`, err);\n }\n return {};\n }\n const parsed = safeParse<PartialConfig>(raw);\n if (!parsed.ok || !parsed.value) {\n // The file exists but isn't valid JSON. Don't silently reset to\n // defaults — that's hours of debug timesink for users who'd typo'd\n // their config. Warn loudly and keep the in-memory defaults.\n console.warn(\n `[config] Failed to parse \"${file}\": invalid JSON. Falling back to defaults for this layer.`,\n );\n return {};\n }\n return parsed.value;\n }\n\n private validateBehavior(cfg: PartialConfig): void {\n if (cfg.version === undefined) throw new Error('Config: missing version field');\n if (cfg.version !== 1) throw new Error(`Config: unsupported version ${cfg.version}`);\n const c = cfg.context;\n if (!c) throw new Error('Config: missing context section');\n // A user-edited config.json can land strings here (\"0.6\") and slip past\n // truthiness checks; the `>=` comparison then coerces silently and the\n // threshold ordering check passes for nonsense values. Validate types\n // explicitly so misconfigs surface here, not as confusing failures deep\n // in the auto-compaction logic.\n const fields: Array<keyof typeof c> = ['warnThreshold', 'softThreshold', 'hardThreshold'];\n for (const f of fields) {\n const v = c[f];\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`Config: context.${String(f)} must be a finite number (got ${typeof v})`);\n }\n }\n if (c.warnThreshold >= c.softThreshold || c.softThreshold >= c.hardThreshold) {\n throw new Error('Config: context thresholds must satisfy warn < soft < hard');\n }\n }\n\n private validateIdentity(cfg: PartialConfig): void {\n if (!cfg.provider) {\n throw new Error(\n 'Config: no provider configured. Run `wstack init` or set WRONGSTACK_PROVIDER.',\n );\n }\n if (!cfg.model) {\n throw new Error(\n 'Config: no model configured. Run `wstack init` or set WRONGSTACK_MODEL.',\n );\n }\n }\n}\n","import type { Config, ConfigStore } from '../types/config.js';\n\n/**\n * Reference implementation of `ConfigStore`. Stores a single frozen Config\n * and notifies watchers synchronously on every update. Updates use a deep\n * clone so callers can mutate their `partial` argument freely without\n * tainting state.\n *\n * For the CLI: instantiate once at boot, pass the store (not the Config)\n * to subsystems that care about runtime changes (provider switching,\n * extension reload).\n */\nexport class DefaultConfigStore implements ConfigStore {\n private current: Readonly<Config>;\n private watchers = new Set<(next: Readonly<Config>, prev: Readonly<Config>) => void>();\n\n constructor(initial: Config) {\n this.current = deepFreeze(structuredClone(initial));\n }\n\n get(): Readonly<Config> {\n return this.current;\n }\n\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]> {\n return this.current[key] as Readonly<Config[K]>;\n }\n\n getExtension(pluginName: string): Readonly<Record<string, unknown>> {\n const ext = this.current.extensions?.[pluginName];\n return ext ? (ext as Readonly<Record<string, unknown>>) : FROZEN_EMPTY;\n }\n\n update(partial: Partial<Config>): Readonly<Config> {\n // Shallow merge — top-level fields replace, nested objects do too unless\n // the caller passes a fully-formed sub-object. That matches the JSON\n // config user mental model (replace `tools.maxIterations` by passing\n // the whole `tools` block, or by patching `extensions.<name>`).\n const next = deepFreeze(\n structuredClone({ ...this.current, ...partial }),\n ) as Readonly<Config>;\n\n if (next.version !== 1) {\n throw new Error(`ConfigStore.update: version must remain 1, got ${String(next.version)}`);\n }\n\n const prev = this.current;\n this.current = next;\n // Notify watchers AFTER mutating `current` so re-entrant watcher reads\n // see the new state. Watcher exceptions are caught individually so one\n // misbehaving subscriber can't block the others.\n for (const w of this.watchers) {\n try {\n w(next, prev);\n } catch (err) {\n // A plugin watcher that crashes on /model switch or similar would\n // otherwise leave the system in a quietly-inconsistent state. We\n // still don't propagate (one bad subscriber must not break the\n // others), but we surface the error so it's discoverable.\n console.error('[config-store] watcher threw:', err);\n }\n }\n return next;\n }\n\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void {\n this.watchers.add(cb);\n return () => this.watchers.delete(cb);\n }\n}\n\nconst FROZEN_EMPTY: Readonly<Record<string, unknown>> = Object.freeze({});\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Object.isFrozen(obj)) return obj;\n for (const key of Object.keys(obj as object)) {\n const v = (obj as Record<string, unknown>)[key];\n if (v !== null && typeof v === 'object' && !Object.isFrozen(v)) {\n deepFreeze(v);\n }\n }\n return Object.freeze(obj);\n}\n","/**\n * L2-D: Config version migration framework. Pure functions, decoupled\n * from disk/CLI — caller passes a parsed JSON object and gets back the\n * up-to-date `Config` shape (or a structured error explaining why\n * migration failed).\n *\n * Migrations are registered as `{ from, to, migrate }` triples and run\n * sequentially. Each migration is independently testable. Adding a new\n * version means appending one migration; existing user configs are\n * upgraded in place at load time.\n */\n\nexport interface MigrationContext {\n /**\n * Original on-disk version of the input. Migrations may use this to\n * decide between in-place patches and rewrites.\n */\n fromVersion: number;\n /**\n * Set when the migration writes back to disk. Callers persist the\n * migrated config when this is true so the user doesn't see the same\n * migration banner on every boot.\n */\n shouldPersist: boolean;\n}\n\nexport interface ConfigMigration {\n /** Version of the input this migration accepts. */\n from: number;\n /** Version of the output it produces. */\n to: number;\n /** Pure transform — no I/O. */\n migrate(input: Record<string, unknown>, ctx: MigrationContext): Record<string, unknown>;\n /** Optional human-readable description for migration logs / banners. */\n describe?: string;\n}\n\nexport interface MigrationResult {\n /** Final config (still typed as `unknown`-keyed — caller validates). */\n config: Record<string, unknown>;\n /** Ordered list of `from→to` versions that ran. */\n applied: string[];\n /** True when at least one migration produced changes worth persisting. */\n shouldPersist: boolean;\n}\n\nexport class ConfigMigrationError extends Error {\n readonly fromVersion: number;\n readonly targetVersion: number;\n readonly missingStep: number | null;\n\n constructor(opts: { message: string; fromVersion: number; targetVersion: number; missingStep: number | null }) {\n super(opts.message);\n this.name = 'ConfigMigrationError';\n this.fromVersion = opts.fromVersion;\n this.targetVersion = opts.targetVersion;\n this.missingStep = opts.missingStep;\n }\n}\n\n/**\n * Run registered migrations until the input reaches `targetVersion`.\n *\n * Resolution rules:\n * 1. If `input.version === targetVersion`, no migrations run; `shouldPersist`\n * is false.\n * 2. Otherwise walk the migration chain from `input.version` upward,\n * picking the migration whose `from` matches the current version.\n * 3. Stop when `current.version === targetVersion`.\n * 4. If no migration matches at some point, throw `ConfigMigrationError`\n * with the missing step recorded for diagnostics.\n *\n * Migrations may be downward (e.g. for staged rollouts), but `targetVersion`\n * must be reachable strictly via the registered chain — there's no implicit\n * \"skip\" or transitive resolution.\n */\nexport function runConfigMigrations(\n input: Record<string, unknown>,\n targetVersion: number,\n migrations: readonly ConfigMigration[],\n): MigrationResult {\n const initial = typeof input['version'] === 'number' ? (input['version'] as number) : 1;\n let current: Record<string, unknown> = { ...input };\n let currentVersion = initial;\n const applied: string[] = [];\n let shouldPersist = false;\n\n let guard = 0;\n while (currentVersion !== targetVersion) {\n if (++guard > 100) {\n throw new ConfigMigrationError({\n message: `Config migration looped past 100 steps (from v${initial} toward v${targetVersion})`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const step = migrations.find((m) => m.from === currentVersion);\n if (!step) {\n throw new ConfigMigrationError({\n message: `No migration registered from config v${currentVersion} (target v${targetVersion}). Update the framework or revert the config file.`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const ctx: MigrationContext = { fromVersion: currentVersion, shouldPersist: false };\n const next = step.migrate(current, ctx);\n // Ensure the migration set the new version. Be tolerant: if it didn't,\n // patch it in so the chain doesn't infinite-loop on author oversight.\n if (typeof next['version'] !== 'number' || next['version'] !== step.to) {\n next['version'] = step.to;\n }\n current = next;\n currentVersion = step.to;\n applied.push(`v${step.from}→v${step.to}`);\n shouldPersist = shouldPersist || ctx.shouldPersist || step.from < step.to;\n }\n return { config: current, applied, shouldPersist };\n}\n\n/**\n * Default empty migration registry. Real migrations are appended as new\n * Config versions are introduced. Example (when v2 lands):\n *\n * export const CONFIG_MIGRATIONS: readonly ConfigMigration[] = [\n * {\n * from: 1, to: 2, describe: 'rename `apiKey` → `auth.apiKey`',\n * migrate(cfg) {\n * const apiKey = cfg.apiKey;\n * delete cfg.apiKey;\n * return { ...cfg, auth: { ...(cfg.auth ?? {}), apiKey } };\n * },\n * },\n * ];\n */\nexport const DEFAULT_CONFIG_MIGRATIONS: readonly ConfigMigration[] = [];\n","/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n */\n\nconst RoughTokenEstimate = (text: string): number => Math.max(1, Math.ceil(text.length / 4));\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n\nconst ESTIMATE_CACHE_MAX_SIZE = 10_000;\n\nfunction getCachedEstimate(key: string, compute: () => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest quarter when at capacity — simple LRU-ish policy.\n const keys = [...ESTIMATE_CACHE.keys()];\n for (let i = 0; i < Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4); i++) {\n ESTIMATE_CACHE.delete(keys[i]!);\n }\n }\n const estimate = compute();\n ESTIMATE_CACHE.set(key, estimate);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n const key = JSON.stringify(input);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n const key = JSON.stringify(content);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}","import type { Compactor, CompactReport } from '../types/compactor.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { ContentBlock, ToolResultBlock } from '../types/blocks.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport { estimateToolInputTokens, estimateToolResultTokens, estimateTextTokens } from '../utils/token-estimate.js';\r\n\r\nexport interface CompactorOptions {\r\n preserveK?: number;\r\n eliseThreshold?: number;\r\n estimator?: (text: string) => number;\r\n}\r\n\r\nexport class HybridCompactor implements Compactor {\r\n private readonly preserveK: number;\r\n private readonly eliseThreshold: number;\r\n private readonly estimator: (text: string) => number;\r\n\r\n constructor(opts: CompactorOptions = {}) {\r\n this.preserveK = opts.preserveK ?? 10;\r\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\r\n this.estimator = opts.estimator ?? estimateTextTokens;\r\n }\r\n\r\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\r\n const beforeTokens = this.estimateMessages(ctx.messages);\r\n const reductions: CompactReport['reductions'] = [];\r\n\r\n // Phase 1: elision\r\n const phase1Saved = this.eliseOldToolResults(ctx);\r\n if (phase1Saved > 0) reductions.push({ phase: 'elision', saved: phase1Saved });\r\n\r\n // Phase 2: summary (placeholder; in production calls sub-LLM)\r\n if (opts.aggressive) {\r\n const phase2Saved = this.collapseAncientTurns(ctx);\r\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\r\n }\r\n\r\n const afterTokens = this.estimateMessages(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n private eliseOldToolResults(ctx: Context): number {\r\n const messages = ctx.messages;\r\n // Walk backwards counting (user + assistant) pairs to determine where\r\n // the preservation window really starts. This is more accurate than\r\n // the fixed multiplier which assumes every turn is 1 message pair.\r\n let pairCount = 0;\r\n let preserveStart = messages.length;\r\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' || m.role === 'assistant') {\r\n pairCount++;\r\n preserveStart = i;\r\n }\r\n }\r\n let saved = 0;\r\n let changed = false;\r\n const nextMessages = new Array(messages.length);\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i];\r\n // Only process messages before the preservation window\r\n if (i >= preserveStart) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n if (!msg || !Array.isArray(msg.content)) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n const newContent: ContentBlock[] = msg.content.map((b) => {\r\n if (b.type !== 'tool_result') return b;\r\n const tokens = estimateToolResultTokens(b.content);\r\n if (tokens < this.eliseThreshold) return b;\r\n saved += tokens;\r\n const elided: ToolResultBlock = {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: `[elided: ~${tokens} tokens removed. Call the tool again if needed.]`,\r\n is_error: b.is_error,\r\n };\r\n return elided;\r\n });\r\n // Check whether any block actually changed by reference equality\r\n if (newContent.length === msg.content.length && newContent.every((b, idx) => b === msg.content[idx])) {\r\n nextMessages[i] = msg;\r\n } else {\r\n nextMessages[i] = { ...msg, content: newContent };\r\n changed = true;\r\n }\r\n }\r\n if (changed) ctx.state.replaceMessages(nextMessages);\r\n return saved;\r\n }\r\n\r\n private collapseAncientTurns(ctx: Context): number {\r\n const messages = ctx.messages;\r\n const cutTarget = Math.max(0, messages.length - this.preserveK * 2);\r\n if (cutTarget <= 0) return 0;\r\n\r\n // Find a safe boundary: nearest user-message-with-text at or after cutTarget\r\n let boundary = -1;\r\n for (let i = cutTarget; i < messages.length; i++) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' && hasTextContent(m)) {\r\n boundary = i;\r\n break;\r\n }\r\n }\r\n if (boundary <= 0) return 0;\r\n\r\n const removed = messages.slice(0, boundary);\r\n const removedTokens = this.estimateMessages(removed);\r\n\r\n const summary: Message[] = [\r\n {\r\n role: 'user',\r\n content: `[previous_session_summary: ${removed.length} earlier turns compacted. Todo state preserved in context.]`,\r\n },\r\n { role: 'assistant', content: 'Continuing from compacted context.' },\r\n ];\r\n\r\n // L1-A: route through ConversationState so subscribers see the rewrite.\r\n const tail = ctx.messages.slice(boundary);\r\n ctx.state.replaceMessages([...summary, ...tail]);\r\n return Math.max(0, removedTokens - this.estimateMessages(summary));\r\n }\r\n\r\n private estimateMessages(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += this.estimator(m.content);\r\n } else {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += this.estimator(b.text);\r\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\r\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\r\n }\r\n }\r\n }\r\n return total;\r\n }\r\n}\r\n\r\nfunction hasTextContent(m: Message): boolean {\r\n if (typeof m.content === 'string') return m.content.trim().length > 0;\r\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\r\n}\r\n","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string;\n content: string;\n is_error?: boolean;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\n };\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\n","import type { Compactor, CompactReport } from '../types/compactor.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport type { Provider, Request } from '../types/provider.js';\r\nimport type { ContentBlock, TextBlock } from '../types/blocks.js';\r\nimport { isTextBlock } from '../types/blocks.js';\r\nimport { estimateToolInputTokens, estimateToolResultTokens, estimateTextTokens } from '../utils/token-estimate.js';\r\n\r\n/**\r\n * Options for IntelligentCompactor.\r\n */\r\nexport interface IntelligentCompactorOptions {\r\n /** Provider to use for LLM-assisted summarization. Required. */\r\n provider: Provider;\r\n /** Fraction of maxContext that triggers a warning (default 0.6). */\r\n warnThreshold?: number;\r\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\r\n softThreshold?: number;\r\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\r\n hardThreshold?: number;\r\n /** Max context window in tokens (used only for threshold fraction math). */\r\n maxContext?: number;\r\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\r\n preserveK?: number;\r\n /** Token threshold below which tool results are not elided (default 500). */\r\n eliseThreshold?: number;\r\n /** System prompt for the summarizer sub-LLM. */\r\n summarizerPrompt?: string;\r\n /**\r\n * Model ID to use for summarization. When not set, the same model as the\r\n * agent is used (which risks cascading failure on context overflow). Set to\r\n * a fast/cheap model like `claude-3-5-haiku-20240620` for resilience.\r\n */\r\n summarizerModel?: string;\r\n}\r\n\r\n/**\r\n * An importance label for a message or message range.\r\n */\r\nexport type Importance = 'critical' | 'high' | 'medium' | 'low';\r\n\r\n/**\r\n * Result of importance analysis.\r\n */\r\nexport interface ImportanceAnalysis {\r\n messages: Array<{ index: number; importance: Importance; reason: string }>;\r\n criticalRanges: Array<{ from: number; to: number; summary: string }>;\r\n}\r\n\r\n/**\r\n * IntelligentCompactor uses an LLM to:\r\n * - Analyze message importance and preserve critical context\r\n * - Generate semantic summaries for old message ranges\r\n * - Make intelligent decisions about what to compact\r\n *\r\n * It extends HybridCompactor's elision logic with LLM-assisted summarization.\r\n */\r\nexport class IntelligentCompactor implements Compactor {\r\n private readonly provider: Provider;\r\n private readonly warnThreshold: number;\r\n private readonly softThreshold: number;\r\n private readonly hardThreshold: number;\r\n private readonly maxContext: number;\r\n private readonly preserveK: number;\r\n private readonly eliseThreshold: number;\r\n private readonly summarizerPrompt: string;\r\n private readonly summarizerModel?: string;\r\n\r\n constructor(opts: IntelligentCompactorOptions) {\r\n this.provider = opts.provider;\r\n this.warnThreshold = opts.warnThreshold ?? 0.6;\r\n this.softThreshold = opts.softThreshold ?? 0.75;\r\n this.hardThreshold = opts.hardThreshold ?? 0.9;\r\n this.maxContext = opts.maxContext ?? 128_000;\r\n this.preserveK = opts.preserveK ?? 4;\r\n this.eliseThreshold = opts.eliseThreshold ?? 500;\r\n this.summarizerPrompt =\r\n opts.summarizerPrompt ??\r\n 'You are a context summarizer. Given a list of conversation messages, produce a concise but complete summary that preserves all factual information, decisions made, and any state changes (e.g. file edits, todo updates). Do not add commentary. Output only the summary.';\r\n this.summarizerModel = opts.summarizerModel;\r\n }\r\n\r\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\r\n const beforeTokens = this.estimateTokens(ctx.messages);\r\n const reductions: CompactReport['reductions'] = [];\r\n\r\n const load = beforeTokens / this.maxContext;\r\n // Past hardThreshold, force aggressive regardless of caller preference —\r\n // the alternative (lightweight elision) is unlikely to recover enough.\r\n const aggressive = load >= this.hardThreshold\r\n ? true\r\n : opts.aggressive ?? load >= this.softThreshold;\r\n\r\n // Phase 1: always run elision (preserves recent K pairs)\r\n const saved1 = this.eliseOldToolResults(ctx);\r\n if (saved1 > 0) reductions.push({ phase: 'elision', saved: saved1 });\r\n\r\n // Phase 2: LLM summarization of ancient turns\r\n if (aggressive) {\r\n const saved2 = await this.summarizeAncientTurns(ctx);\r\n if (saved2 > 0) reductions.push({ phase: 'summary', saved: saved2 });\r\n } else if (load >= this.warnThreshold) {\r\n // Non-aggressive: do lightweight summarization via direct analysis\r\n const saved2 = this.lightweightCompact(ctx);\r\n if (saved2 > 0) reductions.push({ phase: 'elision', saved: saved2 });\r\n }\r\n\r\n const afterTokens = this.estimateTokens(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n private async summarizeAncientTurns(ctx: Context): Promise<number> {\r\n const messages = ctx.messages;\r\n const cutoff = Math.max(0, messages.length - this.preserveK * 2);\r\n if (cutoff <= 2) return 0;\r\n\r\n // Find the best boundary in the ancient region\r\n const boundary = this.findSafeBoundary(messages, 0, cutoff);\r\n if (boundary <= 1) return 0;\r\n\r\n const toSummarize = messages.slice(0, boundary);\r\n const removedTokens = this.estimateTokens(toSummarize);\r\n\r\n let summaryText: string;\r\n try {\r\n summaryText = await this.callSummarizer(toSummarize, ctx);\r\n } catch {\r\n // Fallback: generic placeholder if summarizer fails\r\n summaryText = `[${toSummarize.length} earlier turns omitted — key decisions and file states preserved in context]`;\r\n }\r\n\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[prior_turns_summary: ${summaryText}]`,\r\n };\r\n const summaryTokens = this.estimateTokens([summaryMsg]);\r\n\r\n // L1-A: route through ConversationState so subscribers see the rewrite.\r\n const tail = ctx.messages.slice(boundary);\r\n ctx.state.replaceMessages([summaryMsg, ...tail]);\r\n return Math.max(0, removedTokens - summaryTokens);\r\n }\r\n\r\n private findSafeBoundary(messages: Message[], from: number, to: number): number {\r\n // Find the nearest user message with text content at or after `to`\r\n // and walk backwards to find a safe cut point.\r\n for (let i = to; i >= from; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' && this.hasTextContent(m)) {\r\n // Ensure we don't cut inside a multi-message exchange\r\n // by finding the start of this exchange.\r\n return this.findExchangeStart(messages, i);\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private findExchangeStart(messages: Message[], userIndex: number): number {\r\n // Walk backwards from userIndex to find where this logical exchange began.\r\n // An exchange starts after the last assistant message that had no tool calls.\r\n for (let i = userIndex - 1; i >= 0; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'assistant') {\r\n const hasToolUse = Array.isArray(m.content)\r\n ? m.content.some((b) => b.type === 'tool_use')\r\n : false;\r\n if (!hasToolUse) {\r\n // This assistant msg had no tool calls — it's a boundary\r\n return i + 1;\r\n }\r\n } else if (m.role !== 'user') {\r\n // system or other — skip\r\n } else {\r\n // another user msg — boundary\r\n return i;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n private async callSummarizer(messages: Message[], ctx: Context): Promise<string> {\r\n const prompt: TextBlock[] = [\r\n { type: 'text', text: this.summarizerPrompt },\r\n { type: 'text', text: '\\n\\nConversation to summarize:\\n' },\r\n ...this.messagesToText(messages),\r\n ];\r\n\r\n const req: Request = {\r\n model: this.summarizerModel ?? ctx.model,\r\n system: prompt,\r\n messages: [],\r\n maxTokens: 1024,\r\n };\r\n\r\n // Use abort signal from context if available\r\n const signal = ctx.signal ?? new AbortController().signal;\r\n const res = await this.provider.complete(req, { signal });\r\n\r\n const textBlocks = res.content.filter(isTextBlock);\r\n return textBlocks.map((b) => b.text).join('\\n').trim() || '(empty summary)';\r\n }\r\n\r\n private messagesToText(messages: Message[]): TextBlock[] {\r\n const lines: string[] = [];\r\n for (const m of messages) {\r\n const role = m.role.padEnd(10, ' ');\r\n if (typeof m.content === 'string') {\r\n lines.push(`[${role}]: ${m.content.slice(0, 500)}`);\r\n } else if (Array.isArray(m.content)) {\r\n const textParts = m.content.filter(isTextBlock).map((b) => b.text);\r\n if (textParts.length > 0) {\r\n lines.push(`[${role}]: ${textParts.join(' ').slice(0, 500)}`);\r\n }\r\n }\r\n }\r\n return [{ type: 'text', text: lines.join('\\n') }];\r\n }\r\n\r\n private lightweightCompact(ctx: Context): number {\r\n // Lightweight: just elide very large tool results without full summarization\r\n return this.eliseOldToolResults(ctx);\r\n }\r\n\r\n private eliseOldToolResults(ctx: Context): number {\r\n const messages = ctx.messages;\r\n let pairCount = 0;\r\n let preserveStart = messages.length;\r\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' || m.role === 'assistant') {\r\n pairCount++;\r\n preserveStart = i;\r\n }\r\n }\r\n let saved = 0;\r\n let changed = false;\r\n const nextMessages = new Array(messages.length);\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i];\r\n // Only process messages before the preservation window\r\n if (i >= preserveStart) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n if (!msg || !Array.isArray(msg.content)) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n const newContent: ContentBlock[] = msg.content.map((b) => {\r\n if (b.type !== 'tool_result') return b;\r\n const tokens = estimateToolResultTokens(b.content);\r\n if (tokens < this.eliseThreshold) return b;\r\n saved += tokens;\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: `[elided: ~${tokens} tokens]`,\r\n is_error: b.is_error,\r\n };\r\n });\r\n // Check by reference equality whether any block actually changed\r\n if (newContent.length === msg.content.length && newContent.every((b, idx) => b === msg.content[idx])) {\r\n nextMessages[i] = msg;\r\n } else {\r\n nextMessages[i] = { ...msg, content: newContent };\r\n changed = true;\r\n }\r\n }\r\n if (changed) ctx.state.replaceMessages(nextMessages);\r\n return saved;\r\n }\r\n\r\n private hasTextContent(m: Message): boolean {\r\n if (typeof m.content === 'string') return m.content.trim().length > 0;\r\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\r\n }\r\n\r\n private estimateTokens(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += estimateTextTokens(m.content);\r\n } else {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += estimateTextTokens(b.text);\r\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\r\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\r\n }\r\n }\r\n }\r\n return total;\r\n }\r\n}\r\n","import type { Message } from '../types/messages.js';\r\nimport type { Provider, Request } from '../types/provider.js';\r\nimport { isTextBlock } from '../types/blocks.js';\r\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\r\n\r\nexport interface LLMSelectorOptions {\r\n /** Provider used for the selector LLM call. Required. */\r\n provider: Provider;\r\n /** Model for the selector. Defaults to the provider's default model. */\r\n model?: string;\r\n /**\r\n * Maximum tokens to keep in context (target budget).\r\n * Selector will aim to keep total content below this.\r\n */\r\n maxContextTokens?: number;\r\n /**\r\n * Prompt instructing the selector how to behave.\r\n * Should guide the LLM on importance tiers and output format.\r\n */\r\n systemPrompt?: string;\r\n}\r\n\r\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\r\n\r\nOutput a JSON object with this structure:\r\n{\r\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\r\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\r\n \"reasoning\": \"brief explanation of decisions\"\r\n}\r\n\r\nImportance tiers:\r\n- \"critical\": decisions, file edits, tool results that affect state, final answers\r\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\r\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\r\n\r\nRules:\r\n- Always keep the most recent K pairs (preserve recency)\r\n- Never collapse the final 2 user/assistant pairs (working memory)\r\n- Preserve tool results that modified files or had external effects\r\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\r\n- If unsure, keep rather than collapse (errors are more costly than waste)\r\n\r\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\r\n\r\n/** Rough token estimation for a message array */\r\nfunction estimateTokens(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += Math.ceil(m.content.length / 4);\r\n } else if (Array.isArray(m.content)) {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n return total;\r\n}\r\n\r\n/** Format messages as a compact text dump for the selector LLM */\r\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\r\n const lines: string[] = [];\r\n let used = 0;\r\n for (let i = 0; i < messages.length; i++) {\r\n const m = messages[i]!;\r\n const role = m.role.padEnd(10, ' ');\r\n let text: string;\r\n if (typeof m.content === 'string') {\r\n text = m.content.slice(0, 500);\r\n } else {\r\n const content = m.content as import('../types/blocks.js').ContentBlock[];\r\n text = content\r\n .filter(isTextBlock)\r\n .map((b) => b.text)\r\n .join(' ');\r\n // Also capture tool names for context\r\n const toolUses = content.filter((b) => b.type === 'tool_use');\r\n if (toolUses.length > 0) {\r\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\r\n }\r\n }\r\n const line = `[${i}][${role}]: ${text}`;\r\n if (used + line.length > maxChars) break;\r\n lines.push(line);\r\n used += line.length;\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * LLM-powered message selector. Calls a sub-LLM to analyze the\r\n * message history and produce a keep/collapse plan — more surgical\r\n * than fixed-window rules.\r\n */\r\nexport class LLMSelector implements MessageSelector {\r\n private readonly provider: Provider;\r\n private readonly model: string;\r\n private readonly maxContextTokens: number;\r\n private readonly systemPrompt: string;\r\n\r\n constructor(opts: LLMSelectorOptions) {\r\n this.provider = opts.provider;\r\n this.model = opts.model ?? 'unknown';\r\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\r\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\r\n }\r\n\r\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\r\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\r\n\r\n // Build a concise representation of the conversation\r\n const historyText = formatMessages(messages);\r\n const totalTokens = estimateTokens(messages);\r\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\r\n\r\n // Add instruction to stay within budget\r\n const budgetInstruction =\r\n totalTokens > effectiveBudget\r\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\r\n : '';\r\n\r\n const req: Request = {\r\n model: this.model,\r\n system: [{ type: 'text', text: systemText + budgetInstruction }],\r\n messages: [{ role: 'user', content: historyText }],\r\n maxTokens: 1024,\r\n };\r\n\r\n let raw: string;\r\n try {\r\n const res = await this.provider.complete(req, { signal: new AbortController().signal });\r\n const textBlocks = res.content.filter(isTextBlock);\r\n raw = textBlocks.map((b) => b.text).join('\\n').trim();\r\n } catch (err) {\r\n // Fallback: use simple recency-based selection\r\n return this.fallbackSelect(messages, effectiveBudget);\r\n }\r\n\r\n return this.parseSelectorOutput(raw, messages.length);\r\n }\r\n\r\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\r\n // Simple fallback: keep from the end until we hit budget\r\n const toKeep: SelectorResult['kept'] = [];\r\n const toCollapse: SelectorResult['collapsed'] = [];\r\n\r\n let tokenCount = 0;\r\n let startIdx = 0;\r\n\r\n // Scan from the end backwards\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const m = messages[i]!;\r\n const cost = typeof m.content === 'string'\r\n ? Math.ceil(m.content.length / 4)\r\n : m.content.reduce((acc, b) => acc + (b.type === 'text' ? Math.ceil(b.text.length / 4) : Math.ceil(JSON.stringify(b).length / 4)), 0);\r\n\r\n if (tokenCount + cost <= budget) {\r\n tokenCount += cost;\r\n } else {\r\n startIdx = i + 1;\r\n break;\r\n }\r\n }\r\n\r\n if (startIdx > 0) {\r\n toCollapse.push({ from: 0, to: startIdx - 1 });\r\n }\r\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\r\n\r\n return {\r\n kept: toKeep,\r\n collapsed: toCollapse,\r\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\r\n };\r\n }\r\n\r\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\r\n // Try to extract JSON from the response\r\n const jsonStart = raw.indexOf('{');\r\n const jsonEnd = raw.lastIndexOf('}');\r\n if (jsonStart === -1 || jsonEnd === -1) {\r\n // Can't parse — use fallback\r\n return this.fallbackSelect(\r\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' } as Message)),\r\n this.maxContextTokens,\r\n );\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\r\n } catch {\r\n return this.fallbackSelect(\r\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' } as Message)),\r\n this.maxContextTokens,\r\n );\r\n }\r\n\r\n const obj = parsed as Record<string, unknown>;\r\n const kept = (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\r\n const collapsed = (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\r\n\r\n return {\r\n kept: kept.map((k) => ({ from: k.from, to: k.to, importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium' })),\r\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\r\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\r\n };\r\n }\r\n}","import type { Compactor, CompactReport } from '../types/compactor.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport type { Provider, Request } from '../types/provider.js';\r\nimport type { ContentBlock } from '../types/blocks.js';\r\nimport { isTextBlock } from '../types/blocks.js';\r\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\r\nimport { LLMSelector } from './llm-selector.js';\r\n\r\n/**\r\n * Options for SelectiveCompactor — the most configurable compactor.\r\n */\r\nexport interface SelectiveCompactorOptions {\r\n /** Provider for LLM calls (selector + summarizer). Required. */\r\n provider: Provider;\r\n /** Selector for LLM-driven importance analysis. */\r\n selector?: MessageSelector;\r\n /** Fraction of maxContext that triggers a warning (default 0.6). */\r\n warnThreshold?: number;\r\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\r\n softThreshold?: number;\r\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\r\n hardThreshold?: number;\r\n /** Max context window in tokens (used for threshold fraction math). */\r\n maxContext?: number;\r\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\r\n preserveK?: number;\r\n /** Token threshold below which tool results are not elided (default 500). */\r\n eliseThreshold?: number;\r\n /** Model for selector LLM calls (default: same as provider default). */\r\n selectorModel?: string;\r\n /** Summarizer model for collapsed ranges (default: same as selectorModel). */\r\n summarizerModel?: string;\r\n /** Prompt for the summarizer sub-LLM. */\r\n summarizerPrompt?: string;\r\n}\r\n\r\n/**\r\n * SelectiveCompactor uses an LLM-driven MessageSelector to make\r\n * surgical decisions about which message ranges to keep vs collapse.\r\n *\r\n * Compared to HybridCompactor / IntelligentCompactor:\r\n * - HybridCompactor: rule-based (preserveK + elision), no LLM calls\r\n * - IntelligentCompactor: LLM summarization but no structured selection\r\n * - SelectiveCompactor: full LLM-driven selection + optional summarization\r\n */\r\nexport class SelectiveCompactor implements Compactor {\r\n private readonly provider: Provider;\r\n private readonly selector: MessageSelector;\r\n private readonly warnThreshold: number;\r\n private readonly softThreshold: number;\r\n private readonly hardThreshold: number;\r\n private readonly maxContext: number;\r\n private readonly preserveK: number;\r\n private readonly eliseThreshold: number;\r\n private readonly summarizerModel: string;\r\n private readonly summarizerPrompt: string;\r\n\r\n constructor(opts: SelectiveCompactorOptions) {\r\n this.provider = opts.provider;\r\n this.selector = opts.selector ?? new LLMSelector({ provider: opts.provider, model: opts.selectorModel });\r\n this.warnThreshold = opts.warnThreshold ?? 0.6;\r\n this.softThreshold = opts.softThreshold ?? 0.75;\r\n this.hardThreshold = opts.hardThreshold ?? 0.9;\r\n this.maxContext = opts.maxContext ?? 128_000;\r\n this.preserveK = opts.preserveK ?? 4;\r\n this.eliseThreshold = opts.eliseThreshold ?? 500;\r\n this.summarizerModel = opts.summarizerModel ?? opts.selectorModel ?? 'unknown';\r\n this.summarizerPrompt =\r\n opts.summarizerPrompt ??\r\n 'You are a context summarizer. Given a list of messages, produce a concise summary that preserves all factual information, decisions, file changes, and state changes. Do not add commentary or opinions.';\r\n }\r\n\r\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\r\n const beforeTokens = this.estimateTokens(ctx.messages);\r\n const reductions: CompactReport['reductions'] = [];\r\n\r\n const load = beforeTokens / this.maxContext;\r\n const shouldCompact = load >= this.warnThreshold || opts.aggressive;\r\n\r\n if (!shouldCompact) {\r\n // Only do lightweight elision if below warn threshold\r\n const saved = this.eliseOldToolResults(ctx);\r\n if (saved > 0) reductions.push({ phase: 'elision', saved });\r\n const afterTokens = this.estimateTokens(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n // Phase 1: elision — always run first to get a baseline reduction\r\n const savedElision = this.eliseOldToolResults(ctx);\r\n if (savedElision > 0) reductions.push({ phase: 'elision', saved: savedElision });\r\n\r\n // Phase 2: LLM-driven selective compaction\r\n const afterPhase1 = this.estimateTokens(ctx.messages);\r\n const targetBudget = this.computeTargetBudget(load);\r\n\r\n if (afterPhase1 > targetBudget) {\r\n const savedSelective = await this.runSelector(ctx, targetBudget);\r\n if (savedSelective > 0) reductions.push({ phase: 'selective', saved: savedSelective });\r\n }\r\n\r\n const afterTokens = this.estimateTokens(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n /**\r\n * Run the LLM selector to decide what to keep vs collapse.\r\n * Returns the token savings achieved.\r\n */\r\n private async runSelector(ctx: Context, targetBudget: number): Promise<number> {\r\n const before = this.estimateTokens(ctx.messages);\r\n\r\n let result: SelectorResult;\r\n try {\r\n result = await this.selector.select(ctx.messages, targetBudget);\r\n } catch {\r\n // Fallback to aggressive recency preservation\r\n return this.aggressiveRecencyTrim(ctx);\r\n }\r\n\r\n // Execute the selector's plan\r\n await this.executePlan(ctx, result);\r\n\r\n const after = this.estimateTokens(ctx.messages);\r\n return Math.max(0, before - after);\r\n }\r\n\r\n /**\r\n * Execute a SelectorResult plan: collapse/remove ranges and\r\n * insert summaries where the selector provided them.\r\n */\r\n private async executePlan(ctx: Context, plan: SelectorResult): Promise<void> {\r\n if (ctx.messages.length === 0) return;\r\n\r\n // Process collapsed ranges in reverse order to preserve indices. We work\r\n // on a local copy and commit through `ctx.state.replaceMessages` at the\r\n // end so subscribers see a single state change for the whole rewrite.\r\n const messages = [...ctx.messages];\r\n const sortedCollapsed = [...plan.collapsed].sort((a, b) => b.from - a.from);\r\n\r\n for (const range of sortedCollapsed) {\r\n if (range.from < 0 || range.to >= messages.length || range.from > range.to) continue;\r\n\r\n let summary = range.summary;\r\n if (!summary) {\r\n const toSummarize = messages.slice(range.from, range.to + 1);\r\n summary = await this.summarizeRange(toSummarize, ctx);\r\n }\r\n\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[prior_turns_${range.from}-${range.to}: ${summary}]`,\r\n };\r\n\r\n messages.splice(range.from, range.to - range.from + 1, summaryMsg);\r\n }\r\n\r\n ctx.state.replaceMessages(messages);\r\n }\r\n\r\n private async summarizeRange(messages: Message[], ctx: Context): Promise<string> {\r\n const systemText = `${this.summarizerPrompt}\\n\\nSummarize the following message range:`;\r\n const body = messages.map((m, i) => `[${i}] ${m.role}: ${this.messagePreview(m)}`).join('\\n');\r\n\r\n const req: Request = {\r\n model: this.summarizerModel,\r\n system: [{ type: 'text', text: systemText }],\r\n messages: [{ role: 'user', content: body }],\r\n maxTokens: 512,\r\n };\r\n\r\n try {\r\n const res = await this.provider.complete(req, { signal: ctx.signal ?? new AbortController().signal });\r\n return res.content.filter(isTextBlock).map((b) => b.text).join('\\n').trim() || '(empty)';\r\n } catch {\r\n return `[${messages.length} earlier turns omitted]`;\r\n }\r\n }\r\n\r\n private messagePreview(m: Message): string {\r\n if (typeof m.content === 'string') return m.content.slice(0, 300);\r\n return m.content\r\n .filter(isTextBlock)\r\n .map((b) => b.text)\r\n .join(' ')\r\n .slice(0, 300);\r\n }\r\n\r\n /**\r\n * Fallback when selector fails: aggressively trim from the oldest end\r\n * until we hit targetBudget.\r\n */\r\n private aggressiveRecencyTrim(ctx: Context): number {\r\n const messages = ctx.messages;\r\n const preserveIdx = Math.max(0, messages.length - this.preserveK * 2);\r\n\r\n if (preserveIdx <= 0) return 0;\r\n\r\n // Find safe boundary near preserveIdx\r\n let boundary = preserveIdx;\r\n for (let i = preserveIdx; i < messages.length && i < preserveIdx + 6; i++) {\r\n const m = messages[i]!;\r\n if (m.role === 'user' && this.hasTextContent(m)) {\r\n boundary = i;\r\n break;\r\n }\r\n }\r\n\r\n const removed = messages.slice(0, boundary);\r\n const removedTokens = this.estimateTokens(removed);\r\n\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[${removed.length} earlier turns trimmed — see session log for details]`,\r\n };\r\n const tail = messages.slice(boundary);\r\n ctx.state.replaceMessages([summaryMsg, ...tail]);\r\n\r\n return Math.max(0, removedTokens - this.estimateTokens([summaryMsg]));\r\n }\r\n\r\n private computeTargetBudget(load: number): number {\r\n if (load >= this.hardThreshold) {\r\n return Math.floor(this.maxContext * 0.5); // keep only 50%\r\n }\r\n if (load >= this.softThreshold) {\r\n return Math.floor(this.maxContext * 0.65); // keep 65%\r\n }\r\n return Math.floor(this.maxContext * 0.75); // keep 75% at warn\r\n }\r\n\r\n private eliseOldToolResults(ctx: Context): number {\r\n const messages = ctx.messages;\r\n let pairCount = 0;\r\n let preserveStart = messages.length;\r\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' || m.role === 'assistant') {\r\n pairCount++;\r\n preserveStart = i;\r\n }\r\n }\r\n let saved = 0;\r\n let changed = false;\r\n const nextMessages = new Array(messages.length);\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i];\r\n // Only process messages before the preservation window\r\n if (i >= preserveStart) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n if (!msg || !Array.isArray(msg.content)) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n const newContent: ContentBlock[] = msg.content.map((b) => {\r\n if (b.type !== 'tool_result') return b;\r\n const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n const tokens = this.roughTokenEstimate(text);\r\n if (tokens < this.eliseThreshold) return b;\r\n saved += tokens;\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: `[elided: ~${tokens} tokens]`,\r\n is_error: b.is_error,\r\n };\r\n });\r\n // map() preserves length, so only block ref-equality matters here.\r\n if (newContent.every((b, idx) => b === msg.content[idx])) {\r\n nextMessages[i] = msg;\r\n } else {\r\n nextMessages[i] = { ...msg, content: newContent };\r\n changed = true;\r\n }\r\n }\r\n if (changed) ctx.state.replaceMessages(nextMessages);\r\n return saved;\r\n }\r\n\r\n private hasTextContent(m: Message): boolean {\r\n if (typeof m.content === 'string') return m.content.trim().length > 0;\r\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\r\n }\r\n\r\n private estimateTokens(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += this.roughTokenEstimate(m.content);\r\n } else {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += this.roughTokenEstimate(b.text);\r\n else if (b.type === 'tool_use') total += this.roughTokenEstimate(JSON.stringify(b.input));\r\n else if (b.type === 'tool_result') {\r\n total += this.roughTokenEstimate(\r\n typeof b.content === 'string' ? b.content : JSON.stringify(b.content),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n private roughTokenEstimate(text: string): number {\r\n return Math.max(1, Math.ceil(text.length / 4));\r\n }\r\n}\r\n","import type { MiddlewareHandler } from '../kernel/pipeline.js';\nimport type { Context } from '../core/context.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { EventBus } from '../kernel/events.js';\nimport { AgentError } from '../types/errors.js';\n\nexport type CompactionFailureMode = 'throw' | 'throw_on_hard' | 'continue';\n\nexport interface AutoCompactionOptions {\n aggressiveOn?: 'hard' | 'soft' | 'warn';\n events?: EventBus;\n failureMode?: CompactionFailureMode;\n}\n\n/**\n * Pipeline middleware that monitors context token load and automatically\n * triggers compaction when the warn/soft/hard thresholds are crossed.\n * Runs before the next agent iteration.\n */\nexport class AutoCompactionMiddleware {\n readonly name = 'AutoCompaction';\n\n private readonly compactor: Compactor;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly estimator: (ctx: Context) => number;\n private readonly aggressiveOn: 'hard' | 'soft' | 'warn';\n private readonly events?: EventBus;\n private readonly failureMode: CompactionFailureMode;\n\n /**\n * @param compactor Compactor to use for compaction.\n * @param maxContext Provider's max context window in tokens.\n * @param estimator Token estimation function.\n * @param thresholds Threshold fractions (0-1) of maxContext.\n * @param opts Optional behavior. By default, failures at the\n * hard threshold throw AGENT_CONTEXT_OVERFLOW so\n * the agent does not continue into a likely\n * provider context overflow. Warn/soft failures\n * still emit compaction.failed and continue.\n */\n constructor(\n compactor: Compactor,\n maxContext: number,\n estimator: (ctx: Context) => number,\n thresholds: { warn: number; soft: number; hard: number },\n optsOrAggressiveOn: AutoCompactionOptions | 'hard' | 'soft' | 'warn' = {},\n events?: EventBus,\n ) {\n const opts =\n typeof optsOrAggressiveOn === 'string'\n ? { aggressiveOn: optsOrAggressiveOn, events }\n : optsOrAggressiveOn;\n this.compactor = compactor;\n this.maxContext = maxContext;\n this.estimator = estimator;\n this.warnThreshold = thresholds.warn;\n this.softThreshold = thresholds.soft;\n this.hardThreshold = thresholds.hard;\n this.aggressiveOn = opts.aggressiveOn ?? 'soft';\n this.events = opts.events;\n this.failureMode = opts.failureMode ?? 'throw_on_hard';\n }\n\n handler(): MiddlewareHandler<Context> {\n return async (ctx, next) => {\n const tokens = this.estimator(ctx);\n const load = tokens / this.maxContext;\n\n if (load >= this.hardThreshold) {\n await this.compact(ctx, true, { level: 'hard', tokens, load });\n } else if (load >= this.softThreshold) {\n await this.compact(ctx, this.aggressiveOn !== 'hard', { level: 'soft', tokens, load });\n } else if (load >= this.warnThreshold) {\n await this.compact(ctx, false, { level: 'warn', tokens, load });\n }\n\n return next(ctx);\n };\n }\n\n private async compact(\n ctx: Context,\n aggressive: boolean,\n pressure: { level: 'warn' | 'soft' | 'hard'; tokens: number; load: number },\n ): Promise<void> {\n try {\n await this.compactor.compact(ctx, { aggressive });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const fatal =\n this.failureMode === 'throw' ||\n (this.failureMode === 'throw_on_hard' && pressure.level === 'hard');\n this.events?.emit('compaction.failed', {\n err: error,\n aggressive,\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n load: pressure.load,\n fatal,\n });\n if (fatal) {\n throw new AgentError({\n message: `Auto-compaction failed at ${pressure.level} threshold`,\n code: 'AGENT_CONTEXT_OVERFLOW',\n recoverable: true,\n context: {\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n },\n cause: err,\n });\n }\n }\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport type {\n ModelsRegistry,\n ModelsDevPayload,\n ModelsDevProvider,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string;\n ttlSeconds?: number;\n fetchImpl?: typeof fetch;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload;\n /**\n * Maximum age in seconds for stale cache fallback when network fails.\n * Defaults to 7 days. Set to `Infinity` for full offline resilience\n * (risk: deprecated models, wrong pricing). Set to `0` to disable\n * stale fallback entirely.\n */\n maxStaleAgeSeconds?: number;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n private payload?: ModelsDevPayload;\n private fetchedAt?: Date;\n private readonly cacheFile: string;\n private readonly url: string;\n private readonly ttlMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly seed?: ModelsDevPayload;\n private readonly maxStaleAgeMs: number;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? DEFAULT_URL;\n this.ttlMs = (opts.ttlSeconds ?? DEFAULT_TTL_SECONDS) * 1000;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.seed = opts.seed;\n // Default max stale age: 7 days\n const maxStaleSeconds = opts.maxStaleAgeSeconds ?? 7 * 24 * 3600;\n this.maxStaleAgeMs = maxStaleSeconds * 1000;\n }\n\n async load(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n if (!opts.force) {\n const cached = await this.readCache();\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refresh();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCache();\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n throw err;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) {\n throw new Error(`ModelsRegistry: HTTP ${res.status} fetching ${this.url}`);\n }\n const json = (await res.json()) as ModelsDevPayload;\n this.payload = json;\n this.fetchedAt = new Date();\n const envelope: CacheEnvelope = {\n fetchedAt: this.fetchedAt.toISOString(),\n url: this.url,\n payload: json,\n };\n await atomicWrite(this.cacheFile, JSON.stringify(envelope));\n return json;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? false,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\n },\n cost: model.cost,\n };\n }\n\n async suggestModel(providerId: string): Promise<string | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider || provider.models.length === 0) return undefined;\n const ranked = [...provider.models].sort((a, b) => {\n const at = a.release_date ?? a.last_updated ?? '';\n const bt = b.release_date ?? b.last_updated ?? '';\n return bt.localeCompare(at);\n });\n return ranked[0]?.id;\n }\n\n async ageSeconds(): Promise<number> {\n if (!this.fetchedAt) {\n const cached = await this.readCache();\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCache(): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(this.cacheFile, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n","export interface Mode {\n id: string;\n name: string;\n description: string;\n /** Additional prompt text injected into system prompt when mode is active */\n prompt: string;\n /** Tags for tool_search filtering */\n tags?: string[];\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[];\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string;\n}\n\nexport interface ModeStore {\n getActiveMode(): Promise<Mode | null>;\n setActiveMode(modeId: string | null): Promise<void>;\n listModes(): Promise<Mode[]>;\n getMode(modeId: string): Promise<Mode | null>;\n}\n\nexport interface ModeConfig {\n directory: string;\n}\n\nexport const DEFAULT_MODES: Mode[] = [\n {\n id: 'default',\n name: 'Default',\n description: 'General-purpose coding assistant',\n prompt: '',\n tags: ['general'],\n },\n {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'Focus on code quality, best practices, and potential bugs',\n prompt: `## Code Reviewer Mode\n\nWhen reviewing code:\n- Look for potential bugs, race conditions, and edge cases\n- Check for security vulnerabilities (SQL injection, XSS, CSRF, etc.)\n- Evaluate error handling completeness\n- Assess code readability and maintainability\n- Check for performance anti-patterns\n- Verify test coverage for critical paths\n- Ensure naming conventions are followed`,\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: `## Code Auditor Mode\n\nWhen auditing code for security:\n- Identify injection vulnerabilities (SQL, Command, XSS, LDAP)\n- Check authentication and authorization patterns\n- Look for sensitive data exposure (secrets, PII in logs)\n- Verify cryptographic implementations\n- Check for insecure dependencies or configurations\n- Assess input validation and output encoding\n- Look for timing attacks and information leakage`,\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: `## Architect Mode\n\nWhen designing or reviewing architecture:\n- Evaluate scalability and future growth\n- Check for appropriate design patterns\n- Assess coupling and cohesion\n- Look forSOLID principle violations\n- Evaluate data modeling decisions\n- Check for eventual consistency issues\n- Assess API design and contract stability\n- Consider operational aspects (monitoring, logging, deployment)`,\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: `## Debugger Mode\n\nWhen investigating bugs:\n- Reproduce the issue with minimal steps\n- Check error messages and stack traces thoroughly\n- Look for related logs and historical context\n- Verify assumptions about data flow\n- Check for race conditions in async code\n- Validate environment and configuration\n- Use binary search to isolate the root cause\n- Verify fixes with tests before considering done`,\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: `## Tester Mode\n\nWhen testing or writing tests:\n- Cover happy path and error paths equally\n- Think about edge cases and boundary conditions\n- Check for missing null/undefined handling tests\n- Verify error messages are tested\n- Look for race condition tests in async code\n- Assess mutation testing opportunities\n- Check for integration test gaps\n- Verify test isolation and cleanup`,\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: `## DevOps Mode\n\nWhen working on infrastructure:\n- Check for containerization and deployment readiness\n- Verify CI/CD pipeline configurations\n- Assess monitoring and alerting setup\n- Look for health check endpoints\n- Check for graceful shutdown handling\n- Verify backup and disaster recovery plans\n- Assess secrets management\n- Check for resource limits and quotas`,\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: `## Refactorer Mode\n\nWhen refactoring code:\n- Maintain existing behavior — tests must pass before and after\n- Make one change at a time, verify after each\n- Prefer small, focused commits\n- Preserve API contracts unless explicitly changing\n- Remove dead code and comments\n- Improve naming as you go\n- Don't mix formatting changes with logic changes\n- Keep performance in mind — don't regress`,\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n },\n];","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Mode, ModeStore, ModeManifest, ModeConfig } from '../types/mode.js';\nimport { DEFAULT_MODES } from '../types/mode.js';\n\nexport class DefaultModeStore implements ModeStore {\n private activeModeId: string | null = null;\n private modes: Mode[];\n private configDir: string;\n\n constructor(config: ModeConfig) {\n this.configDir = config.directory;\n this.modes = [...DEFAULT_MODES];\n }\n\n async getActiveMode(): Promise<Mode | null> {\n if (!this.activeModeId) {\n await this.loadActiveMode();\n }\n if (!this.activeModeId) return null;\n return this.modes.find((m) => m.id === this.activeModeId) ?? null;\n }\n\n async setActiveMode(modeId: string | null): Promise<void> {\n this.activeModeId = modeId;\n await this.saveActiveMode();\n }\n\n async listModes(): Promise<Mode[]> {\n return [...this.modes];\n }\n\n async getMode(modeId: string): Promise<Mode | null> {\n return this.modes.find((m) => m.id === modeId) ?? null;\n }\n\n async addMode(mode: Mode): Promise<void> {\n const idx = this.modes.findIndex((m) => m.id === mode.id);\n if (idx >= 0) {\n this.modes[idx] = mode;\n } else {\n this.modes.push(mode);\n }\n }\n\n async removeMode(modeId: string): Promise<void> {\n const builtIn = DEFAULT_MODES.find((m) => m.id === modeId);\n if (builtIn) {\n throw new Error(`Cannot remove built-in mode \"${modeId}\"`);\n }\n this.modes = this.modes.filter((m) => m.id !== modeId);\n if (this.activeModeId === modeId) {\n this.activeModeId = null;\n await this.saveActiveMode();\n }\n }\n\n private async loadActiveMode(): Promise<void> {\n try {\n const configPath = path.join(this.configDir, 'mode.json');\n const content = await fs.readFile(configPath, 'utf8');\n const data = JSON.parse(content);\n this.activeModeId = data.activeMode ?? null;\n } catch {\n this.activeModeId = 'default';\n }\n }\n\n private async saveActiveMode(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true });\n const configPath = path.join(this.configDir, 'mode.json');\n await fs.writeFile(\n configPath,\n JSON.stringify({ activeMode: this.activeModeId }, null, 2),\n 'utf8',\n );\n } catch {\n // ignore save errors\n }\n }\n}\n\nexport interface ModeLoaderOptions {\n projectModesDir?: string;\n userModesDir?: string;\n}\n\nexport async function loadProjectModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const entries = await fs.readdir(modesDir);\n for (const entry of entries) {\n if (!entry.endsWith('.md') && !entry.endsWith('.txt')) continue;\n const filePath = path.join(modesDir, entry);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) continue;\n const content = await fs.readFile(filePath, 'utf8');\n const id = path.basename(entry, path.extname(entry));\n modes.push({\n id,\n name: id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()),\n description: content.split('\\n')[0] ?? id,\n prompt: content,\n tags: ['project'],\n });\n }\n } catch {\n // no project modes\n }\n return modes;\n}\n\nexport async function loadUserModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const manifestPath = path.join(modesDir, 'modes.json');\n const content = await fs.readFile(manifestPath, 'utf8');\n const manifest: ModeManifest = JSON.parse(content);\n for (const mode of manifest.modes) {\n modes.push(mode);\n }\n } catch {\n // no user modes\n }\n return modes;\n}","import type { Usage } from '../types/provider.js';\r\n\r\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\r\n\r\nexport class BudgetExceededError extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly observed: number;\r\n\r\n constructor(kind: BudgetKind, limit: number, observed: number) {\r\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\r\n this.name = 'BudgetExceededError';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\nexport interface BudgetLimits {\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n /** Estimated USD cost ceiling. */\r\n maxCostUsd?: number;\r\n /** Wall-clock timeout from start() to checkTimeout(). */\r\n timeoutMs?: number;\r\n}\r\n\r\nexport interface BudgetUsage {\r\n iterations: number;\r\n toolCalls: number;\r\n tokens: { input: number; output: number; total: number };\r\n costUsd: number;\r\n elapsedMs: number;\r\n}\r\n\r\n/**\r\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\r\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\r\n * methods are O(1) and safe to call from hot paths.\r\n *\r\n * Behavior: `record*` methods throw `BudgetExceededError` synchronously the\r\n * moment a limit is crossed. The caller (runner/coordinator) catches this and\r\n * marks the task as 'failed' with the budget kind, so the operator can see\r\n * exactly which ceiling tripped.\r\n */\r\nexport class SubagentBudget {\r\n readonly limits: Readonly<BudgetLimits>;\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private tokenInput = 0;\r\n private tokenOutput = 0;\r\n private costUsd = 0;\r\n private startTime: number | null = null;\r\n\r\n constructor(limits: BudgetLimits = {}) {\r\n this.limits = Object.freeze({ ...limits });\r\n }\r\n\r\n start(): void {\r\n this.startTime = Date.now();\r\n }\r\n\r\n recordIteration(): void {\r\n this.iterations++;\r\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\r\n throw new BudgetExceededError('iterations', this.limits.maxIterations, this.iterations);\r\n }\r\n }\r\n\r\n recordToolCall(): void {\r\n this.toolCalls++;\r\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\r\n throw new BudgetExceededError('tool_calls', this.limits.maxToolCalls, this.toolCalls);\r\n }\r\n }\r\n\r\n recordUsage(usage: Usage, costUsd = 0): void {\r\n this.tokenInput += usage.input;\r\n this.tokenOutput += usage.output;\r\n this.costUsd += costUsd;\r\n\r\n const totalTokens = this.tokenInput + this.tokenOutput;\r\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\r\n throw new BudgetExceededError('tokens', this.limits.maxTokens, totalTokens);\r\n }\r\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\r\n throw new BudgetExceededError('cost', this.limits.maxCostUsd, this.costUsd);\r\n }\r\n }\r\n\r\n /**\r\n * Throws if the wall-clock budget is exhausted. Call this from the iteration\r\n * loop so a hung tool can't keep a subagent running past its deadline.\r\n */\r\n checkTimeout(): void {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\r\n const elapsed = Date.now() - this.startTime;\r\n if (elapsed > this.limits.timeoutMs) {\r\n throw new BudgetExceededError('timeout', this.limits.timeoutMs, elapsed);\r\n }\r\n }\r\n\r\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\r\n isTimedOut(): boolean {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\r\n return Date.now() - this.startTime > this.limits.timeoutMs;\r\n }\r\n\r\n usage(): BudgetUsage {\r\n return {\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n tokens: {\r\n input: this.tokenInput,\r\n output: this.tokenOutput,\r\n total: this.tokenInput + this.tokenOutput,\r\n },\r\n costUsd: this.costUsd,\r\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\r\n };\r\n }\r\n}\r\n","import { randomUUID } from 'node:crypto';\r\nimport { EventEmitter } from 'node:events';\r\nimport type {\r\n MultiAgentCoordinator,\r\n CoordinatorStatus,\r\n SubagentConfig,\r\n SpawnResult,\r\n TaskSpec,\r\n TaskResult,\r\n MultiAgentConfig,\r\n SubagentContext,\r\n SubagentRunner,\r\n SubagentRunContext,\r\n} from '../types/multi-agent.js';\r\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\r\nimport { SubagentBudget, BudgetExceededError } from './subagent-budget.js';\r\n\r\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\r\n\r\ninterface SubagentEntry {\r\n config: SubagentConfig;\r\n context: SubagentContext;\r\n status: SubagentStatus;\r\n currentTask?: string;\r\n abortController: AbortController;\r\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\r\n activeBudget?: SubagentBudget;\r\n}\r\n\r\nexport interface MultiAgentCoordinatorOptions {\r\n /**\r\n * Callback that executes a task on behalf of a subagent. Required for\r\n * `assign()` to actually run anything — without it, tasks queue forever.\r\n * The coordinator provides per-subagent isolation (own budget, own signal,\r\n * own bridge) and enforces timeout + concurrency.\r\n */\r\n runner?: SubagentRunner;\r\n}\r\n\r\nexport class DefaultMultiAgentCoordinator\r\n extends EventEmitter\r\n implements MultiAgentCoordinator\r\n{\r\n readonly coordinatorId: string;\r\n readonly config: MultiAgentConfig;\r\n private readonly runner?: SubagentRunner;\r\n\r\n private readonly subagents = new Map<string, SubagentEntry>();\r\n\r\n private pendingTasks: TaskSpec[] = [];\r\n private completedResults: TaskResult[] = [];\r\n private totalIterations = 0;\r\n private inFlight = 0;\r\n\r\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\r\n super();\r\n this.coordinatorId = config.coordinatorId;\r\n this.config = config;\r\n this.runner = options.runner;\r\n }\r\n\r\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\r\n const id = subagent.id || randomUUID();\r\n const context: SubagentContext = {\r\n subagentId: id,\r\n tasks: [],\r\n // Wired later by the caller via setSubagentBridge() once the\r\n // bidirectional bridge is created. Readers must null-check / use\r\n // hasParentBridge() — the type now reflects this.\r\n parentBridge: null,\r\n doneCondition: this.config.doneCondition,\r\n maxConcurrent: this.config.maxConcurrent ?? 4,\r\n };\r\n\r\n this.subagents.set(id, {\r\n config: { ...subagent, id },\r\n context,\r\n status: 'idle',\r\n abortController: new AbortController(),\r\n });\r\n\r\n this.emit('subagent.started', { subagent: { ...subagent, id } });\r\n\r\n return { subagentId: id, agentId: id };\r\n }\r\n\r\n async assign(task: TaskSpec): Promise<void> {\r\n this.pendingTasks.push(task);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\r\n const subagent = this.subagents.get(to);\r\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\r\n if (!subagent.context.parentBridge) {\r\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\r\n }\r\n await subagent.context.parentBridge.send(msg);\r\n }\r\n\r\n /**\r\n * Wire up the communication bridge for a subagent. Call after spawn() once\r\n * the caller has created the bidirectional connection.\r\n */\r\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\r\n subagent.context.parentBridge = bridge;\r\n }\r\n\r\n async stop(subagentId: string): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n // Abort any in-flight run, then sever the bridge so further messages fail\r\n // fast instead of silently queueing on a dead subagent.\r\n subagent.abortController.abort();\r\n subagent.status = 'stopped';\r\n subagent.currentTask = undefined;\r\n subagent.context.parentBridge = null;\r\n\r\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\r\n }\r\n\r\n async stopAll(): Promise<void> {\r\n // allSettled so one failure doesn't leave other subagents un-stopped.\r\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\r\n }\r\n\r\n getStatus(): CoordinatorStatus {\r\n return {\r\n coordinatorId: this.coordinatorId,\r\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\r\n id,\r\n name: s.config.name,\r\n status: s.status,\r\n currentTask: s.currentTask,\r\n })),\r\n pendingTasks: this.pendingTasks.length,\r\n completedTasks: this.completedResults.length,\r\n totalIterations: this.totalIterations,\r\n done: this.isDone(),\r\n };\r\n }\r\n\r\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\r\n results(): readonly TaskResult[] {\r\n return this.completedResults;\r\n }\r\n\r\n /**\r\n * Manual completion — for callers that drive subagents without a runner\r\n * (e.g. external orchestrators). When a runner is configured the coordinator\r\n * calls this itself.\r\n */\r\n completeTask(result: TaskResult): void {\r\n this.recordCompletion(result);\r\n }\r\n\r\n // --- internal dispatching ---------------------------------------------\r\n\r\n private tryDispatchNext(): void {\r\n while (this.canDispatch()) {\r\n const subagentId = this.findIdleSubagent();\r\n if (!subagentId) return;\r\n const task = this.pendingTasks.shift();\r\n if (!task) return;\r\n // Attach a catch so a synchronous throw inside runDispatched (rare —\r\n // e.g. provider misconfiguration before the first await) becomes a\r\n // visible failed task instead of an unhandled rejection that leaves\r\n // `inFlight` permanently elevated.\r\n this.runDispatched(subagentId, task).catch((err) => {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'failed',\r\n error: err instanceof Error ? err.message : String(err),\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n });\r\n }\r\n }\r\n\r\n private canDispatch(): boolean {\r\n const max = this.config.maxConcurrent ?? 4;\r\n return this.inFlight < max && this.pendingTasks.length > 0;\r\n }\r\n\r\n private findIdleSubagent(): string | null {\r\n for (const [id, s] of this.subagents) {\r\n if (s.status === 'idle') return id;\r\n }\r\n return null;\r\n }\r\n\r\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n subagent.status = 'running';\r\n subagent.currentTask = task.id;\r\n task.subagentId = subagentId;\r\n subagent.context.tasks.push(task);\r\n\r\n this.emit('task.assigned', { task, subagentId });\r\n\r\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\r\n // Precedence: task > subagent > coordinator default.\r\n const budget = new SubagentBudget({\r\n maxIterations: subagent.config.maxIterations ?? this.config.defaultBudget?.maxIterations,\r\n maxToolCalls: task.maxToolCalls ?? subagent.config.maxToolCalls ?? this.config.defaultBudget?.maxToolCalls,\r\n maxTokens: subagent.config.maxTokens ?? this.config.defaultBudget?.maxTokens,\r\n maxCostUsd: subagent.config.maxCostUsd ?? this.config.defaultBudget?.maxCostUsd,\r\n timeoutMs: task.timeoutMs ?? subagent.config.timeoutMs ?? this.config.defaultBudget?.timeoutMs,\r\n });\r\n subagent.activeBudget = budget;\r\n\r\n if (!this.runner) {\r\n // No runner wired — caller drives execution via completeTask(). Status\r\n // reverts when the caller reports. We intentionally don't bump\r\n // `inFlight` here: `completeTask` → `recordCompletion` would then\r\n // decrement an inFlight that runDispatched never incremented, masking\r\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\r\n // check still settles correctly once the caller reports.\r\n return;\r\n }\r\n\r\n // Only count inFlight when we actually own the execution lifecycle.\r\n this.inFlight++;\r\n\r\n const startTime = Date.now();\r\n const runCtx: SubagentRunContext = {\r\n subagentId,\r\n config: subagent.config,\r\n budget,\r\n signal: subagent.abortController.signal,\r\n bridge: subagent.context.parentBridge || null,\r\n };\r\n\r\n let result: TaskResult;\r\n\r\n budget.start();\r\n try {\r\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status: 'success',\r\n result: outcome.result,\r\n iterations: outcome.iterations,\r\n toolCalls: outcome.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n } catch (err) {\r\n // Order matters: a timeout calls abort() to signal cooperative runners,\r\n // which also flips `signal.aborted=true`. Inspect the error first so we\r\n // surface 'timeout' rather than masking it as 'stopped'.\r\n const status: TaskResult['status'] =\r\n err instanceof BudgetExceededError && err.kind === 'timeout'\r\n ? 'timeout'\r\n : subagent.abortController.signal.aborted\r\n ? 'stopped'\r\n : 'failed';\r\n const usage = budget.usage();\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status,\r\n error: err instanceof Error ? err.message : String(err),\r\n iterations: usage.iterations,\r\n toolCalls: usage.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n this.recordCompletion(result);\r\n }\r\n\r\n private async executeWithTimeout(\r\n runner: SubagentRunner,\r\n task: TaskSpec,\r\n ctx: SubagentRunContext,\r\n budget: SubagentBudget,\r\n ) {\r\n const timeoutMs = budget.limits.timeoutMs;\r\n if (timeoutMs === undefined) return runner(task, ctx);\r\n\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n timer = setTimeout(() => {\r\n // Abort the subagent's signal so cooperative runners can clean up.\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', timeoutMs, Date.now()));\r\n }, timeoutMs);\r\n });\r\n\r\n try {\r\n return await Promise.race([runner(task, ctx), timeoutPromise]);\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n private recordCompletion(result: TaskResult): void {\r\n this.completedResults.push(result);\r\n this.totalIterations += result.iterations;\r\n if (this.inFlight > 0) {\r\n this.inFlight--;\r\n } else if (this.runner) {\r\n // Runner-driven path completed without an outstanding inFlight slot —\r\n // shouldn't happen unless completeTask was called externally.\r\n this.emit('warning', {\r\n type: 'inFlight_underflow',\r\n taskId: result.taskId,\r\n subagentId: result.subagentId,\r\n });\r\n return;\r\n }\r\n\r\n const subagent = this.subagents.get(result.subagentId);\r\n if (subagent && subagent.status !== 'stopped') {\r\n const failed = result.status === 'failed' || result.status === 'timeout';\r\n subagent.status = failed ? 'error' : 'idle';\r\n subagent.currentTask = undefined;\r\n // If the run aborted (timeout or explicit stop), the subagent's\r\n // signal is now permanently aborted — recycling the controller lets\r\n // the next dispatched task start with a fresh cancellation scope.\r\n if (subagent.abortController.signal.aborted) {\r\n subagent.abortController = new AbortController();\r\n }\r\n // Reset error state on next assignment so a transient failure doesn't\r\n // permanently sideline the subagent.\r\n if (subagent.status === 'error') {\r\n queueMicrotask(() => {\r\n if (subagent.status === 'error') subagent.status = 'idle';\r\n this.tryDispatchNext();\r\n });\r\n }\r\n }\r\n\r\n this.emit('task.completed', {\r\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\r\n result,\r\n });\r\n\r\n this.tryDispatchNext();\r\n\r\n if (this.isDone()) {\r\n this.emit('done', {\r\n results: this.completedResults,\r\n totalIterations: this.totalIterations,\r\n });\r\n }\r\n }\r\n\r\n private isDone(): boolean {\r\n if (this.config.doneCondition.type === 'all_tasks_done') {\r\n return this.pendingTasks.length === 0 && this.inFlight === 0;\r\n }\r\n if (\r\n this.config.doneCondition.maxIterations !== undefined &&\r\n this.totalIterations >= this.config.doneCondition.maxIterations\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type {\r\n SubagentConfig,\r\n SubagentRunContext,\r\n SubagentRunOutcome,\r\n SubagentRunner,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport { BudgetExceededError } from './subagent-budget.js';\r\n\r\n/**\r\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\r\n * The factory MUST construct a fresh `Context` per call — sharing context\r\n * between subagents defeats isolation. Each Agent should also use either\r\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\r\n * attributed correctly.\r\n */\r\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\r\n\r\nexport interface AgentFactoryResult {\r\n agent: Agent;\r\n /** Event bus the factory wired to this agent — required for budget hookup. */\r\n events: EventBus;\r\n}\r\n\r\nexport interface AgentRunnerOptions {\r\n factory: AgentFactory;\r\n /**\r\n * Format a TaskSpec into the user input the agent will receive. Defaults\r\n * to `task.description ?? ''`. Override when subagents expect structured\r\n * input (e.g. JSON contracts, role-prefixed prompts).\r\n */\r\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\r\n}\r\n\r\n/**\r\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\r\n * the coordinator's budget and abort signal. This is the production adapter —\r\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\r\n *\r\n * Lifecycle per task:\r\n * 1. factory(config) → fresh Agent + EventBus.\r\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\r\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\r\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\r\n * 5. Unsubscribe and let the factory's resources be GC'd.\r\n *\r\n * The budget is checked synchronously from event handlers — a runaway agent\r\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\r\n * coordinator surfaces as `status: 'failed'` on the task result.\r\n */\r\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\r\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\r\n\r\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\r\n const { agent, events } = await opts.factory(ctx.config);\r\n\r\n // Hook budget into the agent's event stream. We capture errors thrown by\r\n // recordToolCall/recordUsage so the budget can short-circuit the run by\r\n // aborting the controller — the agent then unwinds cooperatively.\r\n const aborter = new AbortController();\r\n const onBudgetError = (err: unknown) => {\r\n if (err instanceof BudgetExceededError) {\r\n aborter.abort();\r\n budgetError = err;\r\n } else {\r\n throw err;\r\n }\r\n };\r\n\r\n let budgetError: BudgetExceededError | null = null;\r\n\r\n const unsub: Array<() => void> = [];\r\n unsub.push(\r\n events.on('tool.started', () => {\r\n try { ctx.budget.recordToolCall(); }\r\n catch (e) { onBudgetError(e); }\r\n }),\r\n events.on('provider.response', (e) => {\r\n try { ctx.budget.recordUsage(e.usage); }\r\n catch (e2) { onBudgetError(e2); }\r\n }),\r\n events.on('iteration.started', () => {\r\n try {\r\n ctx.budget.recordIteration();\r\n ctx.budget.checkTimeout();\r\n } catch (e) { onBudgetError(e); }\r\n }),\r\n );\r\n\r\n // Forward the coordinator signal so stop() from outside also aborts.\r\n const onParentAbort = () => aborter.abort();\r\n ctx.signal.addEventListener('abort', onParentAbort);\r\n\r\n let result: RunResult;\r\n try {\r\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\r\n } finally {\r\n ctx.signal.removeEventListener('abort', onParentAbort);\r\n for (const u of unsub) u();\r\n }\r\n\r\n // A budget violation is the signal — surface it so the coordinator can\r\n // tag the task with the right failure kind ('failed' for budget; the\r\n // coordinator separately recognises 'timeout' from BudgetExceededError).\r\n if (budgetError) throw budgetError;\r\n\r\n if (result.status === 'failed') {\r\n throw result.error instanceof Error\r\n ? result.error\r\n : new Error(String(result.error ?? 'agent failed'));\r\n }\r\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\r\n // classify them. When the parent signal was aborted, coordinator marks\r\n // the task 'stopped' (matched against subagent.abortController.aborted).\r\n if (result.status === 'aborted') {\r\n throw new Error('agent aborted');\r\n }\r\n if (result.status === 'max_iterations') {\r\n throw new Error('agent exhausted iteration limit');\r\n }\r\n\r\n const usage = ctx.budget.usage();\r\n return {\r\n result: result.finalText,\r\n iterations: result.iterations,\r\n toolCalls: usage.toolCalls,\r\n };\r\n };\r\n}\r\n\r\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\r\n return task.description ?? '';\r\n}\r\n","import type { BridgeMessage, BridgeTransport } from '../../types/agent-bridge.js';\r\n\r\n/**\r\n * In-memory pub/sub transport for agent-to-agent messaging.\r\n * Subscribers register by agentId and receive messages via callback.\r\n */\r\nexport class InMemoryBridgeTransport implements BridgeTransport {\r\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\r\n\r\n send(msg: BridgeMessage, to: string): Promise<void> {\r\n // Broadcast: deliver to every subscriber except the sender.\r\n if (to === '*') {\r\n for (const [id, handlers] of this.subs) {\r\n if (id === msg.from) continue;\r\n for (const h of handlers) {\r\n try { h(msg); } catch { /* ignore */ }\r\n }\r\n }\r\n return Promise.resolve();\r\n }\r\n const handlers = this.subs.get(to);\r\n if (handlers) {\r\n for (const h of handlers) {\r\n try { h(msg); } catch { /* ignore */ }\r\n }\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\r\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\r\n this.subs.get(agentId)!.add(handler);\r\n return () => this.subs.get(agentId)?.delete(handler);\r\n }\r\n\r\n close(agentId: string): Promise<void> {\r\n this.subs.delete(agentId);\r\n return Promise.resolve();\r\n }\r\n}","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { InMemoryBridgeTransport } from './transport/in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private pendingRequests = new Map<string, {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }>();\n private stopped = false;\n private timeoutMs: number;\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try { h(msg); } catch { /* ignore */ }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new Error('Bridge is stopped');\n const timeout = timeoutMs ?? this.timeoutMs;\n const correlationId = msg.id;\n\n // Detect collision: if a caller reuses an id while a prior request is\n // still outstanding, the second .set() would silently overwrite the\n // first record — leaving its caller hanging until its timer fired but\n // looking up the now-replaced entry. Surface the bug instead.\n if (this.pendingRequests.has(correlationId)) {\n throw new Error(\n `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n );\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\n\n this.pendingRequests.set(correlationId, { resolve: resolve as (msg: BridgeMessage) => void, reject, timer });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n }\n this.pendingRequests.clear();\n this.subscriptions.clear();\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}","import type { Agent, RunResult } from '../core/agent.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { DoneCondition } from '../types/multi-agent.js';\r\nimport { toWrongStackError } from '../types/errors.js';\r\n\r\ntype AutonomousResult = RunResult & { toolCalls: number; reason?: string };\r\n\r\nexport interface DoneCheckResult {\r\n done: boolean;\r\n reason?: string;\r\n iterations: number;\r\n toolCalls: number;\r\n}\r\n\r\nexport class DoneConditionChecker {\r\n private readonly compiledRegex: RegExp | null;\r\n\r\n constructor(private readonly condition: DoneCondition) {\r\n this.compiledRegex =\r\n condition.type === 'output_match' && condition.pattern\r\n ? new RegExp(condition.pattern)\r\n : null;\r\n }\r\n\r\n check(state: { iterations: number; toolCalls: number; lastOutput?: string }): DoneCheckResult {\r\n switch (this.condition.type) {\r\n case 'iterations':\r\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\r\n return { done: true, reason: `max iterations (${this.condition.maxIterations}) reached`, ...state };\r\n }\r\n break;\r\n\r\n case 'tool_calls':\r\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\r\n return { done: true, reason: `max tool calls (${this.condition.maxToolCalls}) reached`, ...state };\r\n }\r\n break;\r\n\r\n case 'output_match':\r\n if (this.compiledRegex && state.lastOutput && this.compiledRegex.test(state.lastOutput)) {\r\n return { done: true, reason: `output matched pattern \"${this.condition.pattern}\"`, ...state };\r\n }\r\n break;\r\n\r\n case 'custom':\r\n // Reserved for future extension\r\n break;\r\n }\r\n\r\n return { done: false, iterations: state.iterations, toolCalls: state.toolCalls };\r\n }\r\n}\r\n\r\nexport interface AutonomousRunnerOptions {\r\n agent: Agent;\r\n context: Context;\r\n doneCondition: DoneCondition;\r\n iterationTimeoutMs?: number;\r\n onIteration?: (state: { iteration: number; toolCalls: number }) => void;\r\n onDone?: (result: AutonomousResult) => void;\r\n}\r\n\r\nexport class AutonomousRunner {\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private lastOutput?: string;\r\n private stopped = false;\r\n private readonly doneChecker: DoneConditionChecker;\r\n\r\n constructor(private readonly opts: AutonomousRunnerOptions) {\r\n this.doneChecker = new DoneConditionChecker(opts.doneCondition);\r\n }\r\n\r\n async run(): Promise<AutonomousResult> {\r\n while (!this.stopped) {\r\n const check = this.doneChecker.check({\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n lastOutput: this.lastOutput,\r\n });\r\n\r\n if (check.done) {\r\n const result: AutonomousResult = {\r\n status: 'done',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: check.reason,\r\n };\r\n this.opts.onDone?.(result);\r\n return result;\r\n }\r\n\r\n this.opts.onIteration?.({ iteration: this.iterations, toolCalls: this.toolCalls });\r\n\r\n const ctrl = new AbortController();\r\n const timeout = setTimeout(() => ctrl.abort(), this.opts.iterationTimeoutMs ?? 30_000);\r\n\r\n try {\r\n const result = await this.opts.agent.run(\r\n '',\r\n { signal: ctrl.signal, maxIterations: 1, executionStrategy: 'sequential' },\r\n );\r\n\r\n this.iterations++;\r\n this.lastOutput = result.finalText;\r\n this.toolCalls++;\r\n\r\n if (result.status === 'failed' || result.status === 'aborted') {\r\n const failedResult: AutonomousResult = {\r\n status: result.status,\r\n error: result.error,\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n };\r\n this.opts.onDone?.(failedResult);\r\n return failedResult;\r\n }\r\n } catch (e) {\r\n const msg = e instanceof Error ? e.message : String(e);\r\n if (msg.includes('timeout')) {\r\n const timeoutResult: AutonomousResult = {\r\n status: 'failed',\r\n error: toWrongStackError(e),\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'iteration timeout',\r\n };\r\n this.opts.onDone?.(timeoutResult);\r\n return timeoutResult;\r\n }\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n\r\n return {\r\n status: 'aborted',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'stopped externally',\r\n };\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n }\r\n}","import type { Specification, SpecAnalysis, SpecRequirement, SpecSection, SpecValidationResult } from '../types/spec.js';\r\n\r\nexport class SpecParser {\r\n\r\n parse(content: string): Specification {\r\n const lines = content.split('\\n');\r\n const sections = this.extractSections(lines);\r\n const requirements = this.extractRequirements(lines);\r\n const now = Date.now();\r\n\r\n return {\r\n id: crypto.randomUUID(),\r\n title: this.extractTitle(lines),\r\n version: this.extractVersion(lines),\r\n status: 'draft',\r\n overview: this.extractOverview(lines),\r\n sections,\r\n requirements,\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n }\r\n\r\n private extractTitle(lines: string[]): string {\r\n for (const line of lines) {\r\n const m = /^#\\s+(.+)/.exec(line.trim());\r\n if (m?.[1]) return m[1];\r\n }\r\n return 'Untitled Specification';\r\n }\r\n\r\n private extractVersion(lines: string[]): string {\r\n for (const line of lines) {\r\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\r\n if (m?.[1]) return m[1];\r\n }\r\n return '0.0.1';\r\n }\r\n\r\n private extractOverview(lines: string[]): string {\r\n const overviewLines: string[] = [];\r\n let inOverview = false;\r\n let foundHeading = false;\r\n\r\n for (const line of lines) {\r\n if (/^##\\s+Overview/i.test(line.trim())) {\r\n inOverview = true;\r\n foundHeading = true;\r\n continue;\r\n }\r\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\r\n if (inOverview) overviewLines.push(line);\r\n }\r\n\r\n return overviewLines.join('\\n').trim() || 'No overview provided';\r\n }\r\n\r\n private extractSections(lines: string[]): SpecSection[] {\r\n const sections: SpecSection[] = [];\r\n let currentSection: Partial<SpecSection> | null = null;\r\n let currentLines: string[] = [];\r\n let depth = 1;\r\n\r\n for (const line of lines) {\r\n const h2 = /^##\\s+(.+)/.exec(line.trim());\r\n const h3 = /^###\\s+(.+)/.exec(line.trim());\r\n\r\n if (h2) {\r\n if (currentSection && currentLines.length > 0) {\r\n sections.push({\r\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\r\n title: currentSection.title ?? 'Unknown',\r\n level: depth,\r\n content: currentLines.join('\\n').trim(),\r\n });\r\n }\r\n currentSection = { title: h2[1] ?? 'Unknown' };\r\n currentLines = [];\r\n depth = 2;\r\n continue;\r\n }\r\n\r\n if (h3) {\r\n currentLines.push(line);\r\n continue;\r\n }\r\n\r\n if (currentSection) {\r\n currentLines.push(line);\r\n }\r\n }\r\n\r\n if (currentSection && currentLines.length > 0) {\r\n sections.push({\r\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\r\n title: currentSection.title ?? 'Unknown',\r\n level: depth,\r\n content: currentLines.join('\\n').trim(),\r\n });\r\n }\r\n\r\n return sections;\r\n }\r\n\r\n private extractRequirements(lines: string[]): SpecRequirement[] {\r\n const requirements: SpecRequirement[] = [];\r\n let inRequirements = false;\r\n let idCounter = 0;\r\n\r\n for (const line of lines) {\r\n if (/^##\\s+Requirements/i.test(line.trim())) {\r\n inRequirements = true;\r\n continue;\r\n }\r\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\r\n\r\n if (inRequirements) {\r\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\r\n if (req) requirements.push(req);\r\n }\r\n }\r\n\r\n return requirements;\r\n }\r\n\r\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith('#')) return null;\r\n\r\n const lower = trimmed.toLowerCase();\r\n const types: SpecRequirement['type'][] = ['functional', 'non-functional', 'security', 'performance', 'ux'];\r\n let type: SpecRequirement['type'] = 'functional';\r\n for (const t of types) {\r\n if (lower.includes(`[${t}]`)) type = t;\r\n }\r\n\r\n let priority: SpecRequirement['priority'] = 'medium';\r\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\r\n priority = 'critical';\r\n } else if (trimmed.includes('[high]')) {\r\n priority = 'high';\r\n } else if (trimmed.includes('[low]')) {\r\n priority = 'low';\r\n }\r\n\r\n return {\r\n id,\r\n type,\r\n priority,\r\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\r\n acceptanceCriteria: [],\r\n };\r\n }\r\n\r\n private mapSectionType(title: string): SpecSection['type'] {\r\n const t = title.toLowerCase();\r\n if (t.includes('overview')) return 'overview';\r\n if (t.includes('requirement')) return 'requirements';\r\n if (t.includes('architect')) return 'architecture';\r\n if (t.includes('api')) return 'api';\r\n if (t.includes('data')) return 'data';\r\n if (t.includes('security')) return 'security';\r\n if (t.includes('acceptance')) return 'acceptance';\r\n return 'overview';\r\n }\r\n\r\n analyze(spec: Specification): SpecAnalysis {\r\n const gaps: string[] = [];\r\n const suggestions: string[] = [];\r\n const risks: SpecAnalysis['risks'] = [];\r\n\r\n // Check completeness\r\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\r\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\r\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\r\n\r\n if (!hasOverview) gaps.push('Missing Overview section');\r\n if (!hasRequirements) gaps.push('Missing Requirements section');\r\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\r\n\r\n if (spec.requirements.length === 0) {\r\n gaps.push('No requirements defined');\r\n suggestions.push('Add specific functional and non-functional requirements');\r\n }\r\n\r\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\r\n if (unverifiedReqs.length > 0) {\r\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\r\n suggestions.push('Define clear acceptance criteria for each requirement');\r\n }\r\n\r\n const criticalUnresolved = spec.requirements.filter(\r\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\r\n );\r\n for (const req of criticalUnresolved) {\r\n risks.push({\r\n requirement: req.id,\r\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\r\n severity: 'high',\r\n });\r\n }\r\n\r\n const completeness = Math.round(\r\n ((hasOverview ? 1 : 0) + (hasRequirements ? 1 : 0) + (hasAcceptance ? 1 : 0) +\r\n (spec.requirements.length > 0 ? 1 : 0) +\r\n (spec.sections.length > 3 ? 1 : 0)) / 5 * 100,\r\n );\r\n\r\n return {\r\n specId: spec.id,\r\n completeness,\r\n coverage: {\r\n requirements: spec.requirements.length,\r\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\r\n edgeCases: 0,\r\n errorHandling: 0,\r\n },\r\n gaps,\r\n risks,\r\n suggestions,\r\n };\r\n }\r\n\r\n validate(spec: Specification): SpecValidationResult {\r\n const errors: SpecValidationResult['errors'] = [];\r\n const warnings: SpecValidationResult['warnings'] = [];\r\n\r\n if (!spec.title.trim()) {\r\n errors.push({ path: 'title', message: 'Title is required' });\r\n }\r\n\r\n if (!spec.version.trim()) {\r\n errors.push({ path: 'version', message: 'Version is required' });\r\n }\r\n\r\n for (const req of spec.requirements) {\r\n if (!req.description.trim()) {\r\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\r\n }\r\n if (req.acceptanceCriteria.length === 0) {\r\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\r\n }\r\n }\r\n\r\n const reqIds = new Set(spec.requirements.map((r) => r.id));\r\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\r\n for (const id of blockedByIds) {\r\n if (!reqIds.has(id)) {\r\n errors.push({ path: 'requirements', message: `BlockedBy references non-existent requirement: ${id}` });\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n };\r\n }\r\n}","import type { Specification, SpecRequirement } from '../types/spec.js';\r\nimport type { TaskNode, TaskGraph, TaskType, TaskPriority } from '../types/task-graph.js';\r\nimport type { TaskTracker, TaskStore } from './task-tracker.js';\r\n\r\nexport interface TaskGeneratorOptions {\r\n taskTracker: TaskTracker;\r\n}\r\n\r\nexport interface GeneratedTask {\r\n specRequirementId?: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n estimateHours?: number;\r\n tags?: string[];\r\n}\r\n\r\nexport class TaskGenerator {\r\n constructor(private readonly opts: TaskGeneratorOptions) {}\r\n\r\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\r\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\r\n\r\n const overview = spec.sections.find((s) => s.type === 'overview');\r\n if (overview) {\r\n this.opts.taskTracker.addNode({\r\n title: `Implement ${spec.title}`,\r\n description: overview.content,\r\n type: 'feature',\r\n priority: 'high',\r\n status: 'pending',\r\n });\r\n }\r\n\r\n // Group requirements by priority in a single pass, then emit in priority order.\r\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\r\n critical: [], high: [], medium: [], low: [],\r\n };\r\n for (const req of spec.requirements) {\r\n const bucket = byPriority[req.priority] ?? byPriority.medium;\r\n bucket.push(req);\r\n }\r\n\r\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\r\n for (const p of order) {\r\n for (const req of byPriority[p]) {\r\n this.opts.taskTracker.addNode(this.createTaskFromRequirement(req));\r\n }\r\n }\r\n\r\n // API tasks\r\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\r\n const apiParent = this.opts.taskTracker.addNode({\r\n title: 'API Implementation',\r\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\r\n type: 'feature',\r\n priority: 'high',\r\n status: 'pending',\r\n });\r\n\r\n for (const endpoint of spec.apiEndpoints) {\r\n const task = this.createTaskFromEndpoint(endpoint);\r\n this.opts.taskTracker.addNode({\r\n ...task,\r\n parentId: apiParent.id,\r\n });\r\n }\r\n }\r\n\r\n // Test tasks\r\n this.opts.taskTracker.addNode({\r\n title: 'Write Tests',\r\n description: 'Comprehensive test coverage for all features',\r\n type: 'test',\r\n priority: 'high',\r\n status: 'pending',\r\n });\r\n\r\n // Documentation tasks\r\n this.opts.taskTracker.addNode({\r\n title: 'Update Documentation',\r\n description: 'Update docs for new features',\r\n type: 'docs',\r\n priority: 'medium',\r\n status: 'pending',\r\n });\r\n\r\n return graph;\r\n }\r\n\r\n private createTaskFromRequirement(req: SpecRequirement): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\r\n return {\r\n title: req.description,\r\n description: this.buildDescription(req),\r\n type: this.mapRequirementType(req.type),\r\n priority: req.priority,\r\n status: 'pending',\r\n specRequirementId: req.id,\r\n tags: [req.type, req.priority],\r\n estimateHours: this.estimateHours(req),\r\n };\r\n }\r\n\r\n private createTaskFromEndpoint(endpoint: NonNullable<Specification['apiEndpoints']>[number]): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\r\n return {\r\n title: `${endpoint.method} ${endpoint.path}`,\r\n description: endpoint.description,\r\n type: 'feature',\r\n priority: 'high',\r\n status: 'pending',\r\n tags: [endpoint.method],\r\n estimateHours: this.estimateForEndpoint(endpoint),\r\n };\r\n }\r\n\r\n private buildDescription(req: SpecRequirement): string {\r\n const lines = [\r\n req.description,\r\n '',\r\n '**Type:** ' + req.type,\r\n '**Priority:** ' + req.priority,\r\n ];\r\n\r\n if (req.acceptanceCriteria.length > 0) {\r\n lines.push('', '**Acceptance Criteria:**');\r\n for (const criterion of req.acceptanceCriteria) {\r\n lines.push(`- ${criterion}`);\r\n }\r\n }\r\n\r\n if (req.blockedBy && req.blockedBy.length > 0) {\r\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\r\n }\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\r\n switch (type) {\r\n case 'functional': return 'feature';\r\n case 'non-functional': return 'feature';\r\n case 'security': return 'feature';\r\n case 'performance': return 'feature';\r\n case 'ux': return 'feature';\r\n default: return 'feature';\r\n }\r\n }\r\n\r\n private estimateHours(req: SpecRequirement): number {\r\n switch (req.priority) {\r\n case 'critical': return 8;\r\n case 'high': return 4;\r\n case 'medium': return 2;\r\n case 'low': return 1;\r\n default: return 2;\r\n }\r\n }\r\n\r\n private estimateForEndpoint(endpoint: NonNullable<Specification['apiEndpoints']>[number]): number {\r\n let hours = 2;\r\n if (endpoint.auth) hours += 1;\r\n if (endpoint.request) hours += 1;\r\n return hours;\r\n }\r\n\r\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\r\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\r\n if (!reqId) return;\r\n\r\n const req = spec.requirements.find((r) => r.id === reqId);\r\n if (!req) return;\r\n\r\n if (req.acceptanceCriteria.length > 0) {\r\n for (const criterion of req.acceptanceCriteria) {\r\n this.opts.taskTracker.addNode({\r\n title: criterion,\r\n description: `Verify: ${criterion}`,\r\n type: 'test',\r\n priority: 'medium',\r\n status: 'pending',\r\n parentId: parentTaskId,\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class DefaultTaskStore implements TaskStore {\r\n private graphs = new Map<string, TaskGraph>();\r\n\r\n async saveGraph(graph: TaskGraph): Promise<void> {\r\n this.graphs.set(graph.id, this.cloneGraph(graph));\r\n }\r\n\r\n async loadGraph(id: string): Promise<TaskGraph | null> {\r\n const g = this.graphs.get(id);\r\n return g ? this.cloneGraph(g) : null;\r\n }\r\n\r\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\r\n return Array.from(this.graphs.values()).map((g) => ({\r\n id: g.id,\r\n title: g.title,\r\n updatedAt: g.updatedAt,\r\n }));\r\n }\r\n\r\n async deleteGraph(id: string): Promise<void> {\r\n this.graphs.delete(id);\r\n }\r\n\r\n private cloneGraph(g: TaskGraph): TaskGraph {\r\n return {\r\n ...g,\r\n nodes: new Map(g.nodes),\r\n edges: [...g.edges],\r\n rootNodes: [...g.rootNodes],\r\n };\r\n }\r\n}","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\r\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\r\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\r\n\r\nexport interface TaskNode {\r\n id: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n status: TaskStatus;\r\n assignee?: string;\r\n estimateHours?: number;\r\n actualHours?: number;\r\n tags?: string[];\r\n specRequirementId?: string;\r\n parentId?: string;\r\n children?: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n completedAt?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface TaskEdge {\r\n id: string;\r\n from: string;\r\n to: string;\r\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\r\n weight?: number;\r\n}\r\n\r\nexport interface TaskGraph {\r\n id: string;\r\n specId: string;\r\n title: string;\r\n nodes: Map<string, TaskNode>;\r\n edges: TaskEdge[];\r\n rootNodes: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface TaskDependency {\r\n taskId: string;\r\n blockedBy: string[];\r\n blocking: string[];\r\n}\r\n\r\nexport interface TaskAssignment {\r\n taskId: string;\r\n assignee: string;\r\n assignedAt: number;\r\n}\r\n\r\nexport interface TaskProgress {\r\n total: number;\r\n pending: number;\r\n inProgress: number;\r\n blocked: number;\r\n failed: number;\r\n review: number;\r\n completed: number;\r\n percentComplete: number;\r\n estimatedHours: number;\r\n actualHours: number;\r\n}\r\n\r\nexport interface TaskFilter {\r\n status?: TaskStatus[];\r\n priority?: TaskPriority[];\r\n type?: TaskType[];\r\n assignee?: string[];\r\n tags?: string[];\r\n specRequirementId?: string;\r\n}\r\n\r\nexport interface TaskSort {\r\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface CriticalPathResult {\r\n taskIds: string[];\r\n totalEstimateHours: number;\r\n bottleneckTasks: string[];\r\n}\r\n\r\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\r\n let completed = 0, pending = 0, inProgress = 0, blocked = 0, failed = 0, review = 0;\r\n let estimatedHours = 0, actualHours = 0;\r\n for (const n of graph.nodes.values()) {\r\n switch (n.status) {\r\n case 'completed': completed++; break;\r\n case 'pending': pending++; break;\r\n case 'in_progress': inProgress++; break;\r\n case 'blocked': blocked++; break;\r\n case 'failed': failed++; break;\r\n case 'review': review++; break;\r\n }\r\n estimatedHours += n.estimateHours ?? 0;\r\n actualHours += n.actualHours ?? 0;\r\n }\r\n const total = graph.nodes.size;\r\n\r\n return {\r\n total,\r\n pending,\r\n inProgress,\r\n blocked,\r\n failed,\r\n review,\r\n completed,\r\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\r\n estimatedHours,\r\n actualHours,\r\n };\r\n}\r\n\r\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\r\n const nodes = Array.from(graph.nodes.values());\r\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\r\n const bottleneckTasks = criticalNodes\r\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\r\n .map((n) => n.id);\r\n\r\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\r\n\r\n return {\r\n taskIds: criticalNodes.map((n) => n.id),\r\n totalEstimateHours,\r\n bottleneckTasks,\r\n };\r\n}\r\n\r\nexport function topologicalSort(graph: TaskGraph): string[] {\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n const result: string[] = [];\r\n\r\n function visit(id: string): void {\r\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\r\n if (inStack.has(id)) return;\r\n if (visited.has(id)) return;\r\n if (!graph.nodes.has(id)) return;\r\n\r\n visited.add(id);\r\n inStack.add(id);\r\n\r\n for (const edge of graph.edges) {\r\n if (edge.from === id) visit(edge.to);\r\n }\r\n\r\n inStack.delete(id);\r\n result.push(id);\r\n }\r\n\r\n for (const rootId of graph.rootNodes) {\r\n visit(rootId);\r\n }\r\n\r\n return result;\r\n}","import type { TaskNode, TaskGraph, TaskFilter, TaskSort, TaskProgress } from '../types/task-graph.js';\r\nimport { computeTaskProgress } from '../types/task-graph.js';\r\n\r\nexport interface TaskStore {\r\n saveGraph(graph: TaskGraph): Promise<void>;\r\n loadGraph(id: string): Promise<TaskGraph | null>;\r\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\r\n deleteGraph(id: string): Promise<void>;\r\n}\r\n\r\nexport interface TaskTrackerOptions {\r\n store: TaskStore;\r\n /**\r\n * Called when an in-the-background persistence (`saveGraph`) rejects.\r\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\r\n * fire-and-forget their writes; without this, a failing store silently\r\n * loses graph mutations. Defaults to a console.warn.\r\n */\r\n onPersistError?: (err: unknown) => void;\r\n}\r\n\r\nexport interface TaskTransition {\r\n from: TaskNode['status'];\r\n to: TaskNode['status'];\r\n timestamp: number;\r\n reason?: string;\r\n}\r\n\r\nexport class TaskTracker {\r\n private graph: TaskGraph | null = null;\r\n private transitions: TaskTransition[] = [];\r\n\r\n constructor(private readonly opts: TaskTrackerOptions) {}\r\n\r\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\r\n this.graph = {\r\n id: crypto.randomUUID(),\r\n specId,\r\n title,\r\n nodes: new Map(),\r\n edges: [],\r\n rootNodes: [],\r\n createdAt: Date.now(),\r\n updatedAt: Date.now(),\r\n };\r\n await this.opts.store.saveGraph(this.graph);\r\n return this.graph;\r\n }\r\n\r\n async loadGraph(id: string): Promise<TaskGraph | null> {\r\n this.graph = await this.opts.store.loadGraph(id);\r\n return this.graph;\r\n }\r\n\r\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\r\n if (!this.graph) throw new Error('No graph loaded');\r\n\r\n const now = Date.now();\r\n const newNode: TaskNode = {\r\n ...node,\r\n id: crypto.randomUUID(),\r\n status: node.status ?? 'pending',\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n\r\n this.graph.nodes.set(newNode.id, newNode);\r\n\r\n if (!node.parentId) {\r\n this.graph.rootNodes.push(newNode.id);\r\n }\r\n\r\n this.graph.updatedAt = now;\r\n this.persist();\r\n\r\n return newNode;\r\n }\r\n\r\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\r\n if (!this.graph) throw new Error('No graph loaded');\r\n\r\n this.graph.edges.push({\r\n id: crypto.randomUUID(),\r\n from,\r\n to,\r\n type,\r\n });\r\n this.graph.updatedAt = Date.now();\r\n this.persist();\r\n }\r\n\r\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\r\n if (!this.graph) throw new Error('No graph loaded');\r\n\r\n const node = this.graph.nodes.get(id);\r\n if (!node) throw new Error(`Node ${id} not found`);\r\n\r\n const from = node.status;\r\n const now = Date.now();\r\n node.status = status;\r\n node.updatedAt = now;\r\n\r\n if (status === 'completed') {\r\n node.completedAt = now;\r\n }\r\n\r\n this.transitions.push({ from, to: status, timestamp: now, reason });\r\n\r\n // Auto-unblock dependents\r\n if (status === 'completed') {\r\n this.unblockDependents(id);\r\n }\r\n\r\n // Auto-block blockers\r\n if (status === 'in_progress') {\r\n this.checkAndBlockIfNeeded(id);\r\n }\r\n\r\n this.graph.updatedAt = now;\r\n this.persist();\r\n }\r\n\r\n getNode(id: string): TaskNode | undefined {\r\n return this.graph?.nodes.get(id);\r\n }\r\n\r\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\r\n if (!this.graph) return [];\r\n\r\n let nodes = Array.from(this.graph.nodes.values());\r\n\r\n if (filter) {\r\n nodes = nodes.filter((n) => {\r\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\r\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\r\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\r\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee)) return false;\r\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags!.includes(t))) return false;\r\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId) return false;\r\n return true;\r\n });\r\n }\r\n\r\n if (sort) {\r\n nodes.sort((a, b) => {\r\n const cmp = compareByField(a, b, sort.field);\r\n return sort.direction === 'asc' ? cmp : -cmp;\r\n });\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n getChildren(parentId: string): TaskNode[] {\r\n if (!this.graph) return [];\r\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\r\n }\r\n\r\n getDependents(taskId: string): string[] {\r\n if (!this.graph) return [];\r\n return this.graph.edges\r\n .filter((e) => e.from === taskId && e.type === 'depends_on')\r\n .map((e) => e.to);\r\n }\r\n\r\n getBlockers(taskId: string): string[] {\r\n if (!this.graph) return [];\r\n return this.graph.edges\r\n .filter((e) => e.to === taskId && e.type === 'depends_on')\r\n .map((e) => e.from);\r\n }\r\n\r\n canStart(taskId: string): boolean {\r\n const blockers = this.getBlockers(taskId);\r\n return blockers.every((id) => {\r\n const node = this.graph?.nodes.get(id);\r\n return node?.status === 'completed';\r\n });\r\n }\r\n\r\n getProgress(): TaskProgress {\r\n if (!this.graph) {\r\n return {\r\n total: 0, pending: 0, inProgress: 0, blocked: 0,\r\n failed: 0, review: 0, completed: 0,\r\n percentComplete: 0, estimatedHours: 0, actualHours: 0,\r\n };\r\n }\r\n return computeTaskProgress(this.graph);\r\n }\r\n\r\n getTransitions(taskId?: string): TaskTransition[] {\r\n if (!taskId) return [...this.transitions];\r\n // Would need taskId tracking per transition\r\n return [...this.transitions];\r\n }\r\n\r\n private unblockDependents(completedId: string): void {\r\n if (!this.graph) return;\r\n const dependents = this.getDependents(completedId);\r\n for (const depId of dependents) {\r\n const dep = this.graph.nodes.get(depId);\r\n if (dep?.status === 'blocked') {\r\n const remainingBlockers = this.getBlockers(depId);\r\n const allUnblocked = remainingBlockers.every((id) => {\r\n const blocker = this.graph?.nodes.get(id);\r\n return blocker?.status === 'completed';\r\n });\r\n if (allUnblocked) {\r\n dep.status = 'pending';\r\n dep.updatedAt = Date.now();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private checkAndBlockIfNeeded(taskId: string): void {\r\n if (!this.graph) return;\r\n const blockers = this.getBlockers(taskId);\r\n const someBlocked = blockers.some((id) => {\r\n const blocker = this.graph?.nodes.get(id);\r\n return blocker?.status !== 'completed';\r\n });\r\n if (someBlocked) {\r\n const node = this.graph.nodes.get(taskId);\r\n if (node) {\r\n node.status = 'blocked';\r\n node.updatedAt = Date.now();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Fire-and-forget persistence with attached error handler.\r\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\r\n * avoid forcing an async cascade through every caller; if the store\r\n * rejects, the configured `onPersistError` is invoked so failures are\r\n * surfaced instead of swallowed by an unhandled promise rejection.\r\n */\r\n private persist(): void {\r\n if (!this.graph) return;\r\n this.opts.store.saveGraph(this.graph).catch((err) => {\r\n if (this.opts.onPersistError) this.opts.onPersistError(err);\r\n else console.warn('[task-tracker] saveGraph failed:', err instanceof Error ? err.message : String(err));\r\n });\r\n }\r\n}\r\n\r\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\r\n critical: 0, high: 1, medium: 2, low: 3,\r\n};\r\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\r\n in_progress: 0, pending: 1, review: 2, blocked: 3, failed: 4, completed: 5,\r\n};\r\n\r\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\r\n switch (field) {\r\n case 'priority': return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\r\n case 'status': return STATUS_RANK[a.status] - STATUS_RANK[b.status];\r\n case 'createdAt': return a.createdAt - b.createdAt;\r\n case 'updatedAt': return a.updatedAt - b.updatedAt;\r\n }\r\n}","import type { TaskGraph, TaskNode } from '../types/task-graph.js';\r\nimport type { Specification, SpecAnalysis } from '../types/spec.js';\r\nimport type { DoneCondition } from '../types/multi-agent.js';\r\nimport { TaskTracker } from './task-tracker.js';\r\nimport { SpecParser } from './spec-parser.js';\r\nimport { TaskGenerator, DefaultTaskStore } from './task-generator.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\n\r\n/**\r\n * Extended event map used internally by TaskFlow and multi-agent components.\r\n * These events are emitted on the injected EventBus and are a subset of\r\n * the full EventMap — they do not require a separate registration.\r\n */\r\nexport interface TaskFlowEventMap {\r\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\r\n 'task.started': { taskId: string };\r\n 'task.completed': { taskId: string; result?: unknown };\r\n 'task.failed': { taskId: string; error: string };\r\n 'task.review': { taskId: string };\r\n 'spec.analyzed': { analysis: SpecAnalysis };\r\n 'progress': { percent: number; message: string };\r\n 'done': { graph: TaskGraph };\r\n 'error': { phase: TaskFlowPhase; error: Error };\r\n}\r\n\r\nexport type TaskFlowPhase =\r\n | 'idle'\r\n | 'parsing'\r\n | 'analyzing'\r\n | 'generating'\r\n | 'executing'\r\n | 'reviewing'\r\n | 'completing'\r\n | 'done'\r\n | 'failed';\r\n\r\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\r\n\r\nexport interface TaskFlowOptions {\r\n tracker: TaskTracker;\r\n events: EventBus;\r\n doneCondition?: DoneCondition;\r\n maxConcurrent?: number;\r\n}\r\n\r\nexport interface TaskFlowExecutionContext {\r\n executeTask: (task: TaskNode) => Promise<unknown>;\r\n onTaskComplete?: (task: TaskNode, result: unknown) => void;\r\n onTaskFail?: (task: TaskNode, error: Error) => void;\r\n}\r\n\r\nexport class TaskFlow {\r\n private phase: TaskFlowPhase = 'idle';\r\n private spec: Specification | null = null;\r\n private graph: TaskGraph | null = null;\r\n private stopped = false;\r\n\r\n constructor(private readonly opts: TaskFlowOptions) {\r\n this.setPhase('idle');\r\n }\r\n\r\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\r\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\r\n }\r\n\r\n async fromSpec(specContent: string): Promise<TaskGraph> {\r\n this.setPhase('parsing');\r\n\r\n const parser = new SpecParser();\r\n this.spec = parser.parse(specContent);\r\n\r\n this.setPhase('analyzing');\r\n const analysis = parser.analyze(this.spec);\r\n this.emit('spec.analyzed', { analysis });\r\n\r\n if (analysis.completeness < 50) {\r\n this.emit('error', {\r\n phase: 'analyzing',\r\n error: new Error(`Spec completeness too low: ${analysis.completeness}%`),\r\n });\r\n this.setPhase('failed');\r\n throw new Error('Spec too incomplete');\r\n }\r\n\r\n this.setPhase('generating');\r\n const generator = new TaskGenerator({ taskTracker: this.opts.tracker });\r\n this.graph = await generator.generateFromSpec(this.spec);\r\n\r\n return this.graph;\r\n }\r\n\r\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\r\n if (!this.graph) throw new Error('No graph loaded. Call fromSpec first.');\r\n\r\n this.setPhase('executing');\r\n this.stopped = false;\r\n\r\n const pendingTasks = this.getExecutableTasks();\r\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\r\n\r\n while (pendingTasks.length > 0 && !this.stopped) {\r\n const batch = pendingTasks.splice(0, maxConcurrent);\r\n const results = await Promise.allSettled(\r\n batch.map((task) => this.executeSingleTask(task, ctx)),\r\n );\r\n\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i];\r\n const task = batch[i];\r\n\r\n if (!result || !task) continue;\r\n\r\n if (result.status === 'rejected') {\r\n const reason = result.reason as Error | undefined;\r\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\r\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\r\n ctx.onTaskFail?.(task, reason as Error);\r\n } else {\r\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\r\n this.emit('task.completed', { taskId: task.id, result: result.value });\r\n ctx.onTaskComplete?.(task, result.value);\r\n }\r\n\r\n this.emitProgress();\r\n }\r\n\r\n // Re-evaluate pending tasks (some may have become unblocked)\r\n const stillPending = this.getExecutableTasks();\r\n pendingTasks.length = 0;\r\n pendingTasks.push(...stillPending);\r\n\r\n // Check done condition\r\n if (this.checkDoneCondition()) {\r\n break;\r\n }\r\n }\r\n\r\n this.setPhase('completing');\r\n this.emit('done', { graph: this.graph });\r\n this.setPhase('done');\r\n\r\n return this.graph;\r\n }\r\n\r\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\r\n const task = this.opts.tracker.getNode(taskId);\r\n if (!task) throw new Error(`Task ${taskId} not found`);\r\n\r\n if (approved) {\r\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\r\n this.emit('task.completed', { taskId });\r\n } else {\r\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\r\n this.emit('task.review', { taskId });\r\n }\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n }\r\n\r\n getPhase(): TaskFlowPhase {\r\n return this.phase;\r\n }\r\n\r\n getGraph(): TaskGraph | null {\r\n return this.graph;\r\n }\r\n\r\n getSpec(): Specification | null {\r\n return this.spec;\r\n }\r\n\r\n private setPhase(phase: TaskFlowPhase): void {\r\n const from = this.phase;\r\n this.phase = phase;\r\n this.emit('phase.change', { from, to: phase });\r\n }\r\n\r\n private getExecutableTasks(): TaskNode[] {\r\n return this.opts.tracker\r\n .getAllNodes({ status: ['pending', 'blocked'] })\r\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\r\n .sort((a, b) => {\r\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\r\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\r\n });\r\n }\r\n\r\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\r\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\r\n this.emit('task.started', { taskId: task.id });\r\n return ctx.executeTask(task);\r\n }\r\n\r\n private checkDoneCondition(): boolean {\r\n const condition = this.opts.doneCondition;\r\n if (!condition) {\r\n const progress = this.opts.tracker.getProgress();\r\n return progress.percentComplete === 100;\r\n }\r\n\r\n switch (condition.type) {\r\n case 'all_tasks_done': {\r\n const progress = this.opts.tracker.getProgress();\r\n return progress.pending === 0 && progress.inProgress === 0;\r\n }\r\n case 'iterations':\r\n return false; // Not tracked here\r\n case 'tool_calls':\r\n return false;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private emitProgress(): void {\r\n const progress = this.opts.tracker.getProgress();\r\n this.emit('progress', {\r\n percent: progress.percentComplete,\r\n message: `${progress.completed}/${progress.total} tasks completed`,\r\n });\r\n }\r\n}\r\n\r\nexport interface SpecDrivenDevOptions {\r\n workingDirectory: string;\r\n events: EventBus;\r\n doneCondition?: DoneCondition;\r\n}\r\n\r\nexport class SpecDrivenDev {\r\n private store: DefaultTaskStore;\r\n private tracker: TaskTracker;\r\n private readonly events: EventBus;\r\n private flows = new Map<string, TaskFlow>();\r\n\r\n constructor(opts: SpecDrivenDevOptions) {\r\n this.store = new DefaultTaskStore();\r\n this.tracker = new TaskTracker({ store: this.store });\r\n this.events = opts.events;\r\n }\r\n\r\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\r\n const flow = new TaskFlow({\r\n tracker: this.tracker,\r\n events: this.events,\r\n ...options,\r\n });\r\n\r\n const graph = await flow.fromSpec(specContent);\r\n this.flows.set(graph.id, flow);\r\n\r\n return flow;\r\n }\r\n\r\n getTracker(): TaskTracker {\r\n return this.tracker;\r\n }\r\n\r\n getFlow(graphId: string): TaskFlow | undefined {\r\n return this.flows.get(graphId);\r\n }\r\n\r\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\r\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\r\n id,\r\n title: flow.getGraph()?.title ?? 'Untitled',\r\n phase: flow.getPhase(),\r\n }));\r\n }\r\n}","import * as fsp from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SessionStore } from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\n/**\n * Per-project lockfile used for crash detection. The CLI writes one of\n * these alongside the session JSONLs (`<projectSessions>/active.json`)\n * when an interactive run starts, and deletes it on clean exit. If we\n * find one on the next launch whose owning PID is dead (or whose host\n * doesn't match), we know the previous run was killed mid-flight and\n * the session it was writing to is a recovery candidate.\n *\n * The lockfile is intentionally per-project (already isolated by\n * `wpaths.projectSessions`), so two TUIs in two different repos do not\n * fight each other.\n */\nexport interface RecoveryLockOptions {\n /** Directory the lockfile lives in. Usually `wpaths.projectSessions`. */\n dir: string;\n /** This process's PID. Default: `process.pid`. */\n pid?: number;\n /** Hostname recorded for the lock. Default: `os.hostname()`. */\n hostname?: string;\n /** Locks older than this are considered orphaned (disk wiped, etc.). Default 24h. */\n maxAgeMs?: number;\n /** Used to check whether the abandoned session was actually closed cleanly. */\n sessionStore?: SessionStore;\n /**\n * Override the PID-liveness probe. Default: `process.kill(pid, 0)` —\n * succeeds (or throws EPERM) when the PID is alive, throws ESRCH when\n * it is gone. Tests inject a deterministic stub.\n */\n isPidAlive?: (pid: number) => boolean;\n}\n\nexport interface AbandonedSession {\n sessionId: string;\n pid: number;\n startedAt: string;\n /** Lockfile age in ms at the time of the check. */\n ageMs: number;\n /** Number of messages already on disk for this session. */\n messageCount: number;\n}\n\ninterface LockFile {\n v: 1;\n sessionId: string;\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\nconst LOCK_FILE = 'active.json';\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport class RecoveryLock {\n private readonly file: string;\n private readonly pid: number;\n private readonly hostname: string;\n private readonly maxAgeMs: number;\n private readonly sessionStore?: SessionStore;\n private readonly probe: (pid: number) => boolean;\n\n constructor(opts: RecoveryLockOptions) {\n this.file = path.join(opts.dir, LOCK_FILE);\n this.pid = opts.pid ?? process.pid;\n this.hostname = opts.hostname ?? os.hostname();\n this.maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n this.sessionStore = opts.sessionStore;\n this.probe = opts.isPidAlive ?? defaultIsPidAlive;\n }\n\n /**\n * Examine the lockfile and decide whether it represents an abandoned\n * session. Returns `null` if the file is missing, points to a live\n * instance, references a clean-closed session, is too old, or is\n * malformed. Otherwise returns enough detail to prompt the user.\n *\n * Important: this is a read-only check. We never delete an active\n * lock from here — if another wstack instance is alive, the caller\n * should bail or run with a fresh session instead.\n */\n async checkAbandoned(): Promise<AbandonedSession | null> {\n const lock = await this.readLock();\n if (!lock) return null;\n\n const ageMs = Date.now() - new Date(lock.startedAt).getTime();\n if (Number.isNaN(ageMs) || ageMs < 0) {\n // Clock skew or corrupted timestamp — treat as orphan.\n return null;\n }\n if (ageMs > this.maxAgeMs) return null;\n\n // PID liveness only meaningful on the same host. Different host\n // means we can't probe — assume abandoned (the other machine's\n // wstack can't be holding *our* sessions dir unless it was\n // shared via network mount, in which case the user is on their\n // own).\n if (lock.hostname === this.hostname && this.probe(lock.pid)) {\n // Another wstack on this box is actively writing here.\n return null;\n }\n\n let messageCount = 0;\n if (this.sessionStore) {\n try {\n const data = await this.sessionStore.load(lock.sessionId);\n const closed = data.events.some((e) => e.type === 'session_end');\n if (closed) return null;\n messageCount = data.messages.length;\n } catch {\n // Lock points to a session that doesn't exist on disk (deleted\n // out from under us). Nothing to recover.\n return null;\n }\n }\n\n return {\n sessionId: lock.sessionId,\n pid: lock.pid,\n startedAt: lock.startedAt,\n ageMs,\n messageCount,\n };\n }\n\n /**\n * Claim the lock for the given session. Overwrites any existing lock\n * — the caller should have already handled abandonment (via\n * `checkAbandoned`) before calling this.\n */\n async write(sessionId: string): Promise<void> {\n await ensureDir(path.dirname(this.file));\n const lock: LockFile = {\n v: 1,\n sessionId,\n pid: this.pid,\n hostname: this.hostname,\n startedAt: new Date().toISOString(),\n };\n // Atomic write: write to .tmp and rename. Important on Windows\n // where a partial write of `active.json` would be readable.\n const tmp = `${this.file}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(lock), { mode: 0o600 });\n await fsp.rename(tmp, this.file);\n }\n\n /**\n * Release the lock. Idempotent — silently succeeds if the file is\n * already gone (e.g. someone else cleared it, or the directory was\n * wiped).\n */\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n throw err;\n }\n }\n\n private async readLock(): Promise<LockFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return null;\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isLockFile(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n }\n}\n\nfunction isLockFile(v: unknown): v is LockFile {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return (\n o['v'] === 1 &&\n typeof o['sessionId'] === 'string' &&\n typeof o['pid'] === 'number' &&\n typeof o['hostname'] === 'string' &&\n typeof o['startedAt'] === 'string'\n );\n}\n\n/**\n * Probe whether a process is alive without sending it a real signal.\n *\n * Unix: `process.kill(pid, 0)` succeeds for our own processes, throws\n * EPERM for others (still alive, just not ours), and throws ESRCH\n * when the PID is gone.\n * Windows (Node 22+): same call returns true if the process exists,\n * throws otherwise.\n */\nfunction defaultIsPidAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EPERM') return true; // alive, but owned by someone else\n return false;\n }\n}\n","/**\r\n * Tool output serialization utilities.\r\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\r\n */\r\n\r\nexport interface ToolOutputSerializerOptions {\r\n perIterationOutputCapBytes?: number;\r\n estimator?: (text: string) => number;\r\n}\r\n\r\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\r\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\r\n\r\n function serialize(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value === null || value === undefined) return '';\r\n if (typeof value === 'object') {\r\n if (Array.isArray(value)) return value.map(serialize).join('\\n');\r\n if ('text' in (value as Record<string, unknown>)) {\r\n const t = (value as Record<string, unknown>).text;\r\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\r\n }\r\n try {\r\n return JSON.stringify(value, null, 2);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n return String(value);\r\n }\r\n\r\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\r\n if (remainingBudget <= 0) {\r\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\r\n }\r\n const textBytes = Buffer.byteLength(text, 'utf8');\r\n if (textBytes <= remainingBudget) {\r\n return { text, newBudget: remainingBudget - textBytes };\r\n }\r\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\r\n const markerBytes = Buffer.byteLength(marker, 'utf8');\r\n const available = remainingBudget - markerBytes;\r\n if (available <= 0) {\r\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\r\n }\r\n const half = Math.floor(available / 2);\r\n const first = text.slice(0, half);\r\n const second = text.slice(text.length - half);\r\n return { text: `${first}${marker}${second}`, newBudget: 0 };\r\n }\r\n\r\n return { serialize, enforceCap, capBytes };\r\n}","import type { Context } from '../core/context.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\r\nimport type {\r\n ToolExecutorOptions,\r\n ToolExecutorStrategy,\r\n ToolBatchResult,\r\n ToolExecutionOutput,\r\n ToolConfirmPendingResult,\r\n} from '../types/tool-executor.js';\r\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\r\n\r\nexport class ToolExecutor {\r\n private readonly serializer;\r\n private readonly iterationTimeoutMs: number;\r\n\r\n constructor(\r\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\r\n private readonly opts: ToolExecutorOptions,\r\n ) {\r\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\r\n this.serializer = createToolOutputSerializer({\r\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\r\n });\r\n }\r\n\r\n /**\r\n * Execute a batch of tool uses using the configured strategy.\r\n * Returns the execution results and the remaining output budget.\r\n */\r\n async executeBatch(\r\n toolUses: ToolUseBlock[],\r\n ctx: Context,\r\n strategy: ToolExecutorStrategy,\r\n ): Promise<ToolBatchResult> {\r\n let budget = this.opts.perIterationOutputCapBytes ?? 100_000;\r\n\r\n const runOne = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n const start = Date.now();\r\n const tool = this.registry.get(use.name);\r\n\r\n // Fast path: unknown tool\r\n if (!tool) {\r\n const result = this.unknownToolResult(use, () => this.registry.list().map((t) => t.name));\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\r\n\r\n if (decision.permission === 'deny') {\r\n const result = this.deniedResult(use, decision.reason);\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n if (decision.permission === 'confirm') {\r\n if (this.opts.confirmAwaiter) {\r\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\r\n if (choice !== 'yes' && choice !== 'always') {\r\n const result = { type: 'tool_result' as const, tool_use_id: use.id, content: `Tool \"${tool.name}\" denied by user.`, is_error: true };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n // fall through to execute\r\n } else {\r\n const suggestedPattern = this.subjectFor(tool.name, use.input, tool.subjectKey) ?? tool.name;\r\n const pending: ToolConfirmPendingResult = { type: 'tool_confirm_pending', toolUseId: use.id, toolName: tool.name, input: use.input, suggestedPattern };\r\n return { result: pending, tool, durationMs: Date.now() - start };\r\n }\r\n }\r\n\r\n // permission === 'auto'\r\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\r\n // adapter or other Tracer is bound — zero overhead by default.\r\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\r\n 'tool.name': tool.name,\r\n 'tool.mutating': tool.mutating,\r\n 'tool.permission': tool.permission,\r\n });\r\n try {\r\n const result = await this.executeTool(tool, use, ctx, budget);\r\n budget = this.decrementBudget(result, budget);\r\n span?.setAttribute('tool.is_error', !!result.is_error);\r\n span?.setAttribute(\r\n 'tool.output_bytes',\r\n typeof result.content === 'string' ? result.content.length : 0,\r\n );\r\n return { result, tool, durationMs: Date.now() - start };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n this.opts.renderer?.writeToolResult(tool.name, scrubbed, true);\r\n const result = { type: 'tool_result' as const, tool_use_id: use.id, content: `Tool \"${tool.name}\" threw: ${scrubbed}`, is_error: true };\r\n budget = this.decrementBudget(result, budget);\r\n if (err instanceof Error) span?.recordError(err);\r\n span?.setAttribute('tool.is_error', true);\r\n return { result, tool, durationMs: Date.now() - start };\r\n } finally {\r\n span?.end();\r\n }\r\n };\r\n\r\n // Run a single tool but never let an exception propagate to the\r\n // gather() below — `runOne` is already try/catch-wrapped for the\r\n // execution phase, but the *pre*-execution paths (permission policy,\r\n // confirmAwaiter) are unguarded and an unexpected throw there would\r\n // collapse Promise.all and lose every sibling's output. Wrap each\r\n // call so a per-tool failure becomes a per-tool error result.\r\n const safeRun = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n try {\r\n return await runOne(use);\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" execution failed: ${scrubbed}`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool: this.registry.get(use.name), durationMs: 0 };\r\n }\r\n };\r\n\r\n if (strategy === 'sequential') {\r\n const outputs: ToolExecutionOutput[] = [];\r\n for (const use of toolUses) {\r\n if (use) outputs.push(await safeRun(use));\r\n }\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n if (strategy === 'parallel') {\r\n const outputs = await Promise.all(toolUses.map((use) => safeRun(use)));\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n // smart: non-mutating in parallel, then mutating sequentially\r\n const nonMutating: ToolUseBlock[] = [];\r\n const mutating: ToolUseBlock[] = [];\r\n for (const use of toolUses) {\r\n if (!use) continue;\r\n const tool = this.registry.get(use.name);\r\n if (tool?.mutating) mutating.push(use);\r\n else nonMutating.push(use);\r\n }\r\n const firstPass = await Promise.all(nonMutating.map((use) => safeRun(use)));\r\n const secondPass: ToolExecutionOutput[] = [];\r\n for (const use of mutating) {\r\n secondPass.push(await safeRun(use));\r\n }\r\n return {\r\n outputs: [...firstPass, ...secondPass],\r\n remainingBudget: budget,\r\n };\r\n }\r\n\r\n /**\r\n * Execute a single tool with timeout, permission check, and output capping.\r\n * Emits `tool.started` via the injected EventBus (if any) right before\r\n * invoking the tool — closes the observability gap between \"model decided\r\n * to call a tool\" and \"tool.executed\".\r\n */\r\n async executeTool(\r\n tool: Tool,\r\n use: ToolUseBlock,\r\n ctx: Context,\r\n budget: number,\r\n ): Promise<ToolResultBlock> {\r\n this.opts.events?.emit('tool.started', {\r\n name: tool.name,\r\n id: use.id,\r\n input: use.input,\r\n });\r\n this.opts.renderer?.writeToolCall(tool.name, use.input);\r\n const output = await this.runWithTimeout(tool, use.input, ctx.signal, ctx, use.id);\r\n const text = this.serializer.serialize(output);\r\n const scrubbed = this.opts.secretScrubber.scrub(text);\r\n const { text: capped } = this.serializer.enforceCap(scrubbed, budget);\r\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n name: tool.name,\r\n content: capped,\r\n is_error: false,\r\n };\r\n }\r\n\r\n private async runWithTimeout(\r\n tool: Tool,\r\n input: unknown,\r\n parentSignal: AbortSignal,\r\n ctx: Context,\r\n toolUseId?: string,\r\n ): Promise<unknown> {\r\n if (parentSignal.aborted) {\r\n // Re-throw the original abort reason, whether it's an Error, string, or undefined.\r\n if (parentSignal.reason instanceof Error) throw parentSignal.reason;\r\n throw new Error(typeof parentSignal.reason === 'string' ? parentSignal.reason : 'aborted');\r\n }\r\n const timeoutMs = tool.timeoutMs ?? this.iterationTimeoutMs;\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(new Error('tool timeout')), timeoutMs);\r\n const combined = AbortSignal.any([parentSignal, ctrl.signal]);\r\n try {\r\n // Streaming variant takes precedence — yields progress events, then\r\n // a final 'final' event with the typed output. Tools that don't\r\n // implement executeStream fall through to the standard execute path.\r\n if (typeof tool.executeStream === 'function') {\r\n return await this.runStreamedTool(tool, input, ctx, combined, toolUseId);\r\n }\r\n return await tool.execute(input, ctx, { signal: combined });\r\n } catch (err) {\r\n if (combined.aborted && typeof tool.cleanup === 'function') {\r\n // Best-effort cleanup; never let it mask the original error.\r\n try { await tool.cleanup(input, ctx); } catch { /* swallow */ }\r\n }\r\n throw err;\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async runStreamedTool(\r\n tool: Tool,\r\n input: unknown,\r\n ctx: Context,\r\n signal: AbortSignal,\r\n toolUseId: string | undefined,\r\n ): Promise<unknown> {\r\n let finalOutput: unknown;\r\n let sawFinal = false;\r\n const stream = tool.executeStream!(input, ctx, { signal });\r\n for await (const ev of stream) {\r\n if (ev.type === 'final') {\r\n finalOutput = ev.output;\r\n sawFinal = true;\r\n // Drain whatever the iterator wants to surface after final, but the\r\n // result is locked in. Most tools won't yield more.\r\n break;\r\n }\r\n this.opts.events?.emit('tool.progress', {\r\n name: tool.name,\r\n id: toolUseId ?? '<unknown>',\r\n event: ev,\r\n });\r\n }\r\n if (!sawFinal) {\r\n throw new Error(`tool \"${tool.name}\" executeStream completed without a 'final' event`);\r\n }\r\n return finalOutput;\r\n }\r\n\r\n private unknownToolResult(\r\n use: ToolUseBlock,\r\n listFns: () => string[],\r\n ): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" is not registered. Available tools: ${listFns().join(', ')}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private decrementBudget(result: ToolResultBlock, budget: number): number {\r\n const contentBytes =\r\n typeof result.content === 'string'\r\n ? Buffer.byteLength(result.content, 'utf8')\r\n : Buffer.byteLength(JSON.stringify(result.content), 'utf8');\r\n return Math.max(0, budget - contentBytes);\r\n }\r\n\r\n /**\r\n * Compute the suggestedPattern string for a tool+input pair.\r\n * Matches the logic in DefaultPermissionPolicy so the TUI shows the\r\n * same subject that the trust file would use.\r\n */\r\n private subjectFor(\r\n toolName: string,\r\n input: unknown,\r\n subjectKey?: string,\r\n ): string | undefined {\r\n if (!input || typeof input !== 'object') return undefined;\r\n const obj = input as Record<string, unknown>;\r\n const globChars = /[*?\\[\\]]/g;\r\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\r\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\r\n\r\n // Mirror DefaultPermissionPolicy.subjectFor — keep both in sync so the\r\n // TUI's \"suggested pattern\" matches what the trust file actually uses.\r\n if (subjectKey) {\r\n const v = obj[subjectKey];\r\n if (typeof v === 'string') {\r\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\r\n ? normalizePath(v)\r\n : escapeGlob(v);\r\n }\r\n }\r\n\r\n if (toolName === 'bash' && typeof obj.command === 'string') {\r\n return escapeGlob(obj.command);\r\n }\r\n if (typeof obj.path === 'string') {\r\n return normalizePath(obj.path);\r\n }\r\n if (typeof obj.url === 'string') {\r\n return escapeGlob(obj.url);\r\n }\r\n if (typeof obj.name === 'string') {\r\n return escapeGlob(obj.name);\r\n }\r\n return undefined;\r\n }\r\n}","import type {\n SessionEvent,\n SessionMetadata,\n SessionStore,\n} from '../types/session.js';\nimport type {\n DefaultSessionReaderOptions,\n SessionExportOptions,\n SessionQuery,\n SessionReader,\n SessionSearchHit,\n SessionSearchQuery,\n SessionSummaryLite,\n} from '../types/session-reader.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\n/**\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\n * and export helpers. Implemented on top of the public `SessionStore`\n * surface so any concrete store can be inspected without re-implementation.\n *\n * The heavy operations re-parse the JSONL stream on every call — fine for\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\n */\nexport class DefaultSessionReader implements SessionReader {\n private readonly store: SessionStore;\n\n constructor(opts: DefaultSessionReaderOptions) {\n this.store = opts.store;\n }\n\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\n const titleNeedle = q.titleContains?.toLowerCase();\n const filtered = raw.filter((s) => {\n if (q.since && s.startedAt < q.since) return false;\n if (q.until && s.startedAt > q.until) return false;\n if (q.provider && s.provider !== q.provider) return false;\n if (q.model && s.model !== q.model) return false;\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\n return true;\n });\n const out: SessionSummaryLite[] = filtered.map((s) => ({\n id: s.id,\n title: s.title,\n startedAt: s.startedAt,\n provider: s.provider,\n model: s.model,\n tokenTotal: s.tokenTotal,\n }));\n return q.limit ? out.slice(0, q.limit) : out;\n }\n\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\n const data = await this.store.load(sessionId);\n for (const e of data.events) yield e;\n }\n\n async search(q: SessionSearchQuery, sessionId?: string): Promise<SessionSearchHit[]> {\n const limit = q.limit ?? 100;\n const matcher = buildMatcher(q);\n const allowedTypes = q.types ? new Set(q.types) : null;\n\n const ids = sessionId ? [sessionId] : (await this.store.list(1000)).map((s) => s.id);\n const hits: SessionSearchHit[] = [];\n for (const id of ids) {\n let data;\n try {\n data = await this.store.load(id);\n } catch {\n continue;\n }\n for (let i = 0; i < data.events.length; i++) {\n const ev = data.events[i]!;\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\n const text = eventText(ev);\n if (text === null) continue;\n const hit = matcher(text);\n if (!hit) continue;\n hits.push({\n sessionId: id,\n eventIndex: i,\n ts: ev.ts,\n type: ev.type,\n snippet: snippetOf(text, hit.start, hit.end),\n });\n if (hits.length >= limit) return hits;\n }\n }\n return hits;\n }\n\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\n const data = await this.store.load(sessionId);\n const includeTools = opts.includeTools ?? true;\n const includeDiagnostics = opts.includeDiagnostics ?? true;\n\n const filtered = data.events.filter((e) => {\n if (\n !includeTools &&\n (e.type === 'tool_use' ||\n e.type === 'tool_result' ||\n e.type === 'tool_call_start' ||\n e.type === 'tool_call_end')\n ) {\n return false;\n }\n if (\n !includeDiagnostics &&\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\n ) {\n return false;\n }\n return true;\n });\n\n if (opts.format === 'json') {\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\n }\n if (opts.format === 'text') {\n return renderPlainText(data.metadata, filtered);\n }\n return renderMarkdown(data.metadata, filtered);\n }\n\n async metadata(sessionId: string): Promise<SessionMetadata> {\n const data = await this.store.load(sessionId);\n return data.metadata;\n }\n}\n\nfunction buildMatcher(q: SessionSearchQuery): (text: string) => { start: number; end: number } | null {\n const ci = q.caseInsensitive ?? true;\n if (q.regex) {\n const flags = ci ? 'i' : '';\n const re = new RegExp(q.query, flags);\n return (text) => {\n const m = re.exec(text);\n return m ? { start: m.index, end: m.index + m[0].length } : null;\n };\n }\n const needle = ci ? q.query.toLowerCase() : q.query;\n return (text) => {\n const hay = ci ? text.toLowerCase() : text;\n const idx = hay.indexOf(needle);\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\n };\n}\n\nfunction eventText(e: SessionEvent): string | null {\n switch (e.type) {\n case 'user_input':\n return contentToString(e.content);\n case 'llm_response':\n return contentToString(e.content);\n case 'tool_use':\n return `${e.name} ${JSON.stringify(e.input)}`;\n case 'tool_result':\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\n case 'error':\n return `${e.phase}: ${e.message}`;\n case 'session_start':\n case 'session_resumed':\n return `${e.model}/${e.provider}`;\n case 'task_created':\n case 'task_completed':\n return e.title;\n case 'task_failed':\n return `${e.title}: ${e.error}`;\n case 'skill_activated':\n case 'skill_deactivated':\n return e.skillName;\n default:\n return null;\n }\n}\n\nfunction contentToString(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .map((b) => {\n switch (b.type) {\n case 'text':\n return b.text;\n case 'tool_use':\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\n case 'tool_result':\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n default:\n return '';\n }\n })\n .join('\\n');\n}\n\nconst SNIPPET_RADIUS = 60;\n\nfunction snippetOf(text: string, start: number, end: number): string {\n const from = Math.max(0, start - SNIPPET_RADIUS);\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\n const prefix = from > 0 ? '…' : '';\n const suffix = to < text.length ? '…' : '';\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\n}\n\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(`# Session ${meta.id}`);\n lines.push('');\n if (meta.model || meta.provider) {\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\n }\n lines.push(`- **Started:** ${meta.startedAt}`);\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n for (const e of events) {\n switch (e.type) {\n case 'user_input': {\n lines.push(`## User — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n }\n case 'llm_response': {\n lines.push(`## Assistant — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n if (e.stopReason && e.stopReason !== 'end_turn') {\n lines.push('');\n lines.push(`*stop: ${e.stopReason}*`);\n }\n lines.push('');\n break;\n }\n case 'tool_use': {\n lines.push(`### Tool call: \\`${e.name}\\``);\n lines.push('');\n lines.push('```json');\n lines.push(JSON.stringify(e.input, null, 2));\n lines.push('```');\n lines.push('');\n break;\n }\n case 'tool_result': {\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\n lines.push('');\n lines.push('```');\n lines.push(body);\n lines.push('```');\n lines.push('');\n break;\n }\n case 'error': {\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\n lines.push('');\n break;\n }\n case 'compaction': {\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\n lines.push('');\n break;\n }\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(`Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`);\n lines.push(''.padEnd(72, '-'));\n for (const e of events) {\n switch (e.type) {\n case 'user_input':\n lines.push(`[${e.ts}] USER`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'llm_response':\n lines.push(`[${e.ts}] ASSISTANT`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'tool_use':\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\n break;\n case 'tool_result':\n lines.push(\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\n }`,\n );\n break;\n case 'error':\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\n break;\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n","import type {\r\n MetricLabels,\r\n MetricSeries,\r\n MetricsSink,\r\n MetricsSnapshot,\r\n} from '../../types/observability.js';\r\n\r\ninterface CounterState {\r\n value: number;\r\n}\r\n\r\ninterface GaugeState {\r\n value: number;\r\n}\r\n\r\ninterface HistogramState {\r\n count: number;\r\n sum: number;\r\n min: number;\r\n max: number;\r\n // Reservoir sample for cheap quantile estimates. 1024 samples gives <2% error\r\n // on p99 for typical agent workloads — small memory footprint, no exporter\r\n // dependency. Swap for HdrHistogram if you need bounded-error guarantees.\r\n samples: number[];\r\n}\r\n\r\nconst RESERVOIR_SIZE = 1024;\r\n\r\nfunction labelKey(labels: MetricLabels | undefined): string {\r\n if (!labels) return '';\r\n const keys = Object.keys(labels).sort();\r\n return keys.map((k) => `${k}=${labels[k]}`).join(',');\r\n}\r\n\r\nfunction quantile(sorted: number[], q: number): number {\r\n if (sorted.length === 0) return 0;\r\n const idx = Math.min(sorted.length - 1, Math.floor(q * sorted.length));\r\n return sorted[idx] ?? 0;\r\n}\r\n\r\n/**\r\n * In-memory metrics sink. Suitable for embedded use, tests, and /metrics\r\n * scrape over HTTP. For production push-based pipelines, write an adapter\r\n * that implements MetricsSink and forwards to OTLP/StatsD/Prometheus.\r\n */\r\nexport class InMemoryMetricsSink implements MetricsSink {\r\n private counters = new Map<string, Map<string, CounterState>>();\r\n private gauges = new Map<string, Map<string, GaugeState>>();\r\n private histograms = new Map<string, Map<string, HistogramState>>();\r\n\r\n counter(name: string, value = 1, labels?: MetricLabels): void {\r\n const series = this.getOrCreate(this.counters, name);\r\n const key = labelKey(labels);\r\n const state = series.get(key) ?? { value: 0 };\r\n state.value += value;\r\n series.set(key, state);\r\n }\r\n\r\n gauge(name: string, value: number, labels?: MetricLabels): void {\r\n const series = this.getOrCreate(this.gauges, name);\r\n series.set(labelKey(labels), { value });\r\n }\r\n\r\n histogram(name: string, value: number, labels?: MetricLabels): void {\r\n const series = this.getOrCreate(this.histograms, name);\r\n const key = labelKey(labels);\r\n let state = series.get(key);\r\n if (!state) {\r\n state = { count: 0, sum: 0, min: value, max: value, samples: [] };\r\n series.set(key, state);\r\n }\r\n state.count++;\r\n state.sum += value;\r\n if (value < state.min) state.min = value;\r\n if (value > state.max) state.max = value;\r\n if (state.samples.length < RESERVOIR_SIZE) {\r\n state.samples.push(value);\r\n } else {\r\n // Vitter's Algorithm R — every new value has size/count chance of replacing.\r\n const r = Math.floor(Math.random() * state.count);\r\n if (r < RESERVOIR_SIZE) state.samples[r] = value;\r\n }\r\n }\r\n\r\n snapshot(): MetricsSnapshot {\r\n const series: MetricSeries[] = [];\r\n\r\n for (const [name, byLabel] of this.counters) {\r\n for (const [key, state] of byLabel) {\r\n series.push({\r\n name,\r\n type: 'counter',\r\n labels: parseLabelKey(key),\r\n values: { value: state.value },\r\n });\r\n }\r\n }\r\n\r\n for (const [name, byLabel] of this.gauges) {\r\n for (const [key, state] of byLabel) {\r\n series.push({\r\n name,\r\n type: 'gauge',\r\n labels: parseLabelKey(key),\r\n values: { value: state.value },\r\n });\r\n }\r\n }\r\n\r\n for (const [name, byLabel] of this.histograms) {\r\n for (const [key, state] of byLabel) {\r\n const sorted = [...state.samples].sort((a, b) => a - b);\r\n series.push({\r\n name,\r\n type: 'histogram',\r\n labels: parseLabelKey(key),\r\n values: {\r\n count: state.count,\r\n sum: state.sum,\r\n min: state.min,\r\n max: state.max,\r\n p50: quantile(sorted, 0.5),\r\n p95: quantile(sorted, 0.95),\r\n p99: quantile(sorted, 0.99),\r\n },\r\n });\r\n }\r\n }\r\n\r\n return { timestamp: Date.now(), series };\r\n }\r\n\r\n reset(): void {\r\n this.counters.clear();\r\n this.gauges.clear();\r\n this.histograms.clear();\r\n }\r\n\r\n private getOrCreate<V>(\r\n bag: Map<string, Map<string, V>>,\r\n name: string,\r\n ): Map<string, V> {\r\n let series = bag.get(name);\r\n if (!series) {\r\n series = new Map();\r\n bag.set(name, series);\r\n }\r\n return series;\r\n }\r\n}\r\n\r\nfunction parseLabelKey(key: string): MetricLabels {\r\n if (!key) return {};\r\n const labels: MetricLabels = {};\r\n for (const pair of key.split(',')) {\r\n const eq = pair.indexOf('=');\r\n if (eq > 0) labels[pair.slice(0, eq)] = pair.slice(eq + 1);\r\n }\r\n return labels;\r\n}\r\n\r\n/** Cheap noop sink — drop-in default when observability is not configured. */\r\nexport class NoopMetricsSink implements MetricsSink {\r\n counter(): void {}\r\n gauge(): void {}\r\n histogram(): void {}\r\n snapshot(): MetricsSnapshot {\r\n return { timestamp: Date.now(), series: [] };\r\n }\r\n reset(): void {}\r\n}\r\n","import type {\r\n AggregateHealth,\r\n HealthCheck,\r\n HealthCheckResult,\r\n HealthRegistry,\r\n HealthStatus,\r\n} from '../../types/observability.js';\r\n\r\nconst SEVERITY: Record<HealthStatus, number> = {\r\n healthy: 0,\r\n degraded: 1,\r\n unhealthy: 2,\r\n};\r\n\r\n/**\r\n * Aggregates registered health checks. Worst status wins — one unhealthy check\r\n * makes the whole system unhealthy. Use timeouts so a slow probe can't stall\r\n * the response.\r\n */\r\nexport class DefaultHealthRegistry implements HealthRegistry {\r\n private checks = new Map<string, HealthCheck>();\r\n private readonly timeoutMs: number;\r\n\r\n constructor(opts: { timeoutMs?: number } = {}) {\r\n this.timeoutMs = opts.timeoutMs ?? 5_000;\r\n }\r\n\r\n register(check: HealthCheck): void {\r\n this.checks.set(check.name, check);\r\n }\r\n\r\n unregister(name: string): void {\r\n this.checks.delete(name);\r\n }\r\n\r\n async run(): Promise<AggregateHealth> {\r\n const results = await Promise.all(\r\n Array.from(this.checks.values()).map(async (c) => {\r\n const result = await this.runOne(c);\r\n return { name: c.name, ...result };\r\n }),\r\n );\r\n\r\n let status: HealthStatus = 'healthy';\r\n for (const r of results) {\r\n if (SEVERITY[r.status] > SEVERITY[status]) status = r.status;\r\n }\r\n\r\n return { status, timestamp: Date.now(), checks: results };\r\n }\r\n\r\n private async runOne(check: HealthCheck): Promise<HealthCheckResult> {\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const timeout = new Promise<HealthCheckResult>((resolve) => {\r\n timer = setTimeout(\r\n () => resolve({ status: 'unhealthy', detail: `timeout after ${this.timeoutMs}ms` }),\r\n this.timeoutMs,\r\n );\r\n });\r\n try {\r\n return await Promise.race([check.check(), timeout]);\r\n } catch (err) {\r\n return { status: 'unhealthy', detail: err instanceof Error ? err.message : String(err) };\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n}\r\n","import type { Span, Tracer } from '../../types/observability.js';\r\n\r\n/**\r\n * Default tracer is a noop — zero overhead when observability is not wired up.\r\n * Replace at runtime with an OpenTelemetry-backed Tracer to enable real spans.\r\n */\r\nexport class NoopTracer implements Tracer {\r\n startSpan(): Span {\r\n return NOOP_SPAN;\r\n }\r\n}\r\n\r\nconst NOOP_SPAN: Span = {\r\n setAttribute() {},\r\n recordError() {},\r\n end() {},\r\n};\r\n","/**\n * Lightweight OTel adapter. Doesn't pull in `@opentelemetry/api` directly —\n * the user passes their already-initialized OTel Tracer through, and this\n * wrapper translates our minimal Span surface onto theirs.\n *\n * Usage:\n * import { trace } from '@opentelemetry/api';\n * const tracer = trace.getTracer('wrongstack', '1.0');\n * const wrappedTracer = new OTelTracer(tracer);\n * // pass `wrappedTracer` as Agent.tracer / ToolExecutor.tracer.\n *\n * The shape of the upstream Tracer is intentionally typed loosely so we\n * don't need a build-time dependency. Anything OTel-compatible works,\n * including OpenInference, Tempo, etc.\n */\nimport type { Span as WStackSpan, Tracer as WStackTracer } from '../../types/observability.js';\n\ninterface OTelLikeSpan {\n setAttribute(key: string, value: string | number | boolean): unknown;\n recordException(err: { message: string; stack?: string; name?: string }): unknown;\n setStatus?(status: { code: number; message?: string }): unknown;\n end(): unknown;\n}\n\ninterface OTelLikeTracer {\n startSpan(name: string, options?: { attributes?: Record<string, string | number | boolean> }): OTelLikeSpan;\n}\n\n// OTel SpanStatusCode.ERROR = 2 (per the spec). Hard-coded here so we don't\n// depend on the @opentelemetry/api enum.\nconst OTEL_STATUS_ERROR = 2;\n\nexport class OTelTracer implements WStackTracer {\n constructor(private readonly upstream: OTelLikeTracer) {}\n\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): WStackSpan {\n const otelSpan = this.upstream.startSpan(name, attrs ? { attributes: attrs } : undefined);\n return new OTelSpan(otelSpan);\n }\n}\n\nclass OTelSpan implements WStackSpan {\n constructor(private readonly span: OTelLikeSpan) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n recordError(err: Error): void {\n this.span.recordException(err);\n this.span.setStatus?.({ code: OTEL_STATUS_ERROR, message: err.message });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { EventBus } from '../../kernel/events.js';\r\nimport type { MetricsSink } from '../../types/observability.js';\r\n\r\n/**\r\n * Subscribes a MetricsSink to the EventBus. Returns an unsubscribe function\r\n * that detaches all listeners. This is the single integration point between\r\n * the agent's event stream and the observability layer — no metric calls\r\n * leak into core call sites.\r\n */\r\nexport function wireMetricsToEvents(events: EventBus, sink: MetricsSink): () => void {\r\n const unsubs: Array<() => void> = [];\r\n\r\n unsubs.push(\r\n events.on('session.started', () => sink.counter('agent.sessions.started')),\r\n events.on('session.ended', (e) => {\r\n sink.counter('agent.sessions.ended');\r\n sink.histogram('agent.session.tokens.input', e.usage.input);\r\n sink.histogram('agent.session.tokens.output', e.usage.output);\r\n }),\r\n events.on('session.damaged', () => sink.counter('agent.sessions.damaged')),\r\n events.on('iteration.completed', () => sink.counter('agent.iterations.total')),\r\n events.on('iteration.limit_reached', () => sink.counter('agent.iteration_limit.hit')),\r\n events.on('provider.response', (e) => {\r\n sink.counter('provider.responses.total', 1, { stop_reason: e.stopReason });\r\n sink.counter('provider.tokens.input', e.usage.input);\r\n sink.counter('provider.tokens.output', e.usage.output);\r\n if (e.usage.cacheRead) sink.counter('provider.tokens.cache_read', e.usage.cacheRead);\r\n if (e.usage.cacheWrite) sink.counter('provider.tokens.cache_write', e.usage.cacheWrite);\r\n }),\r\n events.on('provider.retry', (e) =>\r\n sink.counter('provider.retries.total', 1, {\r\n provider: e.providerId,\r\n status: String(e.status),\r\n }),\r\n ),\r\n events.on('provider.error', (e) =>\r\n sink.counter('provider.errors.total', 1, {\r\n provider: e.providerId,\r\n status: String(e.status),\r\n retryable: String(e.retryable),\r\n }),\r\n ),\r\n events.on('tool.started', (e) => sink.counter('tool.starts.total', 1, { tool: e.name })),\r\n events.on('tool.executed', (e) => {\r\n sink.counter('tool.executions.total', 1, { tool: e.name, ok: String(e.ok) });\r\n sink.histogram('tool.duration_ms', e.durationMs, { tool: e.name });\r\n }),\r\n events.on('token.threshold', (e) => sink.gauge('agent.tokens.used', e.used)),\r\n events.on('compaction.fired', (e) => {\r\n sink.counter('compaction.fired.total');\r\n sink.histogram('compaction.reduction_tokens', e.before - e.after);\r\n }),\r\n events.on('mcp.server.connected', (e) =>\r\n sink.counter('mcp.connects.total', 1, { server: e.name }),\r\n ),\r\n events.on('mcp.server.reconnected', (e) =>\r\n sink.counter('mcp.reconnects.total', 1, { server: e.name }),\r\n ),\r\n events.on('mcp.server.disconnected', (e) =>\r\n sink.counter('mcp.disconnects.total', 1, { server: e.name }),\r\n ),\r\n events.on('error', (e) => sink.counter('agent.errors.total', 1, { phase: e.phase })),\r\n );\r\n\r\n return () => {\r\n for (const u of unsubs) u();\r\n };\r\n}\r\n","import type {\n HealthRegistry,\n MetricsSink,\n MetricsSnapshot,\n} from '../../types/observability.js';\n\n/**\n * L3-C: Prometheus text exposition format renderer.\n *\n * Implements v0.0.4 (the line-oriented format every scraper accepts):\n * # HELP <name> <help>\n * # TYPE <name> <counter|gauge|histogram|summary>\n * <name>{label=\"value\"} <number>\n *\n * Histograms are emitted as Prometheus *summary* type because our in-memory\n * sink already stores quantiles (p50/p95/p99) rather than open bucket lists.\n * That maps 1:1 onto Prometheus summary semantics and avoids us having to\n * carry a bucket schema we cannot infer from samples.\n */\n\nconst NUMBER_FORMAT_INFINITY = 'NaN'; // Prometheus accepts `NaN` for missing values.\n\nfunction escapeLabelValue(v: string): string {\n return v.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nfunction formatLabels(labels: Record<string, string>): string {\n const keys = Object.keys(labels);\n if (keys.length === 0) return '';\n const parts = keys.map((k) => `${k}=\"${escapeLabelValue(labels[k] ?? '')}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) return NUMBER_FORMAT_INFINITY;\n return Number.isInteger(n) ? n.toString() : n.toString();\n}\n\nfunction joinLabels(base: Record<string, string>, extra: Record<string, string>): Record<string, string> {\n return { ...base, ...extra };\n}\n\n/**\n * Render a `MetricsSnapshot` as Prometheus text-format bytes. The output\n * always ends with a trailing newline (Prometheus requires it).\n */\nexport function renderPrometheus(snapshot: MetricsSnapshot): string {\n // Group by name so we can emit one HELP/TYPE pair per metric.\n type Row = { labels: Record<string, string>; values: Record<string, number> };\n const groups = new Map<string, { type: MetricsSnapshot['series'][number]['type']; rows: Row[] }>();\n for (const s of snapshot.series) {\n let g = groups.get(s.name);\n if (!g) {\n g = { type: s.type, rows: [] };\n groups.set(s.name, g);\n }\n g.rows.push({ labels: s.labels, values: s.values });\n }\n\n const lines: string[] = [];\n for (const [name, g] of groups) {\n const promType = g.type === 'histogram' ? 'summary' : g.type;\n lines.push(`# HELP ${name} ${name}`);\n lines.push(`# TYPE ${name} ${promType}`);\n\n if (g.type === 'counter' || g.type === 'gauge') {\n for (const row of g.rows) {\n lines.push(`${name}${formatLabels(row.labels)} ${formatNumber(row.values.value ?? 0)}`);\n }\n } else {\n // histogram → summary\n for (const row of g.rows) {\n const { count = 0, sum = 0, p50 = 0, p95 = 0, p99 = 0 } = row.values;\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.5' }))} ${formatNumber(p50)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.95' }))} ${formatNumber(p95)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.99' }))} ${formatNumber(p99)}`,\n );\n lines.push(`${name}_sum${formatLabels(row.labels)} ${formatNumber(sum)}`);\n lines.push(`${name}_count${formatLabels(row.labels)} ${formatNumber(count)}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** MIME type Prometheus servers must respond with on /metrics. */\nexport const PROMETHEUS_CONTENT_TYPE = 'text/plain; version=0.0.4; charset=utf-8';\n\nexport interface MetricsServerOptions {\n port: number;\n /** Bind address. Defaults to 127.0.0.1 so we don't accidentally expose metrics publicly. */\n host?: string;\n sink: MetricsSink;\n /** Path to serve on. Defaults to /metrics. */\n path?: string;\n /**\n * V2-C: optional health registry. When provided, the server also responds\n * on `/healthz` (configurable via `healthPath`) with a JSON aggregate of\n * every registered health check. K8s probes expect a single HTTP server\n * exposing both `/metrics` and `/healthz`, so we mount them on the same\n * port rather than opening a sibling listener.\n */\n healthRegistry?: HealthRegistry;\n /** Path to serve health JSON on. Defaults to /healthz. */\n healthPath?: string;\n}\n\nexport interface MetricsServerHandle {\n port: number;\n url: string;\n close(): Promise<void>;\n}\n\n/**\n * Start an HTTP server that exposes a Prometheus scrape endpoint.\n * Uses node:http directly to avoid pulling a framework into the core graph.\n *\n * Why bind to 127.0.0.1 by default: telemetry endpoints inside an agent\n * process can leak prompt content via metric labels (tool name, error\n * message, etc.). The default keeps that on the loopback interface;\n * operators who want network scraping opt in explicitly with host: '0.0.0.0'.\n */\nexport async function startMetricsServer(opts: MetricsServerOptions): Promise<MetricsServerHandle> {\n const { createServer } = await import('node:http');\n const host = opts.host ?? '127.0.0.1';\n const path = opts.path ?? '/metrics';\n const healthPath = opts.healthPath ?? '/healthz';\n const healthRegistry = opts.healthRegistry;\n\n const server = createServer((req, res) => {\n if (!req.url || req.method !== 'GET') {\n res.statusCode = req.url ? 405 : 400;\n res.end();\n return;\n }\n // Strip query string for the route match.\n const url = req.url.split('?')[0];\n\n if (url === path) {\n let body: string;\n try {\n body = renderPrometheus(opts.sink.snapshot());\n } catch (err) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`metrics render failed: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n res.statusCode = 200;\n res.setHeader('content-type', PROMETHEUS_CONTENT_TYPE);\n res.end(body);\n return;\n }\n\n if (healthRegistry && url === healthPath) {\n // Health responses are async — run the checks then emit JSON.\n healthRegistry.run().then(\n (agg) => {\n // Status maps: healthy → 200, degraded → 200 (still serving), unhealthy → 503.\n res.statusCode = agg.status === 'unhealthy' ? 503 : 200;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(agg, null, 2));\n },\n (err: unknown) => {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`health run failed: ${err instanceof Error ? err.message : String(err)}`);\n },\n );\n return;\n }\n\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Not Found');\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(opts.port, host);\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : opts.port;\n return {\n port: boundPort,\n url: `http://${host}:${boundPort}${path}`,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n }),\n };\n}\n","import type { MetricSeries, MetricsSink } from '../../types/observability.js';\n\n/**\n * V2-A: OTLP/JSON metrics push exporter.\n *\n * Periodically POSTs `MetricsSink.snapshot()` to an OTLP HTTP receiver\n * (the OpenTelemetry Collector, vendor agents like Honeycomb, Datadog,\n * Grafana Cloud, etc.). The wire format is OTLP/JSON v1.0 — covered by\n * the spec at github.com/open-telemetry/opentelemetry-proto.\n *\n * Why no `@opentelemetry/*` dep: the core graph is intentionally\n * dependency-free. The JSON shape is well-defined and stable; bringing\n * in the official SDK would add ~3MB and pin us to its release cadence.\n * Operators who need the OTLP gRPC transport or vendor-specific quirks\n * can wrap an `@opentelemetry/exporter-metrics-otlp-grpc` in a custom\n * `MetricsSink` instead — the seam exists.\n */\n\nexport interface OtlpMetricsExporterOptions {\n /** Source of metric data. The exporter reads `snapshot()` per interval. */\n sink: MetricsSink;\n /**\n * OTLP HTTP endpoint base URL. Path `/v1/metrics` is appended unless\n * the URL already ends with `/v1/metrics` (idempotent).\n * Example: `http://otel-collector:4318` or `https://otlp.example.com`.\n */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 30s (Prometheus default). */\n intervalMs?: number;\n /** Optional bearer token / API key (sent as `Authorization`). */\n authorization?: string;\n /** Extra request headers (vendor-specific keys go here). */\n headers?: Record<string, string>;\n /** Resource attributes attached to every export. Defaults: `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope. Default: `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout. Defaults to 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). Defaults to global `fetch`. */\n fetchImpl?: typeof globalThis.fetch;\n /** Called when a push fails. Defaults to silent (telemetry must never crash the host). */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpMetricsExporterHandle {\n /** Push immediately (in addition to the scheduled interval). */\n flush(): Promise<void>;\n /** Stop the timer, attempt a final flush, then resolve. */\n stop(): Promise<void>;\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/metrics\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/metrics';\n}\n\ninterface OtlpAttribute {\n key: string;\n value: { stringValue: string };\n}\n\ninterface OtlpDataPoint {\n attributes: OtlpAttribute[];\n timeUnixNano: string;\n asDouble?: number;\n asInt?: string;\n count?: string;\n sum?: number;\n quantileValues?: { quantile: number; value: number }[];\n}\n\ninterface OtlpMetric {\n name: string;\n description?: string;\n unit?: string;\n sum?: { dataPoints: OtlpDataPoint[]; aggregationTemporality: 2; isMonotonic: true };\n gauge?: { dataPoints: OtlpDataPoint[] };\n summary?: { dataPoints: OtlpDataPoint[] };\n}\n\ninterface OtlpExportRequest {\n resourceMetrics: {\n resource: { attributes: OtlpAttribute[] };\n scopeMetrics: {\n scope: { name: string; version?: string };\n metrics: OtlpMetric[];\n }[];\n }[];\n}\n\nfunction attributesFor(labels: Record<string, string>): OtlpAttribute[] {\n return Object.entries(labels).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n}\n\nfunction buildExportBody(opts: {\n series: MetricSeries[];\n resourceAttributes: Record<string, string>;\n scopeName: string;\n timeUnixNano: string;\n}): OtlpExportRequest {\n const metrics: OtlpMetric[] = [];\n for (const s of opts.series) {\n const dp: OtlpDataPoint = {\n attributes: attributesFor(s.labels),\n timeUnixNano: opts.timeUnixNano,\n };\n\n if (s.type === 'counter') {\n // OTLP requires sum data points carry `startTimeUnixNano`, but the spec\n // accepts omission for cumulative counters when the receiver can\n // assume process start. Most collectors do; vendor-specific tightness\n // is the user's problem if they need it stricter.\n dp.asDouble = s.values.value ?? 0;\n metrics.push({\n name: s.name,\n sum: { dataPoints: [dp], aggregationTemporality: 2, isMonotonic: true },\n });\n } else if (s.type === 'gauge') {\n dp.asDouble = s.values.value ?? 0;\n metrics.push({ name: s.name, gauge: { dataPoints: [dp] } });\n } else {\n // histogram → OTLP summary (quantiles are pre-computed by the sink)\n dp.count = String(s.values.count ?? 0);\n dp.sum = s.values.sum ?? 0;\n dp.quantileValues = [\n { quantile: 0.5, value: s.values.p50 ?? 0 },\n { quantile: 0.95, value: s.values.p95 ?? 0 },\n { quantile: 0.99, value: s.values.p99 ?? 0 },\n ];\n metrics.push({ name: s.name, summary: { dataPoints: [dp] } });\n }\n }\n\n return {\n resourceMetrics: [\n {\n resource: { attributes: attributesFor(opts.resourceAttributes) },\n scopeMetrics: [\n {\n scope: { name: opts.scopeName },\n metrics,\n },\n ],\n },\n ],\n };\n}\n\n/**\n * Build the OTLP/JSON export body from a sink snapshot. Exported for tests\n * and for callers that want to ship via their own transport.\n */\nexport function buildOtlpMetricsRequest(\n sink: MetricsSink,\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpExportRequest {\n return buildExportBody({\n series: sink.snapshot().series,\n resourceAttributes: opts.resourceAttributes ?? { 'service.name': 'wrongstack' },\n scopeName: opts.scopeName ?? 'wrongstack',\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n}\n\n/**\n * Start pushing metrics to an OTLP HTTP receiver. Returns a handle with\n * `flush()` and `stop()`.\n */\nexport function startOtlpMetricsExporter(\n opts: OtlpMetricsExporterOptions,\n): OtlpMetricsExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n async function pushOnce(): Promise<void> {\n if (stopped) return;\n const body = buildExportBody({\n series: opts.sink.snapshot().series,\n resourceAttributes,\n scopeName,\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n void pushOnce();\n }, intervalMs);\n // Don't keep the process alive just to push metrics — graceful shutdown\n // is the host's job.\n handle.unref?.();\n\n return {\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n };\n}\n","import * as crypto from 'node:crypto';\nimport type { Span, Tracer } from '../../types/observability.js';\n\n/**\n * V2-B: OTLP/JSON trace exporter.\n *\n * The `Tracer` produced here captures every started span into an\n * in-memory buffer; an exporter timer drains the buffer and POSTs to\n * `/v1/traces` on the configured OTLP HTTP endpoint.\n *\n * Two production paths:\n *\n * 1. **This adapter** — zero deps, single-process, no parent/child\n * relationships (every span is a root span). Suitable when you\n * mostly want to see the agent's iteration / provider-call /\n * tool-call timings in a vendor UI (Jaeger, Tempo, Honeycomb,\n * Datadog APM, Grafana Cloud, Lightstep, …).\n *\n * 2. **Wrap a real OTel SDK** via the existing `OTelTracer` adapter.\n * Use this when you need context propagation, distributed traces\n * across processes, or vendor-specific span attributes.\n *\n * Keep `@opentelemetry/*` out of the dependency graph by design — both\n * paths above let users opt in to that dep on their own.\n */\n\nconst SPAN_STATUS_CODE_UNSET = 0;\nconst SPAN_STATUS_CODE_OK = 1;\nconst SPAN_STATUS_CODE_ERROR = 2;\n\ntype SpanAttrValue = string | number | boolean;\n\ninterface RecordedSpan {\n traceId: string;\n spanId: string;\n name: string;\n startTimeUnixNano: bigint;\n endTimeUnixNano?: bigint;\n attributes: Record<string, SpanAttrValue>;\n status: { code: number; message?: string };\n}\n\nfunction hex(bytes: number): string {\n return crypto.randomBytes(bytes).toString('hex');\n}\n\nfunction nowNs(): bigint {\n // Date.now() resolution is 1ms — fine for spans whose work takes ≥1ms.\n // Performance.now-based high-res nanoseconds would help, but reference\n // monoclock differs across processes and the OTLP receiver expects\n // wall-clock anyway.\n return BigInt(Date.now()) * 1_000_000n;\n}\n\nclass CapturingSpan implements Span {\n constructor(\n private readonly state: RecordedSpan,\n private readonly onEnd: (s: RecordedSpan) => void,\n ) {}\n\n setAttribute(key: string, value: SpanAttrValue): void {\n this.state.attributes[key] = value;\n }\n\n recordError(err: Error): void {\n this.state.status = { code: SPAN_STATUS_CODE_ERROR, message: err.message };\n this.state.attributes['exception.message'] = err.message;\n if (err.name) this.state.attributes['exception.type'] = err.name;\n }\n\n end(): void {\n if (this.state.endTimeUnixNano !== undefined) return;\n this.state.endTimeUnixNano = nowNs();\n if (this.state.status.code === SPAN_STATUS_CODE_UNSET) {\n this.state.status.code = SPAN_STATUS_CODE_OK;\n }\n this.onEnd(this.state);\n }\n}\n\nexport interface OtlpTraceExporterOptions {\n /** OTLP HTTP endpoint base URL. `/v1/traces` is appended unless already present. */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 5s (traces are bursty). */\n intervalMs?: number;\n /** Hard cap on buffered spans. When exceeded, oldest are dropped. Defaults to 2048. */\n maxBufferedSpans?: number;\n /** Authorization header. */\n authorization?: string;\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Resource attributes. Defaults to `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope name. Default `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout in ms. Default 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). */\n fetchImpl?: typeof globalThis.fetch;\n /** Called on push failure. Defaults to silent. */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpTraceExporterHandle {\n /** The Tracer to install on Agent / ToolExecutor. */\n readonly tracer: Tracer;\n /** Push buffered spans immediately. */\n flush(): Promise<void>;\n /** Stop the timer, push remaining spans, resolve. */\n stop(): Promise<void>;\n /** Test helper: snapshot of spans currently in the buffer (not yet pushed). */\n readonly buffered: () => readonly RecordedSpan[];\n}\n\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst DEFAULT_BUFFER_CAP = 2048;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/traces\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/traces';\n}\n\ninterface OtlpAttribute {\n key: string;\n value:\n | { stringValue: string }\n | { boolValue: boolean }\n | { doubleValue: number }\n | { intValue: string };\n}\n\nfunction encodeAttr(key: string, value: SpanAttrValue): OtlpAttribute {\n if (typeof value === 'boolean') return { key, value: { boolValue: value } };\n if (typeof value === 'number') {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n return { key, value: { stringValue: value } };\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n name: string;\n kind: 1;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpAttribute[];\n status: { code: number; message?: string };\n}\n\ninterface OtlpTracesRequest {\n resourceSpans: {\n resource: { attributes: OtlpAttribute[] };\n scopeSpans: {\n scope: { name: string };\n spans: OtlpSpan[];\n }[];\n }[];\n}\n\nexport function buildOtlpTracesRequest(\n spans: readonly RecordedSpan[],\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpTracesRequest {\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n const otlpSpans: OtlpSpan[] = spans.map((s) => ({\n traceId: s.traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: s.startTimeUnixNano.toString(),\n endTimeUnixNano: (s.endTimeUnixNano ?? s.startTimeUnixNano).toString(),\n attributes: Object.entries(s.attributes).map(([k, v]) => encodeAttr(k, v)),\n status: s.status,\n }));\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: Object.entries(resourceAttributes).map(([k, v]) =>\n encodeAttr(k, v),\n ),\n },\n scopeSpans: [{ scope: { name: scopeName }, spans: otlpSpans }],\n },\n ],\n };\n}\n\n/**\n * Start the OTLP trace exporter. Returns a `Tracer` to install on the\n * runtime (`Agent.run` etc.) and `flush()`/`stop()` controls.\n */\nexport function startOtlpTraceExporter(\n opts: OtlpTraceExporterOptions,\n): OtlpTraceExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxBuffered = opts.maxBufferedSpans ?? DEFAULT_BUFFER_CAP;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n const buffer: RecordedSpan[] = [];\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n const tracer: Tracer = {\n startSpan(name, attrs) {\n const state: RecordedSpan = {\n traceId: hex(16),\n spanId: hex(8),\n name,\n startTimeUnixNano: nowNs(),\n attributes: { ...(attrs ?? {}) },\n status: { code: SPAN_STATUS_CODE_UNSET },\n };\n return new CapturingSpan(state, (ended) => {\n if (buffer.length >= maxBuffered) buffer.shift();\n buffer.push(ended);\n });\n },\n };\n\n async function pushOnce(): Promise<void> {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n const body = buildOtlpTracesRequest(batch, { resourceAttributes, scopeName });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP traces push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n if (!stopped) void pushOnce();\n }, intervalMs);\n handle.unref?.();\n\n return {\n tracer,\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n buffered: () => [...buffer],\n };\n}\n","import type { Context } from '../core/context.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\n\r\n/**\r\n * Context introspection and management tool.\r\n * Allows the model to:\r\n * - \"check\" → see token budget and message counts\r\n * - \"summary\" → summarize and replace a range of messages\r\n * - \"prune\" → remove specific message indices\r\n * - \"add_note\" → inject a summary note at a specific point\r\n * - \"compact\" → run compaction via the injected compactor\r\n */\r\nexport const CONTEXT_MANAGER_TOOL_NAME = 'context_manager';\r\n\r\nexport type ContextManagerAction = 'check' | 'summary' | 'prune' | 'add_note' | 'compact';\r\n\r\nexport interface ContextManagerInput {\r\n action: ContextManagerAction;\r\n /** 0-based message indices for prune/summary (inclusive). */\r\n from?: number;\r\n to?: number;\r\n /** Text for add_note / summary actions. For summary, this is the LLM-provided summary text. */\r\n text?: string;\r\n /** Inject after which index (for add_note). Defaults to prepend (0). */\r\n afterIndex?: number;\r\n}\r\n\r\nexport interface ContextManagerResult {\r\n action: ContextManagerAction;\r\n beforeTokens: number;\r\n afterTokens?: number;\r\n removedCount?: number;\r\n messageCount: number;\r\n summary?: string;\r\n notes?: string;\r\n}\r\n\r\n/**\r\n * Options for creating a context manager tool.\r\n * `compactor` is required for the \"compact\" action; without it the action returns an error.\r\n */\r\nexport interface ContextManagerToolOptions {\r\n compactor?: Compactor;\r\n /**\r\n * Optional sub-LLM summarizer. When provided, the \"summary\" action calls this\r\n * to produce real summaries of message ranges instead of placeholder text.\r\n * (signature matches Provider.complete — return the summary text in result.content[0].text)\r\n */\r\n summarizer?: (messages: Message[]) => Promise<string>;\r\n}\r\n\r\nfunction roughEstimate(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += Math.ceil(m.content.length / 4);\r\n } else if (Array.isArray(m.content)) {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\r\n total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n}\r\n\r\nexport function createContextManagerTool(opts: ContextManagerToolOptions = {}): Tool<ContextManagerInput, ContextManagerResult> {\r\n return {\r\n name: CONTEXT_MANAGER_TOOL_NAME,\r\n description:\r\n 'Inspect or reorganize the conversation context window. ' +\r\n 'Use \"check\" to see token budget. ' +\r\n 'Use \"summary\" to collapse a message range into a concise note (provide \"text\" for custom summary). ' +\r\n 'Use \"prune\" to remove specific messages by index. ' +\r\n 'Use \"add_note\" to inject a summary note. ' +\r\n 'Use \"compact\" to run aggressive compaction.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n action: {\r\n type: 'string',\r\n enum: ['check', 'summary', 'prune', 'add_note', 'compact'],\r\n description: 'The context operation to perform.',\r\n },\r\n from: {\r\n type: 'number',\r\n description: 'Start index (inclusive) for summary/prune operations.',\r\n },\r\n to: {\r\n type: 'number',\r\n description: 'End index (inclusive) for summary/prune operations.',\r\n },\r\n text: {\r\n type: 'string',\r\n description:\r\n 'Summary or note text. For \"summary\": the model-provided summary of the removed range. ' +\r\n 'For \"add_note\": the note to inject.',\r\n },\r\n afterIndex: {\r\n type: 'number',\r\n description: 'Insert after this index (for add_note). Defaults to prepend (0).',\r\n },\r\n },\r\n required: ['action'],\r\n },\r\n permission: 'auto',\r\n mutating: true,\r\n\r\n async execute(input: ContextManagerInput, ctx: Context): Promise<ContextManagerResult> {\r\n const messages = ctx.messages;\r\n const beforeTokens = roughEstimate(messages);\r\n\r\n switch (input.action) {\r\n case 'check': {\r\n return {\r\n action: 'check',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: JSON.stringify({\r\n messages: messages.length,\r\n tokens: beforeTokens,\r\n readFiles: ctx.readFiles.size,\r\n todos: ctx.todos.length,\r\n inProgress: ctx.todos.filter((t) => t.status === 'in_progress').length,\r\n }),\r\n };\r\n }\r\n\r\n case 'compact': {\r\n if (!opts.compactor) {\r\n return {\r\n action: 'compact',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: 'No compactor registered. Use /compact aggressive via slash command instead.',\r\n };\r\n }\r\n const report = await opts.compactor.compact(ctx);\r\n return {\r\n action: 'compact',\r\n beforeTokens,\r\n afterTokens: report.after,\r\n messageCount: messages.length,\r\n };\r\n }\r\n\r\n case 'prune': {\r\n const from = input.from ?? 0;\r\n const to = input.to ?? messages.length - 1;\r\n if (from < 0 || to >= messages.length || from > to) {\r\n return {\r\n action: 'prune',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\r\n };\r\n }\r\n const removed = messages.splice(from, to - from + 1);\r\n const afterTokens = roughEstimate(messages);\r\n return {\r\n action: 'prune',\r\n beforeTokens,\r\n afterTokens,\r\n messageCount: messages.length,\r\n removedCount: removed.length,\r\n };\r\n }\r\n\r\n case 'add_note': {\r\n const noteText = input.text ?? '(no summary)';\r\n const afterIdx = Math.min(input.afterIndex ?? 0, messages.length);\r\n const noteMsg: Message = {\r\n role: 'system',\r\n content: `[note: ${noteText}]`,\r\n };\r\n messages.splice(afterIdx, 0, noteMsg);\r\n const afterTokens = roughEstimate(messages);\r\n return {\r\n action: 'add_note',\r\n beforeTokens,\r\n afterTokens,\r\n messageCount: messages.length,\r\n summary: noteText,\r\n };\r\n }\r\n\r\n case 'summary': {\r\n const from = input.from ?? 0;\r\n const to = input.to ?? messages.length - 1;\r\n if (from < 0 || to >= messages.length || from > to) {\r\n return {\r\n action: 'summary',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\r\n };\r\n }\r\n const summaryText = input.text ?? '[summary placeholder — provide \"text\" to record the summary]';\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[summary of messages ${from}–${to}]: ${summaryText}`,\r\n };\r\n messages.splice(from, to - from + 1, summaryMsg);\r\n const afterTokens = roughEstimate(messages);\r\n return {\r\n action: 'summary',\r\n beforeTokens,\r\n afterTokens,\r\n messageCount: messages.length,\r\n summary: summaryText,\r\n };\r\n }\r\n\r\n default:\r\n return {\r\n action: input.action,\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: `Unknown action: ${input.action}`,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\n/** Pre-built instance with no compactor — compact action will return an error. */\r\nexport const contextManagerTool: Tool<ContextManagerInput, ContextManagerResult> =\r\n createContextManagerTool();","import type { MCPServerConfig } from '../types/config.js';\n\n/**\n * Built-in MCP server presets available to all WrongStack users out of the box.\n * These servers must be explicitly enabled in config (disabled by default).\n *\n * To enable: set `mcpServers: { serverName: { enabled: true } }` in your config.\n *\n * Some servers require environment variables or additional config — see notes below.\n *\n * Transport types:\n * stdio — spawns a local npm package binary via child_process\n * sse — HTTP SSE endpoint (client POSTs requests)\n * streamable-http — session-based HTTP with NDJSON responses\n */\n\n/** Filesystem access: read, write, list, search, tree. Good for exploring projects. */\nexport const filesystemServer = (): MCPServerConfig => ({\n name: 'filesystem',\n description: 'Read, write, and navigate the local filesystem (read-heavy tools)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '.'],\n permission: 'confirm',\n});\n\n/** GitHub API: issues, PRs, repos, search, file operations. Requires GITHUB_PERSONAL_ACCESS_TOKEN. */\nexport const githubServer = (): MCPServerConfig => ({\n name: 'github',\n description: 'GitHub API — issues, PRs, repos, search, file ops (requires GITHUB_PERSONAL_ACCESS_TOKEN)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n env: { GITHUB_PERSONAL_ACCESS_TOKEN: process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Context7 — codebase-aware documentation and Q&A using context from your code.\n * Live documentation for any library, grounded in your actual versions.\n */\nexport const context7Server = (): MCPServerConfig => ({\n name: 'context7',\n description: 'Codebase-aware documentation and Q&A (context7.ai)',\n transport: 'streamable-http',\n url: 'https://server.context7.ai/mcp',\n permission: 'confirm',\n});\n\n/**\n * Brave Search — web search via Brave Browser's API.\n * Requires BRAVE_SEARCH_API_KEY. Free tier: 2,000 queries/month.\n * Sign up at https://api.search.brave.com/\n */\nexport const braveSearchServer = (): MCPServerConfig => ({\n name: 'brave-search',\n description: 'Web search (Brave). Requires BRAVE_SEARCH_API_KEY — free tier 2k queries/month',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-brave-search'],\n env: { BRAVE_SEARCH_API_KEY: process.env.BRAVE_SEARCH_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Block (Block, Inc.) — Postgres database access via SQL.\n * Useful for running queries against a connected database during development.\n */\nexport const blockServer = (): MCPServerConfig => ({\n name: 'block',\n description: 'Postgres database access via SQL (Block MCP server)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-block'],\n permission: 'confirm',\n});\n\n/**\n * EverArt — AI image generation via various providers.\n * Requires EVERART_API_KEY.\n */\nexport const everArtServer = (): MCPServerConfig => ({\n name: 'everart',\n description: 'AI image generation (EverArt). Requires EVERART_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-everart'],\n env: { EVERART_API_KEY: process.env.EVERART_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Slack — messaging, channels, search.\n * Requires SLACK_BOT_TOKEN and either SLACK_TEAM_ID or SLACK_USER_TOKEN.\n */\nexport const slackServer = (): MCPServerConfig => ({\n name: 'slack',\n description: 'Slack — messaging, channels, search. Requires SLACK_BOT_TOKEN + SLACK_TEAM_ID',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-slack'],\n env: {\n SLACK_BOT_TOKEN: process.env.SLACK_BOT_TOKEN ?? '',\n SLACK_TEAM_ID: process.env.SLACK_TEAM_ID ?? '',\n },\n permission: 'confirm',\n});\n\n/**\n * AWS knowledge base — EC2, S3, Lambda, IAM, CloudFormation, cost management.\n * Requires AWS access key + secret in environment.\n */\nexport const awsServer = (): MCPServerConfig => ({\n name: 'aws',\n description: 'AWS — EC2, S3, Lambda, IAM, CloudFormation, costs. Requires AWS credentials',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-aws'],\n permission: 'confirm',\n});\n\n/**\n * Google Maps — directions, distance matrix, geocoding, places.\n * Requires GOOGLE_MAPS_API_KEY.\n */\nexport const googleMapsServer = (): MCPServerConfig => ({\n name: 'google-maps',\n description: 'Google Maps — directions, geocoding, places. Requires GOOGLE_MAPS_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-google-maps'],\n env: { GOOGLE_MAPS_API_KEY: process.env.GOOGLE_MAPS_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/** Sentinel — security vulnerability scanning (sentinel-labs). */\nexport const sentinelServer = (): MCPServerConfig => ({\n name: 'sentinel',\n description: 'Security vulnerability scanning (Sentinel)',\n transport: 'streamable-http',\n url: 'https://mcp.sentinel.ai',\n permission: 'deny', // security tool — require explicit confirmation\n});\n\n/** Everything bundled — full set of built-in servers. Useful for `wstack mcp add --all`. */\nexport const allServers = (): Record<string, MCPServerConfig> => ({\n filesystem: { ...filesystemServer(), enabled: false },\n github: { ...githubServer(), enabled: false },\n context7: { ...context7Server(), enabled: false },\n 'brave-search': { ...braveSearchServer(), enabled: false },\n block: { ...blockServer(), enabled: false },\n everart: { ...everArtServer(), enabled: false },\n slack: { ...slackServer(), enabled: false },\n aws: { ...awsServer(), enabled: false },\n 'google-maps': { ...googleMapsServer(), enabled: false },\n sentinel: { ...sentinelServer(), enabled: false },\n});"]}
1
+ {"version":3,"sources":["../../src/utils/color.ts","../../src/defaults/logger.ts","../../src/defaults/path-resolver.ts","../../src/defaults/token-counter.ts","../../src/utils/atomic-write.ts","../../src/defaults/session-store.ts","../../src/defaults/queue-store.ts","../../src/defaults/attachment-store.ts","../../src/defaults/memory-store.ts","../../src/defaults/secret-scrubber.ts","../../src/types/secret-vault.ts","../../src/defaults/secret-vault.ts","../../src/utils/glob-match.ts","../../src/utils/safe-json.ts","../../src/defaults/permission-policy.ts","../../src/types/errors.ts","../../src/types/provider.ts","../../src/defaults/retry-policy.ts","../../src/defaults/error-handler.ts","../../src/defaults/skill-loader.ts","../../src/defaults/config-loader.ts","../../src/defaults/config-store.ts","../../src/defaults/config-migration.ts","../../src/utils/token-estimate.ts","../../src/defaults/compactor.ts","../../src/types/blocks.ts","../../src/defaults/intelligent-compactor.ts","../../src/defaults/llm-selector.ts","../../src/defaults/selective-compactor.ts","../../src/defaults/auto-compaction-middleware.ts","../../src/defaults/models-registry.ts","../../src/types/mode.ts","../../src/defaults/mode-store.ts","../../src/defaults/subagent-budget.ts","../../src/defaults/multi-agent-coordinator.ts","../../src/defaults/agent-subagent-runner.ts","../../src/defaults/fleet-bus.ts","../../src/defaults/transport/in-memory-transport.ts","../../src/defaults/agent-bridge.ts","../../src/defaults/director-prompts.ts","../../src/defaults/director.ts","../../src/defaults/director-session.ts","../../src/defaults/agents/fleet.ts","../../src/defaults/autonomous-runner.ts","../../src/defaults/spec-parser.ts","../../src/defaults/task-generator.ts","../../src/types/task-graph.ts","../../src/defaults/task-tracker.ts","../../src/defaults/task-flow.ts","../../src/defaults/recovery-lock.ts","../../src/utils/tool-output-serializer.ts","../../src/defaults/tool-executor.ts","../../src/defaults/session-reader.ts","../../src/defaults/observability/metrics.ts","../../src/defaults/observability/health.ts","../../src/defaults/observability/tracer.ts","../../src/defaults/observability/otel-tracer.ts","../../src/defaults/observability/event-bridge.ts","../../src/defaults/observability/prometheus.ts","../../src/defaults/observability/otlp-metrics.ts","../../src/defaults/observability/otlp-traces.ts","../../src/defaults/context-manager.ts","../../src/defaults/mcp-servers.ts"],"names":["open","fs","path","fs2","path3","fs3","stat","randomBytes","path4","path5","fsp2","fsp3","path6","fs4","path7","path8","fsp4","fs6","fs7","path9","FORBIDDEN_PROTO_KEYS","deepMerge","fs8","afterTokens","fs9","path10","path11","fs10","handlers","resolve","randomUUID","fsp5","path12","path13","path14","fsp6","DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint"],"mappings":"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","file":"index.js","sourcesContent":["const isColorTty = (): boolean => {\n if (process.env.NO_COLOR) return false;\n if (process.env.FORCE_COLOR) return true;\n return Boolean(process.stdout?.isTTY);\n};\n\nconst COLOR = isColorTty();\n\nconst wrap = (open: string, close: string) =>\n (s: string): string =>\n COLOR ? `\\x1b[${open}m${s}\\x1b[${close}m` : s;\n\nexport const color = {\n reset: wrap('0', '0'),\n bold: wrap('1', '22'),\n dim: wrap('2', '22'),\n italic: wrap('3', '23'),\n underline: wrap('4', '24'),\n red: wrap('31', '39'),\n green: wrap('32', '39'),\n yellow: wrap('33', '39'),\n blue: wrap('34', '39'),\n magenta: wrap('35', '39'),\n cyan: wrap('36', '39'),\n gray: wrap('90', '39'),\n amber: wrap('38;5;214', '39'),\n pink: wrap('38;5;205', '39'),\n bgRed: wrap('41', '49'),\n bgGreen: wrap('42', '49'),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(\n // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape regex\n /\\x1b\\[[0-9;]*[A-Za-z]/g,\n '',\n );\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { color } from '../utils/color.js';\nimport type { Logger, LogLevel } from '../types/logger.js';\n\nconst LEVEL_RANK: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n trace: 4,\n};\n\nconst COLORS: Record<LogLevel, (s: string) => string> = {\n error: color.red,\n warn: color.yellow,\n info: color.cyan,\n debug: color.gray,\n trace: color.dim,\n};\n\nexport interface DefaultLoggerOptions {\n level?: LogLevel;\n file?: string;\n pretty?: boolean;\n bindings?: Record<string, unknown>;\n}\n\nexport class DefaultLogger implements Logger {\n level: LogLevel;\n private readonly file?: string;\n private readonly bindings: Record<string, unknown>;\n private readonly pretty: boolean;\n\n constructor(opts: DefaultLoggerOptions = {}) {\n this.level = opts.level ?? (process.env.WRONGSTACK_LOG_LEVEL as LogLevel) ?? 'info';\n this.file = opts.file;\n this.bindings = opts.bindings ?? {};\n this.pretty = opts.pretty ?? true;\n if (this.file) {\n try {\n fs.mkdirSync(path.dirname(this.file), { recursive: true });\n } catch {\n // best-effort\n }\n }\n }\n\n error(msg: string, ctx?: unknown): void {\n this.log('error', msg, ctx);\n }\n warn(msg: string, ctx?: unknown): void {\n this.log('warn', msg, ctx);\n }\n info(msg: string, ctx?: unknown): void {\n this.log('info', msg, ctx);\n }\n debug(msg: string, ctx?: unknown): void {\n this.log('debug', msg, ctx);\n }\n trace(msg: string, ctx?: unknown): void {\n this.log('trace', msg, ctx);\n }\n\n child(bindings: Record<string, unknown>): Logger {\n return new DefaultLogger({\n level: this.level,\n file: this.file,\n pretty: this.pretty,\n bindings: { ...this.bindings, ...bindings },\n });\n }\n\n private log(level: LogLevel, msg: string, ctx?: unknown): void {\n const r = LEVEL_RANK[level];\n const allowed = LEVEL_RANK[this.level];\n if (r > allowed) return;\n const ts = new Date().toISOString();\n const entry: Record<string, unknown> = { ts, level, msg, ...this.bindings };\n if (ctx !== undefined) {\n entry.ctx = ctx instanceof Error ? { message: ctx.message, stack: ctx.stack } : ctx;\n }\n // Disk: JSON line\n if (this.file) {\n try {\n fs.appendFileSync(this.file, `${JSON.stringify(entry)}\\n`);\n } catch {\n // ignore\n }\n }\n // Stderr: pretty or json\n if (r <= LEVEL_RANK.warn || this.level === 'debug' || this.level === 'trace') {\n const head = `${color.dim(ts)} ${COLORS[level](level.toUpperCase().padEnd(5))} ${msg}`;\n if (ctx !== undefined) {\n process.stderr.write(`${head} ${formatCtx(ctx)}\\n`);\n } else {\n process.stderr.write(`${head}\\n`);\n }\n }\n }\n}\n\nfunction formatCtx(ctx: unknown): string {\n if (ctx instanceof Error) return color.dim(ctx.message);\n if (typeof ctx === 'string') return color.dim(ctx);\n try {\n return color.dim(JSON.stringify(ctx));\n } catch {\n return color.dim(String(ctx));\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { PathResolver } from '../types/path-resolver.js';\n\nconst PROJECT_MARKERS = [\n '.git',\n 'package.json',\n 'pnpm-workspace.yaml',\n 'go.mod',\n 'Cargo.toml',\n 'pyproject.toml',\n '.wrongstack',\n];\n\nexport class DefaultPathResolver implements PathResolver {\n readonly projectRoot: string;\n readonly cwd: string;\n\n constructor(cwd: string = process.cwd()) {\n this.cwd = path.resolve(cwd);\n this.projectRoot = this.detectProjectRoot(this.cwd);\n }\n\n detectProjectRoot(start: string): string {\n let dir = path.resolve(start);\n const root = path.parse(dir).root;\n while (dir !== root) {\n for (const marker of PROJECT_MARKERS) {\n try {\n fs.accessSync(path.join(dir, marker));\n return dir;\n } catch {\n // continue\n }\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n return path.resolve(start);\n }\n\n resolve(input: string): string {\n const abs = path.isAbsolute(input) ? input : path.resolve(this.cwd, input);\n let real: string;\n try {\n real = fs.realpathSync(abs);\n } catch {\n // path doesn't exist yet; normalize without resolving symlinks\n real = path.normalize(abs);\n }\n return real;\n }\n\n isInsideRoot(absPath: string): boolean {\n const normalized = path.normalize(absPath);\n const root = path.normalize(this.projectRoot);\n if (normalized === root) return true;\n const rel = path.relative(root, normalized);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n }\n\n ensureInsideRoot(absPath: string): string {\n const resolved = this.resolve(absPath);\n if (!this.isInsideRoot(resolved)) {\n // Render the input as a project-relative-looking string when possible\n // so the error message can flow through telemetry / LLM transcripts\n // without leaking the absolute project root layout.\n const display = path.isAbsolute(absPath)\n ? path.basename(absPath)\n : absPath;\n const err = new Error(`Path \"${display}\" resolves outside the project root`);\n // Keep the full information available to programmatic callers; only\n // the user-facing `message` is sanitized.\n (err as Error & { fullPath?: string; projectRoot?: string }).fullPath = absPath;\n (err as Error & { fullPath?: string; projectRoot?: string }).projectRoot = this.projectRoot;\n throw err;\n }\n return resolved;\n }\n}\n","import type { CacheStats, TokenCounter } from '../types/token-counter.js';\nimport type { Usage } from '../types/provider.js';\nimport type { ModelsRegistry, ResolvedModel } from '../types/models-registry.js';\nimport type { EventBus } from '../kernel/events.js';\n\ninterface PriceEntry {\n input?: number;\n output?: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\n/**\n * Token counter that derives pricing from the ModelsRegistry instead of a\n * hardcoded table. If a model is unknown to the registry (or the registry is\n * unavailable) the counter still tracks token totals but reports zero cost.\n */\nexport class DefaultTokenCounter implements TokenCounter {\n private input = 0;\n private output = 0;\n private cacheRead = 0;\n private cacheWrite = 0;\n private costInput = 0;\n private costOutput = 0;\n private readonly registry?: ModelsRegistry;\n private readonly providerId?: string;\n private readonly events?: EventBus;\n private priceCache = new Map<string, PriceEntry>();\n\n constructor(opts: { registry?: ModelsRegistry; providerId?: string; events?: EventBus } = {}) {\n this.registry = opts.registry;\n this.providerId = opts.providerId;\n this.events = opts.events;\n }\n\n account(usage: Usage, model?: string): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n\n const price = model ? this.priceCache.get(model) : undefined;\n if (price) {\n this.applyPrice(usage, price);\n } else if (this.registry && this.providerId && model) {\n // Async lookup — populate cache, but don't block this call.\n void this.registry\n .getModel(this.providerId, model)\n .then((m) => {\n if (m) {\n const p = priceFromModel(m);\n this.priceCache.set(model, p);\n this.applyPrice(usage, p);\n }\n })\n .catch(() => {\n // Emit so observability tooling can detect unknown models.\n this.events?.emit('token.cost_estimate_unavailable', { model: model ?? '<unknown>' });\n return undefined;\n });\n }\n }\n\n /** Synchronous variant for code paths that have already resolved the model. */\n accountWithModel(usage: Usage, resolved: ResolvedModel): void {\n this.input += usage.input;\n this.output += usage.output;\n this.cacheRead += usage.cacheRead ?? 0;\n this.cacheWrite += usage.cacheWrite ?? 0;\n const price = priceFromModel(resolved);\n this.priceCache.set(resolved.modelId, price);\n this.applyPrice(usage, price);\n }\n\n total(): Usage {\n return {\n input: this.input,\n output: this.output,\n cacheRead: this.cacheRead,\n cacheWrite: this.cacheWrite,\n };\n }\n\n estimateCost(): { input: number; output: number; total: number; currency: 'USD' } {\n return {\n input: round4(this.costInput),\n output: round4(this.costOutput),\n total: round4(this.costInput + this.costOutput),\n currency: 'USD',\n };\n }\n\n cacheStats(): CacheStats {\n // Hit ratio: cacheRead / (cacheRead + input). `input` from the provider\n // is the count of fresh-token reads, so this answers \"what fraction of\n // the prompt did we get for the cache price?\"\n const denom = this.cacheRead + this.input;\n return {\n readTokens: this.cacheRead,\n writeTokens: this.cacheWrite,\n hitRatio: denom === 0 ? 0 : this.cacheRead / denom,\n };\n }\n\n /** Invalidate cached prices so the next account() call fetches fresh data. */\n invalidateCache(): void {\n this.priceCache.clear();\n }\n\n reset(): void {\n this.input = 0;\n this.output = 0;\n this.cacheRead = 0;\n this.cacheWrite = 0;\n this.costInput = 0;\n this.costOutput = 0;\n }\n\n private applyPrice(usage: Usage, price: PriceEntry): void {\n if (price.input) this.costInput += (usage.input / 1_000_000) * price.input;\n if (price.output) this.costOutput += (usage.output / 1_000_000) * price.output;\n if (usage.cacheRead && price.cacheRead) {\n this.costInput += (usage.cacheRead / 1_000_000) * price.cacheRead;\n }\n if (usage.cacheWrite && price.cacheWrite) {\n this.costInput += (usage.cacheWrite / 1_000_000) * price.cacheWrite;\n }\n }\n}\n\nfunction priceFromModel(m: ResolvedModel): PriceEntry {\n return {\n input: m.cost?.input,\n output: m.cost?.output,\n cacheRead: m.cost?.cache_read,\n cacheWrite: m.cost?.cache_write,\n };\n}\n\nfunction round4(n: number): number {\n return Math.round(n * 10_000) / 10_000;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n // target may not exist yet; mode stays undefined\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await fs.rename(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport type { EventBus } from '../kernel/events.js';\nimport type {\n ResumedSession,\n SessionData,\n SessionEvent,\n SessionMetadata,\n SessionStore,\n SessionSummary,\n SessionWriter,\n} from '../types/session.js';\nimport type { Message } from '../types/messages.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\nexport interface SessionStoreOptions {\n dir: string;\n /** Optional EventBus for emitting session diagnostics. */\n events?: EventBus;\n}\n\nexport class DefaultSessionStore implements SessionStore {\n private readonly dir: string;\n private readonly events?: EventBus;\n\n constructor(opts: SessionStoreOptions) {\n this.dir = opts.dir;\n this.events = opts.events;\n }\n\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\n await ensureDir(this.dir);\n const startedAt = new Date().toISOString();\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n // Preserve cause + errno so callers can branch on EACCES vs EMFILE\n // vs ENOSPC etc. instead of substring-matching the error message.\n throw new Error(`Failed to open session file: ${err instanceof Error ? err.message : String(err)}`, {\n cause: err,\n });\n }\n try {\n return new FileSessionWriter(id, handle, startedAt, meta, { dir: this.dir, filePath: file });\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async resume(id: string): Promise<ResumedSession> {\n const data = await this.load(id);\n const file = path.join(this.dir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n const writer = new FileSessionWriter(\n id,\n handle,\n new Date().toISOString(),\n {\n id,\n model: data.metadata.model,\n provider: data.metadata.provider,\n },\n { resumed: true, dir: this.dir, filePath: file },\n );\n return { writer, data };\n }\n\n async load(id: string): Promise<SessionData> {\n const file = path.join(this.dir, `${id}.jsonl`);\n const raw = await fsp.readFile(file, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.trim());\n const events: SessionEvent[] = [];\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n // Session JSONL is on-disk user-writable state; downstream replay\n // trusts `e.type` / `e.ts` etc. and would TypeError on a malformed\n // shape. Validate the discriminator + timestamp before pushing.\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string' &&\n typeof (parsed as { ts?: unknown }).ts === 'string'\n ) {\n events.push(parsed as SessionEvent);\n }\n // else: skip — a hand-edited file with a partial object should not\n // crash replay, just lose that one event.\n } catch {\n // skip malformed JSON\n }\n }\n const meta = this.metaFromEvents(id, events);\n const { messages, usage } = this.replay(events, id);\n return { metadata: meta, events, messages, usage };\n }\n\n async list(limit = 20): Promise<SessionSummary[]> {\n try {\n await ensureDir(this.dir);\n const files = await fsp.readdir(this.dir);\n const ids = files\n .filter((f) => f.endsWith('.jsonl'))\n .map((f) => f.replace(/\\.jsonl$/, ''));\n // Read all manifests in parallel; fall back to full load only for\n // sessions that haven't been closed cleanly (or predate the manifest).\n const sessions = await Promise.all(\n ids.map((id) => this.summaryFor(id).catch(() => null)),\n );\n const out = sessions.filter((s): s is SessionSummary => s !== null);\n out.sort((a, b) => {\n if (a.startedAt < b.startedAt) return 1;\n if (a.startedAt > b.startedAt) return -1;\n // Equal timestamps — use id as tiebreaker for stable sort\n return a.id.localeCompare(b.id);\n });\n return out.slice(0, limit);\n } catch {\n return [];\n }\n }\n\n private async summaryFor(id: string): Promise<SessionSummary> {\n const manifest = path.join(this.dir, `${id}.summary.json`);\n try {\n const raw = await fsp.readFile(manifest, 'utf8');\n return JSON.parse(raw) as SessionSummary;\n } catch {\n // Manifest missing/corrupt — fall back to a full parse and backfill\n // the manifest so the next `list()` hits the fast path.\n const full = path.join(this.dir, `${id}.jsonl`);\n const stat = await fsp.stat(full);\n const summary = await this.summarize(id, stat.mtime.toISOString());\n await fsp.writeFile(manifest, JSON.stringify(summary), { mode: 0o600 }).catch(() => undefined);\n return summary;\n }\n }\n\n async delete(id: string): Promise<void> {\n await fsp.unlink(path.join(this.dir, `${id}.jsonl`));\n await fsp.unlink(path.join(this.dir, `${id}.summary.json`)).catch(() => undefined);\n }\n\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\n try {\n const data = await this.load(id);\n const firstUser = data.events.find((e) => e.type === 'user_input');\n const title =\n firstUser && firstUser.type === 'user_input'\n ? userInputTitle(firstUser.content)\n : '(empty session)';\n return {\n id,\n title,\n startedAt: data.metadata.startedAt,\n model: data.metadata.model ?? 'unknown',\n provider: data.metadata.provider ?? 'unknown',\n tokenTotal: data.usage.input + data.usage.output,\n };\n } catch {\n return {\n id,\n title: '(damaged)',\n startedAt: mtime,\n model: 'unknown',\n provider: 'unknown',\n tokenTotal: 0,\n };\n }\n }\n\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\n const start = events.find((e) => e.type === 'session_start');\n const end = events.find((e) => e.type === 'session_end');\n return {\n id,\n startedAt: start?.ts ?? new Date(0).toISOString(),\n endedAt: end?.ts,\n model: start?.model,\n provider: start?.provider,\n };\n }\n\n private replay(events: SessionEvent[], sessionId = 'unknown'): { messages: Message[]; usage: SessionData['usage'] } {\n const messages: Message[] = [];\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n const openToolUses = new Set<string>();\n for (const e of events) {\n if (e.type === 'user_input') {\n openToolUses.clear();\n messages.push({ role: 'user', content: e.content });\n } else if (e.type === 'llm_response') {\n messages.push({ role: 'assistant', content: e.content });\n for (const b of e.content) {\n if (b.type === 'tool_use') openToolUses.add(b.id);\n }\n usage = {\n input: usage.input + (e.usage.input ?? 0),\n output: usage.output + (e.usage.output ?? 0),\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\n };\n } else if (e.type === 'tool_result') {\n if (!openToolUses.has(e.id)) {\n // Orphan tool_result: tool_use was never seen. Skip to avoid\n // corrupting the replayed message sequence.\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\n });\n continue;\n }\n openToolUses.delete(e.id);\n const content: ContentBlock[] = [\n {\n type: 'tool_result',\n tool_use_id: e.id,\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\n is_error: e.isError,\n },\n ];\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n if (Array.isArray(last.content)) {\n last.content.push(...content);\n } else if (typeof last.content === 'string') {\n // Convert string content to blocks and append\n last.content = [{ type: 'text', text: last.content }, ...content];\n } else {\n messages.push({ role: 'user', content });\n }\n } else {\n messages.push({ role: 'user', content });\n }\n }\n }\n if (openToolUses.size > 0) {\n throw new Error(\n `Session damaged: ${openToolUses.size} tool_use blocks without matching results`,\n );\n }\n return { messages, usage };\n }\n}\n\nclass FileSessionWriter implements SessionWriter {\n private closed = false;\n private manifestFile: string;\n private summary: SessionSummary;\n private tokenIn = 0;\n private tokenOut = 0;\n private readonly filePath: string;\n private initDone = false;\n private readonly resumed: boolean;\n private appendFailCount = 0;\n private lastAppendWarnAt = 0;\n\n constructor(\n public readonly id: string,\n private readonly handle: fsp.FileHandle,\n private readonly startedAt: string,\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\n opts: { resumed?: boolean; dir?: string; filePath?: string } = {},\n ) {\n this.resumed = opts.resumed ?? false;\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\n this.filePath = opts.filePath ?? '';\n this.summary = {\n id,\n title: '(empty session)',\n startedAt,\n model: meta.model ?? 'unknown',\n provider: meta.provider ?? 'unknown',\n tokenTotal: 0,\n };\n // Session start is written lazily on first append to avoid sync I/O\n // in constructor and eliminate reliance on FileHandle.fd private property.\n }\n\n private async writeSessionStart(): Promise<void> {\n if (this.initDone || this.closed) return;\n this.initDone = true;\n const record = `${JSON.stringify({\n type: this.resumed ? 'session_resumed' : 'session_start',\n ts: this.startedAt,\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n try {\n if (this.filePath) {\n // Use fs.promises.writeFile directly to avoid FileHandle.fd private access\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\n }\n } catch {\n // best-effort; session will still be usable without the start event logged\n }\n }\n\n async append(event: SessionEvent): Promise<void> {\n if (this.closed) return;\n if (!this.initDone) {\n await this.writeSessionStart();\n }\n this.observeForSummary(event);\n try {\n await this.handle.appendFile(`${JSON.stringify(event)}\\n`, 'utf8');\n } catch (err) {\n // A persistent failure (full disk, broken pipe) would otherwise log\n // once per appended event — which for a chatty agent run is a lot.\n // Debounce to one log per 5 s and surface the suppressed count.\n this.appendFailCount++;\n const now = Date.now();\n if (now - this.lastAppendWarnAt > 5000) {\n const suppressed = this.appendFailCount - 1;\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\n console.warn(\n '[session] append failed:',\n err instanceof Error ? err.message : String(err),\n tail,\n );\n this.lastAppendWarnAt = now;\n this.appendFailCount = 0;\n }\n }\n }\n\n /**\n * Watch events as they're appended and keep the summary state hot, so\n * `close()` can flush a `<id>.summary.json` manifest without re-reading\n * the JSONL. `list()` reads only manifests, turning a per-session full\n * parse into a single stat+read.\n */\n private observeForSummary(event: SessionEvent): void {\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\n } else if (event.type === 'llm_response') {\n this.tokenIn += event.usage.input;\n this.tokenOut += event.usage.output;\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\n } else if (event.type === 'session_end') {\n // session_end usage is the canonical total — prefer it if non-zero.\n const total = event.usage.input + event.usage.output;\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\n }\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n if (this.manifestFile) {\n try {\n await fsp.writeFile(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\n } catch {\n // manifest write is best-effort; list() falls back to full load.\n }\n }\n try {\n await this.handle.close();\n } catch {\n // ignore\n }\n }\n}\n\nfunction userInputTitle(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content.slice(0, 60);\n const text = content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join(' ');\n return (text || '(non-text input)').slice(0, 60);\n}","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * The persisted form of a single queued user message. The TUI's\n * in-memory QueueItem has a render id; that's pure UI bookkeeping, so\n * we drop it when serializing — fresh ids are assigned on rehydrate.\n */\nexport interface PersistedQueueItem {\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/**\n * Side-file storage for a session's pending input queue. Lives at\n * `<sessionDir>/queue.json` next to the attachment spool. Reads are\n * tolerant (missing/malformed file → empty array); writes are atomic\n * (tmp + rename) so a crash mid-write can never leave a partial file\n * the next launch would choke on.\n *\n * The contract is \"snapshot replacement\": every mutation hands the\n * full queue and we rewrite the file. The queue is small (rarely more\n * than a handful of messages), so this is cheaper than delta logging\n * and avoids the replay complexity.\n */\nexport class QueueStore {\n private readonly file: string;\n\n constructor(opts: { dir: string }) {\n this.file = path.join(opts.dir, 'queue.json');\n }\n\n async write(items: PersistedQueueItem[]): Promise<void> {\n if (items.length === 0) {\n // Empty queue → remove the file rather than write `[]`. Keeps\n // a clean idle state on disk and makes `read()` cheaper.\n await this.clear();\n return;\n }\n await atomicWrite(this.file, JSON.stringify(items), { mode: 0o600 });\n }\n\n async read(): Promise<PersistedQueueItem[]> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return [];\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PersistedQueueItem[] = [];\n for (const v of parsed) {\n if (isPersistedQueueItem(v)) out.push(v);\n }\n return out;\n }\n\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n // Best-effort: a permission/lock error during clear is rare and\n // the queue slash command is non-critical. Warn so it's observable\n // but don't throw so the slash command doesn't crash.\n console.warn(`QueueStore.clear() failed for ${this.file}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction isPersistedQueueItem(v: unknown): v is PersistedQueueItem {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o['displayText'] === 'string' && Array.isArray(o['blocks']);\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { randomBytes } from 'node:crypto';\nimport type { ContentBlock } from '../types/blocks.js';\nimport type {\n AddAttachmentInput,\n Attachment,\n AttachmentKind,\n AttachmentRef,\n AttachmentStore,\n} from '../types/attachment.js';\n\nexport interface AttachmentStoreOptions {\n /**\n * Directory for spooling payloads larger than `spoolThresholdBytes`.\n * When omitted, all payloads stay in memory.\n */\n spoolDir?: string;\n spoolThresholdBytes?: number;\n}\n\nconst DEFAULT_SPOOL_THRESHOLD = 256 * 1024; // 256 KB\nconst PLACEHOLDER_RE = /\\[(pasted|image|file) #(\\d+)\\]/g;\n\n/**\n * In-memory attachment store with optional disk spool. Placeholder syntax\n * is `[<kind> #<seq>]` where kind is `pasted` / `image` / `file`. Unknown\n * placeholders are passed through as-is so users can write that literal\n * text without losing it.\n */\nexport class DefaultAttachmentStore implements AttachmentStore {\n private readonly items = new Map<string, Attachment>();\n private readonly refs: AttachmentRef[] = [];\n private nextSeq: Record<AttachmentKind, number> = { text: 0, image: 0, file: 0 };\n private readonly spoolDir: string | undefined;\n private readonly spoolThreshold: number;\n\n constructor(opts: AttachmentStoreOptions = {}) {\n this.spoolDir = opts.spoolDir;\n this.spoolThreshold = opts.spoolThresholdBytes ?? DEFAULT_SPOOL_THRESHOLD;\n }\n\n async add(input: AddAttachmentInput): Promise<AttachmentRef> {\n const seq = ++this.nextSeq[input.kind];\n const id = `${kindPrefix(input.kind)}-${seq}-${randomBytes(3).toString('hex')}`;\n const bytes = Buffer.byteLength(input.data, input.kind === 'image' ? 'base64' : 'utf8');\n let spooledPath: string | undefined;\n let data: string | undefined = input.data;\n if (this.spoolDir && bytes >= this.spoolThreshold) {\n await fsp.mkdir(this.spoolDir, { recursive: true });\n spooledPath = path.join(this.spoolDir, `${id}.bin`);\n await fsp.writeFile(spooledPath, input.data, input.kind === 'image' ? 'base64' : 'utf8');\n data = undefined;\n }\n const att: Attachment = {\n id,\n kind: input.kind,\n meta: input.meta ?? {},\n data,\n path: spooledPath,\n bytes,\n createdAt: new Date().toISOString(),\n };\n this.items.set(id, att);\n const ref: AttachmentRef = { id, kind: input.kind, seq, meta: att.meta };\n this.refs.push(ref);\n return ref;\n }\n\n async get(id: string): Promise<Attachment | undefined> {\n return this.items.get(id);\n }\n\n list(): AttachmentRef[] {\n return [...this.refs];\n }\n\n async expand(text: string): Promise<ContentBlock[]> {\n const matches = [...text.matchAll(PLACEHOLDER_RE)];\n if (matches.length === 0) return text ? [{ type: 'text', text }] : [];\n const blocks: ContentBlock[] = [];\n let lastIndex = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n const before = text.slice(lastIndex, idx);\n if (before) blocks.push({ type: 'text', text: before });\n const kind = prefixToKind(m[1] as string);\n const seq = Number(m[2]);\n const ref = this.refs.find((r) => r.kind === kind && r.seq === seq);\n const att = ref ? this.items.get(ref.id) : undefined;\n if (!att) {\n blocks.push({ type: 'text', text: m[0] });\n } else {\n blocks.push(await this.toBlock(att));\n }\n lastIndex = idx + m[0].length;\n }\n const tail = text.slice(lastIndex);\n if (tail) blocks.push({ type: 'text', text: tail });\n return mergeAdjacentText(blocks);\n }\n\n async clear(): Promise<void> {\n this.items.clear();\n this.refs.length = 0;\n this.nextSeq = { text: 0, image: 0, file: 0 };\n }\n\n private async toBlock(att: Attachment): Promise<ContentBlock> {\n if (att.kind === 'image') {\n const data = att.data ?? (att.path ? await fsp.readFile(att.path, { encoding: 'base64' }) : '');\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: att.meta.mediaType ?? 'image/png',\n data,\n },\n };\n }\n const raw = att.data ?? (att.path ? await fsp.readFile(att.path, 'utf8') : '');\n const label = att.meta.filename ? `<file path=\"${att.meta.filename}\">` : '<pasted>';\n const close = att.meta.filename ? '</file>' : '</pasted>';\n return { type: 'text', text: `${label}\\n${raw}\\n${close}` };\n }\n}\n\nfunction kindPrefix(kind: AttachmentKind): string {\n return kind === 'text' ? 'pasted' : kind;\n}\n\nfunction prefixToKind(prefix: string): AttachmentKind {\n if (prefix === 'pasted') return 'text';\n if (prefix === 'image') return 'image';\n return 'file';\n}\n\nfunction mergeAdjacentText(blocks: ContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n const prev = out[out.length - 1];\n if (b.type === 'text' && prev && prev.type === 'text') {\n prev.text += b.text;\n } else {\n out.push(b);\n }\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MemoryScope, MemoryStore } from '../types/memory.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nconst MAX_BYTES_TOTAL = 32_000; // ~8K tokens\n\nexport interface MemoryStoreOptions {\n paths: WstackPaths;\n}\n\n/**\n * Three scopes:\n * project-agents → <project>/.wrongstack/AGENTS.md (committed)\n * project-memory → ~/.wrongstack/projects/<hash>/memory.md (per-project agent notes)\n * user-memory → ~/.wrongstack/memory.md (global personal memory)\n */\nexport class DefaultMemoryStore implements MemoryStore {\n private readonly files: Record<MemoryScope, string>;\n /**\n * Per-scope serialization queue. `remember` / `forget` / `consolidate` /\n * `clear` are read-modify-write against a single file; without a lock,\n * two concurrent calls on the same scope can read the same baseline and\n * the later write silently drops the earlier entry. We chain each\n * mutation onto the prior promise for the same scope so they run in\n * issue order. Different scopes still proceed in parallel.\n */\n private readonly writeChain = new Map<MemoryScope, Promise<unknown>>();\n\n constructor(opts: MemoryStoreOptions) {\n this.files = {\n 'project-agents': opts.paths.inProjectAgentsFile,\n 'project-memory': opts.paths.projectMemory,\n 'user-memory': opts.paths.globalMemory,\n };\n }\n\n private async runSerialized<T>(scope: MemoryScope, work: () => Promise<T>): Promise<T> {\n const prior = this.writeChain.get(scope) ?? Promise.resolve();\n // Swallow prior errors here so one failed write doesn't poison the\n // chain — the failed call has already rejected to its own caller.\n const next = prior.catch(() => undefined).then(work);\n this.writeChain.set(scope, next);\n try {\n return await next;\n } finally {\n // Clear the chain reference once this call finishes so memory doesn't\n // grow unboundedly across long-lived processes. If another call\n // queued behind us, it's already captured in next; the map entry\n // serves only as the \"what should the next caller wait on\" pointer.\n if (this.writeChain.get(scope) === next) {\n this.writeChain.delete(scope);\n }\n }\n }\n\n async readAll(): Promise<string> {\n const parts: string[] = [];\n for (const scope of ['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]) {\n const body = await this.read(scope);\n if (body.trim()) parts.push(`## ${labelOf(scope)}\\n\\n${body.trim()}`);\n }\n return parts.join('\\n\\n');\n }\n\n async read(scope: MemoryScope): Promise<string> {\n try {\n return await fs.readFile(this.files[scope], 'utf8');\n } catch {\n return '';\n }\n }\n\n async remember(text: string, scope: MemoryScope = 'project-memory'): Promise<void> {\n return this.runSerialized(scope, async () => {\n const file = this.files[scope];\n await ensureDir(path.dirname(file));\n let existing = '';\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n // new file\n }\n const ts = new Date().toISOString();\n // Use a stable ID so forget() can target exact entries regardless of content.\n const id = `mem_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n const entry = `\\n- [${ts}] ${id} ${text.replace(/\\n/g, ' ')}\\n`;\n const next = existing.trim()\n ? existing.replace(/\\n+$/, '') + entry\n : `# WrongStack Memory\\n${entry}`;\n await atomicWrite(file, next);\n const buf = Buffer.byteLength(next, 'utf8');\n if (buf > MAX_BYTES_TOTAL) {\n // consolidate enqueues onto the same chain — call directly into the\n // inner implementation to avoid deadlocking on our own queue slot.\n await this.consolidateUnsafe(scope);\n }\n });\n }\n\n async forget(query: string, scope: MemoryScope = 'project-memory'): Promise<number> {\n return this.runSerialized(scope, async () => this.forgetUnsafe(query, scope));\n }\n\n private async forgetUnsafe(query: string, scope: MemoryScope): Promise<number> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return 0;\n }\n // Match by unique ID suffix (mem_<ts>_<rand>) embedded in the entry.\n // Fall back to case-insensitive content match for entries without an ID.\n const needle = query.toLowerCase();\n const idMatcher = /mem_\\d+_\\w+/;\n let removed = 0;\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n // If the query looks like an ID, match exactly; otherwise match content.\n if (idMatcher.test(query)) {\n // The entry ID appears right after the timestamp: \"- [ts] mem_<ts>_<rand> ...\"\n const afterBracket = trimmed.indexOf('] ');\n if (afterBracket !== -1) {\n const afterTs = trimmed.slice(afterBracket + 2);\n const entryIdMatch = /^mem_\\d+_\\w+/.exec(afterTs);\n if (entryIdMatch && entryIdMatch[0] === query) {\n removed++;\n return false;\n }\n }\n }\n // Fall back to content-based match (still useful for project-agents legacy entries)\n if (trimmed.toLowerCase().includes(needle)) {\n removed++;\n return false;\n }\n return true;\n });\n if (removed > 0) {\n await atomicWrite(file, lines.join('\\n'));\n }\n return removed;\n }\n\n async consolidate(scope: MemoryScope): Promise<void> {\n return this.runSerialized(scope, async () => this.consolidateUnsafe(scope));\n }\n\n private async consolidateUnsafe(scope: MemoryScope): Promise<void> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return;\n }\n // Dedupe identical bullet lines (case-insensitive, ignoring per-entry\n // metadata: the leading \"[timestamp]\" and the \"mem_<ts>_<rand>\" ID).\n const seen = new Set<string>();\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n const norm = trimmed\n .replace(/\\[[^\\]]+\\]/, '')\n .replace(/\\bmem_\\d+_\\w+\\s*/, '')\n .trim()\n .toLowerCase();\n if (seen.has(norm)) return false;\n seen.add(norm);\n return true;\n });\n const next = lines.join('\\n');\n // Backup AFTER successful write\n try {\n await atomicWrite(file, next);\n } catch {\n return;\n }\n // Backup only after successful write; if write fails, original is untouched\n const backup = `${file}.bak.${Date.now()}`;\n try {\n await fs.copyFile(file, backup);\n } catch {\n // backup best-effort\n }\n }\n\n async clear(scope?: MemoryScope): Promise<void> {\n if (scope) {\n await this.runSerialized(scope, async () => atomicWrite(this.files[scope], ''));\n return;\n }\n // Clear-all: serialize each scope independently so different scopes\n // still run in parallel, but each one waits for its own pending writes.\n await Promise.all(\n (['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]).map((s) =>\n this.runSerialized(s, async () => atomicWrite(this.files[s], '')),\n ),\n );\n }\n\n}\n\nfunction labelOf(scope: MemoryScope): string {\n switch (scope) {\n case 'project-agents':\n return 'Project AGENTS.md';\n case 'project-memory':\n return 'Project memory';\n case 'user-memory':\n return 'User memory';\n }\n}\n","import type { SecretScrubber } from '../types/secret-scrubber.js';\n\ninterface Pattern {\n type: string;\n regex: RegExp;\n}\n\nconst PATTERNS: Pattern[] = [\n // Anchored at the start where possible so partial matches inside larger\n // strings don't trigger false positives.\n { type: 'anthropic_key', regex: /(?<![A-Za-z0-9])sk-ant-api\\d+-[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'openai_key', regex: /(?<![A-Za-z0-9])sk-(?:proj-)?[A-Za-z0-9_-]{20,}(?![A-Za-z0-9])/g },\n { type: 'github_pat', regex: /(?<![A-Za-z0-9])ghp_[A-Za-z0-9]{36,}(?![A-Za-z0-9])/g },\n { type: 'github_pat_v2', regex: /(?<![A-Za-z0-9])github_pat_[A-Za-z0-9_]{50,}(?![A-Za-z0-9])/g },\n { type: 'aws_access_key', regex: /(?<![A-Za-z0-9])AKIA[0-9A-Z]{16}(?![A-Za-z0-9])/g },\n { type: 'gcp_key', regex: /(?<![A-Za-z0-9])AIza[0-9A-Za-z_-]{35}(?![A-Za-z0-9])/g },\n { type: 'slack_token', regex: /(?<![A-Za-z0-9-])xox[abpos]-[A-Za-z0-9-]{10,}(?![A-Za-z0-9-])/g },\n { type: 'stripe_key', regex: /(?<![A-Za-z0-9])sk_(?:live|test)_[A-Za-z0-9]{24,}(?![A-Za-z0-9])/g },\n { type: 'twilio_sid', regex: /(?<![A-Za-z0-9])AC[a-f0-9]{32}(?![A-Za-z0-9])/g },\n {\n type: 'jwt',\n // Anchored: look for literal \"eyJ\" which is unambiguous for JWT header\n regex: /(?<![A-Za-z0-9/+=])eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}(?![A-Za-z0-9/+=])/g,\n },\n {\n type: 'private_key',\n // Anchored: start must be BEGIN, end must be END with no extra dashes after END\n regex: /(?:^|\\n)-----BEGIN (?:RSA|EC|OPENSSH|DSA|PGP)? ?PRIVATE KEY-----[\\s\\S]*?-----END[^-]*-----(?:\\n|$)/g,\n },\n { type: 'mongodb_uri', regex: /mongodb(?:\\+srv)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'postgres_uri', regex: /postgres(?:ql)?:\\/\\/[^\\s\"'`]+/g },\n { type: 'mysql_uri', regex: /mysql:\\/\\/[^\\s\"'`]+/g },\n { type: 'redis_uri', regex: /redis:\\/\\/[^\\s\"'`]+/g },\n { type: 'bearer_token', regex: /(?<![A-Za-z0-9_.~+/-])Bearer\\s+[A-Za-z0-9._~+/-]{20,}=*(?![A-Za-z0-9_.~+/-])/g },\n {\n type: 'high_entropy_env',\n // Value-side word boundary + length gate to avoid matching short random strings\n regex: /\\b([A-Z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))\\s*[:=]\\s*['\"]?([A-Za-z0-9_/+=-]{20,})['\"]?(?!\\s*[A-Za-z_]{4,}(?:KEY|TOKEN|SECRET|PASSWORD|PWD))/g,\n },\n];\n\n/**\n * Per-chunk cap. The `high_entropy_env` and `bearer_token` patterns use\n * negative lookahead/lookbehind which are theoretically backtracking-prone\n * on adversarial input. Real scrub() inputs (LLM responses, tool outputs)\n * are typically much smaller, but defense-in-depth: split very long inputs\n * into smaller chunks and scrub each independently.\n */\nconst SCRUB_CHUNK_BYTES = 64 * 1024;\n\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\n // For oversize inputs, scrub in fixed chunks. We split on newlines\n // where possible so secrets that span a few hundred bytes still get\n // matched within a single chunk; only inputs above ~64 KB risk a\n // boundary cutting a secret in half, and those are uncommon.\n if (text.length <= SCRUB_CHUNK_BYTES) {\n return this.scrubOne(text);\n }\n const out: string[] = [];\n let i = 0;\n while (i < text.length) {\n let end = Math.min(i + SCRUB_CHUNK_BYTES, text.length);\n // Try to break on a newline near the boundary so we don't cut secrets.\n if (end < text.length) {\n const nl = text.lastIndexOf('\\n', end);\n if (nl > i + SCRUB_CHUNK_BYTES / 2) end = nl + 1;\n }\n out.push(this.scrubOne(text.slice(i, end)));\n i = end;\n }\n return out.join('');\n }\n\n private scrubOne(text: string): string {\n let out = text;\n for (const p of PATTERNS) {\n out = out.replace(p.regex, (_match, group1, group2) => {\n if (p.type === 'high_entropy_env' && group1 && group2) {\n return `${group1}=[REDACTED:${p.type}]`;\n }\n return `[REDACTED:${p.type}]`;\n });\n }\n return out;\n }\n\n scrubObject<T>(obj: T): T {\n const seen = new WeakSet();\n const visit = (v: unknown): unknown => {\n if (typeof v === 'string') return this.scrub(v);\n if (v === null || typeof v !== 'object') return v;\n if (seen.has(v as object)) return v;\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(visit);\n const out: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(v as Record<string, unknown>)) {\n out[k] = visit(val);\n }\n return out;\n };\n return visit(obj) as T;\n }\n}\n","/**\n * SecretVault encrypts secrets-at-rest in config files. The wire format is\n * `enc:v1:<base64-iv>:<base64-tag>:<base64-ciphertext>`. Plaintext strings\n * (those that do not match this prefix) are passed through unchanged so that\n * existing configs and env-var-derived values keep working.\n *\n * The vault is intentionally NOT designed to defeat a determined local\n * attacker who can read both the config file and the key file — that level\n * of secrecy needs the OS keychain. The goal is to keep keys from being\n * visible in screen shares, accidental log captures, and `cat config.json`\n * over someone's shoulder.\n */\nexport interface SecretVault {\n encrypt(plaintext: string): string;\n decrypt(value: string): string;\n isEncrypted(value: string): boolean;\n}\n\nexport const ENCRYPTED_PREFIX = 'enc:v1:';\n","import * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { createCipheriv, createDecipheriv, randomBytes } from 'node:crypto';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { ENCRYPTED_PREFIX } from '../types/secret-vault.js';\n\nexport interface SecretVaultOptions {\n /** Absolute path to the key file. Created with mode 0o600 if missing. */\n keyFile: string;\n}\n\nconst KEY_BYTES = 32;\nconst IV_BYTES = 12;\nconst TAG_BYTES = 16;\nconst ALGO = 'aes-256-gcm';\n\n/**\n * Default vault: AES-256-GCM with a key stored at `keyFile` (mode 0o600).\n * The key is loaded lazily on first encrypt/decrypt; if it does not exist,\n * a fresh one is generated. Decryption of plaintext values is a no-op so\n * legacy configs continue to work.\n */\nexport class DefaultSecretVault implements SecretVault {\n private readonly keyFile: string;\n private key?: Buffer;\n\n constructor(opts: SecretVaultOptions) {\n this.keyFile = opts.keyFile;\n }\n\n isEncrypted(value: string): boolean {\n return typeof value === 'string' && value.startsWith(ENCRYPTED_PREFIX);\n }\n\n encrypt(plaintext: string): string {\n if (this.isEncrypted(plaintext)) return plaintext;\n const key = this.loadOrCreateKey();\n const iv = randomBytes(IV_BYTES);\n const cipher = createCipheriv(ALGO, key, iv);\n const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `${ENCRYPTED_PREFIX}${iv.toString('base64')}:${tag.toString('base64')}:${ct.toString('base64')}`;\n }\n\n decrypt(value: string): string {\n if (!this.isEncrypted(value)) return value;\n const rest = value.slice(ENCRYPTED_PREFIX.length);\n const parts = rest.split(':');\n if (parts.length !== 3) {\n throw new Error('SecretVault: malformed encrypted value');\n }\n const [ivB64, tagB64, ctB64] = parts as [string, string, string];\n const iv = Buffer.from(ivB64, 'base64');\n const tag = Buffer.from(tagB64, 'base64');\n const ct = Buffer.from(ctB64, 'base64');\n if (iv.length !== IV_BYTES) throw new Error('SecretVault: bad IV length');\n if (tag.length !== TAG_BYTES) throw new Error('SecretVault: bad tag length');\n const key = this.loadOrCreateKey();\n const decipher = createDecipheriv(ALGO, key, iv);\n decipher.setAuthTag(tag);\n const pt = Buffer.concat([decipher.update(ct), decipher.final()]);\n return pt.toString('utf8');\n }\n\n private loadOrCreateKey(): Buffer {\n if (this.key) return this.key;\n try {\n const buf = fs.readFileSync(this.keyFile);\n if (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n // Create a fresh key. Use sync APIs so the constructor-free getter\n // remains synchronous from the caller's perspective.\n fs.mkdirSync(path.dirname(this.keyFile), { recursive: true });\n const key = randomBytes(KEY_BYTES);\n // Use exclusive-create flag 'wx' to prevent races: if two processes race\n // to create the key file, only one succeeds and the loser gets EEXIST.\n try {\n fs.writeFileSync(this.keyFile, key, { mode: 0o600, flag: 'wx' });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n // Another process won the race — re-read what they wrote.\n const buf = fs.readFileSync(this.keyFile);\n if (buf.length !== KEY_BYTES) {\n throw new Error(`SecretVault: key file ${this.keyFile} has wrong size`);\n }\n this.key = buf;\n return this.key;\n }\n this.key = key;\n return key;\n }\n}\n\n/**\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\n * returning a new object. Used by the config loader so the rest of the\n * system never has to know about the wire format.\n */\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n // A single corrupted/malformed encrypted field should not kill the entire\n // config load. Swallow per-field decrypt errors (zero the field so callers\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\n return walk(cfg, vault, (v, key) => {\n try {\n return vault.decrypt(v);\n } catch (err) {\n console.warn(\n `[secret-vault] Failed to decrypt \"${key}\":`,\n err instanceof Error ? err.message : err,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n return walk(cfg, vault, (v) => vault.encrypt(v));\n}\n\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walk(item, vault, transform)) as unknown as T;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k)) {\n out[k] = transform(v, k);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walk(v, vault, transform);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A key is treated as secret-bearing if its name (case-insensitive) contains\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\n * Use a named field with `isSecret: false` annotation if you must opt out —\n * see `NON_SECRET_OVERRIDES` below.\n */\nconst SECRET_KEY_PATTERN = /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\n\n// Field names that contain the literal substring \"key\" but are not secrets.\n// Keep this list short; the substring rule itself is intentionally narrow.\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\n\nfunction isSecretField(name: string): boolean {\n const lc = name.toLowerCase();\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\n return SECRET_KEY_PATTERN.test(lc);\n}\n\n/**\n * Re-write `~/.wrongstack/config.json` (or any path) with all secret-bearing\n * fields encrypted. Used by the `wstack auth` subcommand.\n */\nexport async function rewriteConfigEncrypted(\n configPath: string,\n vault: SecretVault,\n patch?: Record<string, unknown>,\n): Promise<void> {\n let current: Record<string, unknown> = {};\n try {\n const raw = await fsp.readFile(configPath, 'utf8');\n current = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n // start from empty\n }\n const merged = deepMerge(current, patch ?? {});\n const encrypted = encryptConfigSecrets(merged, vault);\n await fsp.mkdir(path.dirname(configPath), { recursive: true });\n await fsp.writeFile(configPath, JSON.stringify(encrypted, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\n}\n\n/**\n * Scan a config file on disk for plaintext secret-bearing fields and\n * rewrite the file with them encrypted in place. Returns a count of how\n * many fields were migrated. Idempotent — calling on a fully-encrypted\n * file is a no-op and writes nothing. Used by the CLI on every boot so\n * users who had plaintext keys before the vault landed are upgraded\n * transparently.\n */\nexport async function migratePlaintextSecrets(\n configPath: string,\n vault: SecretVault,\n): Promise<{ migrated: number; file: string }> {\n let raw: string;\n try {\n raw = await fsp.readFile(configPath, 'utf8');\n } catch {\n return { migrated: 0, file: configPath };\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { migrated: 0, file: configPath };\n }\n const counter = { n: 0 };\n const migrated = walkCount(parsed, vault, counter);\n if (counter.n === 0) return { migrated: 0, file: configPath };\n await fsp.writeFile(configPath, JSON.stringify(migrated, null, 2), { mode: 0o600 });\n try {\n await fsp.chmod(configPath, 0o600);\n } catch {\n // best-effort on Windows\n }\n return { migrated: counter.n, file: configPath };\n}\n\nfunction walkCount<T>(node: T, vault: SecretVault, counter: { n: number }): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walkCount(item, vault, counter)) as unknown as T;\n }\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k) && !vault.isEncrypted(v) && v.length > 0) {\n out[k] = vault.encrypt(v);\n counter.n++;\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walkCount(v, vault, counter);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/** Keys that, when written into a plain object, can poison the prototype\n * chain. We never want user config to carry these. */\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T extends Record<string, unknown>>(a: T, b: Record<string, unknown>): T {\n const out: Record<string, unknown> = { ...a };\n for (const [k, v] of Object.entries(b)) {\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n if (\n v !== null &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n existing !== null &&\n typeof existing === 'object' &&\n !Array.isArray(existing)\n ) {\n out[k] = deepMerge(existing as Record<string, unknown>, v as Record<string, unknown>);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n","/**\n * Minimal glob matcher for trust patterns.\n * Supports: *, **, ?, character classes [abc], [a-z], negation [!...] or [^...].\n *\n * Compiled regexes are cached so repeated calls with the same pattern\n * avoid recompilation overhead.\n */\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\n}\n\n// Module-level cache to avoid recompiling the same pattern on every call.\n// LRU-ish eviction keeps unbounded growth in check for long-running processes.\nconst COMPILED_GLOB_CACHE = new Map<string, RegExp>();\nconst CACHE_MAX_SIZE = 2000;\n\nfunction getCachedGlob(pattern: string): RegExp {\n const cached = COMPILED_GLOB_CACHE.get(pattern);\n if (cached) return cached;\n if (COMPILED_GLOB_CACHE.size >= CACHE_MAX_SIZE) {\n // Evict oldest 25% when at capacity\n const keys = [...COMPILED_GLOB_CACHE.keys()];\n for (let i = 0; i < Math.floor(CACHE_MAX_SIZE / 4); i++) {\n COMPILED_GLOB_CACHE.delete(keys[i]!);\n }\n }\n const re = compileGlob(pattern);\n COMPILED_GLOB_CACHE.set(pattern, re);\n return re;\n}\n\nexport function compileGlob(pattern: string): RegExp {\n let i = 0;\n let re = '^';\n while (i < pattern.length) {\n const c = pattern[i];\n if (c === '*') {\n if (pattern[i + 1] === '*') {\n // ** matches any number of chars including /\n re += '.*';\n i += 2;\n // Skip trailing slash so '**/x' matches 'x'\n if (pattern[i] === '/') i++;\n } else {\n // single * matches any chars except /\n re += '[^/]*';\n i++;\n }\n } else if (c === '?') {\n re += '[^/]';\n i++;\n } else if (c === '[') {\n let cls = '[';\n i++;\n if (pattern[i] === '!' || pattern[i] === '^') {\n cls += '^';\n i++;\n }\n while (i < pattern.length && pattern[i] !== ']') {\n const ch = pattern[i] ?? '';\n // Inside a regex class, only `]`, `\\`, and `^`/`-` at boundaries need\n // escaping. We've already consumed the leading `^`; the rest are\n // literal. Escape `\\` defensively and pass the rest through verbatim\n // so ranges like `a-z` continue to work.\n if (ch === '\\\\') {\n cls += '\\\\\\\\';\n } else if (ch === ']' || ch === '^') {\n cls += `\\\\${ch}`;\n } else {\n cls += ch;\n }\n i++;\n }\n cls += ']';\n re += cls;\n i++; // skip closing ]\n } else {\n re += escapeRegex(c ?? '');\n i++;\n }\n }\n re += '$';\n return new RegExp(re);\n}\n\nexport function matchGlob(pattern: string, input: string): boolean {\n return getCachedGlob(pattern).test(input);\n}\n\nexport function matchAny(patterns: string[], input: string): boolean {\n return patterns.some((p) => matchGlob(p, input));\n}","export interface SafeParseResult<T> {\n ok: boolean;\n value?: T;\n error?: string;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s[i + 1] === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s[i] !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","import * as fs from 'node:fs/promises';\r\nimport type { Context } from '../core/context.js';\r\nimport type { PermissionDecision, PermissionPolicy, TrustPolicy } from '../types/permission.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { InputReader } from '../types/input-reader.js';\r\nimport { matchAny, matchGlob } from '../utils/glob-match.js';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\nimport { safeParse } from '../utils/safe-json.js';\r\n\r\nexport interface PermissionPolicyOptions {\r\n trustFile: string;\r\n yolo?: boolean;\r\n promptDelegate?: (\r\n tool: Tool,\r\n input: unknown,\r\n suggestedPattern: string,\r\n ) => Promise<'yes' | 'no' | 'always' | 'deny'>;\r\n inputReader?: InputReader;\r\n}\r\n\r\nexport class DefaultPermissionPolicy implements PermissionPolicy {\r\n private policy: TrustPolicy = {};\r\n private loaded = false;\r\n private readonly trustFile: string;\r\n private readonly yolo: boolean;\r\n private readonly promptDelegate?: PermissionPolicyOptions['promptDelegate'];\r\n\r\n constructor(opts: PermissionPolicyOptions) {\r\n this.trustFile = opts.trustFile;\r\n this.yolo = opts.yolo ?? false;\r\n this.promptDelegate = opts.promptDelegate;\r\n }\r\n\r\n async reload(): Promise<void> {\r\n try {\r\n const raw = await fs.readFile(this.trustFile, 'utf8');\r\n const parsed = safeParse<TrustPolicy>(raw);\r\n if (parsed.ok && parsed.value) this.policy = parsed.value;\r\n } catch {\r\n this.policy = {};\r\n }\r\n this.loaded = true;\r\n }\r\n\r\n async evaluate(tool: Tool, input: unknown, _ctx: Context): Promise<PermissionDecision> {\r\n if (!this.loaded) await this.reload();\r\n\r\n // 1. Tool-namespace matching (mcp__server__* etc.)\r\n const namespaceEntry = this.findNamespaceEntry(tool.name);\r\n\r\n // 2. Tool-name entry\r\n const entry = this.policy[tool.name] ?? namespaceEntry;\r\n\r\n // 3. Compute subject (the thing being matched)\r\n const subject = this.subjectFor(tool.name, input, tool.subjectKey);\r\n\r\n // 4. Deny — absolute\r\n if (entry?.deny && subject && matchAny(entry.deny, subject)) {\r\n return { permission: 'deny', source: 'deny', reason: 'matched deny pattern' };\r\n }\r\n if (tool.permission === 'deny') {\r\n return { permission: 'deny', source: 'default', reason: 'tool default deny' };\r\n }\r\n\r\n // 5. Allow\r\n if (entry?.allow && subject && matchAny(entry.allow, subject)) {\r\n return { permission: 'auto', source: 'trust', reason: 'matched allow pattern' };\r\n }\r\n if (entry?.auto) {\r\n return { permission: 'auto', source: 'trust' };\r\n }\r\n\r\n // 6. YOLO\r\n if (this.yolo) {\r\n return { permission: 'auto', source: 'yolo' };\r\n }\r\n\r\n // 7. Tool default\r\n if (tool.permission === 'auto') {\r\n return { permission: 'auto', source: 'default' };\r\n }\r\n\r\n // 8. Confirm — delegate to prompt\r\n if (this.promptDelegate) {\r\n const decision = await this.promptDelegate(tool, input, subject ?? tool.name);\r\n if (decision === 'always') {\r\n await this.trust({ tool: tool.name, pattern: subject ?? tool.name });\r\n return { permission: 'auto', source: 'user', reason: 'user always-allowed' };\r\n }\r\n if (decision === 'deny') {\r\n return { permission: 'deny', source: 'user', reason: 'user denied' };\r\n }\r\n return { permission: decision === 'yes' ? 'auto' : 'deny', source: 'user' };\r\n }\r\n return { permission: 'confirm', source: 'default' };\r\n }\r\n\r\n async trust(rule: { tool: string; pattern: string }): Promise<void> {\r\n if (!this.loaded) await this.reload();\r\n const entry = this.policy[rule.tool] ?? {};\r\n entry.allow = Array.from(new Set([...(entry.allow ?? []), rule.pattern]));\r\n this.policy[rule.tool] = entry;\r\n try {\r\n await atomicWrite(this.trustFile, JSON.stringify(this.policy, null, 2));\r\n } catch (err) {\r\n // Revert in-memory state since disk write failed\r\n const existing = this.policy[rule.tool];\r\n if (existing?.allow) {\r\n const idx = existing.allow.indexOf(rule.pattern);\r\n if (idx !== -1) existing.allow.splice(idx, 1);\r\n }\r\n throw err;\r\n }\r\n }\r\n\r\n private subjectFor(\r\n toolName: string,\r\n input: unknown,\r\n subjectKey?: string,\r\n ): string | undefined {\r\n if (!input || typeof input !== 'object') return undefined;\r\n const obj = input as Record<string, unknown>;\r\n\r\n // Glob metacharacters are dangerous: a crafted subject like \"**\" or \"foo/**/bar\"\r\n // can match too broadly in the allow/deny pattern match. Escape them so the\r\n // matching is done on the literal string.\r\n const globChars = /[*?\\[\\]]/g;\r\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\r\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\r\n\r\n // 1. Explicit subjectKey on the tool wins — eliminates the cross-tool\r\n // collision where e.g. an HTTP tool's `path` field meant \"request\r\n // path\" but was matched against filesystem-path trust rules.\r\n if (subjectKey) {\r\n const v = obj[subjectKey];\r\n if (typeof v === 'string') {\r\n // Heuristic: path-like keys get backslash normalization for glob\r\n // matching on Windows; everything else is treated as opaque.\r\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\r\n ? normalizePath(v)\r\n : escapeGlob(v);\r\n }\r\n // subjectKey was declared but the runtime value isn't a string —\r\n // fall through to the legacy heuristic so the policy still has a\r\n // chance to match on something sensible.\r\n }\r\n\r\n // 2. Legacy heuristic — preserved for tools that haven't migrated.\r\n if (toolName === 'bash' && typeof obj.command === 'string') {\r\n return escapeGlob(obj.command);\r\n }\r\n if (typeof obj.path === 'string') {\r\n return normalizePath(obj.path);\r\n }\r\n if (typeof obj.url === 'string') {\r\n return escapeGlob(obj.url);\r\n }\r\n if (typeof obj.name === 'string') {\r\n return escapeGlob(obj.name);\r\n }\r\n return undefined;\r\n }\r\n\r\n private findNamespaceEntry(toolName: string): TrustPolicy[string] | undefined {\r\n for (const key of Object.keys(this.policy)) {\r\n if (key.includes('*') && matchGlob(key, toolName)) {\r\n return this.policy[key];\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/**\r\n * WrongStack error hierarchy.\r\n *\r\n * Every error thrown by the framework is a `WrongStackError` with a\r\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\r\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\r\n * data instead of parsing error messages.\r\n */\r\n\r\n// ── Error codes ──────────────────────────────────────────────────────\r\n\r\nexport type ErrorCode =\r\n // Provider\r\n | 'PROVIDER_RATE_LIMITED'\r\n | 'PROVIDER_AUTH_FAILED'\r\n | 'PROVIDER_OVERLOADED'\r\n | 'PROVIDER_INVALID_REQUEST'\r\n | 'PROVIDER_SERVER_ERROR'\r\n | 'PROVIDER_NETWORK_ERROR'\r\n | 'PROVIDER_CONTEXT_OVERFLOW'\r\n // Tool\r\n | 'TOOL_NOT_FOUND'\r\n | 'TOOL_PERMISSION_DENIED'\r\n | 'TOOL_EXECUTION_FAILED'\r\n | 'TOOL_TIMEOUT'\r\n | 'TOOL_INPUT_INVALID'\r\n // Config\r\n | 'CONFIG_INVALID'\r\n | 'CONFIG_NOT_FOUND'\r\n | 'CONFIG_PARSE_FAILED'\r\n | 'CONFIG_MIGRATION_NEEDED'\r\n // Plugin\r\n | 'PLUGIN_LOAD_FAILED'\r\n | 'PLUGIN_API_MISMATCH'\r\n | 'PLUGIN_MISSING_DEPENDENCY'\r\n // Agent\r\n | 'AGENT_ITERATION_LIMIT'\r\n | 'AGENT_CONTEXT_OVERFLOW'\r\n | 'AGENT_ABORTED'\r\n | 'AGENT_RUN_FAILED'\r\n // Session\r\n | 'SESSION_NOT_FOUND'\r\n | 'SESSION_CORRUPTED'\r\n | 'SESSION_WRITE_FAILED'\r\n // Container / Registry\r\n | 'CONTAINER_TOKEN_ALREADY_BOUND'\r\n | 'CONTAINER_TOKEN_NOT_BOUND'\r\n | 'REGISTRY_DUPLICATE'\r\n | 'REGISTRY_NOT_FOUND'\r\n // General\r\n | 'UNKNOWN';\r\n\r\nexport type ErrorSubsystem = 'provider' | 'tool' | 'config' | 'plugin' | 'agent' | 'session' | 'container' | 'general';\r\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\r\n\r\n// ── Base error class ─────────────────────────────────────────────────\r\n\r\nexport class WrongStackError extends Error {\r\n readonly code: ErrorCode;\r\n readonly subsystem: ErrorSubsystem;\r\n readonly severity: ErrorSeverity;\r\n readonly recoverable: boolean;\r\n readonly context?: Record<string, unknown>;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: ErrorCode;\r\n subsystem: ErrorSubsystem;\r\n severity?: ErrorSeverity;\r\n recoverable?: boolean;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super(opts.message, { cause: opts.cause });\r\n this.name = 'WrongStackError';\r\n this.code = opts.code;\r\n this.subsystem = opts.subsystem;\r\n this.severity = opts.severity ?? 'error';\r\n this.recoverable = opts.recoverable ?? false;\r\n this.context = opts.context;\r\n }\r\n\r\n /**\r\n * Render a one-line user-facing description.\r\n * Subclasses should override for domain-specific formatting.\r\n */\r\n describe(): string {\r\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\r\n return `${this.code}: ${this.message}${ctx}`;\r\n }\r\n}\r\n\r\nfunction formatContext(ctx: Record<string, unknown>): string {\r\n const parts = Object.entries(ctx)\r\n .filter(([, v]) => v !== undefined)\r\n .slice(0, 3)\r\n .map(([k, v]) => `${k}=${String(v)}`);\r\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\r\n}\r\n\r\n// ── Specific error classes ───────────────────────────────────────────\r\n\r\n/**\r\n * Tool execution errors — thrown by ToolExecutor and individual tools.\r\n */\r\nexport class ToolError extends WrongStackError {\r\n readonly toolName: string;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'TOOL_NOT_FOUND' | 'TOOL_PERMISSION_DENIED' | 'TOOL_EXECUTION_FAILED' | 'TOOL_TIMEOUT' | 'TOOL_INPUT_INVALID'>;\r\n toolName: string;\r\n recoverable?: boolean;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'tool',\r\n recoverable: opts.recoverable,\r\n context: { tool: opts.toolName, ...opts.context },\r\n cause: opts.cause,\r\n });\r\n this.name = 'ToolError';\r\n this.toolName = opts.toolName;\r\n }\r\n}\r\n\r\n/**\r\n * Config loading / validation errors.\r\n */\r\nexport class ConfigError extends WrongStackError {\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'>;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'config',\r\n severity: 'fatal',\r\n recoverable: false,\r\n context: opts.context,\r\n cause: opts.cause,\r\n });\r\n this.name = 'ConfigError';\r\n }\r\n}\r\n\r\n/**\r\n * Plugin loading / lifecycle errors.\r\n */\r\nexport class PluginError extends WrongStackError {\r\n readonly pluginName: string;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'>;\r\n pluginName: string;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'plugin',\r\n severity: 'error',\r\n recoverable: opts.code === 'PLUGIN_MISSING_DEPENDENCY',\r\n context: { plugin: opts.pluginName, ...opts.context },\r\n cause: opts.cause,\r\n });\r\n this.name = 'PluginError';\r\n this.pluginName = opts.pluginName;\r\n }\r\n}\r\n\r\n/**\r\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\r\n * escapes the inner loop, so callers always see a structured error.\r\n */\r\nexport class AgentError extends WrongStackError {\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'>;\r\n recoverable?: boolean;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'agent',\r\n severity: opts.code === 'AGENT_ABORTED' ? 'warning' : 'error',\r\n recoverable: opts.recoverable ?? opts.code === 'AGENT_ITERATION_LIMIT',\r\n context: opts.context,\r\n cause: opts.cause,\r\n });\r\n this.name = 'AgentError';\r\n }\r\n}\r\n\r\n/**\r\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\r\n * always gets a structured error. Pass-throughs WrongStackError instances\r\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\r\n * with the original preserved as `cause`.\r\n */\r\nexport function toWrongStackError(err: unknown, code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = 'AGENT_RUN_FAILED'): WrongStackError {\r\n if (err instanceof WrongStackError) return err;\r\n const message = err instanceof Error ? err.message : String(err);\r\n return new AgentError({\r\n message,\r\n code: code === 'UNKNOWN' ? 'AGENT_RUN_FAILED' : code,\r\n cause: err,\r\n });\r\n}\r\n\r\n/**\r\n * Session storage errors.\r\n */\r\nexport class SessionError extends WrongStackError {\r\n readonly sessionId?: string;\r\n\r\n constructor(opts: {\r\n message: string;\r\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\r\n sessionId?: string;\r\n context?: Record<string, unknown>;\r\n cause?: unknown;\r\n }) {\r\n super({\r\n message: opts.message,\r\n code: opts.code,\r\n subsystem: 'session',\r\n severity: opts.code === 'SESSION_WRITE_FAILED' ? 'error' : 'warning',\r\n recoverable: opts.code !== 'SESSION_CORRUPTED',\r\n context: { sessionId: opts.sessionId, ...opts.context },\r\n cause: opts.cause,\r\n });\r\n this.name = 'SessionError';\r\n this.sessionId = opts.sessionId;\r\n }\r\n}\r\n\r\n// ── Type guards ──────────────────────────────────────────────────────\r\n\r\nexport function isWrongStackError(err: unknown): err is WrongStackError {\r\n return err instanceof WrongStackError;\r\n}\r\n\r\nexport function isToolError(err: unknown): err is ToolError {\r\n return err instanceof ToolError;\r\n}\r\n\r\nexport function isConfigError(err: unknown): err is ConfigError {\r\n return err instanceof ConfigError;\r\n}\r\n\r\nexport function isPluginError(err: unknown): err is PluginError {\r\n return err instanceof PluginError;\r\n}\r\n\r\nexport function isSessionError(err: unknown): err is SessionError {\r\n return err instanceof SessionError;\r\n}\r\n\r\nexport function isAgentError(err: unknown): err is AgentError {\r\n return err instanceof AgentError;\r\n}\r\n","import type { ContentBlock, TextBlock } from './blocks.js';\r\nimport type { Message } from './messages.js';\r\nimport type { Tool } from './tool.js';\r\nimport type { ErrorCode } from './errors.js';\r\nimport { WrongStackError } from './errors.js';\r\n\r\nexport interface Usage {\r\n input: number;\r\n output: number;\r\n cacheRead?: number;\r\n cacheWrite?: number;\r\n}\r\n\r\nexport interface Capabilities {\r\n tools: boolean;\r\n parallelTools: boolean;\r\n vision: boolean;\r\n streaming: boolean;\r\n promptCache: boolean;\r\n systemPrompt: boolean;\r\n jsonMode: boolean;\r\n maxContext: number;\r\n cacheControl: 'native' | 'auto' | 'none';\r\n}\r\n\r\nexport interface Request {\r\n model: string;\r\n system?: TextBlock[];\r\n messages: Message[];\r\n tools?: Tool[];\r\n maxTokens: number;\r\n temperature?: number;\r\n topP?: number;\r\n stopSequences?: string[];\r\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\r\n}\r\n\r\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\r\n\r\nexport interface Response {\r\n content: ContentBlock[];\r\n stopReason: StopReason;\r\n usage: Usage;\r\n model: string;\r\n}\r\n\r\nexport type StreamEvent =\r\n | { type: 'message_start'; model: string }\r\n | { type: 'content_block_start'; kind: 'text' | 'tool_use'; id?: string; name?: string }\r\n | { type: 'content_block_stop'; index: number }\r\n | { type: 'text_delta'; text: string }\r\n | { type: 'tool_use_start'; id: string; name: string }\r\n | { type: 'tool_use_input_delta'; id: string; partial: string }\r\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\r\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\r\n\r\nexport interface Provider {\r\n readonly id: string;\r\n readonly capabilities: Capabilities;\r\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\r\n * aggregates this stream — providers may override for non-streaming wires. */\r\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\r\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\r\n}\r\n\r\n/**\r\n * Structured body parsed from a provider's HTTP error response. Populated\r\n * best-effort: providers return JSON shaped differently (Anthropic uses\r\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\r\n * Google uses `{error: {status, message}}`), so the fields here are the\r\n * intersection that's usable for rendering and routing.\r\n */\r\nexport interface ProviderErrorBody {\r\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\r\n type?: string;\r\n /** Human-readable explanation from the provider. */\r\n message?: string;\r\n /** Provider request id, when present in the body or headers. */\r\n requestId?: string;\r\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\r\n retryAfterMs?: number;\r\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\r\n raw?: string;\r\n /** True when `raw` was truncated; check `rawLength` for the original size. */\r\n truncated?: boolean;\r\n /** Original length of the response body in bytes, when `truncated` is true. */\r\n rawLength?: number;\r\n}\r\n\r\nexport class ProviderError extends WrongStackError {\r\n public readonly status: number;\r\n public readonly retryable: boolean;\r\n public readonly providerId: string;\r\n public readonly body?: ProviderErrorBody;\r\n\r\n constructor(\r\n message: string,\r\n status: number,\r\n retryable: boolean,\r\n providerId: string,\r\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\r\n ) {\r\n super({\r\n message,\r\n code: providerStatusToCode(status, opts.body?.type),\r\n subsystem: 'provider',\r\n severity: status >= 500 ? 'error' : 'warning',\r\n recoverable: retryable,\r\n context: { providerId, status },\r\n cause: opts.cause,\r\n });\r\n this.name = 'ProviderError';\r\n this.status = status;\r\n this.retryable = retryable;\r\n this.providerId = providerId;\r\n this.body = opts.body;\r\n }\r\n\r\n /**\r\n * Render a one-line, user-facing description. Designed for the CLI/TUI\r\n * status line and the agent's retry warning. Avoids dumping raw JSON\r\n * (which is what users see today when a 529 lands and the log message\r\n * includes the full `{\"type\":\"error\",...}` body).\r\n *\r\n * Examples:\r\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\r\n * \"openai rate limited (429): Retry after 12s\"\r\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\r\n * \"groq HTTP 500 (server error)\"\r\n */\r\n override describe(): string {\r\n const kind = describeStatus(this.status, this.body?.type);\r\n const head = `${this.providerId} ${kind}`;\r\n const detail = this.body?.message?.trim();\r\n const reqId = this.body?.requestId\r\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\r\n : '';\r\n if (detail && detail.length > 0) {\r\n return `${head}: ${truncate(detail, 240)}${reqId}`;\r\n }\r\n return `${head}${reqId}`;\r\n }\r\n}\r\n\r\nfunction describeStatus(status: number, type?: string): string {\r\n if (status === 0) return 'network error';\r\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\r\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\r\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\r\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\r\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\r\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\r\n if (status === 408) return `timeout (${status})`;\r\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\r\n if (type) return `${type} (${status})`;\r\n return `HTTP ${status}`;\r\n}\r\n\r\nfunction truncate(s: string, n: number): string {\r\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\r\n}\r\n\r\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\r\n if (status === 0) return 'PROVIDER_NETWORK_ERROR';\r\n if (type === 'rate_limit_error' || status === 429) return 'PROVIDER_RATE_LIMITED';\r\n if (type === 'authentication_error' || status === 401) return 'PROVIDER_AUTH_FAILED';\r\n if (type === 'overloaded_error' || status === 529) return 'PROVIDER_OVERLOADED';\r\n if (type === 'invalid_request_error' || status === 400) return 'PROVIDER_INVALID_REQUEST';\r\n if (status === 408) return 'PROVIDER_NETWORK_ERROR';\r\n if (status >= 500) return 'PROVIDER_SERVER_ERROR';\r\n return 'PROVIDER_INVALID_REQUEST';\r\n}\r\n","import { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n private static readonly NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = DefaultRetryPolicy.NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status >= 500) return 3;\n return 0;\n }\n return 2;\n }\n\n delayMs(attempt: number): number {\n const base = 1000;\n const exp = base * 2 ** attempt;\n const jitter = Math.random() * base;\n return Math.min(30_000, exp + jitter);\n }\n}\n","import { ProviderError } from '../types/provider.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport type { Context } from '../core/context.js';\n\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\n\n/**\n * Tiered error recovery strategies.\n * Each strategy is attempted in order until one returns a decision.\n */\nexport interface RecoveryStrategy {\n /** Human-readable label for logs. */\n label: string;\n /** Optional compactor for context_overflow recovery. */\n compactor?: Compactor;\n /** Returns an explicit recovery decision, or null to fall through. */\n attempt: (err: unknown, ctx: Context) => Promise<RecoveryDecision | null>;\n}\n\n// Package-level compiled regex for hot paths — avoids repeated compilation.\nconst CONTEXT_OVERFLOW_RE = /context|too long|tokens/i;\nconst NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\n/**\n * Builds the ordered list of recovery strategies used by DefaultErrorHandler.\n * Exported so callers can customise or extend the strategy chain.\n */\nexport function buildRecoveryStrategies(opts?: {\n compactor?: Compactor;\n modelsRegistry?: ModelsRegistry;\n}): RecoveryStrategy[] {\n return [\n {\n label: 'context_overflow_reduce',\n compactor: opts?.compactor,\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 413 && !CONTEXT_OVERFLOW_RE.test(err.message)) return null;\n\n if (this.compactor) {\n try {\n const report = await this.compactor.compact(ctx, { aggressive: true });\n if (report.after < report.before) {\n return { action: 'retry', reason: 'context_compacted' };\n }\n } catch {\n // compact failed; fall through\n }\n }\n return null;\n },\n },\n {\n label: 'rate_limit_backoff',\n async attempt(err) {\n if (!(err instanceof ProviderError) || err.status !== 429) return null;\n\n // Prefer the parsed Retry-After hint the provider extracted into\n // body.retryAfterMs; fall back to 5s when absent.\n const delayMs = err.body?.retryAfterMs ?? 5_000;\n // Clamp between 1s and 60s.\n const delay = Math.max(1_000, Math.min(delayMs, 60_000));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 429 && err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const candidates = provider.models.filter((m) => {\n const modelCost = m.cost?.input ?? Number.POSITIVE_INFINITY;\n const currentCost = currentModel.cost?.input ?? Number.POSITIVE_INFINITY;\n if (modelCost >= currentCost) return false;\n if (currentModel.capabilities.tools && !m.tool_call) return false;\n if (currentModel.capabilities.vision && !m.modalities?.input?.includes('image')) return false;\n return true;\n });\n\n if (candidates.length === 0) return null;\n\n const fallback = candidates.reduce((prev, curr) =>\n (curr.cost?.input ?? 0) < (prev.cost?.input ?? 0) ? curr : prev,\n );\n\n return {\n action: 'retry',\n reason: 'model_downgrade',\n model: fallback.id,\n };\n } catch {\n return null;\n }\n },\n },\n ];\n}\n\nexport const DEFAULT_RECOVERY_STRATEGIES = buildRecoveryStrategies();\n\nexport class DefaultErrorHandler implements ErrorHandler {\n private readonly strategies: RecoveryStrategy[];\n\n constructor(strategies: RecoveryStrategy[] = DEFAULT_RECOVERY_STRATEGIES) {\n this.strategies = strategies;\n }\n\n classify(err: unknown): {\n kind:\n | 'rate_limit'\n | 'overloaded'\n | 'server'\n | 'client'\n | 'network'\n | 'abort'\n | 'context_overflow'\n | 'unknown';\n retryable: boolean;\n } {\n if (err instanceof DOMException && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof ProviderError) {\n if (err.status === 429) return { kind: 'rate_limit', retryable: true };\n if (err.status === 529) return { kind: 'overloaded', retryable: true };\n if (err.status >= 500) return { kind: 'server', retryable: true };\n if (err.status === 413 || CONTEXT_OVERFLOW_RE.test(err.message)) {\n return { kind: 'context_overflow', retryable: false };\n }\n if (err.status >= 400) return { kind: 'client', retryable: false };\n }\n if (err instanceof Error && NETWORK_ERR_RE.test(err.message)) {\n return { kind: 'network', retryable: true };\n }\n return { kind: 'unknown', retryable: false };\n }\n\n async recover(err: unknown, ctx: Context): Promise<RecoveryDecision | null> {\n for (const strategy of this.strategies) {\n const result = await strategy.attempt(err, ctx);\n if (result !== null) return result;\n }\n return null;\n }\n}","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillEntry, SkillLoader, SkillManifest } from '../types/skill.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface SkillLoaderOptions {\n paths: WstackPaths;\n bundledDir?: string;\n}\n\n/**\n * Discovery order (later layers shadow earlier ones at boot, but we walk\n * highest priority first and skip names already seen):\n * 1. Project-committed: <project>/.wrongstack/skills/\n * 2. User-global: ~/.wrongstack/skills/\n * 3. Bundled with build: packages/core/skills/\n */\nexport class DefaultSkillLoader implements SkillLoader {\n private readonly dirs: { dir: string; source: SkillManifest['source'] }[];\n private cache?: SkillManifest[];\n\n constructor(opts: SkillLoaderOptions) {\n this.dirs = [\n { dir: opts.paths.inProjectSkills, source: 'project' },\n { dir: opts.paths.globalSkills, source: 'user' },\n ];\n if (opts.bundledDir) {\n this.dirs.push({ dir: opts.bundledDir, source: 'bundled' });\n }\n }\n\n async list(): Promise<SkillManifest[]> {\n if (this.cache) return this.cache;\n const found: SkillManifest[] = [];\n const seen = new Set<string>();\n for (const { dir, source } of this.dirs) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const skillFile = path.join(dir, e.name, 'SKILL.md');\n try {\n const raw = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(raw);\n if (!meta.name || !meta.description) continue;\n if (seen.has(meta.name)) continue;\n seen.add(meta.name);\n found.push({\n name: meta.name,\n description: meta.description,\n version: meta.version,\n path: skillFile,\n source,\n });\n } catch {\n // skip malformed skill\n }\n }\n } catch {\n // directory may not exist\n }\n }\n this.cache = found;\n return found;\n }\n\n async find(name: string): Promise<SkillManifest | undefined> {\n const all = await this.list();\n return all.find((s) => s.name === name);\n }\n\n async manifestText(): Promise<string> {\n const skills = await this.list();\n if (skills.length === 0) return '';\n const entries = await this.listEntries();\n const lines = ['## Available skills'];\n for (const e of entries) {\n const scopeTag = e.scope.length > 0 ? ` — ${e.scope.slice(0, 3).join(', ')}` : '';\n lines.push(`- **${e.name}**${scopeTag}`);\n lines.push(` Use when: ${e.trigger}`);\n }\n return lines.join('\\n');\n }\n\n async listEntries(): Promise<SkillEntry[]> {\n const skills = await this.list();\n const entries: SkillEntry[] = [];\n for (const s of skills) {\n try {\n const raw = await fs.readFile(s.path, 'utf8');\n const { trigger, scope } = parseDescription(raw);\n entries.push({ name: s.name, trigger, scope, source: s.source, path: s.path });\n } catch {\n // skip\n }\n }\n return entries;\n }\n\n async readBody(name: string): Promise<string> {\n const m = await this.find(name);\n if (!m) throw new Error(`Skill \"${name}\" not found`);\n return fs.readFile(m.path, 'utf8');\n }\n}\n\ninterface Frontmatter {\n name?: string;\n description?: string;\n version?: string;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Parse skill description into:\n * - trigger: extracted \"Use when...\" sentence (first sentence of description)\n * - scope: comma-separated items from first line's parenthetical or file-ext list\n */\nfunction parseDescription(raw: string): { trigger: string; scope: string[] } {\n const fm = parseFrontmatter(raw);\n const desc = fm.description ?? '';\n\n // Extract first sentence as trigger\n const firstSentenceEnd = desc.indexOf('. ');\n const trigger = firstSentenceEnd !== -1\n ? desc.slice(0, firstSentenceEnd + 1).trim()\n : desc.trim().split('\\n')[0] ?? '';\n\n // Extract scope from parenthetical: \"Covers X, Y, and Z\" or \"for A, B, C\"\n const scope: string[] = [];\n const coversMatch = /(?:covers|for|including)\\s+([^.]+)/i.exec(desc);\n if (coversMatch) {\n const items = coversMatch[1]!.replace(/[·•]/g, ',').split(',').map((s) => s.trim()).filter(Boolean);\n scope.push(...items);\n }\n\n return { trigger, scope };\n}\n","import * as fs from 'node:fs/promises';\nimport type { Config, ConfigLoader } from '../types/config.js';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { safeParse } from '../utils/safe-json.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\nimport { decryptConfigSecrets } from './secret-vault.js';\n\n/**\n * Defaults express *behavior*, not identity. Provider and model are NOT\n * hardcoded — they must be resolved at runtime from config + env + the\n * ModelsRegistry. A bare Config returned by this loader will throw when\n * the agent tries to construct a provider, with a message that points\n * users at `wstack init`.\n */\nconst BEHAVIOR_DEFAULTS: Omit<Config, 'provider' | 'model'> = {\n version: 1,\n context: {\n warnThreshold: 0.6,\n softThreshold: 0.75,\n hardThreshold: 0.9,\n autoCompact: true,\n preserveK: 10,\n eliseThreshold: 2000,\n },\n tools: {\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n },\n log: { level: 'info' },\n features: {\n mcp: true,\n plugins: true,\n memory: true,\n modelsRegistry: true,\n skills: true,\n },\n};\n\nconst ENV_MAP: Record<string, (cfg: PartialConfig, val: string) => void> = {\n WRONGSTACK_PROVIDER: (c, v) => {\n c.provider = v;\n },\n WRONGSTACK_MODEL: (c, v) => {\n c.model = v;\n },\n WRONGSTACK_API_KEY: (c, v) => {\n c.apiKey = v;\n },\n WRONGSTACK_BASE_URL: (c, v) => {\n c.baseUrl = v;\n },\n WRONGSTACK_LOG_LEVEL: (c, v) => {\n if (!c.log) c.log = { level: 'info' };\n c.log.level = v as Config['log']['level'];\n },\n};\n\ntype PartialConfig = Partial<Config> & { providers?: Record<string, { apiKey?: string; baseUrl?: string; type?: string }> };\n\nfunction isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || typeof v !== 'object');\n}\n\nconst FORBIDDEN_PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nfunction deepMerge<T>(base: T, patch: Partial<T>): T {\n if (typeof base !== 'object' || base === null) return (patch as T) ?? base;\n if (typeof patch !== 'object' || patch === null) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [k, v] of Object.entries(patch as Record<string, unknown>)) {\n // Defense in depth — user config is parsed from JSON and merged\n // recursively; blocking these keys eliminates prototype-pollution\n // gadgets regardless of where else they might be touched.\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n // Primitive arrays (plugins, tools, etc.) are merged by concatenation.\n // Object arrays (MCP servers, etc.) are replaced wholesale.\n if (Array.isArray(v)) {\n if (Array.isArray(existing) && isPrimitiveArray(v) && isPrimitiveArray(existing)) {\n out[k] = [...new Set([...existing, ...v])];\n } else {\n out[k] = v;\n if (process.env.WRONGSTACK_DEBUG_CONFIG) {\n console.warn(\n `[config] Non-primitive array for \"${k}\" replaced (global + local config merge). ` +\n `Global entries: ${(existing as unknown[] | undefined)?.length ?? 0}, local entries: ${v.length}.`,\n );\n }\n }\n } else if (\n typeof v === 'object' &&\n v !== null &&\n typeof existing === 'object' &&\n existing !== null\n ) {\n out[k] = deepMerge(existing, v as Record<string, unknown>);\n } else if (v !== undefined) {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A single config source. Higher priority wins in merges.\n * Sources are applied in priority order (lowest first), so a source\n * with priority=10 overrides one with priority=1.\n */\nexport interface ConfigSource {\n /** Unique name for debugging and error messages. */\n name: string;\n /** Lower numbers merge first, higher numbers override lower. Default: 50. */\n priority?: number;\n /**\n * Read the raw config patch. Return an empty object if unavailable.\n * Errors are surfaced but do not abort loading — the source is skipped.\n */\n read(): Promise<Partial<Config>>;\n}\n\nexport interface ConfigLoaderOptions {\n paths: WstackPaths;\n strict?: boolean;\n vault?: SecretVault;\n /** Extra sources merged after the built-in layers. */\n sources?: ConfigSource[];\n}\n\nexport class DefaultConfigLoader implements ConfigLoader {\n private readonly paths: WstackPaths;\n private readonly strict: boolean;\n private readonly vault: SecretVault | undefined;\n private readonly extraSources: ConfigSource[];\n\n constructor(opts: ConfigLoaderOptions) {\n this.paths = opts.paths;\n this.strict = opts.strict ?? false;\n this.vault = opts.vault;\n this.extraSources = opts.sources ?? [];\n }\n\n async load(opts: { cliFlags?: Partial<Config>; cwd?: string } = {}): Promise<Config> {\n let cfg: PartialConfig = { ...BEHAVIOR_DEFAULTS } as PartialConfig;\n\n // Layer 2 & 3: global + project-local config — read in parallel\n const [global, local] = await Promise.all([\n this.readJson(this.paths.globalConfig),\n this.readJson(this.paths.projectLocalConfig),\n ]);\n cfg = deepMerge(cfg, global);\n cfg = deepMerge(cfg, local);\n\n // Layer 4: env vars\n for (const [key, fn] of Object.entries(ENV_MAP)) {\n const v = process.env[key];\n if (v) fn(cfg, v);\n }\n\n // Layer 5: extra sources — sorted by priority (lowest first).\n // When priorities tie, sort by name for deterministic order.\n const sorted = [...this.extraSources].sort((a, b) => {\n const pd = (a.priority ?? 50) - (b.priority ?? 50);\n if (pd !== 0) return pd;\n return a.name.localeCompare(b.name);\n });\n for (const src of sorted) {\n try {\n const patch = await src.read();\n if (patch && Object.keys(patch).length > 0) {\n cfg = deepMerge(cfg, patch);\n }\n } catch (err) {\n // Best-effort: skip failing sources so one bad source doesn't block boot.\n console.warn(`Config source \"${src.name}\" failed`, err);\n }\n }\n\n // Layer 6: CLI flags\n if (opts.cliFlags) {\n cfg = deepMerge(cfg, opts.cliFlags);\n }\n\n // Decrypt apiKey-like fields if a vault is configured.\n if (this.vault) {\n cfg = decryptConfigSecrets(cfg, this.vault);\n }\n\n // Multi-key resolution: when a provider has `apiKeys[]` configured,\n // mirror the active entry into `apiKey` so downstream construction\n // code (provider registry, wire adapters) needs no changes. Honors\n // `activeKey` (by label), else falls back to the first entry. A\n // pre-existing `apiKey` set by env/CLI flags wins so an explicit\n // override still beats the saved list.\n if (cfg.providers) {\n for (const pcfg of Object.values(cfg.providers)) {\n if (!pcfg || typeof pcfg !== 'object') continue;\n const rawKeys = (pcfg as { apiKeys?: unknown }).apiKeys;\n if (!Array.isArray(rawKeys) || rawKeys.length === 0) continue;\n // Each apiKeys entry came from arbitrary JSON. Filter to entries\n // that actually have a string apiKey + label so a malformed array\n // (null entry, missing field) doesn't crash the .find / chosen.apiKey\n // path below.\n const keys = rawKeys.filter(\n (k): k is { label: string; apiKey: string } =>\n !!k &&\n typeof k === 'object' &&\n typeof (k as { label?: unknown }).label === 'string' &&\n typeof (k as { apiKey?: unknown }).apiKey === 'string',\n );\n if (keys.length === 0) continue;\n const existing = (pcfg as { apiKey?: string }).apiKey;\n if (existing && existing.length > 0) continue;\n const activeLabel = (pcfg as { activeKey?: string }).activeKey;\n const chosen = activeLabel\n ? keys.find((k) => k.label === activeLabel) ?? keys[0]\n : keys[0];\n if (chosen?.apiKey) {\n (pcfg as { apiKey?: string }).apiKey = chosen.apiKey;\n }\n }\n }\n\n this.validateBehavior(cfg);\n if (this.strict) {\n this.validateIdentity(cfg);\n }\n // In strict mode, validateIdentity has confirmed provider/model are set;\n // it's safe to assert the full Config contract. In non-strict mode the\n // caller (e.g. early-boot wizard) accepts a Partial and constructs the\n // provider later, so we deliberately return without the cast.\n return Object.freeze(cfg) as Config;\n }\n\n private async readJson(file: string): Promise<PartialConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(file, 'utf8');\n } catch (err) {\n // Missing file is the common case (per-project local config rarely\n // exists at start). Surface anything else (EACCES, EISDIR) so a\n // mis-permissioned config doesn't silently fall back to defaults.\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`[config] Failed to read \"${file}\":`, err);\n }\n return {};\n }\n const parsed = safeParse<PartialConfig>(raw);\n if (!parsed.ok || !parsed.value) {\n // The file exists but isn't valid JSON. Don't silently reset to\n // defaults — that's hours of debug timesink for users who'd typo'd\n // their config. Warn loudly and keep the in-memory defaults.\n console.warn(\n `[config] Failed to parse \"${file}\": invalid JSON. Falling back to defaults for this layer.`,\n );\n return {};\n }\n return parsed.value;\n }\n\n private validateBehavior(cfg: PartialConfig): void {\n if (cfg.version === undefined) throw new Error('Config: missing version field');\n if (cfg.version !== 1) throw new Error(`Config: unsupported version ${cfg.version}`);\n const c = cfg.context;\n if (!c) throw new Error('Config: missing context section');\n // A user-edited config.json can land strings here (\"0.6\") and slip past\n // truthiness checks; the `>=` comparison then coerces silently and the\n // threshold ordering check passes for nonsense values. Validate types\n // explicitly so misconfigs surface here, not as confusing failures deep\n // in the auto-compaction logic.\n const fields: Array<keyof typeof c> = ['warnThreshold', 'softThreshold', 'hardThreshold'];\n for (const f of fields) {\n const v = c[f];\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`Config: context.${String(f)} must be a finite number (got ${typeof v})`);\n }\n }\n if (c.warnThreshold >= c.softThreshold || c.softThreshold >= c.hardThreshold) {\n throw new Error('Config: context thresholds must satisfy warn < soft < hard');\n }\n }\n\n private validateIdentity(cfg: PartialConfig): void {\n if (!cfg.provider) {\n throw new Error(\n 'Config: no provider configured. Run `wstack init` or set WRONGSTACK_PROVIDER.',\n );\n }\n if (!cfg.model) {\n throw new Error(\n 'Config: no model configured. Run `wstack init` or set WRONGSTACK_MODEL.',\n );\n }\n }\n}\n","import type { Config, ConfigStore } from '../types/config.js';\n\n/**\n * Reference implementation of `ConfigStore`. Stores a single frozen Config\n * and notifies watchers synchronously on every update. Updates use a deep\n * clone so callers can mutate their `partial` argument freely without\n * tainting state.\n *\n * For the CLI: instantiate once at boot, pass the store (not the Config)\n * to subsystems that care about runtime changes (provider switching,\n * extension reload).\n */\nexport class DefaultConfigStore implements ConfigStore {\n private current: Readonly<Config>;\n private watchers = new Set<(next: Readonly<Config>, prev: Readonly<Config>) => void>();\n\n constructor(initial: Config) {\n this.current = deepFreeze(structuredClone(initial));\n }\n\n get(): Readonly<Config> {\n return this.current;\n }\n\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]> {\n return this.current[key] as Readonly<Config[K]>;\n }\n\n getExtension(pluginName: string): Readonly<Record<string, unknown>> {\n const ext = this.current.extensions?.[pluginName];\n return ext ? (ext as Readonly<Record<string, unknown>>) : FROZEN_EMPTY;\n }\n\n update(partial: Partial<Config>): Readonly<Config> {\n // Shallow merge — top-level fields replace, nested objects do too unless\n // the caller passes a fully-formed sub-object. That matches the JSON\n // config user mental model (replace `tools.maxIterations` by passing\n // the whole `tools` block, or by patching `extensions.<name>`).\n const next = deepFreeze(\n structuredClone({ ...this.current, ...partial }),\n ) as Readonly<Config>;\n\n if (next.version !== 1) {\n throw new Error(`ConfigStore.update: version must remain 1, got ${String(next.version)}`);\n }\n\n const prev = this.current;\n this.current = next;\n // Notify watchers AFTER mutating `current` so re-entrant watcher reads\n // see the new state. Watcher exceptions are caught individually so one\n // misbehaving subscriber can't block the others.\n for (const w of this.watchers) {\n try {\n w(next, prev);\n } catch (err) {\n // A plugin watcher that crashes on /model switch or similar would\n // otherwise leave the system in a quietly-inconsistent state. We\n // still don't propagate (one bad subscriber must not break the\n // others), but we surface the error so it's discoverable.\n console.error('[config-store] watcher threw:', err);\n }\n }\n return next;\n }\n\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void {\n this.watchers.add(cb);\n return () => this.watchers.delete(cb);\n }\n}\n\nconst FROZEN_EMPTY: Readonly<Record<string, unknown>> = Object.freeze({});\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Object.isFrozen(obj)) return obj;\n for (const key of Object.keys(obj as object)) {\n const v = (obj as Record<string, unknown>)[key];\n if (v !== null && typeof v === 'object' && !Object.isFrozen(v)) {\n deepFreeze(v);\n }\n }\n return Object.freeze(obj);\n}\n","/**\n * L2-D: Config version migration framework. Pure functions, decoupled\n * from disk/CLI — caller passes a parsed JSON object and gets back the\n * up-to-date `Config` shape (or a structured error explaining why\n * migration failed).\n *\n * Migrations are registered as `{ from, to, migrate }` triples and run\n * sequentially. Each migration is independently testable. Adding a new\n * version means appending one migration; existing user configs are\n * upgraded in place at load time.\n */\n\nexport interface MigrationContext {\n /**\n * Original on-disk version of the input. Migrations may use this to\n * decide between in-place patches and rewrites.\n */\n fromVersion: number;\n /**\n * Set when the migration writes back to disk. Callers persist the\n * migrated config when this is true so the user doesn't see the same\n * migration banner on every boot.\n */\n shouldPersist: boolean;\n}\n\nexport interface ConfigMigration {\n /** Version of the input this migration accepts. */\n from: number;\n /** Version of the output it produces. */\n to: number;\n /** Pure transform — no I/O. */\n migrate(input: Record<string, unknown>, ctx: MigrationContext): Record<string, unknown>;\n /** Optional human-readable description for migration logs / banners. */\n describe?: string;\n}\n\nexport interface MigrationResult {\n /** Final config (still typed as `unknown`-keyed — caller validates). */\n config: Record<string, unknown>;\n /** Ordered list of `from→to` versions that ran. */\n applied: string[];\n /** True when at least one migration produced changes worth persisting. */\n shouldPersist: boolean;\n}\n\nexport class ConfigMigrationError extends Error {\n readonly fromVersion: number;\n readonly targetVersion: number;\n readonly missingStep: number | null;\n\n constructor(opts: { message: string; fromVersion: number; targetVersion: number; missingStep: number | null }) {\n super(opts.message);\n this.name = 'ConfigMigrationError';\n this.fromVersion = opts.fromVersion;\n this.targetVersion = opts.targetVersion;\n this.missingStep = opts.missingStep;\n }\n}\n\n/**\n * Run registered migrations until the input reaches `targetVersion`.\n *\n * Resolution rules:\n * 1. If `input.version === targetVersion`, no migrations run; `shouldPersist`\n * is false.\n * 2. Otherwise walk the migration chain from `input.version` upward,\n * picking the migration whose `from` matches the current version.\n * 3. Stop when `current.version === targetVersion`.\n * 4. If no migration matches at some point, throw `ConfigMigrationError`\n * with the missing step recorded for diagnostics.\n *\n * Migrations may be downward (e.g. for staged rollouts), but `targetVersion`\n * must be reachable strictly via the registered chain — there's no implicit\n * \"skip\" or transitive resolution.\n */\nexport function runConfigMigrations(\n input: Record<string, unknown>,\n targetVersion: number,\n migrations: readonly ConfigMigration[],\n): MigrationResult {\n const initial = typeof input['version'] === 'number' ? (input['version'] as number) : 1;\n let current: Record<string, unknown> = { ...input };\n let currentVersion = initial;\n const applied: string[] = [];\n let shouldPersist = false;\n\n let guard = 0;\n while (currentVersion !== targetVersion) {\n if (++guard > 100) {\n throw new ConfigMigrationError({\n message: `Config migration looped past 100 steps (from v${initial} toward v${targetVersion})`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const step = migrations.find((m) => m.from === currentVersion);\n if (!step) {\n throw new ConfigMigrationError({\n message: `No migration registered from config v${currentVersion} (target v${targetVersion}). Update the framework or revert the config file.`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const ctx: MigrationContext = { fromVersion: currentVersion, shouldPersist: false };\n const next = step.migrate(current, ctx);\n // Ensure the migration set the new version. Be tolerant: if it didn't,\n // patch it in so the chain doesn't infinite-loop on author oversight.\n if (typeof next['version'] !== 'number' || next['version'] !== step.to) {\n next['version'] = step.to;\n }\n current = next;\n currentVersion = step.to;\n applied.push(`v${step.from}→v${step.to}`);\n shouldPersist = shouldPersist || ctx.shouldPersist || step.from < step.to;\n }\n return { config: current, applied, shouldPersist };\n}\n\n/**\n * Default empty migration registry. Real migrations are appended as new\n * Config versions are introduced. Example (when v2 lands):\n *\n * export const CONFIG_MIGRATIONS: readonly ConfigMigration[] = [\n * {\n * from: 1, to: 2, describe: 'rename `apiKey` → `auth.apiKey`',\n * migrate(cfg) {\n * const apiKey = cfg.apiKey;\n * delete cfg.apiKey;\n * return { ...cfg, auth: { ...(cfg.auth ?? {}), apiKey } };\n * },\n * },\n * ];\n */\nexport const DEFAULT_CONFIG_MIGRATIONS: readonly ConfigMigration[] = [];\n","/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n */\n\nconst RoughTokenEstimate = (text: string): number => Math.max(1, Math.ceil(text.length / 4));\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n\nconst ESTIMATE_CACHE_MAX_SIZE = 10_000;\n\nfunction getCachedEstimate(key: string, compute: () => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest quarter when at capacity — simple LRU-ish policy.\n const keys = [...ESTIMATE_CACHE.keys()];\n for (let i = 0; i < Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4); i++) {\n ESTIMATE_CACHE.delete(keys[i]!);\n }\n }\n const estimate = compute();\n ESTIMATE_CACHE.set(key, estimate);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n const key = JSON.stringify(input);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n const key = JSON.stringify(content);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}","import type { Compactor, CompactReport } from '../types/compactor.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { ContentBlock, ToolResultBlock } from '../types/blocks.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport { estimateToolInputTokens, estimateToolResultTokens, estimateTextTokens } from '../utils/token-estimate.js';\r\n\r\nexport interface CompactorOptions {\r\n preserveK?: number;\r\n eliseThreshold?: number;\r\n estimator?: (text: string) => number;\r\n}\r\n\r\nexport class HybridCompactor implements Compactor {\r\n private readonly preserveK: number;\r\n private readonly eliseThreshold: number;\r\n private readonly estimator: (text: string) => number;\r\n\r\n constructor(opts: CompactorOptions = {}) {\r\n this.preserveK = opts.preserveK ?? 10;\r\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\r\n this.estimator = opts.estimator ?? estimateTextTokens;\r\n }\r\n\r\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\r\n const beforeTokens = this.estimateMessages(ctx.messages);\r\n const reductions: CompactReport['reductions'] = [];\r\n\r\n // Phase 1: elision\r\n const phase1Saved = this.eliseOldToolResults(ctx);\r\n if (phase1Saved > 0) reductions.push({ phase: 'elision', saved: phase1Saved });\r\n\r\n // Phase 2: summary (placeholder; in production calls sub-LLM)\r\n if (opts.aggressive) {\r\n const phase2Saved = this.collapseAncientTurns(ctx);\r\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\r\n }\r\n\r\n const afterTokens = this.estimateMessages(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n private eliseOldToolResults(ctx: Context): number {\r\n const messages = ctx.messages;\r\n // Walk backwards counting (user + assistant) pairs to determine where\r\n // the preservation window really starts. This is more accurate than\r\n // the fixed multiplier which assumes every turn is 1 message pair.\r\n let pairCount = 0;\r\n let preserveStart = messages.length;\r\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' || m.role === 'assistant') {\r\n pairCount++;\r\n preserveStart = i;\r\n }\r\n }\r\n let saved = 0;\r\n let changed = false;\r\n const nextMessages = new Array(messages.length);\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i];\r\n // Only process messages before the preservation window\r\n if (i >= preserveStart) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n if (!msg || !Array.isArray(msg.content)) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n const newContent: ContentBlock[] = msg.content.map((b) => {\r\n if (b.type !== 'tool_result') return b;\r\n const tokens = estimateToolResultTokens(b.content);\r\n if (tokens < this.eliseThreshold) return b;\r\n saved += tokens;\r\n const elided: ToolResultBlock = {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: `[elided: ~${tokens} tokens removed. Call the tool again if needed.]`,\r\n is_error: b.is_error,\r\n };\r\n return elided;\r\n });\r\n // Check whether any block actually changed by reference equality\r\n if (newContent.length === msg.content.length && newContent.every((b, idx) => b === msg.content[idx])) {\r\n nextMessages[i] = msg;\r\n } else {\r\n nextMessages[i] = { ...msg, content: newContent };\r\n changed = true;\r\n }\r\n }\r\n if (changed) ctx.state.replaceMessages(nextMessages);\r\n return saved;\r\n }\r\n\r\n private collapseAncientTurns(ctx: Context): number {\r\n const messages = ctx.messages;\r\n const cutTarget = Math.max(0, messages.length - this.preserveK * 2);\r\n if (cutTarget <= 0) return 0;\r\n\r\n // Find a safe boundary: nearest user-message-with-text at or after cutTarget\r\n let boundary = -1;\r\n for (let i = cutTarget; i < messages.length; i++) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' && hasTextContent(m)) {\r\n boundary = i;\r\n break;\r\n }\r\n }\r\n if (boundary <= 0) return 0;\r\n\r\n const removed = messages.slice(0, boundary);\r\n const removedTokens = this.estimateMessages(removed);\r\n\r\n const summary: Message[] = [\r\n {\r\n role: 'user',\r\n content: `[previous_session_summary: ${removed.length} earlier turns compacted. Todo state preserved in context.]`,\r\n },\r\n { role: 'assistant', content: 'Continuing from compacted context.' },\r\n ];\r\n\r\n // L1-A: route through ConversationState so subscribers see the rewrite.\r\n const tail = ctx.messages.slice(boundary);\r\n ctx.state.replaceMessages([...summary, ...tail]);\r\n return Math.max(0, removedTokens - this.estimateMessages(summary));\r\n }\r\n\r\n private estimateMessages(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += this.estimator(m.content);\r\n } else {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += this.estimator(b.text);\r\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\r\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\r\n }\r\n }\r\n }\r\n return total;\r\n }\r\n}\r\n\r\nfunction hasTextContent(m: Message): boolean {\r\n if (typeof m.content === 'string') return m.content.trim().length > 0;\r\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\r\n}\r\n","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string;\n content: string;\n is_error?: boolean;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\n };\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\n","import type { Compactor, CompactReport } from '../types/compactor.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport type { Provider, Request } from '../types/provider.js';\r\nimport type { ContentBlock, TextBlock } from '../types/blocks.js';\r\nimport { isTextBlock } from '../types/blocks.js';\r\nimport { estimateToolInputTokens, estimateToolResultTokens, estimateTextTokens } from '../utils/token-estimate.js';\r\n\r\n/**\r\n * Options for IntelligentCompactor.\r\n */\r\nexport interface IntelligentCompactorOptions {\r\n /** Provider to use for LLM-assisted summarization. Required. */\r\n provider: Provider;\r\n /** Fraction of maxContext that triggers a warning (default 0.6). */\r\n warnThreshold?: number;\r\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\r\n softThreshold?: number;\r\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\r\n hardThreshold?: number;\r\n /** Max context window in tokens (used only for threshold fraction math). */\r\n maxContext?: number;\r\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\r\n preserveK?: number;\r\n /** Token threshold below which tool results are not elided (default 500). */\r\n eliseThreshold?: number;\r\n /** System prompt for the summarizer sub-LLM. */\r\n summarizerPrompt?: string;\r\n /**\r\n * Model ID to use for summarization. When not set, the same model as the\r\n * agent is used (which risks cascading failure on context overflow). Set to\r\n * a fast/cheap model like `claude-3-5-haiku-20240620` for resilience.\r\n */\r\n summarizerModel?: string;\r\n}\r\n\r\n/**\r\n * An importance label for a message or message range.\r\n */\r\nexport type Importance = 'critical' | 'high' | 'medium' | 'low';\r\n\r\n/**\r\n * Result of importance analysis.\r\n */\r\nexport interface ImportanceAnalysis {\r\n messages: Array<{ index: number; importance: Importance; reason: string }>;\r\n criticalRanges: Array<{ from: number; to: number; summary: string }>;\r\n}\r\n\r\n/**\r\n * IntelligentCompactor uses an LLM to:\r\n * - Analyze message importance and preserve critical context\r\n * - Generate semantic summaries for old message ranges\r\n * - Make intelligent decisions about what to compact\r\n *\r\n * It extends HybridCompactor's elision logic with LLM-assisted summarization.\r\n */\r\nexport class IntelligentCompactor implements Compactor {\r\n private readonly provider: Provider;\r\n private readonly warnThreshold: number;\r\n private readonly softThreshold: number;\r\n private readonly hardThreshold: number;\r\n private readonly maxContext: number;\r\n private readonly preserveK: number;\r\n private readonly eliseThreshold: number;\r\n private readonly summarizerPrompt: string;\r\n private readonly summarizerModel?: string;\r\n\r\n constructor(opts: IntelligentCompactorOptions) {\r\n this.provider = opts.provider;\r\n this.warnThreshold = opts.warnThreshold ?? 0.6;\r\n this.softThreshold = opts.softThreshold ?? 0.75;\r\n this.hardThreshold = opts.hardThreshold ?? 0.9;\r\n this.maxContext = opts.maxContext ?? 128_000;\r\n this.preserveK = opts.preserveK ?? 4;\r\n this.eliseThreshold = opts.eliseThreshold ?? 500;\r\n this.summarizerPrompt =\r\n opts.summarizerPrompt ??\r\n 'You are a context summarizer. Given a list of conversation messages, produce a concise but complete summary that preserves all factual information, decisions made, and any state changes (e.g. file edits, todo updates). Do not add commentary. Output only the summary.';\r\n this.summarizerModel = opts.summarizerModel;\r\n }\r\n\r\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\r\n const beforeTokens = this.estimateTokens(ctx.messages);\r\n const reductions: CompactReport['reductions'] = [];\r\n\r\n const load = beforeTokens / this.maxContext;\r\n // Past hardThreshold, force aggressive regardless of caller preference —\r\n // the alternative (lightweight elision) is unlikely to recover enough.\r\n const aggressive = load >= this.hardThreshold\r\n ? true\r\n : opts.aggressive ?? load >= this.softThreshold;\r\n\r\n // Phase 1: always run elision (preserves recent K pairs)\r\n const saved1 = this.eliseOldToolResults(ctx);\r\n if (saved1 > 0) reductions.push({ phase: 'elision', saved: saved1 });\r\n\r\n // Phase 2: LLM summarization of ancient turns\r\n if (aggressive) {\r\n const saved2 = await this.summarizeAncientTurns(ctx);\r\n if (saved2 > 0) reductions.push({ phase: 'summary', saved: saved2 });\r\n } else if (load >= this.warnThreshold) {\r\n // Non-aggressive: do lightweight summarization via direct analysis\r\n const saved2 = this.lightweightCompact(ctx);\r\n if (saved2 > 0) reductions.push({ phase: 'elision', saved: saved2 });\r\n }\r\n\r\n const afterTokens = this.estimateTokens(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n private async summarizeAncientTurns(ctx: Context): Promise<number> {\r\n const messages = ctx.messages;\r\n const cutoff = Math.max(0, messages.length - this.preserveK * 2);\r\n if (cutoff <= 2) return 0;\r\n\r\n // Find the best boundary in the ancient region\r\n const boundary = this.findSafeBoundary(messages, 0, cutoff);\r\n if (boundary <= 1) return 0;\r\n\r\n const toSummarize = messages.slice(0, boundary);\r\n const removedTokens = this.estimateTokens(toSummarize);\r\n\r\n let summaryText: string;\r\n try {\r\n summaryText = await this.callSummarizer(toSummarize, ctx);\r\n } catch {\r\n // Fallback: generic placeholder if summarizer fails\r\n summaryText = `[${toSummarize.length} earlier turns omitted — key decisions and file states preserved in context]`;\r\n }\r\n\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[prior_turns_summary: ${summaryText}]`,\r\n };\r\n const summaryTokens = this.estimateTokens([summaryMsg]);\r\n\r\n // L1-A: route through ConversationState so subscribers see the rewrite.\r\n const tail = ctx.messages.slice(boundary);\r\n ctx.state.replaceMessages([summaryMsg, ...tail]);\r\n return Math.max(0, removedTokens - summaryTokens);\r\n }\r\n\r\n private findSafeBoundary(messages: Message[], from: number, to: number): number {\r\n // Find the nearest user message with text content at or after `to`\r\n // and walk backwards to find a safe cut point.\r\n for (let i = to; i >= from; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' && this.hasTextContent(m)) {\r\n // Ensure we don't cut inside a multi-message exchange\r\n // by finding the start of this exchange.\r\n return this.findExchangeStart(messages, i);\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private findExchangeStart(messages: Message[], userIndex: number): number {\r\n // Walk backwards from userIndex to find where this logical exchange began.\r\n // An exchange starts after the last assistant message that had no tool calls.\r\n for (let i = userIndex - 1; i >= 0; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'assistant') {\r\n const hasToolUse = Array.isArray(m.content)\r\n ? m.content.some((b) => b.type === 'tool_use')\r\n : false;\r\n if (!hasToolUse) {\r\n // This assistant msg had no tool calls — it's a boundary\r\n return i + 1;\r\n }\r\n } else if (m.role !== 'user') {\r\n // system or other — skip\r\n } else {\r\n // another user msg — boundary\r\n return i;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n private async callSummarizer(messages: Message[], ctx: Context): Promise<string> {\r\n const prompt: TextBlock[] = [\r\n { type: 'text', text: this.summarizerPrompt },\r\n { type: 'text', text: '\\n\\nConversation to summarize:\\n' },\r\n ...this.messagesToText(messages),\r\n ];\r\n\r\n const req: Request = {\r\n model: this.summarizerModel ?? ctx.model,\r\n system: prompt,\r\n messages: [],\r\n maxTokens: 1024,\r\n };\r\n\r\n // Use abort signal from context if available\r\n const signal = ctx.signal ?? new AbortController().signal;\r\n const res = await this.provider.complete(req, { signal });\r\n\r\n const textBlocks = res.content.filter(isTextBlock);\r\n return textBlocks.map((b) => b.text).join('\\n').trim() || '(empty summary)';\r\n }\r\n\r\n private messagesToText(messages: Message[]): TextBlock[] {\r\n const lines: string[] = [];\r\n for (const m of messages) {\r\n const role = m.role.padEnd(10, ' ');\r\n if (typeof m.content === 'string') {\r\n lines.push(`[${role}]: ${m.content.slice(0, 500)}`);\r\n } else if (Array.isArray(m.content)) {\r\n const textParts = m.content.filter(isTextBlock).map((b) => b.text);\r\n if (textParts.length > 0) {\r\n lines.push(`[${role}]: ${textParts.join(' ').slice(0, 500)}`);\r\n }\r\n }\r\n }\r\n return [{ type: 'text', text: lines.join('\\n') }];\r\n }\r\n\r\n private lightweightCompact(ctx: Context): number {\r\n // Lightweight: just elide very large tool results without full summarization\r\n return this.eliseOldToolResults(ctx);\r\n }\r\n\r\n private eliseOldToolResults(ctx: Context): number {\r\n const messages = ctx.messages;\r\n let pairCount = 0;\r\n let preserveStart = messages.length;\r\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' || m.role === 'assistant') {\r\n pairCount++;\r\n preserveStart = i;\r\n }\r\n }\r\n let saved = 0;\r\n let changed = false;\r\n const nextMessages = new Array(messages.length);\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i];\r\n // Only process messages before the preservation window\r\n if (i >= preserveStart) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n if (!msg || !Array.isArray(msg.content)) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n const newContent: ContentBlock[] = msg.content.map((b) => {\r\n if (b.type !== 'tool_result') return b;\r\n const tokens = estimateToolResultTokens(b.content);\r\n if (tokens < this.eliseThreshold) return b;\r\n saved += tokens;\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: `[elided: ~${tokens} tokens]`,\r\n is_error: b.is_error,\r\n };\r\n });\r\n // Check by reference equality whether any block actually changed\r\n if (newContent.length === msg.content.length && newContent.every((b, idx) => b === msg.content[idx])) {\r\n nextMessages[i] = msg;\r\n } else {\r\n nextMessages[i] = { ...msg, content: newContent };\r\n changed = true;\r\n }\r\n }\r\n if (changed) ctx.state.replaceMessages(nextMessages);\r\n return saved;\r\n }\r\n\r\n private hasTextContent(m: Message): boolean {\r\n if (typeof m.content === 'string') return m.content.trim().length > 0;\r\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\r\n }\r\n\r\n private estimateTokens(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += estimateTextTokens(m.content);\r\n } else {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += estimateTextTokens(b.text);\r\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\r\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\r\n }\r\n }\r\n }\r\n return total;\r\n }\r\n}\r\n","import type { Message } from '../types/messages.js';\r\nimport type { Provider, Request } from '../types/provider.js';\r\nimport { isTextBlock } from '../types/blocks.js';\r\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\r\n\r\nexport interface LLMSelectorOptions {\r\n /** Provider used for the selector LLM call. Required. */\r\n provider: Provider;\r\n /** Model for the selector. Defaults to the provider's default model. */\r\n model?: string;\r\n /**\r\n * Maximum tokens to keep in context (target budget).\r\n * Selector will aim to keep total content below this.\r\n */\r\n maxContextTokens?: number;\r\n /**\r\n * Prompt instructing the selector how to behave.\r\n * Should guide the LLM on importance tiers and output format.\r\n */\r\n systemPrompt?: string;\r\n}\r\n\r\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\r\n\r\nOutput a JSON object with this structure:\r\n{\r\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\r\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\r\n \"reasoning\": \"brief explanation of decisions\"\r\n}\r\n\r\nImportance tiers:\r\n- \"critical\": decisions, file edits, tool results that affect state, final answers\r\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\r\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\r\n\r\nRules:\r\n- Always keep the most recent K pairs (preserve recency)\r\n- Never collapse the final 2 user/assistant pairs (working memory)\r\n- Preserve tool results that modified files or had external effects\r\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\r\n- If unsure, keep rather than collapse (errors are more costly than waste)\r\n\r\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\r\n\r\n/** Rough token estimation for a message array */\r\nfunction estimateTokens(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += Math.ceil(m.content.length / 4);\r\n } else if (Array.isArray(m.content)) {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n return total;\r\n}\r\n\r\n/** Format messages as a compact text dump for the selector LLM */\r\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\r\n const lines: string[] = [];\r\n let used = 0;\r\n for (let i = 0; i < messages.length; i++) {\r\n const m = messages[i]!;\r\n const role = m.role.padEnd(10, ' ');\r\n let text: string;\r\n if (typeof m.content === 'string') {\r\n text = m.content.slice(0, 500);\r\n } else {\r\n const content = m.content as import('../types/blocks.js').ContentBlock[];\r\n text = content\r\n .filter(isTextBlock)\r\n .map((b) => b.text)\r\n .join(' ');\r\n // Also capture tool names for context\r\n const toolUses = content.filter((b) => b.type === 'tool_use');\r\n if (toolUses.length > 0) {\r\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\r\n }\r\n }\r\n const line = `[${i}][${role}]: ${text}`;\r\n if (used + line.length > maxChars) break;\r\n lines.push(line);\r\n used += line.length;\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\n/**\r\n * LLM-powered message selector. Calls a sub-LLM to analyze the\r\n * message history and produce a keep/collapse plan — more surgical\r\n * than fixed-window rules.\r\n */\r\nexport class LLMSelector implements MessageSelector {\r\n private readonly provider: Provider;\r\n private readonly model: string;\r\n private readonly maxContextTokens: number;\r\n private readonly systemPrompt: string;\r\n\r\n constructor(opts: LLMSelectorOptions) {\r\n this.provider = opts.provider;\r\n this.model = opts.model ?? 'unknown';\r\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\r\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\r\n }\r\n\r\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\r\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\r\n\r\n // Build a concise representation of the conversation\r\n const historyText = formatMessages(messages);\r\n const totalTokens = estimateTokens(messages);\r\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\r\n\r\n // Add instruction to stay within budget\r\n const budgetInstruction =\r\n totalTokens > effectiveBudget\r\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\r\n : '';\r\n\r\n const req: Request = {\r\n model: this.model,\r\n system: [{ type: 'text', text: systemText + budgetInstruction }],\r\n messages: [{ role: 'user', content: historyText }],\r\n maxTokens: 1024,\r\n };\r\n\r\n let raw: string;\r\n try {\r\n const res = await this.provider.complete(req, { signal: new AbortController().signal });\r\n const textBlocks = res.content.filter(isTextBlock);\r\n raw = textBlocks.map((b) => b.text).join('\\n').trim();\r\n } catch (err) {\r\n // Fallback: use simple recency-based selection\r\n return this.fallbackSelect(messages, effectiveBudget);\r\n }\r\n\r\n return this.parseSelectorOutput(raw, messages.length);\r\n }\r\n\r\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\r\n // Simple fallback: keep from the end until we hit budget\r\n const toKeep: SelectorResult['kept'] = [];\r\n const toCollapse: SelectorResult['collapsed'] = [];\r\n\r\n let tokenCount = 0;\r\n let startIdx = 0;\r\n\r\n // Scan from the end backwards\r\n for (let i = messages.length - 1; i >= 0; i--) {\r\n const m = messages[i]!;\r\n const cost = typeof m.content === 'string'\r\n ? Math.ceil(m.content.length / 4)\r\n : m.content.reduce((acc, b) => acc + (b.type === 'text' ? Math.ceil(b.text.length / 4) : Math.ceil(JSON.stringify(b).length / 4)), 0);\r\n\r\n if (tokenCount + cost <= budget) {\r\n tokenCount += cost;\r\n } else {\r\n startIdx = i + 1;\r\n break;\r\n }\r\n }\r\n\r\n if (startIdx > 0) {\r\n toCollapse.push({ from: 0, to: startIdx - 1 });\r\n }\r\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\r\n\r\n return {\r\n kept: toKeep,\r\n collapsed: toCollapse,\r\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\r\n };\r\n }\r\n\r\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\r\n // Try to extract JSON from the response\r\n const jsonStart = raw.indexOf('{');\r\n const jsonEnd = raw.lastIndexOf('}');\r\n if (jsonStart === -1 || jsonEnd === -1) {\r\n // Can't parse — use fallback\r\n return this.fallbackSelect(\r\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' } as Message)),\r\n this.maxContextTokens,\r\n );\r\n }\r\n\r\n let parsed: unknown;\r\n try {\r\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\r\n } catch {\r\n return this.fallbackSelect(\r\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' } as Message)),\r\n this.maxContextTokens,\r\n );\r\n }\r\n\r\n const obj = parsed as Record<string, unknown>;\r\n const kept = (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\r\n const collapsed = (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\r\n\r\n return {\r\n kept: kept.map((k) => ({ from: k.from, to: k.to, importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium' })),\r\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\r\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\r\n };\r\n }\r\n}","import type { Compactor, CompactReport } from '../types/compactor.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport type { Provider, Request } from '../types/provider.js';\r\nimport type { ContentBlock } from '../types/blocks.js';\r\nimport { isTextBlock } from '../types/blocks.js';\r\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\r\nimport { LLMSelector } from './llm-selector.js';\r\n\r\n/**\r\n * Options for SelectiveCompactor — the most configurable compactor.\r\n */\r\nexport interface SelectiveCompactorOptions {\r\n /** Provider for LLM calls (selector + summarizer). Required. */\r\n provider: Provider;\r\n /** Selector for LLM-driven importance analysis. */\r\n selector?: MessageSelector;\r\n /** Fraction of maxContext that triggers a warning (default 0.6). */\r\n warnThreshold?: number;\r\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\r\n softThreshold?: number;\r\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\r\n hardThreshold?: number;\r\n /** Max context window in tokens (used for threshold fraction math). */\r\n maxContext?: number;\r\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\r\n preserveK?: number;\r\n /** Token threshold below which tool results are not elided (default 500). */\r\n eliseThreshold?: number;\r\n /** Model for selector LLM calls (default: same as provider default). */\r\n selectorModel?: string;\r\n /** Summarizer model for collapsed ranges (default: same as selectorModel). */\r\n summarizerModel?: string;\r\n /** Prompt for the summarizer sub-LLM. */\r\n summarizerPrompt?: string;\r\n}\r\n\r\n/**\r\n * SelectiveCompactor uses an LLM-driven MessageSelector to make\r\n * surgical decisions about which message ranges to keep vs collapse.\r\n *\r\n * Compared to HybridCompactor / IntelligentCompactor:\r\n * - HybridCompactor: rule-based (preserveK + elision), no LLM calls\r\n * - IntelligentCompactor: LLM summarization but no structured selection\r\n * - SelectiveCompactor: full LLM-driven selection + optional summarization\r\n */\r\nexport class SelectiveCompactor implements Compactor {\r\n private readonly provider: Provider;\r\n private readonly selector: MessageSelector;\r\n private readonly warnThreshold: number;\r\n private readonly softThreshold: number;\r\n private readonly hardThreshold: number;\r\n private readonly maxContext: number;\r\n private readonly preserveK: number;\r\n private readonly eliseThreshold: number;\r\n private readonly summarizerModel: string;\r\n private readonly summarizerPrompt: string;\r\n\r\n constructor(opts: SelectiveCompactorOptions) {\r\n this.provider = opts.provider;\r\n this.selector = opts.selector ?? new LLMSelector({ provider: opts.provider, model: opts.selectorModel });\r\n this.warnThreshold = opts.warnThreshold ?? 0.6;\r\n this.softThreshold = opts.softThreshold ?? 0.75;\r\n this.hardThreshold = opts.hardThreshold ?? 0.9;\r\n this.maxContext = opts.maxContext ?? 128_000;\r\n this.preserveK = opts.preserveK ?? 4;\r\n this.eliseThreshold = opts.eliseThreshold ?? 500;\r\n this.summarizerModel = opts.summarizerModel ?? opts.selectorModel ?? 'unknown';\r\n this.summarizerPrompt =\r\n opts.summarizerPrompt ??\r\n 'You are a context summarizer. Given a list of messages, produce a concise summary that preserves all factual information, decisions, file changes, and state changes. Do not add commentary or opinions.';\r\n }\r\n\r\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\r\n const beforeTokens = this.estimateTokens(ctx.messages);\r\n const reductions: CompactReport['reductions'] = [];\r\n\r\n const load = beforeTokens / this.maxContext;\r\n const shouldCompact = load >= this.warnThreshold || opts.aggressive;\r\n\r\n if (!shouldCompact) {\r\n // Only do lightweight elision if below warn threshold\r\n const saved = this.eliseOldToolResults(ctx);\r\n if (saved > 0) reductions.push({ phase: 'elision', saved });\r\n const afterTokens = this.estimateTokens(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n // Phase 1: elision — always run first to get a baseline reduction\r\n const savedElision = this.eliseOldToolResults(ctx);\r\n if (savedElision > 0) reductions.push({ phase: 'elision', saved: savedElision });\r\n\r\n // Phase 2: LLM-driven selective compaction\r\n const afterPhase1 = this.estimateTokens(ctx.messages);\r\n const targetBudget = this.computeTargetBudget(load);\r\n\r\n if (afterPhase1 > targetBudget) {\r\n const savedSelective = await this.runSelector(ctx, targetBudget);\r\n if (savedSelective > 0) reductions.push({ phase: 'selective', saved: savedSelective });\r\n }\r\n\r\n const afterTokens = this.estimateTokens(ctx.messages);\r\n return { before: beforeTokens, after: afterTokens, reductions };\r\n }\r\n\r\n /**\r\n * Run the LLM selector to decide what to keep vs collapse.\r\n * Returns the token savings achieved.\r\n */\r\n private async runSelector(ctx: Context, targetBudget: number): Promise<number> {\r\n const before = this.estimateTokens(ctx.messages);\r\n\r\n let result: SelectorResult;\r\n try {\r\n result = await this.selector.select(ctx.messages, targetBudget);\r\n } catch {\r\n // Fallback to aggressive recency preservation\r\n return this.aggressiveRecencyTrim(ctx);\r\n }\r\n\r\n // Execute the selector's plan\r\n await this.executePlan(ctx, result);\r\n\r\n const after = this.estimateTokens(ctx.messages);\r\n return Math.max(0, before - after);\r\n }\r\n\r\n /**\r\n * Execute a SelectorResult plan: collapse/remove ranges and\r\n * insert summaries where the selector provided them.\r\n */\r\n private async executePlan(ctx: Context, plan: SelectorResult): Promise<void> {\r\n if (ctx.messages.length === 0) return;\r\n\r\n // Process collapsed ranges in reverse order to preserve indices. We work\r\n // on a local copy and commit through `ctx.state.replaceMessages` at the\r\n // end so subscribers see a single state change for the whole rewrite.\r\n const messages = [...ctx.messages];\r\n const sortedCollapsed = [...plan.collapsed].sort((a, b) => b.from - a.from);\r\n\r\n for (const range of sortedCollapsed) {\r\n if (range.from < 0 || range.to >= messages.length || range.from > range.to) continue;\r\n\r\n let summary = range.summary;\r\n if (!summary) {\r\n const toSummarize = messages.slice(range.from, range.to + 1);\r\n summary = await this.summarizeRange(toSummarize, ctx);\r\n }\r\n\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[prior_turns_${range.from}-${range.to}: ${summary}]`,\r\n };\r\n\r\n messages.splice(range.from, range.to - range.from + 1, summaryMsg);\r\n }\r\n\r\n ctx.state.replaceMessages(messages);\r\n }\r\n\r\n private async summarizeRange(messages: Message[], ctx: Context): Promise<string> {\r\n const systemText = `${this.summarizerPrompt}\\n\\nSummarize the following message range:`;\r\n const body = messages.map((m, i) => `[${i}] ${m.role}: ${this.messagePreview(m)}`).join('\\n');\r\n\r\n const req: Request = {\r\n model: this.summarizerModel,\r\n system: [{ type: 'text', text: systemText }],\r\n messages: [{ role: 'user', content: body }],\r\n maxTokens: 512,\r\n };\r\n\r\n try {\r\n const res = await this.provider.complete(req, { signal: ctx.signal ?? new AbortController().signal });\r\n return res.content.filter(isTextBlock).map((b) => b.text).join('\\n').trim() || '(empty)';\r\n } catch {\r\n return `[${messages.length} earlier turns omitted]`;\r\n }\r\n }\r\n\r\n private messagePreview(m: Message): string {\r\n if (typeof m.content === 'string') return m.content.slice(0, 300);\r\n return m.content\r\n .filter(isTextBlock)\r\n .map((b) => b.text)\r\n .join(' ')\r\n .slice(0, 300);\r\n }\r\n\r\n /**\r\n * Fallback when selector fails: aggressively trim from the oldest end\r\n * until we hit targetBudget.\r\n */\r\n private aggressiveRecencyTrim(ctx: Context): number {\r\n const messages = ctx.messages;\r\n const preserveIdx = Math.max(0, messages.length - this.preserveK * 2);\r\n\r\n if (preserveIdx <= 0) return 0;\r\n\r\n // Find safe boundary near preserveIdx\r\n let boundary = preserveIdx;\r\n for (let i = preserveIdx; i < messages.length && i < preserveIdx + 6; i++) {\r\n const m = messages[i]!;\r\n if (m.role === 'user' && this.hasTextContent(m)) {\r\n boundary = i;\r\n break;\r\n }\r\n }\r\n\r\n const removed = messages.slice(0, boundary);\r\n const removedTokens = this.estimateTokens(removed);\r\n\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[${removed.length} earlier turns trimmed — see session log for details]`,\r\n };\r\n const tail = messages.slice(boundary);\r\n ctx.state.replaceMessages([summaryMsg, ...tail]);\r\n\r\n return Math.max(0, removedTokens - this.estimateTokens([summaryMsg]));\r\n }\r\n\r\n private computeTargetBudget(load: number): number {\r\n if (load >= this.hardThreshold) {\r\n return Math.floor(this.maxContext * 0.5); // keep only 50%\r\n }\r\n if (load >= this.softThreshold) {\r\n return Math.floor(this.maxContext * 0.65); // keep 65%\r\n }\r\n return Math.floor(this.maxContext * 0.75); // keep 75% at warn\r\n }\r\n\r\n private eliseOldToolResults(ctx: Context): number {\r\n const messages = ctx.messages;\r\n let pairCount = 0;\r\n let preserveStart = messages.length;\r\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\r\n const m = messages[i];\r\n if (!m) continue;\r\n if (m.role === 'user' || m.role === 'assistant') {\r\n pairCount++;\r\n preserveStart = i;\r\n }\r\n }\r\n let saved = 0;\r\n let changed = false;\r\n const nextMessages = new Array(messages.length);\r\n for (let i = 0; i < messages.length; i++) {\r\n const msg = messages[i];\r\n // Only process messages before the preservation window\r\n if (i >= preserveStart) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n if (!msg || !Array.isArray(msg.content)) {\r\n nextMessages[i] = msg;\r\n continue;\r\n }\r\n const newContent: ContentBlock[] = msg.content.map((b) => {\r\n if (b.type !== 'tool_result') return b;\r\n const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n const tokens = this.roughTokenEstimate(text);\r\n if (tokens < this.eliseThreshold) return b;\r\n saved += tokens;\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: `[elided: ~${tokens} tokens]`,\r\n is_error: b.is_error,\r\n };\r\n });\r\n // map() preserves length, so only block ref-equality matters here.\r\n if (newContent.every((b, idx) => b === msg.content[idx])) {\r\n nextMessages[i] = msg;\r\n } else {\r\n nextMessages[i] = { ...msg, content: newContent };\r\n changed = true;\r\n }\r\n }\r\n if (changed) ctx.state.replaceMessages(nextMessages);\r\n return saved;\r\n }\r\n\r\n private hasTextContent(m: Message): boolean {\r\n if (typeof m.content === 'string') return m.content.trim().length > 0;\r\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\r\n }\r\n\r\n private estimateTokens(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += this.roughTokenEstimate(m.content);\r\n } else {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += this.roughTokenEstimate(b.text);\r\n else if (b.type === 'tool_use') total += this.roughTokenEstimate(JSON.stringify(b.input));\r\n else if (b.type === 'tool_result') {\r\n total += this.roughTokenEstimate(\r\n typeof b.content === 'string' ? b.content : JSON.stringify(b.content),\r\n );\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n }\r\n\r\n private roughTokenEstimate(text: string): number {\r\n return Math.max(1, Math.ceil(text.length / 4));\r\n }\r\n}\r\n","import type { MiddlewareHandler } from '../kernel/pipeline.js';\nimport type { Context } from '../core/context.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { EventBus } from '../kernel/events.js';\nimport { AgentError } from '../types/errors.js';\n\nexport type CompactionFailureMode = 'throw' | 'throw_on_hard' | 'continue';\n\nexport interface AutoCompactionOptions {\n aggressiveOn?: 'hard' | 'soft' | 'warn';\n events?: EventBus;\n failureMode?: CompactionFailureMode;\n}\n\n/**\n * Pipeline middleware that monitors context token load and automatically\n * triggers compaction when the warn/soft/hard thresholds are crossed.\n * Runs before the next agent iteration.\n */\nexport class AutoCompactionMiddleware {\n readonly name = 'AutoCompaction';\n\n private readonly compactor: Compactor;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly estimator: (ctx: Context) => number;\n private readonly aggressiveOn: 'hard' | 'soft' | 'warn';\n private readonly events?: EventBus;\n private readonly failureMode: CompactionFailureMode;\n\n /**\n * @param compactor Compactor to use for compaction.\n * @param maxContext Provider's max context window in tokens.\n * @param estimator Token estimation function.\n * @param thresholds Threshold fractions (0-1) of maxContext.\n * @param opts Optional behavior. By default, failures at the\n * hard threshold throw AGENT_CONTEXT_OVERFLOW so\n * the agent does not continue into a likely\n * provider context overflow. Warn/soft failures\n * still emit compaction.failed and continue.\n */\n constructor(\n compactor: Compactor,\n maxContext: number,\n estimator: (ctx: Context) => number,\n thresholds: { warn: number; soft: number; hard: number },\n optsOrAggressiveOn: AutoCompactionOptions | 'hard' | 'soft' | 'warn' = {},\n events?: EventBus,\n ) {\n const opts =\n typeof optsOrAggressiveOn === 'string'\n ? { aggressiveOn: optsOrAggressiveOn, events }\n : optsOrAggressiveOn;\n this.compactor = compactor;\n this.maxContext = maxContext;\n this.estimator = estimator;\n this.warnThreshold = thresholds.warn;\n this.softThreshold = thresholds.soft;\n this.hardThreshold = thresholds.hard;\n this.aggressiveOn = opts.aggressiveOn ?? 'soft';\n this.events = opts.events;\n this.failureMode = opts.failureMode ?? 'throw_on_hard';\n }\n\n handler(): MiddlewareHandler<Context> {\n return async (ctx, next) => {\n const tokens = this.estimator(ctx);\n const load = tokens / this.maxContext;\n\n if (load >= this.hardThreshold) {\n await this.compact(ctx, true, { level: 'hard', tokens, load });\n } else if (load >= this.softThreshold) {\n await this.compact(ctx, this.aggressiveOn !== 'hard', { level: 'soft', tokens, load });\n } else if (load >= this.warnThreshold) {\n await this.compact(ctx, false, { level: 'warn', tokens, load });\n }\n\n return next(ctx);\n };\n }\n\n private async compact(\n ctx: Context,\n aggressive: boolean,\n pressure: { level: 'warn' | 'soft' | 'hard'; tokens: number; load: number },\n ): Promise<void> {\n try {\n await this.compactor.compact(ctx, { aggressive });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n const fatal =\n this.failureMode === 'throw' ||\n (this.failureMode === 'throw_on_hard' && pressure.level === 'hard');\n this.events?.emit('compaction.failed', {\n err: error,\n aggressive,\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n load: pressure.load,\n fatal,\n });\n if (fatal) {\n throw new AgentError({\n message: `Auto-compaction failed at ${pressure.level} threshold`,\n code: 'AGENT_CONTEXT_OVERFLOW',\n recoverable: true,\n context: {\n level: pressure.level,\n tokens: pressure.tokens,\n maxContext: this.maxContext,\n },\n cause: err,\n });\n }\n }\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport type {\n ModelsRegistry,\n ModelsDevPayload,\n ModelsDevProvider,\n ResolvedModel,\n ResolvedProvider,\n WireFamily,\n} from '../types/models-registry.js';\n\nconst DEFAULT_URL = 'https://models.dev/api.json';\nconst DEFAULT_TTL_SECONDS = 24 * 3600;\n\ninterface CacheEnvelope {\n fetchedAt: string;\n url: string;\n payload: ModelsDevPayload;\n}\n\nexport interface DefaultModelsRegistryOptions {\n cacheFile: string;\n url?: string;\n ttlSeconds?: number;\n fetchImpl?: typeof fetch;\n /** Pre-seeded payload — useful for offline scenarios and tests. */\n seed?: ModelsDevPayload;\n /**\n * Maximum age in seconds for stale cache fallback when network fails.\n * Defaults to 7 days. Set to `Infinity` for full offline resilience\n * (risk: deprecated models, wrong pricing). Set to `0` to disable\n * stale fallback entirely.\n */\n maxStaleAgeSeconds?: number;\n}\n\n/**\n * The npm package each models.dev provider declares determines which wire\n * family WrongStack speaks. Anything not listed falls into `unsupported` and\n * can be enabled by registering a custom provider factory via a plugin.\n */\nconst FAMILY_BY_NPM: Record<string, WireFamily> = {\n '@ai-sdk/anthropic': 'anthropic',\n '@ai-sdk/google-vertex/anthropic': 'anthropic',\n '@ai-sdk/openai': 'openai',\n '@ai-sdk/openai-compatible': 'openai-compatible',\n '@ai-sdk/groq': 'openai-compatible',\n '@ai-sdk/xai': 'openai-compatible',\n '@ai-sdk/cerebras': 'openai-compatible',\n '@ai-sdk/togetherai': 'openai-compatible',\n '@ai-sdk/perplexity': 'openai-compatible',\n '@ai-sdk/deepinfra': 'openai-compatible',\n '@openrouter/ai-sdk-provider': 'openai-compatible',\n 'ai-gateway-provider': 'openai-compatible',\n '@ai-sdk/vercel': 'openai-compatible',\n '@ai-sdk/gateway': 'openai-compatible',\n '@aihubmix/ai-sdk-provider': 'openai-compatible',\n 'venice-ai-sdk-provider': 'openai-compatible',\n '@ai-sdk/google': 'google',\n};\n\nexport function classifyFamily(npm: string | undefined): WireFamily {\n if (!npm) return 'unsupported';\n return FAMILY_BY_NPM[npm] ?? 'unsupported';\n}\n\nexport class DefaultModelsRegistry implements ModelsRegistry {\n private payload?: ModelsDevPayload;\n private fetchedAt?: Date;\n private readonly cacheFile: string;\n private readonly url: string;\n private readonly ttlMs: number;\n private readonly fetchImpl: typeof fetch;\n private readonly seed?: ModelsDevPayload;\n private readonly maxStaleAgeMs: number;\n\n constructor(opts: DefaultModelsRegistryOptions) {\n this.cacheFile = opts.cacheFile;\n this.url = opts.url ?? DEFAULT_URL;\n this.ttlMs = (opts.ttlSeconds ?? DEFAULT_TTL_SECONDS) * 1000;\n this.fetchImpl = opts.fetchImpl ?? fetch;\n this.seed = opts.seed;\n // Default max stale age: 7 days\n const maxStaleSeconds = opts.maxStaleAgeSeconds ?? 7 * 24 * 3600;\n this.maxStaleAgeMs = maxStaleSeconds * 1000;\n }\n\n async load(opts: { force?: boolean } = {}): Promise<ModelsDevPayload> {\n if (this.payload && !opts.force) return this.payload;\n if (this.seed) {\n this.payload = this.seed;\n this.fetchedAt = new Date();\n return this.payload;\n }\n if (!opts.force) {\n const cached = await this.readCache();\n if (cached && this.isFresh(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n }\n try {\n return await this.refresh();\n } catch (err) {\n // Network failed — fall back to stale cache if within maxStaleAgeMs.\n const cached = await this.readCache();\n if (cached && this.isWithinMaxStaleAge(cached.fetchedAt)) {\n this.payload = cached.payload;\n this.fetchedAt = new Date(cached.fetchedAt);\n return cached.payload;\n }\n throw err;\n }\n }\n\n async refresh(): Promise<ModelsDevPayload> {\n const res = await this.fetchImpl(this.url, {\n method: 'GET',\n headers: { accept: 'application/json' },\n });\n if (!res.ok) {\n throw new Error(`ModelsRegistry: HTTP ${res.status} fetching ${this.url}`);\n }\n const json = (await res.json()) as ModelsDevPayload;\n this.payload = json;\n this.fetchedAt = new Date();\n const envelope: CacheEnvelope = {\n fetchedAt: this.fetchedAt.toISOString(),\n url: this.url,\n payload: json,\n };\n await atomicWrite(this.cacheFile, JSON.stringify(envelope));\n return json;\n }\n\n async listProviders(): Promise<ResolvedProvider[]> {\n const payload = await this.load();\n return Object.values(payload).map((p) => this.resolveProvider(p));\n }\n\n async getProvider(id: string): Promise<ResolvedProvider | undefined> {\n const payload = await this.load();\n const p = payload[id];\n return p ? this.resolveProvider(p) : undefined;\n }\n\n async getModel(providerId: string, modelId: string): Promise<ResolvedModel | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider) return undefined;\n const model = provider.models.find((m) => m.id === modelId);\n if (!model) return undefined;\n return {\n providerId,\n modelId,\n capabilities: {\n tools: model.tool_call ?? false,\n vision: Boolean(model.modalities?.input?.includes('image')),\n reasoning: model.reasoning ?? false,\n maxContext: model.limit?.context ?? 0,\n maxOutput: model.limit?.output,\n knowledge: model.knowledge,\n },\n cost: model.cost,\n };\n }\n\n async suggestModel(providerId: string): Promise<string | undefined> {\n const provider = await this.getProvider(providerId);\n if (!provider || provider.models.length === 0) return undefined;\n const ranked = [...provider.models].sort((a, b) => {\n const at = a.release_date ?? a.last_updated ?? '';\n const bt = b.release_date ?? b.last_updated ?? '';\n return bt.localeCompare(at);\n });\n return ranked[0]?.id;\n }\n\n async ageSeconds(): Promise<number> {\n if (!this.fetchedAt) {\n const cached = await this.readCache();\n if (!cached) return Number.POSITIVE_INFINITY;\n return (Date.now() - new Date(cached.fetchedAt).getTime()) / 1000;\n }\n return (Date.now() - this.fetchedAt.getTime()) / 1000;\n }\n\n private resolveProvider(p: ModelsDevProvider): ResolvedProvider {\n return {\n id: p.id,\n name: p.name,\n family: classifyFamily(p.npm),\n apiBase: p.api,\n envVars: p.env ?? [],\n doc: p.doc,\n models: Object.values(p.models ?? {}),\n npm: p.npm,\n };\n }\n\n private isFresh(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.ttlMs;\n }\n\n private isWithinMaxStaleAge(fetchedAtIso: string): boolean {\n return Date.now() - new Date(fetchedAtIso).getTime() < this.maxStaleAgeMs;\n }\n\n private async readCache(): Promise<CacheEnvelope | undefined> {\n try {\n const raw = await fs.readFile(this.cacheFile, 'utf8');\n return JSON.parse(raw) as CacheEnvelope;\n } catch {\n return undefined;\n }\n }\n\n /** Used by `wstack models refresh` to expose where the cache lives. */\n cacheLocation(): string {\n return path.resolve(this.cacheFile);\n }\n}\n","export interface Mode {\n id: string;\n name: string;\n description: string;\n /** Additional prompt text injected into system prompt when mode is active */\n prompt: string;\n /** Tags for tool_search filtering */\n tags?: string[];\n /** Tools that should be prioritized/highlighted when this mode is active */\n toolPreferences?: string[];\n}\n\nexport interface ModeManifest {\n modes: Mode[];\n defaultMode?: string;\n}\n\nexport interface ModeStore {\n getActiveMode(): Promise<Mode | null>;\n setActiveMode(modeId: string | null): Promise<void>;\n listModes(): Promise<Mode[]>;\n getMode(modeId: string): Promise<Mode | null>;\n}\n\nexport interface ModeConfig {\n directory: string;\n}\n\nexport const DEFAULT_MODES: Mode[] = [\n {\n id: 'default',\n name: 'Default',\n description: 'General-purpose coding assistant',\n prompt: '',\n tags: ['general'],\n },\n {\n id: 'code-reviewer',\n name: 'Code Reviewer',\n description: 'Focus on code quality, best practices, and potential bugs',\n prompt: `## Code Reviewer Mode\n\nWhen reviewing code:\n- Look for potential bugs, race conditions, and edge cases\n- Check for security vulnerabilities (SQL injection, XSS, CSRF, etc.)\n- Evaluate error handling completeness\n- Assess code readability and maintainability\n- Check for performance anti-patterns\n- Verify test coverage for critical paths\n- Ensure naming conventions are followed`,\n tags: ['review', 'quality', 'security'],\n toolPreferences: ['read', 'grep', 'git', 'diff', 'test'],\n },\n {\n id: 'code-auditor',\n name: 'Code Auditor',\n description: 'Security-focused code analysis',\n prompt: `## Code Auditor Mode\n\nWhen auditing code for security:\n- Identify injection vulnerabilities (SQL, Command, XSS, LDAP)\n- Check authentication and authorization patterns\n- Look for sensitive data exposure (secrets, PII in logs)\n- Verify cryptographic implementations\n- Check for insecure dependencies or configurations\n- Assess input validation and output encoding\n- Look for timing attacks and information leakage`,\n tags: ['security', 'audit', 'compliance'],\n toolPreferences: ['grep', 'read', 'audit', 'bash'],\n },\n {\n id: 'architect',\n name: 'Software Architect',\n description: 'Design patterns, scalability, and system design',\n prompt: `## Architect Mode\n\nWhen designing or reviewing architecture:\n- Evaluate scalability and future growth\n- Check for appropriate design patterns\n- Assess coupling and cohesion\n- Look forSOLID principle violations\n- Evaluate data modeling decisions\n- Check for eventual consistency issues\n- Assess API design and contract stability\n- Consider operational aspects (monitoring, logging, deployment)`,\n tags: ['architecture', 'design', 'scalability'],\n toolPreferences: ['read', 'glob', 'tree', 'diff'],\n },\n {\n id: 'debugger',\n name: 'Debugger',\n description: 'Root cause analysis and error investigation',\n prompt: `## Debugger Mode\n\nWhen investigating bugs:\n- Reproduce the issue with minimal steps\n- Check error messages and stack traces thoroughly\n- Look for related logs and historical context\n- Verify assumptions about data flow\n- Check for race conditions in async code\n- Validate environment and configuration\n- Use binary search to isolate the root cause\n- Verify fixes with tests before considering done`,\n tags: ['debug', 'investigation', 'error-resolution'],\n toolPreferences: ['read', 'grep', 'bash', 'logs', 'test'],\n },\n {\n id: 'tester',\n name: 'QA Engineer',\n description: 'Test coverage, edge cases, and quality assurance',\n prompt: `## Tester Mode\n\nWhen testing or writing tests:\n- Cover happy path and error paths equally\n- Think about edge cases and boundary conditions\n- Check for missing null/undefined handling tests\n- Verify error messages are tested\n- Look for race condition tests in async code\n- Assess mutation testing opportunities\n- Check for integration test gaps\n- Verify test isolation and cleanup`,\n tags: ['testing', 'qa', 'quality'],\n toolPreferences: ['read', 'grep', 'test', 'bash'],\n },\n {\n id: 'devops',\n name: 'DevOps Engineer',\n description: 'Infrastructure, deployment, and operations',\n prompt: `## DevOps Mode\n\nWhen working on infrastructure:\n- Check for containerization and deployment readiness\n- Verify CI/CD pipeline configurations\n- Assess monitoring and alerting setup\n- Look for health check endpoints\n- Check for graceful shutdown handling\n- Verify backup and disaster recovery plans\n- Assess secrets management\n- Check for resource limits and quotas`,\n tags: ['devops', 'infrastructure', 'operations'],\n toolPreferences: ['read', 'bash', 'grep', 'logs', 'git'],\n },\n {\n id: 'refactorer',\n name: 'Refactorer',\n description: 'Code improvement and modernization',\n prompt: `## Refactorer Mode\n\nWhen refactoring code:\n- Maintain existing behavior — tests must pass before and after\n- Make one change at a time, verify after each\n- Prefer small, focused commits\n- Preserve API contracts unless explicitly changing\n- Remove dead code and comments\n- Improve naming as you go\n- Don't mix formatting changes with logic changes\n- Keep performance in mind — don't regress`,\n tags: ['refactor', 'modernization', 'improvement'],\n toolPreferences: ['read', 'edit', 'test', 'git', 'grep'],\n },\n];","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Mode, ModeStore, ModeManifest, ModeConfig } from '../types/mode.js';\nimport { DEFAULT_MODES } from '../types/mode.js';\n\nexport class DefaultModeStore implements ModeStore {\n private activeModeId: string | null = null;\n private modes: Mode[];\n private configDir: string;\n\n constructor(config: ModeConfig) {\n this.configDir = config.directory;\n this.modes = [...DEFAULT_MODES];\n }\n\n async getActiveMode(): Promise<Mode | null> {\n if (!this.activeModeId) {\n await this.loadActiveMode();\n }\n if (!this.activeModeId) return null;\n return this.modes.find((m) => m.id === this.activeModeId) ?? null;\n }\n\n async setActiveMode(modeId: string | null): Promise<void> {\n this.activeModeId = modeId;\n await this.saveActiveMode();\n }\n\n async listModes(): Promise<Mode[]> {\n return [...this.modes];\n }\n\n async getMode(modeId: string): Promise<Mode | null> {\n return this.modes.find((m) => m.id === modeId) ?? null;\n }\n\n async addMode(mode: Mode): Promise<void> {\n const idx = this.modes.findIndex((m) => m.id === mode.id);\n if (idx >= 0) {\n this.modes[idx] = mode;\n } else {\n this.modes.push(mode);\n }\n }\n\n async removeMode(modeId: string): Promise<void> {\n const builtIn = DEFAULT_MODES.find((m) => m.id === modeId);\n if (builtIn) {\n throw new Error(`Cannot remove built-in mode \"${modeId}\"`);\n }\n this.modes = this.modes.filter((m) => m.id !== modeId);\n if (this.activeModeId === modeId) {\n this.activeModeId = null;\n await this.saveActiveMode();\n }\n }\n\n private async loadActiveMode(): Promise<void> {\n try {\n const configPath = path.join(this.configDir, 'mode.json');\n const content = await fs.readFile(configPath, 'utf8');\n const data = JSON.parse(content);\n this.activeModeId = data.activeMode ?? null;\n } catch {\n this.activeModeId = 'default';\n }\n }\n\n private async saveActiveMode(): Promise<void> {\n try {\n await fs.mkdir(this.configDir, { recursive: true });\n const configPath = path.join(this.configDir, 'mode.json');\n await fs.writeFile(\n configPath,\n JSON.stringify({ activeMode: this.activeModeId }, null, 2),\n 'utf8',\n );\n } catch {\n // ignore save errors\n }\n }\n}\n\nexport interface ModeLoaderOptions {\n projectModesDir?: string;\n userModesDir?: string;\n}\n\nexport async function loadProjectModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const entries = await fs.readdir(modesDir);\n for (const entry of entries) {\n if (!entry.endsWith('.md') && !entry.endsWith('.txt')) continue;\n const filePath = path.join(modesDir, entry);\n const stat = await fs.stat(filePath);\n if (!stat.isFile()) continue;\n const content = await fs.readFile(filePath, 'utf8');\n const id = path.basename(entry, path.extname(entry));\n modes.push({\n id,\n name: id.replace(/[-_]/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase()),\n description: content.split('\\n')[0] ?? id,\n prompt: content,\n tags: ['project'],\n });\n }\n } catch {\n // no project modes\n }\n return modes;\n}\n\nexport async function loadUserModes(modesDir: string): Promise<Mode[]> {\n const modes: Mode[] = [];\n try {\n const manifestPath = path.join(modesDir, 'modes.json');\n const content = await fs.readFile(manifestPath, 'utf8');\n const manifest: ModeManifest = JSON.parse(content);\n for (const mode of manifest.modes) {\n modes.push(mode);\n }\n } catch {\n // no user modes\n }\n return modes;\n}","import type { Usage } from '../types/provider.js';\r\n\r\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\r\n\r\nexport class BudgetExceededError extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly observed: number;\r\n\r\n constructor(kind: BudgetKind, limit: number, observed: number) {\r\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\r\n this.name = 'BudgetExceededError';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\nexport interface BudgetLimits {\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n /** Estimated USD cost ceiling. */\r\n maxCostUsd?: number;\r\n /** Wall-clock timeout from start() to checkTimeout(). */\r\n timeoutMs?: number;\r\n}\r\n\r\nexport interface BudgetUsage {\r\n iterations: number;\r\n toolCalls: number;\r\n tokens: { input: number; output: number; total: number };\r\n costUsd: number;\r\n elapsedMs: number;\r\n}\r\n\r\n/**\r\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\r\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\r\n * methods are O(1) and safe to call from hot paths.\r\n *\r\n * Behavior: `record*` methods throw `BudgetExceededError` synchronously the\r\n * moment a limit is crossed. The caller (runner/coordinator) catches this and\r\n * marks the task as 'failed' with the budget kind, so the operator can see\r\n * exactly which ceiling tripped.\r\n */\r\nexport class SubagentBudget {\r\n readonly limits: Readonly<BudgetLimits>;\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private tokenInput = 0;\r\n private tokenOutput = 0;\r\n private costUsd = 0;\r\n private startTime: number | null = null;\r\n\r\n constructor(limits: BudgetLimits = {}) {\r\n this.limits = Object.freeze({ ...limits });\r\n }\r\n\r\n start(): void {\r\n this.startTime = Date.now();\r\n }\r\n\r\n recordIteration(): void {\r\n this.iterations++;\r\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\r\n throw new BudgetExceededError('iterations', this.limits.maxIterations, this.iterations);\r\n }\r\n }\r\n\r\n recordToolCall(): void {\r\n this.toolCalls++;\r\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\r\n throw new BudgetExceededError('tool_calls', this.limits.maxToolCalls, this.toolCalls);\r\n }\r\n }\r\n\r\n recordUsage(usage: Usage, costUsd = 0): void {\r\n this.tokenInput += usage.input;\r\n this.tokenOutput += usage.output;\r\n this.costUsd += costUsd;\r\n\r\n const totalTokens = this.tokenInput + this.tokenOutput;\r\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\r\n throw new BudgetExceededError('tokens', this.limits.maxTokens, totalTokens);\r\n }\r\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\r\n throw new BudgetExceededError('cost', this.limits.maxCostUsd, this.costUsd);\r\n }\r\n }\r\n\r\n /**\r\n * Throws if the wall-clock budget is exhausted. Call this from the iteration\r\n * loop so a hung tool can't keep a subagent running past its deadline.\r\n */\r\n checkTimeout(): void {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\r\n const elapsed = Date.now() - this.startTime;\r\n if (elapsed > this.limits.timeoutMs) {\r\n throw new BudgetExceededError('timeout', this.limits.timeoutMs, elapsed);\r\n }\r\n }\r\n\r\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\r\n isTimedOut(): boolean {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\r\n return Date.now() - this.startTime > this.limits.timeoutMs;\r\n }\r\n\r\n usage(): BudgetUsage {\r\n return {\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n tokens: {\r\n input: this.tokenInput,\r\n output: this.tokenOutput,\r\n total: this.tokenInput + this.tokenOutput,\r\n },\r\n costUsd: this.costUsd,\r\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\r\n };\r\n }\r\n}\r\n","import { randomUUID } from 'node:crypto';\r\nimport { EventEmitter } from 'node:events';\r\nimport type {\r\n MultiAgentCoordinator,\r\n CoordinatorStatus,\r\n SubagentConfig,\r\n SpawnResult,\r\n TaskSpec,\r\n TaskResult,\r\n MultiAgentConfig,\r\n SubagentContext,\r\n SubagentRunner,\r\n SubagentRunContext,\r\n} from '../types/multi-agent.js';\r\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\r\nimport { SubagentBudget, BudgetExceededError } from './subagent-budget.js';\r\n\r\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\r\n\r\ninterface SubagentEntry {\r\n config: SubagentConfig;\r\n context: SubagentContext;\r\n status: SubagentStatus;\r\n currentTask?: string;\r\n abortController: AbortController;\r\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\r\n activeBudget?: SubagentBudget;\r\n}\r\n\r\nexport interface MultiAgentCoordinatorOptions {\r\n /**\r\n * Callback that executes a task on behalf of a subagent. Required for\r\n * `assign()` to actually run anything — without it, tasks queue forever.\r\n * The coordinator provides per-subagent isolation (own budget, own signal,\r\n * own bridge) and enforces timeout + concurrency.\r\n */\r\n runner?: SubagentRunner;\r\n}\r\n\r\nexport class DefaultMultiAgentCoordinator\r\n extends EventEmitter\r\n implements MultiAgentCoordinator\r\n{\r\n readonly coordinatorId: string;\r\n readonly config: MultiAgentConfig;\r\n private readonly runner?: SubagentRunner;\r\n\r\n private readonly subagents = new Map<string, SubagentEntry>();\r\n\r\n private pendingTasks: TaskSpec[] = [];\r\n private completedResults: TaskResult[] = [];\r\n private totalIterations = 0;\r\n private inFlight = 0;\r\n\r\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\r\n super();\r\n this.coordinatorId = config.coordinatorId;\r\n this.config = config;\r\n this.runner = options.runner;\r\n }\r\n\r\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\r\n const id = subagent.id || randomUUID();\r\n const context: SubagentContext = {\r\n subagentId: id,\r\n tasks: [],\r\n // Wired later by the caller via setSubagentBridge() once the\r\n // bidirectional bridge is created. Readers must null-check / use\r\n // hasParentBridge() — the type now reflects this.\r\n parentBridge: null,\r\n doneCondition: this.config.doneCondition,\r\n maxConcurrent: this.config.maxConcurrent ?? 4,\r\n };\r\n\r\n this.subagents.set(id, {\r\n config: { ...subagent, id },\r\n context,\r\n status: 'idle',\r\n abortController: new AbortController(),\r\n });\r\n\r\n this.emit('subagent.started', { subagent: { ...subagent, id } });\r\n\r\n return { subagentId: id, agentId: id };\r\n }\r\n\r\n async assign(task: TaskSpec): Promise<void> {\r\n this.pendingTasks.push(task);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\r\n const subagent = this.subagents.get(to);\r\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\r\n if (!subagent.context.parentBridge) {\r\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\r\n }\r\n await subagent.context.parentBridge.send(msg);\r\n }\r\n\r\n /**\r\n * Wire up the communication bridge for a subagent. Call after spawn() once\r\n * the caller has created the bidirectional connection.\r\n */\r\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\r\n subagent.context.parentBridge = bridge;\r\n }\r\n\r\n async stop(subagentId: string): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n // Abort any in-flight run, then sever the bridge so further messages fail\r\n // fast instead of silently queueing on a dead subagent.\r\n subagent.abortController.abort();\r\n subagent.status = 'stopped';\r\n subagent.currentTask = undefined;\r\n subagent.context.parentBridge = null;\r\n\r\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\r\n }\r\n\r\n async stopAll(): Promise<void> {\r\n // allSettled so one failure doesn't leave other subagents un-stopped.\r\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\r\n }\r\n\r\n getStatus(): CoordinatorStatus {\r\n return {\r\n coordinatorId: this.coordinatorId,\r\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\r\n id,\r\n name: s.config.name,\r\n status: s.status,\r\n currentTask: s.currentTask,\r\n })),\r\n pendingTasks: this.pendingTasks.length,\r\n completedTasks: this.completedResults.length,\r\n totalIterations: this.totalIterations,\r\n done: this.isDone(),\r\n };\r\n }\r\n\r\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\r\n results(): readonly TaskResult[] {\r\n return this.completedResults;\r\n }\r\n\r\n /**\r\n * Manual completion — for callers that drive subagents without a runner\r\n * (e.g. external orchestrators). When a runner is configured the coordinator\r\n * calls this itself.\r\n */\r\n completeTask(result: TaskResult): void {\r\n this.recordCompletion(result);\r\n }\r\n\r\n // --- internal dispatching ---------------------------------------------\r\n\r\n private tryDispatchNext(): void {\r\n while (this.canDispatch()) {\r\n const subagentId = this.findIdleSubagent();\r\n if (!subagentId) return;\r\n const task = this.pendingTasks.shift();\r\n if (!task) return;\r\n // Attach a catch so a synchronous throw inside runDispatched (rare —\r\n // e.g. provider misconfiguration before the first await) becomes a\r\n // visible failed task instead of an unhandled rejection that leaves\r\n // `inFlight` permanently elevated.\r\n this.runDispatched(subagentId, task).catch((err) => {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'failed',\r\n error: err instanceof Error ? err.message : String(err),\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n });\r\n }\r\n }\r\n\r\n private canDispatch(): boolean {\r\n const max = this.config.maxConcurrent ?? 4;\r\n return this.inFlight < max && this.pendingTasks.length > 0;\r\n }\r\n\r\n private findIdleSubagent(): string | null {\r\n for (const [id, s] of this.subagents) {\r\n if (s.status === 'idle') return id;\r\n }\r\n return null;\r\n }\r\n\r\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n subagent.status = 'running';\r\n subagent.currentTask = task.id;\r\n task.subagentId = subagentId;\r\n subagent.context.tasks.push(task);\r\n\r\n this.emit('task.assigned', { task, subagentId });\r\n\r\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\r\n // Precedence: task > subagent > coordinator default.\r\n const budget = new SubagentBudget({\r\n maxIterations: subagent.config.maxIterations ?? this.config.defaultBudget?.maxIterations,\r\n maxToolCalls: task.maxToolCalls ?? subagent.config.maxToolCalls ?? this.config.defaultBudget?.maxToolCalls,\r\n maxTokens: subagent.config.maxTokens ?? this.config.defaultBudget?.maxTokens,\r\n maxCostUsd: subagent.config.maxCostUsd ?? this.config.defaultBudget?.maxCostUsd,\r\n timeoutMs: task.timeoutMs ?? subagent.config.timeoutMs ?? this.config.defaultBudget?.timeoutMs,\r\n });\r\n subagent.activeBudget = budget;\r\n\r\n if (!this.runner) {\r\n // No runner wired — caller drives execution via completeTask(). Status\r\n // reverts when the caller reports. We intentionally don't bump\r\n // `inFlight` here: `completeTask` → `recordCompletion` would then\r\n // decrement an inFlight that runDispatched never incremented, masking\r\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\r\n // check still settles correctly once the caller reports.\r\n return;\r\n }\r\n\r\n // Only count inFlight when we actually own the execution lifecycle.\r\n this.inFlight++;\r\n\r\n const startTime = Date.now();\r\n const runCtx: SubagentRunContext = {\r\n subagentId,\r\n config: subagent.config,\r\n budget,\r\n signal: subagent.abortController.signal,\r\n bridge: subagent.context.parentBridge || null,\r\n };\r\n\r\n let result: TaskResult;\r\n\r\n budget.start();\r\n try {\r\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status: 'success',\r\n result: outcome.result,\r\n iterations: outcome.iterations,\r\n toolCalls: outcome.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n } catch (err) {\r\n // Order matters: a timeout calls abort() to signal cooperative runners,\r\n // which also flips `signal.aborted=true`. Inspect the error first so we\r\n // surface 'timeout' rather than masking it as 'stopped'.\r\n const status: TaskResult['status'] =\r\n err instanceof BudgetExceededError && err.kind === 'timeout'\r\n ? 'timeout'\r\n : subagent.abortController.signal.aborted\r\n ? 'stopped'\r\n : 'failed';\r\n const usage = budget.usage();\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status,\r\n error: err instanceof Error ? err.message : String(err),\r\n iterations: usage.iterations,\r\n toolCalls: usage.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n this.recordCompletion(result);\r\n }\r\n\r\n private async executeWithTimeout(\r\n runner: SubagentRunner,\r\n task: TaskSpec,\r\n ctx: SubagentRunContext,\r\n budget: SubagentBudget,\r\n ) {\r\n const timeoutMs = budget.limits.timeoutMs;\r\n if (timeoutMs === undefined) return runner(task, ctx);\r\n\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n timer = setTimeout(() => {\r\n // Abort the subagent's signal so cooperative runners can clean up.\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', timeoutMs, Date.now()));\r\n }, timeoutMs);\r\n });\r\n\r\n try {\r\n return await Promise.race([runner(task, ctx), timeoutPromise]);\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n private recordCompletion(result: TaskResult): void {\r\n this.completedResults.push(result);\r\n this.totalIterations += result.iterations;\r\n if (this.inFlight > 0) {\r\n this.inFlight--;\r\n } else if (this.runner) {\r\n // Runner-driven path completed without an outstanding inFlight slot —\r\n // shouldn't happen unless completeTask was called externally.\r\n this.emit('warning', {\r\n type: 'inFlight_underflow',\r\n taskId: result.taskId,\r\n subagentId: result.subagentId,\r\n });\r\n return;\r\n }\r\n\r\n const subagent = this.subagents.get(result.subagentId);\r\n if (subagent && subagent.status !== 'stopped') {\r\n const failed = result.status === 'failed' || result.status === 'timeout';\r\n subagent.status = failed ? 'error' : 'idle';\r\n subagent.currentTask = undefined;\r\n // If the run aborted (timeout or explicit stop), the subagent's\r\n // signal is now permanently aborted — recycling the controller lets\r\n // the next dispatched task start with a fresh cancellation scope.\r\n if (subagent.abortController.signal.aborted) {\r\n subagent.abortController = new AbortController();\r\n }\r\n // Reset error state on next assignment so a transient failure doesn't\r\n // permanently sideline the subagent.\r\n if (subagent.status === 'error') {\r\n queueMicrotask(() => {\r\n if (subagent.status === 'error') subagent.status = 'idle';\r\n this.tryDispatchNext();\r\n });\r\n }\r\n }\r\n\r\n this.emit('task.completed', {\r\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\r\n result,\r\n });\r\n\r\n this.tryDispatchNext();\r\n\r\n if (this.isDone()) {\r\n this.emit('done', {\r\n results: this.completedResults,\r\n totalIterations: this.totalIterations,\r\n });\r\n }\r\n }\r\n\r\n private isDone(): boolean {\r\n if (this.config.doneCondition.type === 'all_tasks_done') {\r\n return this.pendingTasks.length === 0 && this.inFlight === 0;\r\n }\r\n if (\r\n this.config.doneCondition.maxIterations !== undefined &&\r\n this.totalIterations >= this.config.doneCondition.maxIterations\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type {\r\n SubagentConfig,\r\n SubagentRunContext,\r\n SubagentRunOutcome,\r\n SubagentRunner,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport { BudgetExceededError } from './subagent-budget.js';\r\n\r\n/**\r\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\r\n * The factory MUST construct a fresh `Context` per call — sharing context\r\n * between subagents defeats isolation. Each Agent should also use either\r\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\r\n * attributed correctly.\r\n */\r\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\r\n\r\nexport interface AgentFactoryResult {\r\n agent: Agent;\r\n /** Event bus the factory wired to this agent — required for budget hookup. */\r\n events: EventBus;\r\n}\r\n\r\nexport interface AgentRunnerOptions {\r\n factory: AgentFactory;\r\n /**\r\n * Format a TaskSpec into the user input the agent will receive. Defaults\r\n * to `task.description ?? ''`. Override when subagents expect structured\r\n * input (e.g. JSON contracts, role-prefixed prompts).\r\n */\r\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\r\n}\r\n\r\n/**\r\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\r\n * the coordinator's budget and abort signal. This is the production adapter —\r\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\r\n *\r\n * Lifecycle per task:\r\n * 1. factory(config) → fresh Agent + EventBus.\r\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\r\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\r\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\r\n * 5. Unsubscribe and let the factory's resources be GC'd.\r\n *\r\n * The budget is checked synchronously from event handlers — a runaway agent\r\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\r\n * coordinator surfaces as `status: 'failed'` on the task result.\r\n */\r\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\r\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\r\n\r\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\r\n const { agent, events } = await opts.factory(ctx.config);\r\n\r\n // Hook budget into the agent's event stream. We capture errors thrown by\r\n // recordToolCall/recordUsage so the budget can short-circuit the run by\r\n // aborting the controller — the agent then unwinds cooperatively.\r\n const aborter = new AbortController();\r\n const onBudgetError = (err: unknown) => {\r\n if (err instanceof BudgetExceededError) {\r\n aborter.abort();\r\n budgetError = err;\r\n } else {\r\n throw err;\r\n }\r\n };\r\n\r\n let budgetError: BudgetExceededError | null = null;\r\n\r\n const unsub: Array<() => void> = [];\r\n unsub.push(\r\n events.on('tool.started', () => {\r\n try { ctx.budget.recordToolCall(); }\r\n catch (e) { onBudgetError(e); }\r\n }),\r\n events.on('provider.response', (e) => {\r\n try { ctx.budget.recordUsage(e.usage); }\r\n catch (e2) { onBudgetError(e2); }\r\n }),\r\n events.on('iteration.started', () => {\r\n try {\r\n ctx.budget.recordIteration();\r\n ctx.budget.checkTimeout();\r\n } catch (e) { onBudgetError(e); }\r\n }),\r\n );\r\n\r\n // Forward the coordinator signal so stop() from outside also aborts.\r\n const onParentAbort = () => aborter.abort();\r\n ctx.signal.addEventListener('abort', onParentAbort);\r\n\r\n let result: RunResult;\r\n try {\r\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\r\n } finally {\r\n ctx.signal.removeEventListener('abort', onParentAbort);\r\n for (const u of unsub) u();\r\n }\r\n\r\n // A budget violation is the signal — surface it so the coordinator can\r\n // tag the task with the right failure kind ('failed' for budget; the\r\n // coordinator separately recognises 'timeout' from BudgetExceededError).\r\n if (budgetError) throw budgetError;\r\n\r\n if (result.status === 'failed') {\r\n throw result.error instanceof Error\r\n ? result.error\r\n : new Error(String(result.error ?? 'agent failed'));\r\n }\r\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\r\n // classify them. When the parent signal was aborted, coordinator marks\r\n // the task 'stopped' (matched against subagent.abortController.aborted).\r\n if (result.status === 'aborted') {\r\n throw new Error('agent aborted');\r\n }\r\n if (result.status === 'max_iterations') {\r\n throw new Error('agent exhausted iteration limit');\r\n }\r\n\r\n const usage = ctx.budget.usage();\r\n return {\r\n result: result.finalText,\r\n iterations: result.iterations,\r\n toolCalls: usage.toolCalls,\r\n };\r\n };\r\n}\r\n\r\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\r\n return task.description ?? '';\r\n}\r\n","import type { EventBus } from '../kernel/events.js';\n\n/**\n * Single fleet-wide event with subagent attribution. Whatever a child\n * agent emits on its own EventBus gets re-published here, prefixed with\n * `subagentId` so a single subscriber can multiplex across the fleet.\n *\n * The director uses `FleetBus.filter('tool.executed', …)` to see every\n * tool call across the fleet; the TUI uses\n * `FleetBus.subscribe(id, handler)` to render a per-subagent panel.\n */\nexport interface FleetEvent {\n subagentId: string;\n taskId?: string;\n ts: number;\n type: string;\n payload: unknown;\n}\n\nexport type FleetHandler = (event: FleetEvent) => void;\n\n/**\n * Fan-in for per-subagent EventBuses. Each subagent's bus is plugged in\n * via `attach()`; the FleetBus re-emits every event with subagent\n * attribution. Detachment is automatic via the returned disposer — call\n * it when a subagent terminates so we don't leak listeners.\n *\n * The bus exposes two subscription modes: by `subagentId` (everything\n * from one child) and by `type` (one event-type across the fleet). They\n * compose — if you need a per-subagent + per-type slice, subscribe by\n * type and filter on `event.subagentId` in your handler.\n */\nexport class FleetBus {\n private readonly byId = new Map<string, Set<FleetHandler>>();\n private readonly byType = new Map<string, Set<FleetHandler>>();\n private readonly any = new Set<FleetHandler>();\n\n /**\n * Hook a subagent's EventBus into the fleet. EventBus is strongly\n * typed and doesn't expose an `onAny` hook, so we subscribe to the\n * canonical set of event types a subagent emits during a run. New\n * event types added to the kernel must be added here too — but the\n * cost is a tiny single line per type, and the explicit list keeps\n * the wire format clear.\n *\n * Returns a disposer that detaches every subscription; call on\n * subagent teardown so the listeners don't outlive the run.\n */\n attach(subagentId: string, bus: EventBus, taskId?: string): () => void {\n const FORWARDED_TYPES = [\n 'tool.started', 'tool.executed', 'tool.progress', 'tool.confirm_needed',\n 'iteration.started', 'iteration.completed',\n 'provider.text_delta', 'provider.response',\n 'provider.retry', 'provider.error',\n 'session.started', 'session.ended',\n 'token.threshold',\n ] as const;\n const offs: Array<() => void> = [];\n for (const t of FORWARDED_TYPES) {\n offs.push(\n bus.on(t, (payload: unknown) => {\n this.emit({ subagentId, taskId, ts: Date.now(), type: t, payload });\n }),\n );\n }\n return () => { for (const off of offs) off(); };\n }\n\n /** Subscribe to every event from one subagent. */\n subscribe(subagentId: string, handler: FleetHandler): () => void {\n let set = this.byId.get(subagentId);\n if (!set) { set = new Set(); this.byId.set(subagentId, set); }\n set.add(handler);\n return () => { set!.delete(handler); };\n }\n\n /** Subscribe to one event type across all subagents. */\n filter(type: string, handler: FleetHandler): () => void {\n let set = this.byType.get(type);\n if (!set) { set = new Set(); this.byType.set(type, set); }\n set.add(handler);\n return () => { set!.delete(handler); };\n }\n\n /** Subscribe to literally everything. The fleet roll-up uses this. */\n onAny(handler: FleetHandler): () => void {\n this.any.add(handler);\n return () => { this.any.delete(handler); };\n }\n\n emit(event: FleetEvent): void {\n // Each fan-out is best-effort — a misbehaving handler must not\n // bring down the bus or other handlers. Errors are swallowed\n // (matching the rest of the project's listener-error policy).\n const byId = this.byId.get(event.subagentId);\n if (byId) for (const h of byId) { try { h(event); } catch { /* ignore */ } }\n const byType = this.byType.get(event.type);\n if (byType) for (const h of byType) { try { h(event); } catch { /* ignore */ } }\n for (const h of this.any) { try { h(event); } catch { /* ignore */ } }\n }\n}\n\n/**\n * Roll-up of token usage + cost across an entire director run. The\n * director's `fleet_status` tool returns this so the model can reason\n * about budget in its next turn (\"the researcher already burned $0.40,\n * lean on summaries for the next task\").\n */\nexport interface FleetUsage {\n total: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n };\n perSubagent: Record<string, SubagentUsageSnapshot>;\n}\n\nexport interface SubagentUsageSnapshot {\n subagentId: string;\n provider?: string;\n model?: string;\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n toolCalls: number;\n iterations: number;\n startedAt: number;\n lastEventAt: number;\n}\n\n/**\n * Aggregates provider.response + tool.executed events from the FleetBus\n * into a live `FleetUsage` snapshot. Costs are computed by the caller\n * via a `priceLookup(subagentId)` so we don't bake provider-pricing\n * coupling into core; the CLI/tests supply a function that resolves\n * each subagent's per-token rates from the models registry.\n */\nexport class FleetUsageAggregator {\n private readonly perSubagent = new Map<string, SubagentUsageSnapshot>();\n private readonly total = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\n\n constructor(\n private readonly bus: FleetBus,\n private readonly priceLookup?: (subagentId: string) => { input?: number; output?: number; cacheRead?: number; cacheWrite?: number } | undefined,\n private readonly metaLookup?: (subagentId: string) => { provider?: string; model?: string } | undefined,\n ) {\n bus.filter('provider.response', (e) => this.onProviderResponse(e));\n bus.filter('tool.executed', (e) => this.onToolExecuted(e));\n bus.filter('iteration.started', (e) => this.onIterationStarted(e));\n }\n\n /** Live snapshot — safe to call from a tool's execute() body. */\n snapshot(): FleetUsage {\n return {\n total: { ...this.total },\n perSubagent: Object.fromEntries(\n Array.from(this.perSubagent.entries()).map(([k, v]) => [k, { ...v }]),\n ),\n };\n }\n\n private ensure(subagentId: string): SubagentUsageSnapshot {\n let snap = this.perSubagent.get(subagentId);\n if (!snap) {\n const meta = this.metaLookup?.(subagentId);\n snap = {\n subagentId,\n provider: meta?.provider,\n model: meta?.model,\n input: 0, output: 0, cacheRead: 0, cacheWrite: 0,\n cost: 0, toolCalls: 0, iterations: 0,\n startedAt: Date.now(),\n lastEventAt: Date.now(),\n };\n this.perSubagent.set(subagentId, snap);\n }\n return snap;\n }\n\n private onProviderResponse(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n const p = e.payload as { usage?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number } };\n const usage = p?.usage;\n if (!usage) return;\n snap.input += usage.input ?? 0;\n snap.output += usage.output ?? 0;\n snap.cacheRead += usage.cacheRead ?? 0;\n snap.cacheWrite += usage.cacheWrite ?? 0;\n this.total.input += usage.input ?? 0;\n this.total.output += usage.output ?? 0;\n this.total.cacheRead += usage.cacheRead ?? 0;\n this.total.cacheWrite += usage.cacheWrite ?? 0;\n const price = this.priceLookup?.(e.subagentId);\n if (price) {\n const delta =\n ((usage.input ?? 0) / 1_000_000) * (price.input ?? 0) +\n ((usage.output ?? 0) / 1_000_000) * (price.output ?? 0) +\n ((usage.cacheRead ?? 0) / 1_000_000) * (price.cacheRead ?? 0) +\n ((usage.cacheWrite ?? 0) / 1_000_000) * (price.cacheWrite ?? 0);\n snap.cost += delta;\n this.total.cost += delta;\n }\n snap.lastEventAt = e.ts;\n }\n\n private onToolExecuted(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n snap.toolCalls += 1;\n snap.lastEventAt = e.ts;\n }\n\n private onIterationStarted(e: FleetEvent): void {\n const snap = this.ensure(e.subagentId);\n snap.iterations += 1;\n snap.lastEventAt = e.ts;\n }\n}\n","import type { BridgeMessage, BridgeTransport } from '../../types/agent-bridge.js';\r\n\r\n/**\r\n * In-memory pub/sub transport for agent-to-agent messaging.\r\n * Subscribers register by agentId and receive messages via callback.\r\n */\r\nexport class InMemoryBridgeTransport implements BridgeTransport {\r\n private readonly subs = new Map<string, Set<(msg: BridgeMessage) => void>>();\r\n\r\n send(msg: BridgeMessage, to: string): Promise<void> {\r\n // Broadcast: deliver to every subscriber except the sender.\r\n if (to === '*') {\r\n for (const [id, handlers] of this.subs) {\r\n if (id === msg.from) continue;\r\n for (const h of handlers) {\r\n try { h(msg); } catch { /* ignore */ }\r\n }\r\n }\r\n return Promise.resolve();\r\n }\r\n const handlers = this.subs.get(to);\r\n if (handlers) {\r\n for (const h of handlers) {\r\n try { h(msg); } catch { /* ignore */ }\r\n }\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n subscribe(agentId: string, handler: (msg: BridgeMessage) => void): () => void {\r\n if (!this.subs.has(agentId)) this.subs.set(agentId, new Set());\r\n this.subs.get(agentId)!.add(handler);\r\n return () => this.subs.get(agentId)?.delete(handler);\r\n }\r\n\r\n close(agentId: string): Promise<void> {\r\n this.subs.delete(agentId);\r\n return Promise.resolve();\r\n }\r\n}","import { randomUUID } from 'node:crypto';\nimport type {\n AgentBridge,\n AgentBridgeConfig,\n BridgeMessage,\n BridgeTransport,\n} from '../types/agent-bridge.js';\nimport { InMemoryBridgeTransport } from './transport/in-memory-transport.js';\n\n// Re-export for backwards compatibility\nexport { InMemoryBridgeTransport };\n\nexport class InMemoryAgentBridge implements AgentBridge {\n readonly agentId: string;\n readonly coordinatorId: string;\n private readonly transport: BridgeTransport;\n private readonly subscriptions: Set<(msg: BridgeMessage) => void> = new Set();\n private pendingRequests = new Map<string, {\n resolve: (msg: BridgeMessage) => void;\n reject: (e: Error) => void;\n timer: ReturnType<typeof setTimeout>;\n }>();\n private stopped = false;\n private timeoutMs: number;\n\n constructor(config: AgentBridgeConfig, transport: BridgeTransport) {\n this.agentId = config.agentId;\n this.coordinatorId = config.coordinatorId;\n this.transport = transport;\n this.timeoutMs = config.timeoutMs ?? 30_000;\n\n this.transport.subscribe(this.agentId, (msg) => {\n if (msg.type === 'heartbeat') return;\n\n const pending = this.pendingRequests.get(msg.id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pendingRequests.delete(msg.id);\n pending.resolve(msg);\n return;\n }\n\n for (const h of this.subscriptions) {\n try { h(msg); } catch { /* ignore */ }\n }\n });\n }\n\n async send(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n await this.transport.send(msg, msg.to ?? this.coordinatorId);\n }\n\n async broadcast(msg: BridgeMessage): Promise<void> {\n msg.timestamp = Date.now();\n msg.to = '*';\n await this.transport.send(msg, '*');\n }\n\n subscribe(handler: (msg: BridgeMessage) => void | Promise<void>): () => void {\n this.subscriptions.add(handler as (msg: BridgeMessage) => void);\n return () => this.subscriptions.delete(handler as (msg: BridgeMessage) => void);\n }\n\n async request<T>(msg: BridgeMessage, timeoutMs?: number): Promise<BridgeMessage<T>> {\n if (this.stopped) throw new Error('Bridge is stopped');\n const timeout = timeoutMs ?? this.timeoutMs;\n const correlationId = msg.id;\n\n // Detect collision: if a caller reuses an id while a prior request is\n // still outstanding, the second .set() would silently overwrite the\n // first record — leaving its caller hanging until its timer fired but\n // looking up the now-replaced entry. Surface the bug instead.\n if (this.pendingRequests.has(correlationId)) {\n throw new Error(\n `Bridge request id \"${correlationId}\" collides with an in-flight request — caller is reusing message ids`,\n );\n }\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pendingRequests.delete(correlationId);\n reject(new Error(`Request ${correlationId} timed out after ${timeout}ms`));\n }, timeout);\n\n this.pendingRequests.set(correlationId, { resolve: resolve as (msg: BridgeMessage) => void, reject, timer });\n\n msg.timestamp = Date.now();\n this.transport.send(msg, msg.to ?? this.coordinatorId).catch((e) => {\n clearTimeout(timer);\n this.pendingRequests.delete(correlationId);\n reject(e);\n });\n });\n }\n\n async stop(): Promise<void> {\n this.stopped = true;\n for (const [, p] of this.pendingRequests) {\n clearTimeout(p.timer);\n }\n this.pendingRequests.clear();\n this.subscriptions.clear();\n await this.transport.close(this.agentId);\n }\n}\n\nexport function createMessage<T = unknown>(\n type: BridgeMessage['type'],\n from: string,\n payload: T,\n to?: string,\n): BridgeMessage<T> {\n return {\n id: randomUUID(),\n type,\n from,\n to,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n}","/**\n * System-prompt composition helpers for the Director ecosystem.\n *\n * Two callers need composed prompts:\n *\n * 1. The **leader** (the director's own Agent) — needs a preamble that\n * explains the fleet protocol: when to spawn, when to await, how to\n * roll up, and the eight orchestration tools it owns.\n *\n * 2. Each **subagent** — needs a baseline that explains it has a parent\n * it can call via the bridge, a role-specific block, the task brief,\n * and finally any per-spawn `systemPromptOverride` from `SubagentConfig`.\n *\n * Both composers are pure functions: feed them parts, they return a string.\n * No I/O, no side effects, no implicit defaults beyond the ones exported\n * here. Callers (CLI multi-agent factory, Director itself) decide which\n * parts to fill in — that keeps the composition seam visible and testable.\n */\n\n/**\n * Default fleet-protocol preamble injected at the **front** of the\n * director-agent's system prompt. Kept deliberately short — long preambles\n * crowd out the user's leader prompt and the LLM stops attending. The tool\n * descriptions live on the tool definitions themselves; this preamble only\n * teaches *when* to reach for them.\n */\nexport const DEFAULT_DIRECTOR_PREAMBLE = `\\\nYou are the Director of a multi-agent fleet. You orchestrate worker\nsubagents by spawning them, assigning tasks, awaiting completions, and\nrolling up their outputs into your next decision.\n\nCore fleet tools available to you:\n - spawn_subagent — create a worker with a chosen provider / model / role\n - assign_task — hand a piece of work to a specific subagent\n - await_tasks — block until named task ids complete (parallel-safe)\n - ask_subagent — synchronously query a running subagent via the bridge\n - roll_up — aggregate finished tasks into a markdown/json summary\n - terminate_subagent — abort a stuck worker (use sparingly)\n - fleet_status — snapshot of all subagents and pending tasks\n - fleet_usage — token + cost breakdown per subagent and total\n\nWorking rules:\n 1. Decompose first. Before spawning, decide which sub-tasks are\n independent and can run in parallel. Sequential work doesn't need a\n subagent — do it yourself.\n 2. Match worker to job. Cheap/fast model for triage, capable model for\n synthesis. Different providers per sibling is allowed and encouraged.\n 3. Always pair an assign with an await. Don't fire-and-forget; you owe\n the user a single coherent answer at the end.\n 4. Roll up before deciding. After await_tasks resolves, call roll_up so\n the results are folded back into your context in a compact form.\n 5. Budget is real. Check fleet_usage periodically. If a subagent is\n thrashing, terminate it rather than letting cost climb silently.\n 6. Never claim a subagent's work as your own without verifying it. If a\n result looks wrong, ask_subagent for clarification before passing it\n to the user.\\\n`;\n\n/**\n * Default baseline prepended to every subagent's system prompt. Tells the\n * subagent its place in the hierarchy and the bridge contract — without\n * this, a subagent has no way to know it *can* ask the parent for\n * clarification, and it will hallucinate answers when context is missing.\n *\n * Bridge contract: subagents may `send` progress and `request` answers, but\n * MAY NOT exfiltrate the parent's full system prompt or tools list. The\n * baseline reinforces this in plain text — the actual enforcement is at\n * the bridge transport layer.\n */\nexport const DEFAULT_SUBAGENT_BASELINE = `\\\nYou are a subagent operating under a Director. You were spawned to handle\na specific slice of a larger plan — do that slice well and report back.\n\nBridge contract:\n - You have a parent (the Director). You may call \\`request\\` on the\n parent bridge to ask a clarifying question. Use this sparingly; the\n parent is also working.\n - You MAY NOT request the parent's system prompt, tool list, or other\n subagents' context. Those are not yours to read.\n - Your final task output is what the Director sees. Be concise,\n structured, and self-contained — assume the Director will paste your\n output into its own context.\\\n`;\n\n/** Parts the leader-prompt composer accepts. All optional. */\nexport interface DirectorPromptParts {\n /** The user's existing leader system prompt — typically what was passed\n * via `MultiAgentConfig.leaderSystemPrompt`. */\n basePrompt?: string;\n /** Override the built-in fleet preamble. Pass empty string to suppress. */\n directorPreamble?: string;\n /** Optional roster summary block — a short list of pre-configured roles\n * the director can spawn (e.g. \"researcher, coder, reviewer\"). Helps\n * small models discover the available shapes without scanning tools. */\n rosterSummary?: string;\n}\n\n/**\n * Compose the leader/director's system prompt. Order:\n * 1. Director preamble (fleet protocol)\n * 2. Roster summary (optional, when provided)\n * 3. User base prompt (the per-project leader prompt)\n *\n * Sections are separated by a blank line. Empty parts are skipped so the\n * output never contains stray blank-line runs.\n */\nexport function composeDirectorPrompt(parts: DirectorPromptParts = {}): string {\n const sections: string[] = [];\n const preamble = parts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n if (preamble && preamble.trim().length > 0) sections.push(preamble.trim());\n if (parts.rosterSummary && parts.rosterSummary.trim().length > 0) {\n sections.push(`Available roles you can spawn:\\n${parts.rosterSummary.trim()}`);\n }\n if (parts.basePrompt && parts.basePrompt.trim().length > 0) {\n sections.push(parts.basePrompt.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/** Parts the subagent-prompt composer accepts. Layered from generic to\n * specific; later layers override earlier ones when they conflict. */\nexport interface SubagentPromptParts {\n /** Base persona/identity for *every* subagent. Defaults to the bridge\n * contract baseline. Pass empty string to suppress. */\n baseline?: string;\n /** Role-specific block, e.g. \"You are a code reviewer. Focus on…\". */\n role?: string;\n /** Task brief — usually the same string the runner passes as user input,\n * but exposed here in case the factory wants it duplicated in the\n * system prompt for reinforcement. */\n task?: string;\n /**\n * Absolute path to a shared scratchpad directory the whole fleet can\n * read/write. When set, the composer adds a \"Shared notes\" block that\n * tells the subagent where to drop findings and where to look for\n * sibling output. This is the cheap fleet-coordination channel —\n * agents don't need each other's transcripts, just each other's\n * conclusions. Falls between `task` and `override` so the override\n * can still narrow or replace it.\n */\n sharedScratchpad?: string;\n /** Final per-spawn override from `SubagentConfig.systemPromptOverride`.\n * Added last so it wins on conflict — that's by design: the spawn site\n * knows the most about what this specific subagent should do. */\n override?: string;\n}\n\n/**\n * Compose a subagent's system prompt. Order:\n * 1. Baseline (bridge contract)\n * 2. Role\n * 3. Task brief\n * 4. Per-spawn override\n *\n * Same blank-line-separated joining as the director composer.\n *\n * Layering rationale: the baseline never needs to change between\n * subagents; the role is the \"what kind of worker is this\"; the task is\n * the \"what should you do *now*\"; the override is the spawn-site escape\n * hatch (\"…and respond only in JSON\"). Putting override last means it\n * never gets squashed by something earlier in the chain.\n */\nexport function composeSubagentPrompt(parts: SubagentPromptParts = {}): string {\n const sections: string[] = [];\n const baseline = parts.baseline ?? DEFAULT_SUBAGENT_BASELINE;\n if (baseline && baseline.trim().length > 0) sections.push(baseline.trim());\n if (parts.role && parts.role.trim().length > 0) {\n sections.push(`Role:\\n${parts.role.trim()}`);\n }\n if (parts.task && parts.task.trim().length > 0) {\n sections.push(`Task:\\n${parts.task.trim()}`);\n }\n if (parts.sharedScratchpad && parts.sharedScratchpad.trim().length > 0) {\n sections.push(\n `Shared notes:\\n` +\n `A scratchpad shared with the rest of the fleet is mounted at \\`${parts.sharedScratchpad.trim()}\\`.\\n` +\n `- Write your final findings as markdown files there (e.g. \\`findings.md\\`, \\`security.md\\`).\\n` +\n `- Before starting, list the directory and read any sibling files relevant to your task — ` +\n `they may already contain context you can build on.\\n` +\n `- Use stable filenames (one file per concern); overwrite instead of appending so the ` +\n `Director sees the latest state.`,\n );\n }\n if (parts.override && parts.override.trim().length > 0) {\n sections.push(parts.override.trim());\n }\n return sections.join('\\n\\n');\n}\n\n/**\n * Render a short bullet list summarising a roster — useful for stuffing\n * into `composeDirectorPrompt({ rosterSummary })` so the director model\n * can see available roles without scanning tool descriptions.\n *\n * Each entry: `- <role-id>: <name>[ (provider/model)] — <prompt-headline>`\n * The prompt headline is the first non-empty line of `config.prompt`,\n * truncated to 80 chars. Skipped entirely when the role has no prompt.\n */\nexport function rosterSummaryFromConfigs(\n roster: Record<string, { name: string; provider?: string; model?: string; prompt?: string; role?: string }>,\n): string {\n const lines: string[] = [];\n for (const [roleId, cfg] of Object.entries(roster)) {\n const tag = cfg.provider && cfg.model ? ` (${cfg.provider}/${cfg.model})` : '';\n const headline = cfg.prompt\n ? (cfg.prompt.split('\\n').find((l) => l.trim().length > 0) ?? '').trim().slice(0, 80)\n : '';\n const tail = headline ? ` — ${headline}` : '';\n lines.push(`- ${roleId}: ${cfg.name}${tag}${tail}`);\n }\n return lines.join('\\n');\n}\n","import { randomUUID } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type {\n MultiAgentConfig,\n SubagentConfig,\n TaskSpec,\n TaskResult,\n SubagentRunner,\n CoordinatorStatus,\n} from '../types/multi-agent.js';\nimport type { Tool, JSONSchema } from '../types/tool.js';\nimport type { BridgeMessage } from '../types/agent-bridge.js';\nimport { DefaultMultiAgentCoordinator } from './multi-agent-coordinator.js';\nimport { FleetBus, FleetUsageAggregator, type FleetUsage } from './fleet-bus.js';\nimport { InMemoryAgentBridge } from './agent-bridge.js';\nimport { InMemoryBridgeTransport } from './transport/in-memory-transport.js';\nimport {\n composeDirectorPrompt,\n composeSubagentPrompt,\n rosterSummaryFromConfigs,\n DEFAULT_DIRECTOR_PREAMBLE,\n DEFAULT_SUBAGENT_BASELINE,\n} from './director-prompts.js';\n\n/**\n * Director — high-level orchestrator that owns a `MultiAgentCoordinator`,\n * a `FleetBus`, and a `FleetUsageAggregator`. Exposes a small imperative\n * API (`spawn`, `assign`, `awaitTasks`, `terminate`, `status`, `usage`)\n * that's easy to test, and a `tools()` factory that wraps the same API\n * as agent-callable `Tool`s so an LLM can drive the orchestration.\n *\n * This class is intentionally *not* an `Agent`. It's a coordinator +\n * observability surface. To make it LLM-driven, construct an Agent\n * with `director.tools()` registered. That keeps the construction\n * symmetric with how other agents are built and avoids smuggling a\n * heavy LLM dependency into core just for the director path.\n */\nexport interface DirectorOptions {\n config: MultiAgentConfig;\n runner?: SubagentRunner;\n /**\n * When set, the director writes a `fleet.json` manifest to this path\n * recording every spawned subagent (id, provider, model, role, task\n * ids). Used by `wstack replay <runId>` to rehydrate a fleet. Pass an\n * absolute file path — the directory must already exist (the\n * director-session factory creates it when used together).\n */\n manifestPath?: string;\n /**\n * Optional roster used by `leaderSystemPrompt()` to render a roles\n * summary into the leader's preamble. Same shape as the roster passed\n * to `tools()` — typically the same value.\n */\n roster?: Record<string, SubagentConfig>;\n /**\n * Override the built-in fleet preamble (see `DEFAULT_DIRECTOR_PREAMBLE`).\n * Pass an empty string to suppress the preamble entirely.\n */\n directorPreamble?: string;\n /**\n * Override the built-in subagent baseline (see\n * `DEFAULT_SUBAGENT_BASELINE`). Pass an empty string to suppress.\n */\n subagentBaseline?: string;\n /**\n * Absolute path to a directory the fleet can use as a shared scratchpad\n * (read + write by every subagent). When set, the director creates it on\n * construction and `subagentSystemPrompt()` automatically injects a\n * \"Shared notes\" block telling subagents where to drop their findings.\n * This is the cheap fleet-coordination channel — agents don't need each\n * other's transcripts, just each other's conclusions.\n *\n * Convention: under a fleet run rooted at `<sessionsRoot>/<runId>/`,\n * pass `<sessionsRoot>/<runId>/shared/` here.\n */\n sharedScratchpadPath?: string;\n /**\n * Maximum number of spawns this director can perform across its\n * lifetime. Default: unlimited. Acts as a hard fleet-wide cost cap —\n * a runaway leader that keeps spawning workers gets cut off cleanly\n * instead of burning provider tokens until the user kills the\n * process. The N+1-th spawn call rejects with a `DirectorBudgetError`.\n */\n maxSpawns?: number;\n /**\n * Maximum nesting depth for spawns. The director constructed by the\n * user is at depth `spawnDepth` (default 0); any subagent that itself\n * acts as a director would construct its own `Director` with\n * `spawnDepth: parent.spawnDepth + 1`. When `spawnDepth >= maxSpawnDepth`,\n * `spawn()` rejects. Default: 2 (root director can spawn workers; a\n * worker that becomes a sub-director cannot itself spawn further).\n * This stops infinite recursive director chains from a hostile or\n * confused prompt.\n */\n maxSpawnDepth?: number;\n /**\n * Current spawn-chain depth for this director instance. Defaults to 0.\n * A nested director should pass `parent.spawnDepth + 1`. Together with\n * `maxSpawnDepth` this bounds the chain.\n */\n spawnDepth?: number;\n}\n\n/**\n * Thrown by `Director.spawn()` when a configured spawn cap (`maxSpawns`,\n * `maxSpawnDepth`) is hit. Distinct error class so callers — including\n * the `spawn_subagent` tool surface — can recognize the budget case and\n * report it cleanly instead of treating it like an unexpected failure.\n */\nexport class DirectorBudgetError extends Error {\n readonly kind: 'max_spawns' | 'max_spawn_depth';\n readonly limit: number;\n readonly observed: number;\n constructor(kind: 'max_spawns' | 'max_spawn_depth', limit: number, observed: number) {\n super(\n kind === 'max_spawns'\n ? `Director spawn budget exceeded: tried to spawn #${observed} but maxSpawns is ${limit}`\n : `Director spawn depth budget exceeded: this director is at depth ${observed} and maxSpawnDepth is ${limit}`,\n );\n this.name = 'DirectorBudgetError';\n this.kind = kind;\n this.limit = limit;\n this.observed = observed;\n }\n}\n\nexport class Director {\n readonly id: string;\n readonly fleet: FleetBus;\n readonly usage: FleetUsageAggregator;\n /**\n * Director-side bridge endpoint. Subagents are wired to the same\n * in-memory transport so the director can `ask()` them synchronously\n * and they can `send()` progress back. Exposed so external code (e.g.\n * the TUI) can subscribe to inbound messages.\n */\n readonly bridge: InMemoryAgentBridge;\n private readonly transport: InMemoryBridgeTransport;\n private readonly coordinator: DefaultMultiAgentCoordinator;\n /** Resolves with the matching `TaskResult` the first time the\n * coordinator emits `task.completed` for a given task id. Each entry\n * is created lazily on first poll/await and cleared once consumed. */\n private readonly taskWaiters = new Map<string, {\n promise: Promise<TaskResult>;\n resolve: (r: TaskResult) => void;\n }>();\n /** Cache of completed results in case the consumer asks AFTER the\n * coordinator already fired the event — `awaitTasks(['t-1'])` after\n * t-1 finished should resolve immediately, not hang. */\n private readonly completed = new Map<string, TaskResult>();\n /** Per-subagent provider/model metadata, captured at spawn time so the\n * FleetUsageAggregator's metaLookup can surface readable rows. */\n private readonly subagentMeta = new Map<string, { provider?: string; model?: string }>();\n private readonly priceLookups = new Map<string, { input?: number; output?: number; cacheRead?: number; cacheWrite?: number }>();\n /** Bridge endpoints we created per subagent (so we can `stop()` them\n * on shutdown and free transport subscriptions). */\n private readonly subagentBridges = new Map<string, InMemoryAgentBridge>();\n /** Tracks per-spawn config + assigned task ids for manifest writing. */\n private readonly manifestEntries = new Map<string, {\n subagentId: string;\n name: string;\n role?: string;\n provider?: string;\n model?: string;\n taskIds: string[];\n }>();\n private readonly manifestPath?: string;\n private readonly roster?: Record<string, SubagentConfig>;\n private readonly directorPreamble: string;\n private readonly subagentBaseline: string;\n /** Absolute path to the fleet's shared scratchpad directory, or null\n * when none was configured. Exposed as a readonly getter for callers\n * that need to surface the path to the user (e.g. the CLI logging\n * the location after `--director` boots). */\n readonly sharedScratchpadPath: string | null;\n /** Spawn cap (lifetime total). Infinity means unlimited. */\n readonly maxSpawns: number;\n /** Nesting cap. The N-th director in a chain has `spawnDepth = N-1`. */\n readonly maxSpawnDepth: number;\n /** This director's position in a director chain. Root director = 0. */\n readonly spawnDepth: number;\n /** Live spawn counter for `maxSpawns` enforcement. */\n private spawnCount = 0;\n\n constructor(opts: DirectorOptions) {\n this.id = opts.config.coordinatorId || randomUUID();\n this.manifestPath = opts.manifestPath;\n this.roster = opts.roster;\n this.directorPreamble = opts.directorPreamble ?? DEFAULT_DIRECTOR_PREAMBLE;\n this.subagentBaseline = opts.subagentBaseline ?? DEFAULT_SUBAGENT_BASELINE;\n this.sharedScratchpadPath = opts.sharedScratchpadPath ?? null;\n this.maxSpawns = opts.maxSpawns ?? Infinity;\n this.maxSpawnDepth = opts.maxSpawnDepth ?? 2;\n this.spawnDepth = opts.spawnDepth ?? 0;\n if (this.sharedScratchpadPath) {\n // Create the directory eagerly so subagents that try to write\n // there on first iteration don't trip on ENOENT. Fire-and-forget;\n // any failure surfaces later when an agent actually writes.\n void fsp.mkdir(this.sharedScratchpadPath, { recursive: true }).catch(() => undefined);\n }\n this.transport = new InMemoryBridgeTransport();\n this.bridge = new InMemoryAgentBridge(\n { agentId: this.id, coordinatorId: this.id },\n this.transport,\n );\n this.fleet = new FleetBus();\n this.usage = new FleetUsageAggregator(\n this.fleet,\n (id) => this.priceLookups.get(id),\n (id) => this.subagentMeta.get(id),\n );\n this.coordinator = new DefaultMultiAgentCoordinator(\n { ...opts.config, coordinatorId: this.id },\n { runner: opts.runner },\n );\n // Mirror coordinator completion events into the waiter table. This\n // lets `awaitTasks([...])` resolve on the *next* completion event\n // without polling — and the `completed` cache covers the case where\n // a caller asks after the fact.\n this.coordinator.on('task.completed', (payload: { task: TaskSpec; result: TaskResult }) => {\n const r = payload.result;\n this.completed.set(r.taskId, r);\n const waiter = this.taskWaiters.get(r.taskId);\n if (waiter) {\n waiter.resolve(r);\n this.taskWaiters.delete(r.taskId);\n }\n });\n }\n\n /**\n * Spawn a subagent. Identical to the coordinator's `spawn()` but\n * captures provider/model metadata for the usage aggregator and\n * lets the FleetBus attach to the runner's EventBus when the task\n * actually runs (see `attachSubagentBus`).\n *\n * Caller-supplied `priceLookup` is optional but recommended — without\n * it the `cost` column in `usage.snapshot()` stays at 0.\n */\n async spawn(\n config: SubagentConfig,\n priceLookup?: { input?: number; output?: number; cacheRead?: number; cacheWrite?: number },\n ): Promise<string> {\n // Enforce safety caps BEFORE touching the coordinator — a refused\n // spawn must not leak partial state into the manifest or fleet bus.\n if (this.spawnDepth >= this.maxSpawnDepth) {\n throw new DirectorBudgetError('max_spawn_depth', this.maxSpawnDepth, this.spawnDepth);\n }\n if (this.spawnCount >= this.maxSpawns) {\n throw new DirectorBudgetError('max_spawns', this.maxSpawns, this.spawnCount + 1);\n }\n this.spawnCount += 1;\n const result = await this.coordinator.spawn(config);\n this.subagentMeta.set(result.subagentId, {\n provider: config.provider,\n model: config.model,\n });\n if (priceLookup) this.priceLookups.set(result.subagentId, priceLookup);\n // Auto-wire a bridge per spawn — same transport as the director, so\n // `director.ask(subagentId, …)` and the subagent's own `bridge.send()`\n // round-trip without the caller having to plumb anything. Runners\n // grab their bridge from `ctx.bridge` (already populated by the\n // coordinator from `subagent.context.parentBridge`).\n const subagentBridge = new InMemoryAgentBridge(\n { agentId: result.subagentId, coordinatorId: this.id },\n this.transport,\n );\n this.coordinator.setSubagentBridge(result.subagentId, subagentBridge);\n this.subagentBridges.set(result.subagentId, subagentBridge);\n // Record for manifest. Task ids attach as they're assigned via\n // `assign()` below.\n this.manifestEntries.set(result.subagentId, {\n subagentId: result.subagentId,\n name: config.name,\n role: config.role,\n provider: config.provider,\n model: config.model,\n taskIds: [],\n });\n return result.subagentId;\n }\n\n /**\n * Synchronously ask a subagent something via the bridge. Sends a\n * `task` message addressed to the subagent and awaits a matching\n * reply (matched by message id). Subagent runners that handle these\n * requests subscribe to `ctx.bridge` and reply with a message whose\n * `id` equals the incoming request's id (see `InMemoryAgentBridge`'s\n * `request<T>` implementation).\n *\n * Returns the response payload directly (the bridge wrapper is\n * unwrapped for ergonomics). Times out after `timeoutMs` (default\n * matches the bridge's own default of 30s) — surface those rejections\n * to the caller as actionable errors instead of letting tools hang.\n */\n async ask<T = unknown>(\n subagentId: string,\n payload: unknown,\n timeoutMs?: number,\n ): Promise<T> {\n if (!this.subagentBridges.has(subagentId)) {\n throw new Error(\n `ask: unknown subagent \"${subagentId}\" (spawn() it first; current fleet: ${Array.from(this.subagentBridges.keys()).join(', ') || '(empty)'})`,\n );\n }\n const msg: BridgeMessage = {\n id: randomUUID(),\n type: 'task',\n from: this.id,\n to: subagentId,\n payload,\n timestamp: Date.now(),\n priority: 'normal',\n };\n const reply = await this.bridge.request<T>(msg, timeoutMs);\n return reply.payload;\n }\n\n /**\n * Read completed task results and format them as a structured text\n * block the director's LLM can paste into its own context. The\n * Director keeps every completed `TaskResult` in `completed` so this\n * is a pure read — no bridge round-trip, cheap to call.\n *\n * The returned string is intentionally markdown-flavored: headers per\n * subagent, a one-line meta row (iter / tools / ms), and the task's\n * result text. Pass `style: 'json'` for a programmatic shape instead\n * (useful when the director model is doing structured-output work).\n */\n rollUp(taskIds: string[], style: 'markdown' | 'json' = 'markdown'): string {\n const rows = taskIds.map((id) => this.completed.get(id)).filter(\n (r): r is TaskResult => !!r,\n );\n if (style === 'json') {\n return JSON.stringify(\n rows.map((r) => ({\n taskId: r.taskId,\n subagentId: r.subagentId,\n status: r.status,\n iterations: r.iterations,\n toolCalls: r.toolCalls,\n durationMs: r.durationMs,\n result: r.result,\n error: r.error,\n })),\n null,\n 2,\n );\n }\n if (rows.length === 0) {\n return '_No completed tasks for the requested ids — try waiting first._';\n }\n const lines: string[] = [];\n for (const r of rows) {\n const meta = this.subagentMeta.get(r.subagentId);\n const tag = meta?.provider && meta?.model ? ` · ${meta.provider}/${meta.model}` : '';\n lines.push(`### ${r.subagentId}${tag}`);\n lines.push(\n `_${r.status} — ${r.iterations} iter · ${r.toolCalls} tools · ${r.durationMs}ms_`,\n );\n lines.push('');\n if (r.error) lines.push(`**Error:** ${r.error}`);\n else if (typeof r.result === 'string') lines.push(r.result);\n else if (r.result !== undefined) lines.push('```json\\n' + JSON.stringify(r.result, null, 2) + '\\n```');\n else lines.push('_(no output)_');\n lines.push('');\n }\n return lines.join('\\n').trimEnd();\n }\n\n /**\n * Write the fleet manifest to `manifestPath`. Returns the path written\n * or null when no path was configured. Captures every spawn + its\n * assigned tasks — paired with per-subagent JSONLs, this is enough to\n * replay an entire director run.\n */\n async writeManifest(): Promise<string | null> {\n if (!this.manifestPath) return null;\n const manifest = {\n directorRunId: this.id,\n writtenAt: new Date().toISOString(),\n children: Array.from(this.manifestEntries.values()).map((e) => ({\n ...e,\n // Surface final status from `completed` when available — manifest\n // becomes much more useful for replay when it carries the\n // success/failure state.\n results: e.taskIds.map((tid) => {\n const r = this.completed.get(tid);\n return r ? {\n taskId: tid,\n status: r.status,\n iterations: r.iterations,\n toolCalls: r.toolCalls,\n durationMs: r.durationMs,\n } : { taskId: tid, status: 'pending' as const };\n }),\n })),\n usage: this.usage.snapshot(),\n };\n await fsp.mkdir(path.dirname(this.manifestPath), { recursive: true });\n await fsp.writeFile(this.manifestPath, JSON.stringify(manifest, null, 2), { mode: 0o600 });\n return this.manifestPath;\n }\n\n /**\n * Tear down the director: stop every subagent, close every bridge\n * endpoint, and (when configured) write the final manifest. Idempotent\n * — calling shutdown twice is a no-op on the second invocation.\n */\n async shutdown(): Promise<void> {\n await this.coordinator.stopAll();\n for (const b of this.subagentBridges.values()) {\n await b.stop().catch(() => undefined);\n }\n this.subagentBridges.clear();\n await this.bridge.stop().catch(() => undefined);\n if (this.manifestPath) await this.writeManifest().catch(() => undefined);\n }\n\n /**\n * Hand a task to the coordinator. Returns the assigned task id so\n * callers can wait on it via `awaitTasks([id])`. The coordinator's\n * concurrency limit applies — the task may queue before running.\n */\n async assign(task: TaskSpec): Promise<string> {\n const taskWithId: TaskSpec = task.id ? task : { ...task, id: randomUUID() };\n if (task.subagentId) {\n const entry = this.manifestEntries.get(task.subagentId);\n if (entry) entry.taskIds.push(taskWithId.id);\n }\n await this.coordinator.assign(taskWithId);\n return taskWithId.id;\n }\n\n /**\n * Block until every task id resolves. Returns results in the same\n * order as the input. If any task hasn't completed by the time this\n * is called, the promise hangs until it does — pair with a timeout\n * at the caller if that's a concern. Resolves immediately for ids\n * whose results were already cached.\n */\n awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\n return Promise.all(taskIds.map((id) => {\n const cached = this.completed.get(id);\n if (cached) return cached;\n const existing = this.taskWaiters.get(id);\n if (existing) return existing.promise;\n let resolve!: (r: TaskResult) => void;\n const promise = new Promise<TaskResult>((res) => { resolve = res; });\n this.taskWaiters.set(id, { promise, resolve });\n return promise;\n }));\n }\n\n async terminate(subagentId: string): Promise<void> {\n await this.coordinator.stop(subagentId);\n }\n\n async terminateAll(): Promise<void> {\n await this.coordinator.stopAll();\n }\n\n status(): CoordinatorStatus {\n return this.coordinator.getStatus();\n }\n\n /**\n * Subscribe to coordinator events. Currently only `task.completed` is\n * exposed (the others are internal lifecycle). Returns an unsubscribe\n * function. External callers (e.g. the CLI's `MultiAgentHost`) use this\n * to drive their own pending/results tracking without poking the\n * coordinator directly.\n */\n on(\n event: 'task.completed',\n handler: (payload: { task: TaskSpec; result: TaskResult }) => void,\n ): () => void {\n // EventEmitter.on returns `this`; wrap so callers get a stable\n // unsubscribe closure (matches the rest of our event API).\n this.coordinator.on(event, handler);\n return () => {\n this.coordinator.off(event, handler);\n };\n }\n\n /**\n * Snapshot of every task that has resolved (success, failed, timeout,\n * stopped) since the director started. Returned in completion order\n * via the internal map's iteration order. Used by `/fleet status` to\n * paint the completed table without reaching into private state.\n */\n completedResults(): TaskResult[] {\n return Array.from(this.completed.values());\n }\n\n snapshot(): FleetUsage {\n return this.usage.snapshot();\n }\n\n /**\n * Compose the leader/director-agent system prompt: fleet preamble +\n * (optional) roster summary + user base prompt. Pass the result to your\n * leader Agent's `ctx.systemPrompt` when constructing it.\n *\n * `basePrompt` defaults to `config.leaderSystemPrompt` so callers can\n * use the no-arg form when the multi-agent config already carries it.\n */\n leaderSystemPrompt(basePrompt?: string): string {\n return composeDirectorPrompt({\n basePrompt: basePrompt ?? this.coordinator.config.leaderSystemPrompt,\n directorPreamble: this.directorPreamble,\n rosterSummary: this.roster ? rosterSummaryFromConfigs(this.roster) : undefined,\n });\n }\n\n /**\n * Compose a subagent's system prompt for a given `SubagentConfig`:\n * baseline + role + task + per-spawn override. Returned by value — does\n * not mutate the config. Factories (the user-supplied `AgentFactory`)\n * should call this when building each subagent's Agent so the bridge\n * contract, role context, and override are all surfaced.\n *\n * When `taskBrief` is omitted the Task section is dropped. Pass the\n * actual task description here to reinforce it in the system prompt\n * (the runner already passes it as user input — duplicating in the\n * system prompt is optional but improves anchoring on small models).\n */\n subagentSystemPrompt(config: SubagentConfig, taskBrief?: string): string {\n return composeSubagentPrompt({\n baseline: this.subagentBaseline,\n role: config.prompt,\n task: taskBrief,\n sharedScratchpad: this.sharedScratchpadPath ?? undefined,\n override: config.systemPromptOverride,\n });\n }\n\n /**\n * Build the tool set the LLM-driven director uses to orchestrate.\n * Returns an array of `Tool` definitions; register these on the\n * director's `Agent` to expose `spawn_subagent`, `assign_task`, etc.\n * Each tool's `execute()` delegates straight to the matching method\n * above.\n *\n * Tools all carry `permission: 'auto'` — the *user* has already\n * approved running the director when they kicked off the run, so\n * gating individual orchestration calls behind a confirm prompt\n * would just be noise. The actual subagent tools they spawn are\n * still permission-checked normally.\n */\n tools(roster?: Record<string, SubagentConfig>): Tool[] {\n const t: Tool[] = [\n makeSpawnTool(this, roster),\n makeAssignTool(this),\n makeAwaitTasksTool(this),\n makeAskTool(this),\n makeRollUpTool(this),\n makeTerminateTool(this),\n makeFleetStatusTool(this),\n makeFleetUsageTool(this),\n ];\n return t;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Director-facing tool factories.\n//\n// Each tool's input schema is intentionally minimal — the director model\n// reads the descriptions and gets clean structured shapes. We avoid deep\n// nested schemas because they confuse smaller models.\n\nfunction makeSpawnTool(director: Director, roster?: Record<string, SubagentConfig>): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n role: { type: 'string', description: 'Roster role id (preferred). When set, the spawn uses the matching config from the roster and ignores other fields.' },\n name: { type: 'string', description: 'Display name for the subagent. Required when not using roster.' },\n provider: { type: 'string', description: 'Provider id (e.g. \"anthropic\", \"openai\"). Defaults to the leader provider when omitted.' },\n model: { type: 'string', description: 'Model id within the provider. Defaults to the leader model when omitted.' },\n systemPromptOverride: { type: 'string', description: 'Extra prompt text appended after the role-base prompt.' },\n maxIterations: { type: 'number' },\n maxToolCalls: { type: 'number' },\n maxCostUsd: { type: 'number' },\n },\n required: [],\n };\n return {\n name: 'spawn_subagent',\n description: 'Create a new subagent under this director. Returns the subagent id. Use this when you need a worker with a specific provider, model, or role to handle a piece of the plan.',\n usageHint: 'Either pass `role` (matches the roster) OR pass `name` + optional `provider`/`model`. Returns `{ subagentId }`.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = (input ?? {}) as Record<string, unknown>;\n const role = typeof i.role === 'string' ? i.role : undefined;\n const base: SubagentConfig | undefined = role && roster ? roster[role] : undefined;\n if (role && !base) {\n return { error: `unknown role \"${role}\". roster has: ${roster ? Object.keys(roster).join(', ') : '(empty)'}` };\n }\n const cfg: SubagentConfig = {\n ...(base ?? { name: (i.name as string) ?? 'subagent' }),\n };\n if (typeof i.name === 'string') cfg.name = i.name;\n if (typeof i.provider === 'string') cfg.provider = i.provider;\n if (typeof i.model === 'string') cfg.model = i.model;\n if (typeof i.systemPromptOverride === 'string') cfg.systemPromptOverride = i.systemPromptOverride;\n if (typeof i.maxIterations === 'number') cfg.maxIterations = i.maxIterations;\n if (typeof i.maxToolCalls === 'number') cfg.maxToolCalls = i.maxToolCalls;\n if (typeof i.maxCostUsd === 'number') cfg.maxCostUsd = i.maxCostUsd;\n try {\n const subagentId = await director.spawn(cfg);\n return { subagentId, provider: cfg.provider, model: cfg.model, name: cfg.name };\n } catch (err) {\n // Surface DirectorBudgetError (and any other spawn failure) as a\n // structured `{ error, kind }` payload so the leader model can\n // read the cap and replan — throwing would tear down the whole\n // tool call and give the model no signal to recover from.\n if (err instanceof DirectorBudgetError) {\n return { error: err.message, kind: err.kind, limit: err.limit, observed: err.observed };\n }\n return { error: err instanceof Error ? err.message : String(err) };\n }\n },\n };\n}\n\nfunction makeAssignTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: { type: 'string', description: 'Target subagent id. Required.' },\n description: { type: 'string', description: 'The task in natural language — what you want this subagent to do.' },\n maxToolCalls: { type: 'number', description: 'Optional per-task tool-call budget override.' },\n timeoutMs: { type: 'number', description: 'Optional per-task timeout in ms.' },\n },\n required: ['subagentId', 'description'],\n };\n return {\n name: 'assign_task',\n description: 'Hand a task to a previously spawned subagent. Returns the task id — pass it to `await_tasks` to block on completion.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { subagentId: string; description: string; maxToolCalls?: number; timeoutMs?: number };\n const task: TaskSpec = {\n id: randomUUID(),\n description: i.description,\n subagentId: i.subagentId,\n maxToolCalls: i.maxToolCalls,\n timeoutMs: i.timeoutMs,\n };\n const taskId = await director.assign(task);\n return { taskId, subagentId: i.subagentId };\n },\n };\n}\n\nfunction makeAwaitTasksTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n taskIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'One or more task ids returned by `assign_task`. The call blocks until every id resolves.',\n },\n },\n required: ['taskIds'],\n };\n return {\n name: 'await_tasks',\n description: 'Block until every named task completes. Returns the array of TaskResult — use this to gather subagent output before deciding the next step.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { taskIds: string[] };\n const results = await director.awaitTasks(i.taskIds);\n return { results };\n },\n };\n}\n\nfunction makeAskTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: { type: 'string', description: 'Subagent to ask. Must be a previously spawned id.' },\n question: { type: 'string', description: 'The question or instruction. Sent as the bridge message payload.' },\n timeoutMs: { type: 'number', description: 'Optional timeout in ms (default 30s).' },\n },\n required: ['subagentId', 'question'],\n };\n return {\n name: 'ask_subagent',\n description: 'Synchronously ask a subagent a question. Blocks until the subagent replies via the bridge (or the timeout fires). Use this when you need a one-shot answer without spawning a fresh task.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { subagentId: string; question: string; timeoutMs?: number };\n try {\n const answer = await director.ask(i.subagentId, { question: i.question }, i.timeoutMs);\n return { ok: true, answer };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n },\n };\n}\n\nfunction makeRollUpTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n taskIds: {\n type: 'array',\n items: { type: 'string' },\n description: 'Completed task ids to aggregate. Pass the ids returned by previous `assign_task` calls.',\n },\n style: {\n type: 'string',\n enum: ['markdown', 'json'],\n description: 'Output flavor — markdown (default) for in-prompt summarization, json for structured downstream processing.',\n },\n },\n required: ['taskIds'],\n };\n return {\n name: 'roll_up',\n description: 'Aggregate completed task results into a single formatted summary. Use this after `await_tasks` to fold subagent outputs back into the director\\'s context before deciding the next step.',\n permission: 'auto',\n mutating: false,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { taskIds: string[]; style?: 'markdown' | 'json' };\n const summary = director.rollUp(i.taskIds, i.style ?? 'markdown');\n return { summary, count: i.taskIds.length };\n },\n };\n}\n\nfunction makeTerminateTool(director: Director): Tool {\n const inputSchema: JSONSchema = {\n type: 'object',\n properties: {\n subagentId: { type: 'string', description: 'Subagent to abort.' },\n },\n required: ['subagentId'],\n };\n return {\n name: 'terminate_subagent',\n description: 'Forcibly abort a subagent. Use sparingly — prefer waiting on the natural budget to expire. The current task (if any) ends with status \"stopped\".',\n permission: 'auto',\n mutating: true,\n inputSchema,\n async execute(input: unknown) {\n const i = input as { subagentId: string };\n await director.terminate(i.subagentId);\n return { ok: true };\n },\n };\n}\n\nfunction makeFleetStatusTool(director: Director): Tool {\n return {\n name: 'fleet_status',\n description: 'Snapshot of the fleet — every subagent\\'s current status, pending vs. completed task counts, and the running total iteration count. Cheap; call freely.',\n permission: 'auto',\n mutating: false,\n inputSchema: { type: 'object', properties: {}, required: [] },\n async execute() {\n return director.status();\n },\n };\n}\n\nfunction makeFleetUsageTool(director: Director): Tool {\n return {\n name: 'fleet_usage',\n description: 'Token + cost breakdown across the fleet, per-subagent and totals. Use this to reason about which workers to assign costly tasks to or when to wrap up to stay within budget.',\n permission: 'auto',\n mutating: false,\n inputSchema: { type: 'object', properties: {}, required: [] },\n async execute() {\n return director.snapshot();\n },\n };\n}\n","import * as path from 'node:path';\nimport type { SessionStore, SessionWriter } from '../types/session.js';\nimport { DefaultSessionStore } from './session-store.js';\n\n/**\n * Per-subagent session factory.\n *\n * Director runs produce many parallel transcripts — one per spawned\n * subagent — and we want them all rooted under the same director-run\n * directory so a future `wstack replay <runId>` can rehydrate the whole\n * fleet from a single tree.\n *\n * The factory builds (or accepts) a `SessionStore` whose `dir` points at\n * `<sessionsRoot>/<directorRunId>/`, and returns a small `create()`\n * function that the orchestration layer calls per-spawn. Each call\n * yields a fresh `SessionWriter` whose JSONL file lives in that\n * directory, named by either the caller-supplied `subagentId` (preferred,\n * so the file name is human-readable) or a derived id.\n *\n * **Why a thin factory instead of plumbing options through every spawn\n * site?** Because the director is the only caller that needs this\n * isolation pattern, and shoving `sessionStore` options into\n * `SubagentConfig` would leak storage details into a config shape that\n * agents and the coordinator have no business knowing about.\n */\nexport interface DirectorSessionFactoryOptions {\n /**\n * Either a parent directory where `<directorRunId>/` will be created,\n * or a pre-built `SessionStore` whose `dir` already points at the\n * director run directory. Tests pass an in-memory store for isolation;\n * production code passes the path under `~/.wrongstack/sessions/`.\n */\n store?: SessionStore;\n sessionsRoot?: string;\n /**\n * Director run id — namespaces all subagent JSONLs under one folder.\n * Defaults to a timestamped id; supplied explicitly when resuming a\n * prior fleet manifest.\n */\n directorRunId?: string;\n}\n\nexport interface DirectorSessionFactory {\n /** Absolute directory where this director run's transcripts live. */\n readonly dir: string;\n /** The director run id used to namespace the directory. */\n readonly directorRunId: string;\n /**\n * Create a fresh `SessionWriter` for the named subagent. Each\n * subagent gets its own JSONL file. The writer's `id` matches the\n * supplied `subagentId` so disk paths line up with in-memory ids.\n */\n createSubagentSession(args: {\n subagentId: string;\n provider?: string;\n model?: string;\n title?: string;\n }): Promise<SessionWriter>;\n}\n\n/**\n * Build a `DirectorSessionFactory`. Pass either a pre-configured\n * `SessionStore` (tests) or a `sessionsRoot` path (production). When\n * neither is supplied the factory throws — there's no sane default for\n * \"where do these JSONLs live\".\n */\nexport function makeDirectorSessionFactory(\n opts: DirectorSessionFactoryOptions,\n): DirectorSessionFactory {\n const runId = opts.directorRunId\n ?? `${new Date().toISOString().replace(/[:.]/g, '-')}-director`;\n\n let store: SessionStore;\n let dir: string;\n if (opts.store) {\n // The caller wired its own store — we trust them on where the\n // files land. We can't introspect a `SessionStore`'s directory\n // without a typed accessor, so we report the run id and let the\n // caller record the path separately if needed.\n store = opts.store;\n dir = opts.sessionsRoot ? path.join(opts.sessionsRoot, runId) : '(caller-managed)';\n } else if (opts.sessionsRoot) {\n dir = path.join(opts.sessionsRoot, runId);\n store = new DefaultSessionStore({ dir });\n } else {\n throw new Error(\n 'makeDirectorSessionFactory requires either `store` or `sessionsRoot`',\n );\n }\n\n return {\n dir,\n directorRunId: runId,\n async createSubagentSession({ subagentId, provider, model, title }) {\n // Per-subagent JSONL — DefaultSessionStore generates the file name\n // from the metadata `id`, so we pass `subagentId` directly to\n // keep disk artifacts human-readable.\n return store.create({\n id: subagentId,\n title: title ?? subagentId,\n provider: provider ?? 'unknown',\n model: model ?? 'unknown',\n });\n },\n };\n}\n","/**\n * Pre-built subagent role configurations for the WrongStack fleet.\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\n * for the director's roster.\n */\nimport type { SubagentConfig } from '../../types/multi-agent.js';\n\n/**\n * Audit Log Agent — analyzes session logs, event streams, and traces.\n * Use for: post-mortems, trend analysis, operational insights.\n */\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\n id: 'audit-log',\n name: 'Audit Log',\n role: 'audit-log',\n prompt: `You are the Audit Log agent. Your job is to analyze structured JSONL\nsession logs and produce actionable markdown reports.\n\nScope:\n- Parse session logs (iteration counts, tool calls, errors, usage)\n- Detect repeated failure patterns across multiple runs\n- Identify tool usage anomalies (over-use, failures, unexpected chains)\n- Track token consumption trends\n- Generate structured audit reports with severity ratings\n\nInput format you accept:\n{ \"task\": \"analyze | report | trends\", \"sessionPath\": \"<path>\", \"focus\": \"errors | tools | usage | all\" }\n\nOutput: Markdown audit report with sections:\n- ## Summary (totals, error rate)\n- ## Top Errors (count + context)\n- ## Tool Usage (table with calls, failures, avg duration)\n- ## Anomalies (pattern → severity)\n\nWorking rules:\n- Never fabricate numbers — read the actual logs first\n- Always include file:line references for errors\n- If sessionPath is missing, ask the director to provide it\n- Report confidence level: high (>90% accuracy), medium, low`,\n\n maxIterations: 50,\n maxToolCalls: 200,\n timeoutMs: 120_000,\n};\n\n/**\n * Bug Hunter Agent — systematic bug and code smell detection.\n * Use for: pre-refactoring health checks, code review, regression prevention.\n */\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\n id: 'bug-hunter',\n name: 'Bug Hunter',\n role: 'bug-hunter',\n prompt: `You are the Bug Hunter agent. Your job is to systematically scan\nsource code for bugs, anti-patterns, and code smells using pattern matching\nand heuristics. Output a prioritized hit list with file:line references.\n\nScope:\n- Detect common bug patterns (uncaught errors, resource leaks, race conditions)\n- Identify anti-patterns (callback hell, God objects, circular deps)\n- Find TypeScript-specific issues (unsafe any, missing null checks, branded types)\n- Flag security-sensitive constructs (eval, innerHTML, hardcoded secrets)\n- Rank findings: critical > high > medium > low\n\nInput format you accept:\n{ \"task\": \"scan | hunt | check\", \"paths\": [\"src/**/*.ts\"], \"focus\": \"bugs | patterns | security | all\", \"severityThreshold\": \"medium\" }\n\nOutput: Markdown bug hunt report:\n- ## Critical (must fix first)\n- ## High (should fix)\n- ## Medium\n- ## Low (consider)\nEach entry: **[TYPE]** \\`file:line\\` — description + suggested fix\n\nBug pattern reference you know:\n| Pattern | Regex hint | Severity |\n|---------|------------|----------|\n| Uncaught promise | /\\.then\\\\(.*\\\\)/ without catch | high |\n| Event leak | on\\\\( without off/removeListener | high |\n| Hardcoded secret | [a-zA-Z0-9/_-]{20,} in config files | critical |\n| unsafe any | : any\\\\b or <any> | medium |\n| innerHTML | innerHTML\\\\s*= | high |\n\nWorking rules:\n- Never scan node_modules — it's noise\n- Always include file:line for every finding\n- If >30% of findings are false positives, note the confidence level\n- Ask director for clarification if paths are ambiguous`,\n\n maxIterations: 80,\n maxToolCalls: 300,\n timeoutMs: 180_000,\n};\n\n/**\n * Refactor Planner Agent — structured refactoring planning.\n * Use for: large rewrites, technical debt reduction, architecture improvements.\n */\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\n id: 'refactor-planner',\n name: 'Refactor Planner',\n role: 'refactor-planner',\n prompt: `You are the Refactor Planner agent. Your job is to analyze code\nstructure and produce a concrete, phased refactoring plan with risk\nassessment, dependency ordering, and rollback strategy.\n\nScope:\n- Map module-level dependencies (import graph)\n- Identify coupling hotspots (high fan-in/out modules)\n- Assess refactoring risk by complexity and test coverage\n- Generate phased plans with checkpoint milestones\n- Produce diff-friendly task lists (one task = one concern)\n\nInput format you accept:\n{ \"task\": \"plan | assess | roadmap\", \"target\": \"src/core\", \"constraint\": \"no-breaking-changes | minimal-downtime | full-rewrite\", \"focus\": \"architecture | performance | maintainability\" }\n\nOutput: Markdown refactor plan:\n- ## Phase 1: Low Risk / High Payoff (do first)\n Table: | # | Task | Module | Risk | Est. Time |\n- ## Phase 2: Medium Risk\n- ## Phase 3: High Risk (requires full regression)\n- ## Dependency Graph (abbreviated ASCII)\n- ## Rollback Strategy\n- ## Exit Criteria (checkbox list)\n\nRisk scoring criteria:\n| Factor | Low | Medium | High |\n|--------|-----|--------|------|\n| Cyclomatic complexity | <10 | 10-20 | >20 |\n| Test coverage | >80% | 50-80% | <50% |\n| Fan-out (imports) | <5 | 5-15 | >15 |\n\nWorking rules:\n- Always include rollback strategy — every refactor can fail\n- Merge tasks that take <1h into a single phase\n- Respect team constraints (reviewer availability, parallelization)\n- Never plan without analyzing the actual code first`,\n\n maxIterations: 60,\n maxToolCalls: 250,\n timeoutMs: 150_000,\n};\n\n/**\n * Security Scanner Agent — vulnerability and secret detection.\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\n */\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\n id: 'security-scanner',\n name: 'Security Scanner',\n role: 'security-scanner',\n prompt: `You are the Security Scanner agent. Your job is to scan code,\nconfigs, and dependencies for security issues from hardcoded secrets to\nsupply chain risks.\n\nScope:\n- Detect hardcoded secrets: API keys, tokens, passwords, private keys\n- Find injection vectors: eval, innerHTML, SQL concat, shell injection\n- Identify insecure patterns: weak crypto, hardcoded IVs, disabled TLS\n- Scan dependencies for known CVEs (via npm/pnpm audit)\n- Flag supply chain risks: postinstall hooks, unverified scripts, .npmrc\n\nInput format you accept:\n{ \"task\": \"scan | audit | secrets | dependencies\", \"paths\": [\"src\", \"config\"], \"depth\": \"quick | normal | deep\" }\n\nOutput: Markdown security report:\n- ## CRITICAL: Secrets Found (with code snippets)\n- ## HIGH: Injection Vectors\n- ## MEDIUM: Insecure Patterns\n- ## Dependency Issues (CVE list)\n- ## Summary table (severity → count)\n- ## Remediation Checklist (with checkboxes)\n\nSecret patterns you detect:\n| Pattern | Example | Severity |\n|---------|---------|----------|\n| AWS Access Key | AKIAIOSFODNN7EXAMPLE | critical |\n| AWS Secret Key | [a-zA-Z0-9/+=]{40} base64 | critical |\n| GitHub Token | ghp_[a-zA-Z0-9]{36} | critical |\n| Private Key PEM | -----BEGIN.*PRIVATE KEY----- | critical |\n| JWT | eyJ[a-zA-Z0-9_-]+ | high |\n\nInjection patterns:\n| Construct | Safe alternative |\n|-----------|-----------------|\n| eval(str) | new Function() or parse |\n| innerHTML = x | textContent or sanitize |\n| exec(\\`cmd \\${x}\\`) | execFile with args array |\n\nWorking rules:\n- Never scan node_modules — use npm audit instead\n- Always provide remediation steps, not just findings\n- Verify regex-based secrets before flagging (false positive risk)\n- When in doubt, flag as medium rather than ignoring potential issues`,\n\n maxIterations: 70,\n maxToolCalls: 280,\n timeoutMs: 160_000,\n};\n\n/** All pre-built agents in a map for easy lookup by role. */\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\n 'audit-log': AUDIT_LOG_AGENT,\n 'bug-hunter': BUG_HUNTER_AGENT,\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\n 'security-scanner': SECURITY_SCANNER_AGENT,\n};\n\n/** Quick-access list for spawning all at once. */\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);","import type { Agent, RunResult } from '../core/agent.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { DoneCondition } from '../types/multi-agent.js';\r\nimport { toWrongStackError } from '../types/errors.js';\r\n\r\ntype AutonomousResult = RunResult & { toolCalls: number; reason?: string };\r\n\r\nexport interface DoneCheckResult {\r\n done: boolean;\r\n reason?: string;\r\n iterations: number;\r\n toolCalls: number;\r\n}\r\n\r\nexport class DoneConditionChecker {\r\n private readonly compiledRegex: RegExp | null;\r\n\r\n constructor(private readonly condition: DoneCondition) {\r\n this.compiledRegex =\r\n condition.type === 'output_match' && condition.pattern\r\n ? new RegExp(condition.pattern)\r\n : null;\r\n }\r\n\r\n check(state: { iterations: number; toolCalls: number; lastOutput?: string }): DoneCheckResult {\r\n switch (this.condition.type) {\r\n case 'iterations':\r\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\r\n return { done: true, reason: `max iterations (${this.condition.maxIterations}) reached`, ...state };\r\n }\r\n break;\r\n\r\n case 'tool_calls':\r\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\r\n return { done: true, reason: `max tool calls (${this.condition.maxToolCalls}) reached`, ...state };\r\n }\r\n break;\r\n\r\n case 'output_match':\r\n if (this.compiledRegex && state.lastOutput && this.compiledRegex.test(state.lastOutput)) {\r\n return { done: true, reason: `output matched pattern \"${this.condition.pattern}\"`, ...state };\r\n }\r\n break;\r\n\r\n case 'custom':\r\n // Reserved for future extension\r\n break;\r\n }\r\n\r\n return { done: false, iterations: state.iterations, toolCalls: state.toolCalls };\r\n }\r\n}\r\n\r\nexport interface AutonomousRunnerOptions {\r\n agent: Agent;\r\n context: Context;\r\n doneCondition: DoneCondition;\r\n iterationTimeoutMs?: number;\r\n onIteration?: (state: { iteration: number; toolCalls: number }) => void;\r\n onDone?: (result: AutonomousResult) => void;\r\n}\r\n\r\nexport class AutonomousRunner {\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private lastOutput?: string;\r\n private stopped = false;\r\n private readonly doneChecker: DoneConditionChecker;\r\n\r\n constructor(private readonly opts: AutonomousRunnerOptions) {\r\n this.doneChecker = new DoneConditionChecker(opts.doneCondition);\r\n }\r\n\r\n async run(): Promise<AutonomousResult> {\r\n // Subscribe to `tool.executed` so the per-tool budget (`tool_calls`\r\n // done-condition) actually counts each tool invocation rather than\r\n // each `agent.run()` call. Without this, a single iteration that\r\n // fires 5 tools only bumps the counter once, and a `maxToolCalls: 3`\r\n // budget would fire after 3 iterations (typically 3×N tools) instead\r\n // of after 3 tools. Unsubscribed in the `finally` so the listener\r\n // doesn't outlive this run instance. Mock agents in tests may pass\r\n // null/undefined for `events`; gracefully skip when missing — those\r\n // tests don't exercise the tool-count budget path.\r\n const offToolExecuted = this.opts.agent.events?.on?.('tool.executed', () => {\r\n this.toolCalls++;\r\n });\r\n try {\r\n return await this.runLoop();\r\n } finally {\r\n offToolExecuted?.();\r\n }\r\n }\r\n\r\n private async runLoop(): Promise<AutonomousResult> {\r\n while (!this.stopped) {\r\n const check = this.doneChecker.check({\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n lastOutput: this.lastOutput,\r\n });\r\n\r\n if (check.done) {\r\n const result: AutonomousResult = {\r\n status: 'done',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: check.reason,\r\n };\r\n this.opts.onDone?.(result);\r\n return result;\r\n }\r\n\r\n this.opts.onIteration?.({ iteration: this.iterations, toolCalls: this.toolCalls });\r\n\r\n const ctrl = new AbortController();\r\n const timeout = setTimeout(() => ctrl.abort(), this.opts.iterationTimeoutMs ?? 30_000);\r\n\r\n try {\r\n const result = await this.opts.agent.run(\r\n '',\r\n { signal: ctrl.signal, maxIterations: 1, executionStrategy: 'sequential' },\r\n );\r\n\r\n this.iterations++;\r\n this.lastOutput = result.finalText;\r\n // `toolCalls` is bumped by the `tool.executed` listener installed\r\n // in run() — no manual increment here.\r\n\r\n if (result.status === 'failed' || result.status === 'aborted') {\r\n const failedResult: AutonomousResult = {\r\n status: result.status,\r\n error: result.error,\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n };\r\n this.opts.onDone?.(failedResult);\r\n return failedResult;\r\n }\r\n } catch (e) {\r\n const msg = e instanceof Error ? e.message : String(e);\r\n if (msg.includes('timeout')) {\r\n const timeoutResult: AutonomousResult = {\r\n status: 'failed',\r\n error: toWrongStackError(e),\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'iteration timeout',\r\n };\r\n this.opts.onDone?.(timeoutResult);\r\n return timeoutResult;\r\n }\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n\r\n return {\r\n status: 'aborted',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'stopped externally',\r\n };\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n }\r\n}","import type { Specification, SpecAnalysis, SpecRequirement, SpecSection, SpecValidationResult } from '../types/spec.js';\r\n\r\nexport class SpecParser {\r\n\r\n parse(content: string): Specification {\r\n const lines = content.split('\\n');\r\n const sections = this.extractSections(lines);\r\n const requirements = this.extractRequirements(lines);\r\n const now = Date.now();\r\n\r\n return {\r\n id: crypto.randomUUID(),\r\n title: this.extractTitle(lines),\r\n version: this.extractVersion(lines),\r\n status: 'draft',\r\n overview: this.extractOverview(lines),\r\n sections,\r\n requirements,\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n }\r\n\r\n private extractTitle(lines: string[]): string {\r\n for (const line of lines) {\r\n const m = /^#\\s+(.+)/.exec(line.trim());\r\n if (m?.[1]) return m[1];\r\n }\r\n return 'Untitled Specification';\r\n }\r\n\r\n private extractVersion(lines: string[]): string {\r\n for (const line of lines) {\r\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\r\n if (m?.[1]) return m[1];\r\n }\r\n return '0.0.1';\r\n }\r\n\r\n private extractOverview(lines: string[]): string {\r\n const overviewLines: string[] = [];\r\n let inOverview = false;\r\n let foundHeading = false;\r\n\r\n for (const line of lines) {\r\n if (/^##\\s+Overview/i.test(line.trim())) {\r\n inOverview = true;\r\n foundHeading = true;\r\n continue;\r\n }\r\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\r\n if (inOverview) overviewLines.push(line);\r\n }\r\n\r\n return overviewLines.join('\\n').trim() || 'No overview provided';\r\n }\r\n\r\n private extractSections(lines: string[]): SpecSection[] {\r\n const sections: SpecSection[] = [];\r\n let currentSection: Partial<SpecSection> | null = null;\r\n let currentLines: string[] = [];\r\n let depth = 1;\r\n\r\n for (const line of lines) {\r\n const h2 = /^##\\s+(.+)/.exec(line.trim());\r\n const h3 = /^###\\s+(.+)/.exec(line.trim());\r\n\r\n if (h2) {\r\n if (currentSection && currentLines.length > 0) {\r\n sections.push({\r\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\r\n title: currentSection.title ?? 'Unknown',\r\n level: depth,\r\n content: currentLines.join('\\n').trim(),\r\n });\r\n }\r\n currentSection = { title: h2[1] ?? 'Unknown' };\r\n currentLines = [];\r\n depth = 2;\r\n continue;\r\n }\r\n\r\n if (h3) {\r\n currentLines.push(line);\r\n continue;\r\n }\r\n\r\n if (currentSection) {\r\n currentLines.push(line);\r\n }\r\n }\r\n\r\n if (currentSection && currentLines.length > 0) {\r\n sections.push({\r\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\r\n title: currentSection.title ?? 'Unknown',\r\n level: depth,\r\n content: currentLines.join('\\n').trim(),\r\n });\r\n }\r\n\r\n return sections;\r\n }\r\n\r\n private extractRequirements(lines: string[]): SpecRequirement[] {\r\n const requirements: SpecRequirement[] = [];\r\n let inRequirements = false;\r\n let idCounter = 0;\r\n\r\n for (const line of lines) {\r\n if (/^##\\s+Requirements/i.test(line.trim())) {\r\n inRequirements = true;\r\n continue;\r\n }\r\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\r\n\r\n if (inRequirements) {\r\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\r\n if (req) requirements.push(req);\r\n }\r\n }\r\n\r\n return requirements;\r\n }\r\n\r\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith('#')) return null;\r\n\r\n const lower = trimmed.toLowerCase();\r\n const types: SpecRequirement['type'][] = ['functional', 'non-functional', 'security', 'performance', 'ux'];\r\n let type: SpecRequirement['type'] = 'functional';\r\n for (const t of types) {\r\n if (lower.includes(`[${t}]`)) type = t;\r\n }\r\n\r\n let priority: SpecRequirement['priority'] = 'medium';\r\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\r\n priority = 'critical';\r\n } else if (trimmed.includes('[high]')) {\r\n priority = 'high';\r\n } else if (trimmed.includes('[low]')) {\r\n priority = 'low';\r\n }\r\n\r\n return {\r\n id,\r\n type,\r\n priority,\r\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\r\n acceptanceCriteria: [],\r\n };\r\n }\r\n\r\n private mapSectionType(title: string): SpecSection['type'] {\r\n const t = title.toLowerCase();\r\n if (t.includes('overview')) return 'overview';\r\n if (t.includes('requirement')) return 'requirements';\r\n if (t.includes('architect')) return 'architecture';\r\n if (t.includes('api')) return 'api';\r\n if (t.includes('data')) return 'data';\r\n if (t.includes('security')) return 'security';\r\n if (t.includes('acceptance')) return 'acceptance';\r\n return 'overview';\r\n }\r\n\r\n analyze(spec: Specification): SpecAnalysis {\r\n const gaps: string[] = [];\r\n const suggestions: string[] = [];\r\n const risks: SpecAnalysis['risks'] = [];\r\n\r\n // Check completeness\r\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\r\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\r\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\r\n\r\n if (!hasOverview) gaps.push('Missing Overview section');\r\n if (!hasRequirements) gaps.push('Missing Requirements section');\r\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\r\n\r\n if (spec.requirements.length === 0) {\r\n gaps.push('No requirements defined');\r\n suggestions.push('Add specific functional and non-functional requirements');\r\n }\r\n\r\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\r\n if (unverifiedReqs.length > 0) {\r\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\r\n suggestions.push('Define clear acceptance criteria for each requirement');\r\n }\r\n\r\n const criticalUnresolved = spec.requirements.filter(\r\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\r\n );\r\n for (const req of criticalUnresolved) {\r\n risks.push({\r\n requirement: req.id,\r\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\r\n severity: 'high',\r\n });\r\n }\r\n\r\n const completeness = Math.round(\r\n ((hasOverview ? 1 : 0) + (hasRequirements ? 1 : 0) + (hasAcceptance ? 1 : 0) +\r\n (spec.requirements.length > 0 ? 1 : 0) +\r\n (spec.sections.length > 3 ? 1 : 0)) / 5 * 100,\r\n );\r\n\r\n return {\r\n specId: spec.id,\r\n completeness,\r\n coverage: {\r\n requirements: spec.requirements.length,\r\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\r\n edgeCases: 0,\r\n errorHandling: 0,\r\n },\r\n gaps,\r\n risks,\r\n suggestions,\r\n };\r\n }\r\n\r\n validate(spec: Specification): SpecValidationResult {\r\n const errors: SpecValidationResult['errors'] = [];\r\n const warnings: SpecValidationResult['warnings'] = [];\r\n\r\n if (!spec.title.trim()) {\r\n errors.push({ path: 'title', message: 'Title is required' });\r\n }\r\n\r\n if (!spec.version.trim()) {\r\n errors.push({ path: 'version', message: 'Version is required' });\r\n }\r\n\r\n for (const req of spec.requirements) {\r\n if (!req.description.trim()) {\r\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\r\n }\r\n if (req.acceptanceCriteria.length === 0) {\r\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\r\n }\r\n }\r\n\r\n const reqIds = new Set(spec.requirements.map((r) => r.id));\r\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\r\n for (const id of blockedByIds) {\r\n if (!reqIds.has(id)) {\r\n errors.push({ path: 'requirements', message: `BlockedBy references non-existent requirement: ${id}` });\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n warnings,\r\n };\r\n }\r\n}","import type { Specification, SpecRequirement } from '../types/spec.js';\r\nimport type { TaskNode, TaskGraph, TaskType, TaskPriority } from '../types/task-graph.js';\r\nimport type { TaskTracker, TaskStore } from './task-tracker.js';\r\n\r\nexport interface TaskGeneratorOptions {\r\n taskTracker: TaskTracker;\r\n}\r\n\r\nexport interface GeneratedTask {\r\n specRequirementId?: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n estimateHours?: number;\r\n tags?: string[];\r\n}\r\n\r\nexport class TaskGenerator {\r\n constructor(private readonly opts: TaskGeneratorOptions) {}\r\n\r\n async generateFromSpec(spec: Specification): Promise<TaskGraph> {\r\n const graph = await this.opts.taskTracker.createGraph(spec.id, spec.title);\r\n\r\n const overview = spec.sections.find((s) => s.type === 'overview');\r\n if (overview) {\r\n this.opts.taskTracker.addNode({\r\n title: `Implement ${spec.title}`,\r\n description: overview.content,\r\n type: 'feature',\r\n priority: 'high',\r\n status: 'pending',\r\n });\r\n }\r\n\r\n // Group requirements by priority in a single pass, then emit in priority order.\r\n const byPriority: Record<TaskPriority, SpecRequirement[]> = {\r\n critical: [], high: [], medium: [], low: [],\r\n };\r\n for (const req of spec.requirements) {\r\n const bucket = byPriority[req.priority] ?? byPriority.medium;\r\n bucket.push(req);\r\n }\r\n\r\n const order: TaskPriority[] = ['critical', 'high', 'medium', 'low'];\r\n for (const p of order) {\r\n for (const req of byPriority[p]) {\r\n this.opts.taskTracker.addNode(this.createTaskFromRequirement(req));\r\n }\r\n }\r\n\r\n // API tasks\r\n if (spec.apiEndpoints && spec.apiEndpoints.length > 0) {\r\n const apiParent = this.opts.taskTracker.addNode({\r\n title: 'API Implementation',\r\n description: `Implement ${spec.apiEndpoints.length} API endpoints`,\r\n type: 'feature',\r\n priority: 'high',\r\n status: 'pending',\r\n });\r\n\r\n for (const endpoint of spec.apiEndpoints) {\r\n const task = this.createTaskFromEndpoint(endpoint);\r\n this.opts.taskTracker.addNode({\r\n ...task,\r\n parentId: apiParent.id,\r\n });\r\n }\r\n }\r\n\r\n // Test tasks\r\n this.opts.taskTracker.addNode({\r\n title: 'Write Tests',\r\n description: 'Comprehensive test coverage for all features',\r\n type: 'test',\r\n priority: 'high',\r\n status: 'pending',\r\n });\r\n\r\n // Documentation tasks\r\n this.opts.taskTracker.addNode({\r\n title: 'Update Documentation',\r\n description: 'Update docs for new features',\r\n type: 'docs',\r\n priority: 'medium',\r\n status: 'pending',\r\n });\r\n\r\n return graph;\r\n }\r\n\r\n private createTaskFromRequirement(req: SpecRequirement): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\r\n return {\r\n title: req.description,\r\n description: this.buildDescription(req),\r\n type: this.mapRequirementType(req.type),\r\n priority: req.priority,\r\n status: 'pending',\r\n specRequirementId: req.id,\r\n tags: [req.type, req.priority],\r\n estimateHours: this.estimateHours(req),\r\n };\r\n }\r\n\r\n private createTaskFromEndpoint(endpoint: NonNullable<Specification['apiEndpoints']>[number]): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\r\n return {\r\n title: `${endpoint.method} ${endpoint.path}`,\r\n description: endpoint.description,\r\n type: 'feature',\r\n priority: 'high',\r\n status: 'pending',\r\n tags: [endpoint.method],\r\n estimateHours: this.estimateForEndpoint(endpoint),\r\n };\r\n }\r\n\r\n private buildDescription(req: SpecRequirement): string {\r\n const lines = [\r\n req.description,\r\n '',\r\n '**Type:** ' + req.type,\r\n '**Priority:** ' + req.priority,\r\n ];\r\n\r\n if (req.acceptanceCriteria.length > 0) {\r\n lines.push('', '**Acceptance Criteria:**');\r\n for (const criterion of req.acceptanceCriteria) {\r\n lines.push(`- ${criterion}`);\r\n }\r\n }\r\n\r\n if (req.blockedBy && req.blockedBy.length > 0) {\r\n lines.push('', `**Blocked by:** ${req.blockedBy.join(', ')}`);\r\n }\r\n\r\n return lines.join('\\n');\r\n }\r\n\r\n private mapRequirementType(type: SpecRequirement['type']): TaskType {\r\n switch (type) {\r\n case 'functional': return 'feature';\r\n case 'non-functional': return 'feature';\r\n case 'security': return 'feature';\r\n case 'performance': return 'feature';\r\n case 'ux': return 'feature';\r\n default: return 'feature';\r\n }\r\n }\r\n\r\n private estimateHours(req: SpecRequirement): number {\r\n switch (req.priority) {\r\n case 'critical': return 8;\r\n case 'high': return 4;\r\n case 'medium': return 2;\r\n case 'low': return 1;\r\n default: return 2;\r\n }\r\n }\r\n\r\n private estimateForEndpoint(endpoint: NonNullable<Specification['apiEndpoints']>[number]): number {\r\n let hours = 2;\r\n if (endpoint.auth) hours += 1;\r\n if (endpoint.request) hours += 1;\r\n return hours;\r\n }\r\n\r\n async generateSubtasks(parentTaskId: string, spec: Specification): Promise<void> {\r\n const reqId = this.opts.taskTracker.getNode(parentTaskId)?.specRequirementId;\r\n if (!reqId) return;\r\n\r\n const req = spec.requirements.find((r) => r.id === reqId);\r\n if (!req) return;\r\n\r\n if (req.acceptanceCriteria.length > 0) {\r\n for (const criterion of req.acceptanceCriteria) {\r\n this.opts.taskTracker.addNode({\r\n title: criterion,\r\n description: `Verify: ${criterion}`,\r\n type: 'test',\r\n priority: 'medium',\r\n status: 'pending',\r\n parentId: parentTaskId,\r\n });\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport class DefaultTaskStore implements TaskStore {\r\n private graphs = new Map<string, TaskGraph>();\r\n\r\n async saveGraph(graph: TaskGraph): Promise<void> {\r\n this.graphs.set(graph.id, this.cloneGraph(graph));\r\n }\r\n\r\n async loadGraph(id: string): Promise<TaskGraph | null> {\r\n const g = this.graphs.get(id);\r\n return g ? this.cloneGraph(g) : null;\r\n }\r\n\r\n async listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]> {\r\n return Array.from(this.graphs.values()).map((g) => ({\r\n id: g.id,\r\n title: g.title,\r\n updatedAt: g.updatedAt,\r\n }));\r\n }\r\n\r\n async deleteGraph(id: string): Promise<void> {\r\n this.graphs.delete(id);\r\n }\r\n\r\n private cloneGraph(g: TaskGraph): TaskGraph {\r\n return {\r\n ...g,\r\n nodes: new Map(g.nodes),\r\n edges: [...g.edges],\r\n rootNodes: [...g.rootNodes],\r\n };\r\n }\r\n}","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\r\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\r\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\r\n\r\nexport interface TaskNode {\r\n id: string;\r\n title: string;\r\n description: string;\r\n type: TaskType;\r\n priority: TaskPriority;\r\n status: TaskStatus;\r\n assignee?: string;\r\n estimateHours?: number;\r\n actualHours?: number;\r\n tags?: string[];\r\n specRequirementId?: string;\r\n parentId?: string;\r\n children?: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n completedAt?: number;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface TaskEdge {\r\n id: string;\r\n from: string;\r\n to: string;\r\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\r\n weight?: number;\r\n}\r\n\r\nexport interface TaskGraph {\r\n id: string;\r\n specId: string;\r\n title: string;\r\n nodes: Map<string, TaskNode>;\r\n edges: TaskEdge[];\r\n rootNodes: string[];\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface TaskDependency {\r\n taskId: string;\r\n blockedBy: string[];\r\n blocking: string[];\r\n}\r\n\r\nexport interface TaskAssignment {\r\n taskId: string;\r\n assignee: string;\r\n assignedAt: number;\r\n}\r\n\r\nexport interface TaskProgress {\r\n total: number;\r\n pending: number;\r\n inProgress: number;\r\n blocked: number;\r\n failed: number;\r\n review: number;\r\n completed: number;\r\n percentComplete: number;\r\n estimatedHours: number;\r\n actualHours: number;\r\n}\r\n\r\nexport interface TaskFilter {\r\n status?: TaskStatus[];\r\n priority?: TaskPriority[];\r\n type?: TaskType[];\r\n assignee?: string[];\r\n tags?: string[];\r\n specRequirementId?: string;\r\n}\r\n\r\nexport interface TaskSort {\r\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\r\n direction: 'asc' | 'desc';\r\n}\r\n\r\nexport interface CriticalPathResult {\r\n taskIds: string[];\r\n totalEstimateHours: number;\r\n bottleneckTasks: string[];\r\n}\r\n\r\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\r\n let completed = 0, pending = 0, inProgress = 0, blocked = 0, failed = 0, review = 0;\r\n let estimatedHours = 0, actualHours = 0;\r\n for (const n of graph.nodes.values()) {\r\n switch (n.status) {\r\n case 'completed': completed++; break;\r\n case 'pending': pending++; break;\r\n case 'in_progress': inProgress++; break;\r\n case 'blocked': blocked++; break;\r\n case 'failed': failed++; break;\r\n case 'review': review++; break;\r\n }\r\n estimatedHours += n.estimateHours ?? 0;\r\n actualHours += n.actualHours ?? 0;\r\n }\r\n const total = graph.nodes.size;\r\n\r\n return {\r\n total,\r\n pending,\r\n inProgress,\r\n blocked,\r\n failed,\r\n review,\r\n completed,\r\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\r\n estimatedHours,\r\n actualHours,\r\n };\r\n}\r\n\r\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\r\n const nodes = Array.from(graph.nodes.values());\r\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\r\n const bottleneckTasks = criticalNodes\r\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\r\n .map((n) => n.id);\r\n\r\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\r\n\r\n return {\r\n taskIds: criticalNodes.map((n) => n.id),\r\n totalEstimateHours,\r\n bottleneckTasks,\r\n };\r\n}\r\n\r\nexport function topologicalSort(graph: TaskGraph): string[] {\r\n const visited = new Set<string>();\r\n const inStack = new Set<string>();\r\n const result: string[] = [];\r\n\r\n function visit(id: string): void {\r\n // Cycle: callers must detect cycles up-front if they care; we just stop recursing.\r\n if (inStack.has(id)) return;\r\n if (visited.has(id)) return;\r\n if (!graph.nodes.has(id)) return;\r\n\r\n visited.add(id);\r\n inStack.add(id);\r\n\r\n for (const edge of graph.edges) {\r\n if (edge.from === id) visit(edge.to);\r\n }\r\n\r\n inStack.delete(id);\r\n result.push(id);\r\n }\r\n\r\n for (const rootId of graph.rootNodes) {\r\n visit(rootId);\r\n }\r\n\r\n return result;\r\n}","import type { TaskNode, TaskGraph, TaskFilter, TaskSort, TaskProgress } from '../types/task-graph.js';\r\nimport { computeTaskProgress } from '../types/task-graph.js';\r\n\r\nexport interface TaskStore {\r\n saveGraph(graph: TaskGraph): Promise<void>;\r\n loadGraph(id: string): Promise<TaskGraph | null>;\r\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\r\n deleteGraph(id: string): Promise<void>;\r\n}\r\n\r\nexport interface TaskTrackerOptions {\r\n store: TaskStore;\r\n /**\r\n * Called when an in-the-background persistence (`saveGraph`) rejects.\r\n * The synchronous TaskTracker methods (addNode/addEdge/updateNodeStatus)\r\n * fire-and-forget their writes; without this, a failing store silently\r\n * loses graph mutations. Defaults to a console.warn.\r\n */\r\n onPersistError?: (err: unknown) => void;\r\n}\r\n\r\nexport interface TaskTransition {\r\n from: TaskNode['status'];\r\n to: TaskNode['status'];\r\n timestamp: number;\r\n reason?: string;\r\n}\r\n\r\nexport class TaskTracker {\r\n private graph: TaskGraph | null = null;\r\n private transitions: TaskTransition[] = [];\r\n\r\n constructor(private readonly opts: TaskTrackerOptions) {}\r\n\r\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\r\n this.graph = {\r\n id: crypto.randomUUID(),\r\n specId,\r\n title,\r\n nodes: new Map(),\r\n edges: [],\r\n rootNodes: [],\r\n createdAt: Date.now(),\r\n updatedAt: Date.now(),\r\n };\r\n await this.opts.store.saveGraph(this.graph);\r\n return this.graph;\r\n }\r\n\r\n async loadGraph(id: string): Promise<TaskGraph | null> {\r\n this.graph = await this.opts.store.loadGraph(id);\r\n return this.graph;\r\n }\r\n\r\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\r\n if (!this.graph) throw new Error('No graph loaded');\r\n\r\n const now = Date.now();\r\n const newNode: TaskNode = {\r\n ...node,\r\n id: crypto.randomUUID(),\r\n status: node.status ?? 'pending',\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n\r\n this.graph.nodes.set(newNode.id, newNode);\r\n\r\n if (!node.parentId) {\r\n this.graph.rootNodes.push(newNode.id);\r\n }\r\n\r\n this.graph.updatedAt = now;\r\n this.persist();\r\n\r\n return newNode;\r\n }\r\n\r\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\r\n if (!this.graph) throw new Error('No graph loaded');\r\n\r\n this.graph.edges.push({\r\n id: crypto.randomUUID(),\r\n from,\r\n to,\r\n type,\r\n });\r\n this.graph.updatedAt = Date.now();\r\n this.persist();\r\n }\r\n\r\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\r\n if (!this.graph) throw new Error('No graph loaded');\r\n\r\n const node = this.graph.nodes.get(id);\r\n if (!node) throw new Error(`Node ${id} not found`);\r\n\r\n const from = node.status;\r\n const now = Date.now();\r\n node.status = status;\r\n node.updatedAt = now;\r\n\r\n if (status === 'completed') {\r\n node.completedAt = now;\r\n }\r\n\r\n this.transitions.push({ from, to: status, timestamp: now, reason });\r\n\r\n // Auto-unblock dependents\r\n if (status === 'completed') {\r\n this.unblockDependents(id);\r\n }\r\n\r\n // Auto-block blockers\r\n if (status === 'in_progress') {\r\n this.checkAndBlockIfNeeded(id);\r\n }\r\n\r\n this.graph.updatedAt = now;\r\n this.persist();\r\n }\r\n\r\n getNode(id: string): TaskNode | undefined {\r\n return this.graph?.nodes.get(id);\r\n }\r\n\r\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\r\n if (!this.graph) return [];\r\n\r\n let nodes = Array.from(this.graph.nodes.values());\r\n\r\n if (filter) {\r\n nodes = nodes.filter((n) => {\r\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\r\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\r\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\r\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee)) return false;\r\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags!.includes(t))) return false;\r\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId) return false;\r\n return true;\r\n });\r\n }\r\n\r\n if (sort) {\r\n nodes.sort((a, b) => {\r\n const cmp = compareByField(a, b, sort.field);\r\n return sort.direction === 'asc' ? cmp : -cmp;\r\n });\r\n }\r\n\r\n return nodes;\r\n }\r\n\r\n getChildren(parentId: string): TaskNode[] {\r\n if (!this.graph) return [];\r\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\r\n }\r\n\r\n getDependents(taskId: string): string[] {\r\n if (!this.graph) return [];\r\n return this.graph.edges\r\n .filter((e) => e.from === taskId && e.type === 'depends_on')\r\n .map((e) => e.to);\r\n }\r\n\r\n getBlockers(taskId: string): string[] {\r\n if (!this.graph) return [];\r\n return this.graph.edges\r\n .filter((e) => e.to === taskId && e.type === 'depends_on')\r\n .map((e) => e.from);\r\n }\r\n\r\n canStart(taskId: string): boolean {\r\n const blockers = this.getBlockers(taskId);\r\n return blockers.every((id) => {\r\n const node = this.graph?.nodes.get(id);\r\n return node?.status === 'completed';\r\n });\r\n }\r\n\r\n getProgress(): TaskProgress {\r\n if (!this.graph) {\r\n return {\r\n total: 0, pending: 0, inProgress: 0, blocked: 0,\r\n failed: 0, review: 0, completed: 0,\r\n percentComplete: 0, estimatedHours: 0, actualHours: 0,\r\n };\r\n }\r\n return computeTaskProgress(this.graph);\r\n }\r\n\r\n getTransitions(taskId?: string): TaskTransition[] {\r\n if (!taskId) return [...this.transitions];\r\n // Would need taskId tracking per transition\r\n return [...this.transitions];\r\n }\r\n\r\n private unblockDependents(completedId: string): void {\r\n if (!this.graph) return;\r\n const dependents = this.getDependents(completedId);\r\n for (const depId of dependents) {\r\n const dep = this.graph.nodes.get(depId);\r\n if (dep?.status === 'blocked') {\r\n const remainingBlockers = this.getBlockers(depId);\r\n const allUnblocked = remainingBlockers.every((id) => {\r\n const blocker = this.graph?.nodes.get(id);\r\n return blocker?.status === 'completed';\r\n });\r\n if (allUnblocked) {\r\n dep.status = 'pending';\r\n dep.updatedAt = Date.now();\r\n }\r\n }\r\n }\r\n }\r\n\r\n private checkAndBlockIfNeeded(taskId: string): void {\r\n if (!this.graph) return;\r\n const blockers = this.getBlockers(taskId);\r\n const someBlocked = blockers.some((id) => {\r\n const blocker = this.graph?.nodes.get(id);\r\n return blocker?.status !== 'completed';\r\n });\r\n if (someBlocked) {\r\n const node = this.graph.nodes.get(taskId);\r\n if (node) {\r\n node.status = 'blocked';\r\n node.updatedAt = Date.now();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Fire-and-forget persistence with attached error handler.\r\n * Synchronous mutators (addNode/addEdge/updateNodeStatus) use this to\r\n * avoid forcing an async cascade through every caller; if the store\r\n * rejects, the configured `onPersistError` is invoked so failures are\r\n * surfaced instead of swallowed by an unhandled promise rejection.\r\n */\r\n private persist(): void {\r\n if (!this.graph) return;\r\n this.opts.store.saveGraph(this.graph).catch((err) => {\r\n if (this.opts.onPersistError) this.opts.onPersistError(err);\r\n else console.warn('[task-tracker] saveGraph failed:', err instanceof Error ? err.message : String(err));\r\n });\r\n }\r\n}\r\n\r\nconst PRIORITY_RANK: Record<TaskNode['priority'], number> = {\r\n critical: 0, high: 1, medium: 2, low: 3,\r\n};\r\nconst STATUS_RANK: Record<TaskNode['status'], number> = {\r\n in_progress: 0, pending: 1, review: 2, blocked: 3, failed: 4, completed: 5,\r\n};\r\n\r\nfunction compareByField(a: TaskNode, b: TaskNode, field: TaskSort['field']): number {\r\n switch (field) {\r\n case 'priority': return PRIORITY_RANK[a.priority] - PRIORITY_RANK[b.priority];\r\n case 'status': return STATUS_RANK[a.status] - STATUS_RANK[b.status];\r\n case 'createdAt': return a.createdAt - b.createdAt;\r\n case 'updatedAt': return a.updatedAt - b.updatedAt;\r\n }\r\n}","import type { TaskGraph, TaskNode } from '../types/task-graph.js';\r\nimport type { Specification, SpecAnalysis } from '../types/spec.js';\r\nimport type { DoneCondition } from '../types/multi-agent.js';\r\nimport { TaskTracker } from './task-tracker.js';\r\nimport { SpecParser } from './spec-parser.js';\r\nimport { TaskGenerator, DefaultTaskStore } from './task-generator.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\n\r\n/**\r\n * Extended event map used internally by TaskFlow and multi-agent components.\r\n * These events are emitted on the injected EventBus and are a subset of\r\n * the full EventMap — they do not require a separate registration.\r\n */\r\nexport interface TaskFlowEventMap {\r\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\r\n 'task.started': { taskId: string };\r\n 'task.completed': { taskId: string; result?: unknown };\r\n 'task.failed': { taskId: string; error: string };\r\n 'task.review': { taskId: string };\r\n 'spec.analyzed': { analysis: SpecAnalysis };\r\n 'progress': { percent: number; message: string };\r\n 'done': { graph: TaskGraph };\r\n 'error': { phase: TaskFlowPhase; error: Error };\r\n}\r\n\r\nexport type TaskFlowPhase =\r\n | 'idle'\r\n | 'parsing'\r\n | 'analyzing'\r\n | 'generating'\r\n | 'executing'\r\n | 'reviewing'\r\n | 'completing'\r\n | 'done'\r\n | 'failed';\r\n\r\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\r\n\r\nexport interface TaskFlowOptions {\r\n tracker: TaskTracker;\r\n events: EventBus;\r\n doneCondition?: DoneCondition;\r\n maxConcurrent?: number;\r\n}\r\n\r\nexport interface TaskFlowExecutionContext {\r\n executeTask: (task: TaskNode) => Promise<unknown>;\r\n onTaskComplete?: (task: TaskNode, result: unknown) => void;\r\n onTaskFail?: (task: TaskNode, error: Error) => void;\r\n}\r\n\r\nexport class TaskFlow {\r\n private phase: TaskFlowPhase = 'idle';\r\n private spec: Specification | null = null;\r\n private graph: TaskGraph | null = null;\r\n private stopped = false;\r\n\r\n constructor(private readonly opts: TaskFlowOptions) {\r\n this.setPhase('idle');\r\n }\r\n\r\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\r\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\r\n }\r\n\r\n async fromSpec(specContent: string): Promise<TaskGraph> {\r\n this.setPhase('parsing');\r\n\r\n const parser = new SpecParser();\r\n this.spec = parser.parse(specContent);\r\n\r\n this.setPhase('analyzing');\r\n const analysis = parser.analyze(this.spec);\r\n this.emit('spec.analyzed', { analysis });\r\n\r\n if (analysis.completeness < 50) {\r\n this.emit('error', {\r\n phase: 'analyzing',\r\n error: new Error(`Spec completeness too low: ${analysis.completeness}%`),\r\n });\r\n this.setPhase('failed');\r\n throw new Error('Spec too incomplete');\r\n }\r\n\r\n this.setPhase('generating');\r\n const generator = new TaskGenerator({ taskTracker: this.opts.tracker });\r\n this.graph = await generator.generateFromSpec(this.spec);\r\n\r\n return this.graph;\r\n }\r\n\r\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\r\n if (!this.graph) throw new Error('No graph loaded. Call fromSpec first.');\r\n\r\n this.setPhase('executing');\r\n this.stopped = false;\r\n\r\n const pendingTasks = this.getExecutableTasks();\r\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\r\n\r\n while (pendingTasks.length > 0 && !this.stopped) {\r\n const batch = pendingTasks.splice(0, maxConcurrent);\r\n const results = await Promise.allSettled(\r\n batch.map((task) => this.executeSingleTask(task, ctx)),\r\n );\r\n\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i];\r\n const task = batch[i];\r\n\r\n if (!result || !task) continue;\r\n\r\n if (result.status === 'rejected') {\r\n const reason = result.reason as Error | undefined;\r\n this.opts.tracker.updateNodeStatus(task.id, 'failed', reason?.message);\r\n this.emit('task.failed', { taskId: task.id, error: reason?.message ?? 'unknown' });\r\n ctx.onTaskFail?.(task, reason as Error);\r\n } else {\r\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\r\n this.emit('task.completed', { taskId: task.id, result: result.value });\r\n ctx.onTaskComplete?.(task, result.value);\r\n }\r\n\r\n this.emitProgress();\r\n }\r\n\r\n // Re-evaluate pending tasks (some may have become unblocked)\r\n const stillPending = this.getExecutableTasks();\r\n pendingTasks.length = 0;\r\n pendingTasks.push(...stillPending);\r\n\r\n // Check done condition\r\n if (this.checkDoneCondition()) {\r\n break;\r\n }\r\n }\r\n\r\n this.setPhase('completing');\r\n this.emit('done', { graph: this.graph });\r\n this.setPhase('done');\r\n\r\n return this.graph;\r\n }\r\n\r\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\r\n const task = this.opts.tracker.getNode(taskId);\r\n if (!task) throw new Error(`Task ${taskId} not found`);\r\n\r\n if (approved) {\r\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\r\n this.emit('task.completed', { taskId });\r\n } else {\r\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\r\n this.emit('task.review', { taskId });\r\n }\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n }\r\n\r\n getPhase(): TaskFlowPhase {\r\n return this.phase;\r\n }\r\n\r\n getGraph(): TaskGraph | null {\r\n return this.graph;\r\n }\r\n\r\n getSpec(): Specification | null {\r\n return this.spec;\r\n }\r\n\r\n private setPhase(phase: TaskFlowPhase): void {\r\n const from = this.phase;\r\n this.phase = phase;\r\n this.emit('phase.change', { from, to: phase });\r\n }\r\n\r\n private getExecutableTasks(): TaskNode[] {\r\n return this.opts.tracker\r\n .getAllNodes({ status: ['pending', 'blocked'] })\r\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\r\n .sort((a, b) => {\r\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\r\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\r\n });\r\n }\r\n\r\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\r\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\r\n this.emit('task.started', { taskId: task.id });\r\n return ctx.executeTask(task);\r\n }\r\n\r\n private checkDoneCondition(): boolean {\r\n const condition = this.opts.doneCondition;\r\n if (!condition) {\r\n const progress = this.opts.tracker.getProgress();\r\n return progress.percentComplete === 100;\r\n }\r\n\r\n switch (condition.type) {\r\n case 'all_tasks_done': {\r\n const progress = this.opts.tracker.getProgress();\r\n return progress.pending === 0 && progress.inProgress === 0;\r\n }\r\n case 'iterations':\r\n return false; // Not tracked here\r\n case 'tool_calls':\r\n return false;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n private emitProgress(): void {\r\n const progress = this.opts.tracker.getProgress();\r\n this.emit('progress', {\r\n percent: progress.percentComplete,\r\n message: `${progress.completed}/${progress.total} tasks completed`,\r\n });\r\n }\r\n}\r\n\r\nexport interface SpecDrivenDevOptions {\r\n workingDirectory: string;\r\n events: EventBus;\r\n doneCondition?: DoneCondition;\r\n}\r\n\r\nexport class SpecDrivenDev {\r\n private store: DefaultTaskStore;\r\n private tracker: TaskTracker;\r\n private readonly events: EventBus;\r\n private flows = new Map<string, TaskFlow>();\r\n\r\n constructor(opts: SpecDrivenDevOptions) {\r\n this.store = new DefaultTaskStore();\r\n this.tracker = new TaskTracker({ store: this.store });\r\n this.events = opts.events;\r\n }\r\n\r\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\r\n const flow = new TaskFlow({\r\n tracker: this.tracker,\r\n events: this.events,\r\n ...options,\r\n });\r\n\r\n const graph = await flow.fromSpec(specContent);\r\n this.flows.set(graph.id, flow);\r\n\r\n return flow;\r\n }\r\n\r\n getTracker(): TaskTracker {\r\n return this.tracker;\r\n }\r\n\r\n getFlow(graphId: string): TaskFlow | undefined {\r\n return this.flows.get(graphId);\r\n }\r\n\r\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\r\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\r\n id,\r\n title: flow.getGraph()?.title ?? 'Untitled',\r\n phase: flow.getPhase(),\r\n }));\r\n }\r\n}","import * as fsp from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SessionStore } from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\n/**\n * Per-project lockfile used for crash detection. The CLI writes one of\n * these alongside the session JSONLs (`<projectSessions>/active.json`)\n * when an interactive run starts, and deletes it on clean exit. If we\n * find one on the next launch whose owning PID is dead (or whose host\n * doesn't match), we know the previous run was killed mid-flight and\n * the session it was writing to is a recovery candidate.\n *\n * The lockfile is intentionally per-project (already isolated by\n * `wpaths.projectSessions`), so two TUIs in two different repos do not\n * fight each other.\n */\nexport interface RecoveryLockOptions {\n /** Directory the lockfile lives in. Usually `wpaths.projectSessions`. */\n dir: string;\n /** This process's PID. Default: `process.pid`. */\n pid?: number;\n /** Hostname recorded for the lock. Default: `os.hostname()`. */\n hostname?: string;\n /** Locks older than this are considered orphaned (disk wiped, etc.). Default 24h. */\n maxAgeMs?: number;\n /** Used to check whether the abandoned session was actually closed cleanly. */\n sessionStore?: SessionStore;\n /**\n * Override the PID-liveness probe. Default: `process.kill(pid, 0)` —\n * succeeds (or throws EPERM) when the PID is alive, throws ESRCH when\n * it is gone. Tests inject a deterministic stub.\n */\n isPidAlive?: (pid: number) => boolean;\n}\n\nexport interface AbandonedSession {\n sessionId: string;\n pid: number;\n startedAt: string;\n /** Lockfile age in ms at the time of the check. */\n ageMs: number;\n /** Number of messages already on disk for this session. */\n messageCount: number;\n}\n\ninterface LockFile {\n v: 1;\n sessionId: string;\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\nconst LOCK_FILE = 'active.json';\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport class RecoveryLock {\n private readonly file: string;\n private readonly pid: number;\n private readonly hostname: string;\n private readonly maxAgeMs: number;\n private readonly sessionStore?: SessionStore;\n private readonly probe: (pid: number) => boolean;\n\n constructor(opts: RecoveryLockOptions) {\n this.file = path.join(opts.dir, LOCK_FILE);\n this.pid = opts.pid ?? process.pid;\n this.hostname = opts.hostname ?? os.hostname();\n this.maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n this.sessionStore = opts.sessionStore;\n this.probe = opts.isPidAlive ?? defaultIsPidAlive;\n }\n\n /**\n * Examine the lockfile and decide whether it represents an abandoned\n * session. Returns `null` if the file is missing, points to a live\n * instance, references a clean-closed session, is too old, or is\n * malformed. Otherwise returns enough detail to prompt the user.\n *\n * Important: this is a read-only check. We never delete an active\n * lock from here — if another wstack instance is alive, the caller\n * should bail or run with a fresh session instead.\n */\n async checkAbandoned(): Promise<AbandonedSession | null> {\n const lock = await this.readLock();\n if (!lock) return null;\n\n const ageMs = Date.now() - new Date(lock.startedAt).getTime();\n if (Number.isNaN(ageMs) || ageMs < 0) {\n // Clock skew or corrupted timestamp — treat as orphan.\n return null;\n }\n if (ageMs > this.maxAgeMs) return null;\n\n // PID liveness only meaningful on the same host. Different host\n // means we can't probe — assume abandoned (the other machine's\n // wstack can't be holding *our* sessions dir unless it was\n // shared via network mount, in which case the user is on their\n // own).\n if (lock.hostname === this.hostname && this.probe(lock.pid)) {\n // Another wstack on this box is actively writing here.\n return null;\n }\n\n let messageCount = 0;\n if (this.sessionStore) {\n try {\n const data = await this.sessionStore.load(lock.sessionId);\n const closed = data.events.some((e) => e.type === 'session_end');\n if (closed) return null;\n messageCount = data.messages.length;\n } catch {\n // Lock points to a session that doesn't exist on disk (deleted\n // out from under us). Nothing to recover.\n return null;\n }\n }\n\n return {\n sessionId: lock.sessionId,\n pid: lock.pid,\n startedAt: lock.startedAt,\n ageMs,\n messageCount,\n };\n }\n\n /**\n * Claim the lock for the given session. Overwrites any existing lock\n * — the caller should have already handled abandonment (via\n * `checkAbandoned`) before calling this.\n */\n async write(sessionId: string): Promise<void> {\n await ensureDir(path.dirname(this.file));\n const lock: LockFile = {\n v: 1,\n sessionId,\n pid: this.pid,\n hostname: this.hostname,\n startedAt: new Date().toISOString(),\n };\n // Atomic write: write to .tmp and rename. Important on Windows\n // where a partial write of `active.json` would be readable.\n const tmp = `${this.file}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(lock), { mode: 0o600 });\n await fsp.rename(tmp, this.file);\n }\n\n /**\n * Release the lock. Idempotent — silently succeeds if the file is\n * already gone (e.g. someone else cleared it, or the directory was\n * wiped).\n */\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n throw err;\n }\n }\n\n private async readLock(): Promise<LockFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return null;\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isLockFile(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n }\n}\n\nfunction isLockFile(v: unknown): v is LockFile {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return (\n o['v'] === 1 &&\n typeof o['sessionId'] === 'string' &&\n typeof o['pid'] === 'number' &&\n typeof o['hostname'] === 'string' &&\n typeof o['startedAt'] === 'string'\n );\n}\n\n/**\n * Probe whether a process is alive without sending it a real signal.\n *\n * Unix: `process.kill(pid, 0)` succeeds for our own processes, throws\n * EPERM for others (still alive, just not ours), and throws ESRCH\n * when the PID is gone.\n * Windows (Node 22+): same call returns true if the process exists,\n * throws otherwise.\n */\nfunction defaultIsPidAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EPERM') return true; // alive, but owned by someone else\n return false;\n }\n}\n","/**\r\n * Tool output serialization utilities.\r\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\r\n */\r\n\r\nexport interface ToolOutputSerializerOptions {\r\n perIterationOutputCapBytes?: number;\r\n estimator?: (text: string) => number;\r\n}\r\n\r\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\r\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\r\n\r\n function serialize(value: unknown): string {\r\n if (typeof value === 'string') return value;\r\n if (value === null || value === undefined) return '';\r\n if (typeof value === 'object') {\r\n if (Array.isArray(value)) return value.map(serialize).join('\\n');\r\n if ('text' in (value as Record<string, unknown>)) {\r\n const t = (value as Record<string, unknown>).text;\r\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\r\n }\r\n try {\r\n return JSON.stringify(value, null, 2);\r\n } catch {\r\n return String(value);\r\n }\r\n }\r\n return String(value);\r\n }\r\n\r\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\r\n if (remainingBudget <= 0) {\r\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\r\n }\r\n const textBytes = Buffer.byteLength(text, 'utf8');\r\n if (textBytes <= remainingBudget) {\r\n return { text, newBudget: remainingBudget - textBytes };\r\n }\r\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\r\n const markerBytes = Buffer.byteLength(marker, 'utf8');\r\n const available = remainingBudget - markerBytes;\r\n if (available <= 0) {\r\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\r\n }\r\n const half = Math.floor(available / 2);\r\n const first = text.slice(0, half);\r\n const second = text.slice(text.length - half);\r\n return { text: `${first}${marker}${second}`, newBudget: 0 };\r\n }\r\n\r\n return { serialize, enforceCap, capBytes };\r\n}","import type { Context } from '../core/context.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\r\nimport type {\r\n ToolExecutorOptions,\r\n ToolExecutorStrategy,\r\n ToolBatchResult,\r\n ToolExecutionOutput,\r\n ToolConfirmPendingResult,\r\n} from '../types/tool-executor.js';\r\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\r\n\r\nexport class ToolExecutor {\r\n private readonly serializer;\r\n private readonly iterationTimeoutMs: number;\r\n\r\n constructor(\r\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\r\n private readonly opts: ToolExecutorOptions,\r\n ) {\r\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\r\n this.serializer = createToolOutputSerializer({\r\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\r\n });\r\n }\r\n\r\n /**\r\n * Execute a batch of tool uses using the configured strategy.\r\n * Returns the execution results and the remaining output budget.\r\n */\r\n async executeBatch(\r\n toolUses: ToolUseBlock[],\r\n ctx: Context,\r\n strategy: ToolExecutorStrategy,\r\n ): Promise<ToolBatchResult> {\r\n let budget = this.opts.perIterationOutputCapBytes ?? 100_000;\r\n\r\n const runOne = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n const start = Date.now();\r\n const tool = this.registry.get(use.name);\r\n\r\n // Fast path: unknown tool\r\n if (!tool) {\r\n const result = this.unknownToolResult(use, () => this.registry.list().map((t) => t.name));\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\r\n\r\n if (decision.permission === 'deny') {\r\n const result = this.deniedResult(use, decision.reason);\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n if (decision.permission === 'confirm') {\r\n if (this.opts.confirmAwaiter) {\r\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\r\n if (choice !== 'yes' && choice !== 'always') {\r\n const result = { type: 'tool_result' as const, tool_use_id: use.id, content: `Tool \"${tool.name}\" denied by user.`, is_error: true };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n // fall through to execute\r\n } else {\r\n const suggestedPattern = this.subjectFor(tool.name, use.input, tool.subjectKey) ?? tool.name;\r\n const pending: ToolConfirmPendingResult = { type: 'tool_confirm_pending', toolUseId: use.id, toolName: tool.name, input: use.input, suggestedPattern };\r\n return { result: pending, tool, durationMs: Date.now() - start };\r\n }\r\n }\r\n\r\n // permission === 'auto'\r\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\r\n // adapter or other Tracer is bound — zero overhead by default.\r\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\r\n 'tool.name': tool.name,\r\n 'tool.mutating': tool.mutating,\r\n 'tool.permission': tool.permission,\r\n });\r\n try {\r\n const result = await this.executeTool(tool, use, ctx, budget);\r\n budget = this.decrementBudget(result, budget);\r\n span?.setAttribute('tool.is_error', !!result.is_error);\r\n span?.setAttribute(\r\n 'tool.output_bytes',\r\n typeof result.content === 'string' ? result.content.length : 0,\r\n );\r\n return { result, tool, durationMs: Date.now() - start };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n this.opts.renderer?.writeToolResult(tool.name, scrubbed, true);\r\n const result = { type: 'tool_result' as const, tool_use_id: use.id, content: `Tool \"${tool.name}\" threw: ${scrubbed}`, is_error: true };\r\n budget = this.decrementBudget(result, budget);\r\n if (err instanceof Error) span?.recordError(err);\r\n span?.setAttribute('tool.is_error', true);\r\n return { result, tool, durationMs: Date.now() - start };\r\n } finally {\r\n span?.end();\r\n }\r\n };\r\n\r\n // Run a single tool but never let an exception propagate to the\r\n // gather() below — `runOne` is already try/catch-wrapped for the\r\n // execution phase, but the *pre*-execution paths (permission policy,\r\n // confirmAwaiter) are unguarded and an unexpected throw there would\r\n // collapse Promise.all and lose every sibling's output. Wrap each\r\n // call so a per-tool failure becomes a per-tool error result.\r\n const safeRun = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n try {\r\n return await runOne(use);\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" execution failed: ${scrubbed}`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool: this.registry.get(use.name), durationMs: 0 };\r\n }\r\n };\r\n\r\n if (strategy === 'sequential') {\r\n const outputs: ToolExecutionOutput[] = [];\r\n for (const use of toolUses) {\r\n if (use) outputs.push(await safeRun(use));\r\n }\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n if (strategy === 'parallel') {\r\n const outputs = await Promise.all(toolUses.map((use) => safeRun(use)));\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n // smart: non-mutating in parallel, then mutating sequentially\r\n const nonMutating: ToolUseBlock[] = [];\r\n const mutating: ToolUseBlock[] = [];\r\n for (const use of toolUses) {\r\n if (!use) continue;\r\n const tool = this.registry.get(use.name);\r\n if (tool?.mutating) mutating.push(use);\r\n else nonMutating.push(use);\r\n }\r\n const firstPass = await Promise.all(nonMutating.map((use) => safeRun(use)));\r\n const secondPass: ToolExecutionOutput[] = [];\r\n for (const use of mutating) {\r\n secondPass.push(await safeRun(use));\r\n }\r\n return {\r\n outputs: [...firstPass, ...secondPass],\r\n remainingBudget: budget,\r\n };\r\n }\r\n\r\n /**\r\n * Execute a single tool with timeout, permission check, and output capping.\r\n * Emits `tool.started` via the injected EventBus (if any) right before\r\n * invoking the tool — closes the observability gap between \"model decided\r\n * to call a tool\" and \"tool.executed\".\r\n */\r\n async executeTool(\r\n tool: Tool,\r\n use: ToolUseBlock,\r\n ctx: Context,\r\n budget: number,\r\n ): Promise<ToolResultBlock> {\r\n this.opts.events?.emit('tool.started', {\r\n name: tool.name,\r\n id: use.id,\r\n input: use.input,\r\n });\r\n this.opts.renderer?.writeToolCall(tool.name, use.input);\r\n const output = await this.runWithTimeout(tool, use.input, ctx.signal, ctx, use.id);\r\n const text = this.serializer.serialize(output);\r\n const scrubbed = this.opts.secretScrubber.scrub(text);\r\n const { text: capped } = this.serializer.enforceCap(scrubbed, budget);\r\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n name: tool.name,\r\n content: capped,\r\n is_error: false,\r\n };\r\n }\r\n\r\n private async runWithTimeout(\r\n tool: Tool,\r\n input: unknown,\r\n parentSignal: AbortSignal,\r\n ctx: Context,\r\n toolUseId?: string,\r\n ): Promise<unknown> {\r\n if (parentSignal.aborted) {\r\n // Re-throw the original abort reason, whether it's an Error, string, or undefined.\r\n if (parentSignal.reason instanceof Error) throw parentSignal.reason;\r\n throw new Error(typeof parentSignal.reason === 'string' ? parentSignal.reason : 'aborted');\r\n }\r\n const timeoutMs = tool.timeoutMs ?? this.iterationTimeoutMs;\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(new Error('tool timeout')), timeoutMs);\r\n const combined = AbortSignal.any([parentSignal, ctrl.signal]);\r\n try {\r\n // Streaming variant takes precedence — yields progress events, then\r\n // a final 'final' event with the typed output. Tools that don't\r\n // implement executeStream fall through to the standard execute path.\r\n if (typeof tool.executeStream === 'function') {\r\n return await this.runStreamedTool(tool, input, ctx, combined, toolUseId);\r\n }\r\n return await tool.execute(input, ctx, { signal: combined });\r\n } catch (err) {\r\n if (combined.aborted && typeof tool.cleanup === 'function') {\r\n // Best-effort cleanup; never let it mask the original error.\r\n try { await tool.cleanup(input, ctx); } catch { /* swallow */ }\r\n }\r\n throw err;\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async runStreamedTool(\r\n tool: Tool,\r\n input: unknown,\r\n ctx: Context,\r\n signal: AbortSignal,\r\n toolUseId: string | undefined,\r\n ): Promise<unknown> {\r\n let finalOutput: unknown;\r\n let sawFinal = false;\r\n const stream = tool.executeStream!(input, ctx, { signal });\r\n for await (const ev of stream) {\r\n if (ev.type === 'final') {\r\n finalOutput = ev.output;\r\n sawFinal = true;\r\n // Drain whatever the iterator wants to surface after final, but the\r\n // result is locked in. Most tools won't yield more.\r\n break;\r\n }\r\n this.opts.events?.emit('tool.progress', {\r\n name: tool.name,\r\n id: toolUseId ?? '<unknown>',\r\n event: ev,\r\n });\r\n }\r\n if (!sawFinal) {\r\n throw new Error(`tool \"${tool.name}\" executeStream completed without a 'final' event`);\r\n }\r\n return finalOutput;\r\n }\r\n\r\n private unknownToolResult(\r\n use: ToolUseBlock,\r\n listFns: () => string[],\r\n ): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" is not registered. Available tools: ${listFns().join(', ')}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private decrementBudget(result: ToolResultBlock, budget: number): number {\r\n const contentBytes =\r\n typeof result.content === 'string'\r\n ? Buffer.byteLength(result.content, 'utf8')\r\n : Buffer.byteLength(JSON.stringify(result.content), 'utf8');\r\n return Math.max(0, budget - contentBytes);\r\n }\r\n\r\n /**\r\n * Compute the suggestedPattern string for a tool+input pair.\r\n * Matches the logic in DefaultPermissionPolicy so the TUI shows the\r\n * same subject that the trust file would use.\r\n */\r\n private subjectFor(\r\n toolName: string,\r\n input: unknown,\r\n subjectKey?: string,\r\n ): string | undefined {\r\n if (!input || typeof input !== 'object') return undefined;\r\n const obj = input as Record<string, unknown>;\r\n const globChars = /[*?\\[\\]]/g;\r\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\r\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\r\n\r\n // Mirror DefaultPermissionPolicy.subjectFor — keep both in sync so the\r\n // TUI's \"suggested pattern\" matches what the trust file actually uses.\r\n if (subjectKey) {\r\n const v = obj[subjectKey];\r\n if (typeof v === 'string') {\r\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files'\r\n ? normalizePath(v)\r\n : escapeGlob(v);\r\n }\r\n }\r\n\r\n if (toolName === 'bash' && typeof obj.command === 'string') {\r\n return escapeGlob(obj.command);\r\n }\r\n if (typeof obj.path === 'string') {\r\n return normalizePath(obj.path);\r\n }\r\n if (typeof obj.url === 'string') {\r\n return escapeGlob(obj.url);\r\n }\r\n if (typeof obj.name === 'string') {\r\n return escapeGlob(obj.name);\r\n }\r\n return undefined;\r\n }\r\n}","import type {\n SessionEvent,\n SessionMetadata,\n SessionStore,\n} from '../types/session.js';\nimport type {\n DefaultSessionReaderOptions,\n SessionExportOptions,\n SessionQuery,\n SessionReader,\n SessionSearchHit,\n SessionSearchQuery,\n SessionSummaryLite,\n} from '../types/session-reader.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\n/**\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\n * and export helpers. Implemented on top of the public `SessionStore`\n * surface so any concrete store can be inspected without re-implementation.\n *\n * The heavy operations re-parse the JSONL stream on every call — fine for\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\n */\nexport class DefaultSessionReader implements SessionReader {\n private readonly store: SessionStore;\n\n constructor(opts: DefaultSessionReaderOptions) {\n this.store = opts.store;\n }\n\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\n const titleNeedle = q.titleContains?.toLowerCase();\n const filtered = raw.filter((s) => {\n if (q.since && s.startedAt < q.since) return false;\n if (q.until && s.startedAt > q.until) return false;\n if (q.provider && s.provider !== q.provider) return false;\n if (q.model && s.model !== q.model) return false;\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\n return true;\n });\n const out: SessionSummaryLite[] = filtered.map((s) => ({\n id: s.id,\n title: s.title,\n startedAt: s.startedAt,\n provider: s.provider,\n model: s.model,\n tokenTotal: s.tokenTotal,\n }));\n return q.limit ? out.slice(0, q.limit) : out;\n }\n\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\n const data = await this.store.load(sessionId);\n for (const e of data.events) yield e;\n }\n\n async search(q: SessionSearchQuery, sessionId?: string): Promise<SessionSearchHit[]> {\n const limit = q.limit ?? 100;\n const matcher = buildMatcher(q);\n const allowedTypes = q.types ? new Set(q.types) : null;\n\n const ids = sessionId ? [sessionId] : (await this.store.list(1000)).map((s) => s.id);\n const hits: SessionSearchHit[] = [];\n for (const id of ids) {\n let data;\n try {\n data = await this.store.load(id);\n } catch {\n continue;\n }\n for (let i = 0; i < data.events.length; i++) {\n const ev = data.events[i]!;\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\n const text = eventText(ev);\n if (text === null) continue;\n const hit = matcher(text);\n if (!hit) continue;\n hits.push({\n sessionId: id,\n eventIndex: i,\n ts: ev.ts,\n type: ev.type,\n snippet: snippetOf(text, hit.start, hit.end),\n });\n if (hits.length >= limit) return hits;\n }\n }\n return hits;\n }\n\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\n const data = await this.store.load(sessionId);\n const includeTools = opts.includeTools ?? true;\n const includeDiagnostics = opts.includeDiagnostics ?? true;\n\n const filtered = data.events.filter((e) => {\n if (\n !includeTools &&\n (e.type === 'tool_use' ||\n e.type === 'tool_result' ||\n e.type === 'tool_call_start' ||\n e.type === 'tool_call_end')\n ) {\n return false;\n }\n if (\n !includeDiagnostics &&\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\n ) {\n return false;\n }\n return true;\n });\n\n if (opts.format === 'json') {\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\n }\n if (opts.format === 'text') {\n return renderPlainText(data.metadata, filtered);\n }\n return renderMarkdown(data.metadata, filtered);\n }\n\n async metadata(sessionId: string): Promise<SessionMetadata> {\n const data = await this.store.load(sessionId);\n return data.metadata;\n }\n}\n\nfunction buildMatcher(q: SessionSearchQuery): (text: string) => { start: number; end: number } | null {\n const ci = q.caseInsensitive ?? true;\n if (q.regex) {\n const flags = ci ? 'i' : '';\n const re = new RegExp(q.query, flags);\n return (text) => {\n const m = re.exec(text);\n return m ? { start: m.index, end: m.index + m[0].length } : null;\n };\n }\n const needle = ci ? q.query.toLowerCase() : q.query;\n return (text) => {\n const hay = ci ? text.toLowerCase() : text;\n const idx = hay.indexOf(needle);\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\n };\n}\n\nfunction eventText(e: SessionEvent): string | null {\n switch (e.type) {\n case 'user_input':\n return contentToString(e.content);\n case 'llm_response':\n return contentToString(e.content);\n case 'tool_use':\n return `${e.name} ${JSON.stringify(e.input)}`;\n case 'tool_result':\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\n case 'error':\n return `${e.phase}: ${e.message}`;\n case 'session_start':\n case 'session_resumed':\n return `${e.model}/${e.provider}`;\n case 'task_created':\n case 'task_completed':\n return e.title;\n case 'task_failed':\n return `${e.title}: ${e.error}`;\n case 'skill_activated':\n case 'skill_deactivated':\n return e.skillName;\n default:\n return null;\n }\n}\n\nfunction contentToString(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .map((b) => {\n switch (b.type) {\n case 'text':\n return b.text;\n case 'tool_use':\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\n case 'tool_result':\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n default:\n return '';\n }\n })\n .join('\\n');\n}\n\nconst SNIPPET_RADIUS = 60;\n\nfunction snippetOf(text: string, start: number, end: number): string {\n const from = Math.max(0, start - SNIPPET_RADIUS);\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\n const prefix = from > 0 ? '…' : '';\n const suffix = to < text.length ? '…' : '';\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\n}\n\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(`# Session ${meta.id}`);\n lines.push('');\n if (meta.model || meta.provider) {\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\n }\n lines.push(`- **Started:** ${meta.startedAt}`);\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\n lines.push('');\n lines.push('---');\n lines.push('');\n for (const e of events) {\n switch (e.type) {\n case 'user_input': {\n lines.push(`## User — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n }\n case 'llm_response': {\n lines.push(`## Assistant — ${e.ts}`);\n lines.push('');\n lines.push(contentToString(e.content));\n if (e.stopReason && e.stopReason !== 'end_turn') {\n lines.push('');\n lines.push(`*stop: ${e.stopReason}*`);\n }\n lines.push('');\n break;\n }\n case 'tool_use': {\n lines.push(`### Tool call: \\`${e.name}\\``);\n lines.push('');\n lines.push('```json');\n lines.push(JSON.stringify(e.input, null, 2));\n lines.push('```');\n lines.push('');\n break;\n }\n case 'tool_result': {\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\n lines.push('');\n lines.push('```');\n lines.push(body);\n lines.push('```');\n lines.push('');\n break;\n }\n case 'error': {\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\n lines.push('');\n break;\n }\n case 'compaction': {\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\n lines.push('');\n break;\n }\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\n const lines: string[] = [];\n lines.push(`Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`);\n lines.push(''.padEnd(72, '-'));\n for (const e of events) {\n switch (e.type) {\n case 'user_input':\n lines.push(`[${e.ts}] USER`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'llm_response':\n lines.push(`[${e.ts}] ASSISTANT`);\n lines.push(contentToString(e.content));\n lines.push('');\n break;\n case 'tool_use':\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\n break;\n case 'tool_result':\n lines.push(\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\n }`,\n );\n break;\n case 'error':\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\n break;\n default:\n break;\n }\n }\n return lines.join('\\n');\n}\n","import type {\r\n MetricLabels,\r\n MetricSeries,\r\n MetricsSink,\r\n MetricsSnapshot,\r\n} from '../../types/observability.js';\r\n\r\ninterface CounterState {\r\n value: number;\r\n}\r\n\r\ninterface GaugeState {\r\n value: number;\r\n}\r\n\r\ninterface HistogramState {\r\n count: number;\r\n sum: number;\r\n min: number;\r\n max: number;\r\n // Reservoir sample for cheap quantile estimates. 1024 samples gives <2% error\r\n // on p99 for typical agent workloads — small memory footprint, no exporter\r\n // dependency. Swap for HdrHistogram if you need bounded-error guarantees.\r\n samples: number[];\r\n}\r\n\r\nconst RESERVOIR_SIZE = 1024;\r\n\r\nfunction labelKey(labels: MetricLabels | undefined): string {\r\n if (!labels) return '';\r\n const keys = Object.keys(labels).sort();\r\n return keys.map((k) => `${k}=${labels[k]}`).join(',');\r\n}\r\n\r\nfunction quantile(sorted: number[], q: number): number {\r\n if (sorted.length === 0) return 0;\r\n const idx = Math.min(sorted.length - 1, Math.floor(q * sorted.length));\r\n return sorted[idx] ?? 0;\r\n}\r\n\r\n/**\r\n * In-memory metrics sink. Suitable for embedded use, tests, and /metrics\r\n * scrape over HTTP. For production push-based pipelines, write an adapter\r\n * that implements MetricsSink and forwards to OTLP/StatsD/Prometheus.\r\n */\r\nexport class InMemoryMetricsSink implements MetricsSink {\r\n private counters = new Map<string, Map<string, CounterState>>();\r\n private gauges = new Map<string, Map<string, GaugeState>>();\r\n private histograms = new Map<string, Map<string, HistogramState>>();\r\n\r\n counter(name: string, value = 1, labels?: MetricLabels): void {\r\n const series = this.getOrCreate(this.counters, name);\r\n const key = labelKey(labels);\r\n const state = series.get(key) ?? { value: 0 };\r\n state.value += value;\r\n series.set(key, state);\r\n }\r\n\r\n gauge(name: string, value: number, labels?: MetricLabels): void {\r\n const series = this.getOrCreate(this.gauges, name);\r\n series.set(labelKey(labels), { value });\r\n }\r\n\r\n histogram(name: string, value: number, labels?: MetricLabels): void {\r\n const series = this.getOrCreate(this.histograms, name);\r\n const key = labelKey(labels);\r\n let state = series.get(key);\r\n if (!state) {\r\n state = { count: 0, sum: 0, min: value, max: value, samples: [] };\r\n series.set(key, state);\r\n }\r\n state.count++;\r\n state.sum += value;\r\n if (value < state.min) state.min = value;\r\n if (value > state.max) state.max = value;\r\n if (state.samples.length < RESERVOIR_SIZE) {\r\n state.samples.push(value);\r\n } else {\r\n // Vitter's Algorithm R — every new value has size/count chance of replacing.\r\n const r = Math.floor(Math.random() * state.count);\r\n if (r < RESERVOIR_SIZE) state.samples[r] = value;\r\n }\r\n }\r\n\r\n snapshot(): MetricsSnapshot {\r\n const series: MetricSeries[] = [];\r\n\r\n for (const [name, byLabel] of this.counters) {\r\n for (const [key, state] of byLabel) {\r\n series.push({\r\n name,\r\n type: 'counter',\r\n labels: parseLabelKey(key),\r\n values: { value: state.value },\r\n });\r\n }\r\n }\r\n\r\n for (const [name, byLabel] of this.gauges) {\r\n for (const [key, state] of byLabel) {\r\n series.push({\r\n name,\r\n type: 'gauge',\r\n labels: parseLabelKey(key),\r\n values: { value: state.value },\r\n });\r\n }\r\n }\r\n\r\n for (const [name, byLabel] of this.histograms) {\r\n for (const [key, state] of byLabel) {\r\n const sorted = [...state.samples].sort((a, b) => a - b);\r\n series.push({\r\n name,\r\n type: 'histogram',\r\n labels: parseLabelKey(key),\r\n values: {\r\n count: state.count,\r\n sum: state.sum,\r\n min: state.min,\r\n max: state.max,\r\n p50: quantile(sorted, 0.5),\r\n p95: quantile(sorted, 0.95),\r\n p99: quantile(sorted, 0.99),\r\n },\r\n });\r\n }\r\n }\r\n\r\n return { timestamp: Date.now(), series };\r\n }\r\n\r\n reset(): void {\r\n this.counters.clear();\r\n this.gauges.clear();\r\n this.histograms.clear();\r\n }\r\n\r\n private getOrCreate<V>(\r\n bag: Map<string, Map<string, V>>,\r\n name: string,\r\n ): Map<string, V> {\r\n let series = bag.get(name);\r\n if (!series) {\r\n series = new Map();\r\n bag.set(name, series);\r\n }\r\n return series;\r\n }\r\n}\r\n\r\nfunction parseLabelKey(key: string): MetricLabels {\r\n if (!key) return {};\r\n const labels: MetricLabels = {};\r\n for (const pair of key.split(',')) {\r\n const eq = pair.indexOf('=');\r\n if (eq > 0) labels[pair.slice(0, eq)] = pair.slice(eq + 1);\r\n }\r\n return labels;\r\n}\r\n\r\n/** Cheap noop sink — drop-in default when observability is not configured. */\r\nexport class NoopMetricsSink implements MetricsSink {\r\n counter(): void {}\r\n gauge(): void {}\r\n histogram(): void {}\r\n snapshot(): MetricsSnapshot {\r\n return { timestamp: Date.now(), series: [] };\r\n }\r\n reset(): void {}\r\n}\r\n","import type {\r\n AggregateHealth,\r\n HealthCheck,\r\n HealthCheckResult,\r\n HealthRegistry,\r\n HealthStatus,\r\n} from '../../types/observability.js';\r\n\r\nconst SEVERITY: Record<HealthStatus, number> = {\r\n healthy: 0,\r\n degraded: 1,\r\n unhealthy: 2,\r\n};\r\n\r\n/**\r\n * Aggregates registered health checks. Worst status wins — one unhealthy check\r\n * makes the whole system unhealthy. Use timeouts so a slow probe can't stall\r\n * the response.\r\n */\r\nexport class DefaultHealthRegistry implements HealthRegistry {\r\n private checks = new Map<string, HealthCheck>();\r\n private readonly timeoutMs: number;\r\n\r\n constructor(opts: { timeoutMs?: number } = {}) {\r\n this.timeoutMs = opts.timeoutMs ?? 5_000;\r\n }\r\n\r\n register(check: HealthCheck): void {\r\n this.checks.set(check.name, check);\r\n }\r\n\r\n unregister(name: string): void {\r\n this.checks.delete(name);\r\n }\r\n\r\n async run(): Promise<AggregateHealth> {\r\n const results = await Promise.all(\r\n Array.from(this.checks.values()).map(async (c) => {\r\n const result = await this.runOne(c);\r\n return { name: c.name, ...result };\r\n }),\r\n );\r\n\r\n let status: HealthStatus = 'healthy';\r\n for (const r of results) {\r\n if (SEVERITY[r.status] > SEVERITY[status]) status = r.status;\r\n }\r\n\r\n return { status, timestamp: Date.now(), checks: results };\r\n }\r\n\r\n private async runOne(check: HealthCheck): Promise<HealthCheckResult> {\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n const timeout = new Promise<HealthCheckResult>((resolve) => {\r\n timer = setTimeout(\r\n () => resolve({ status: 'unhealthy', detail: `timeout after ${this.timeoutMs}ms` }),\r\n this.timeoutMs,\r\n );\r\n });\r\n try {\r\n return await Promise.race([check.check(), timeout]);\r\n } catch (err) {\r\n return { status: 'unhealthy', detail: err instanceof Error ? err.message : String(err) };\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n}\r\n","import type { Span, Tracer } from '../../types/observability.js';\r\n\r\n/**\r\n * Default tracer is a noop — zero overhead when observability is not wired up.\r\n * Replace at runtime with an OpenTelemetry-backed Tracer to enable real spans.\r\n */\r\nexport class NoopTracer implements Tracer {\r\n startSpan(): Span {\r\n return NOOP_SPAN;\r\n }\r\n}\r\n\r\nconst NOOP_SPAN: Span = {\r\n setAttribute() {},\r\n recordError() {},\r\n end() {},\r\n};\r\n","/**\n * Lightweight OTel adapter. Doesn't pull in `@opentelemetry/api` directly —\n * the user passes their already-initialized OTel Tracer through, and this\n * wrapper translates our minimal Span surface onto theirs.\n *\n * Usage:\n * import { trace } from '@opentelemetry/api';\n * const tracer = trace.getTracer('wrongstack', '1.0');\n * const wrappedTracer = new OTelTracer(tracer);\n * // pass `wrappedTracer` as Agent.tracer / ToolExecutor.tracer.\n *\n * The shape of the upstream Tracer is intentionally typed loosely so we\n * don't need a build-time dependency. Anything OTel-compatible works,\n * including OpenInference, Tempo, etc.\n */\nimport type { Span as WStackSpan, Tracer as WStackTracer } from '../../types/observability.js';\n\ninterface OTelLikeSpan {\n setAttribute(key: string, value: string | number | boolean): unknown;\n recordException(err: { message: string; stack?: string; name?: string }): unknown;\n setStatus?(status: { code: number; message?: string }): unknown;\n end(): unknown;\n}\n\ninterface OTelLikeTracer {\n startSpan(name: string, options?: { attributes?: Record<string, string | number | boolean> }): OTelLikeSpan;\n}\n\n// OTel SpanStatusCode.ERROR = 2 (per the spec). Hard-coded here so we don't\n// depend on the @opentelemetry/api enum.\nconst OTEL_STATUS_ERROR = 2;\n\nexport class OTelTracer implements WStackTracer {\n constructor(private readonly upstream: OTelLikeTracer) {}\n\n startSpan(name: string, attrs?: Record<string, string | number | boolean>): WStackSpan {\n const otelSpan = this.upstream.startSpan(name, attrs ? { attributes: attrs } : undefined);\n return new OTelSpan(otelSpan);\n }\n}\n\nclass OTelSpan implements WStackSpan {\n constructor(private readonly span: OTelLikeSpan) {}\n\n setAttribute(key: string, value: string | number | boolean): void {\n this.span.setAttribute(key, value);\n }\n\n recordError(err: Error): void {\n this.span.recordException(err);\n this.span.setStatus?.({ code: OTEL_STATUS_ERROR, message: err.message });\n }\n\n end(): void {\n this.span.end();\n }\n}\n","import type { EventBus } from '../../kernel/events.js';\r\nimport type { MetricsSink } from '../../types/observability.js';\r\n\r\n/**\r\n * Subscribes a MetricsSink to the EventBus. Returns an unsubscribe function\r\n * that detaches all listeners. This is the single integration point between\r\n * the agent's event stream and the observability layer — no metric calls\r\n * leak into core call sites.\r\n */\r\nexport function wireMetricsToEvents(events: EventBus, sink: MetricsSink): () => void {\r\n const unsubs: Array<() => void> = [];\r\n\r\n unsubs.push(\r\n events.on('session.started', () => sink.counter('agent.sessions.started')),\r\n events.on('session.ended', (e) => {\r\n sink.counter('agent.sessions.ended');\r\n sink.histogram('agent.session.tokens.input', e.usage.input);\r\n sink.histogram('agent.session.tokens.output', e.usage.output);\r\n }),\r\n events.on('session.damaged', () => sink.counter('agent.sessions.damaged')),\r\n events.on('iteration.completed', () => sink.counter('agent.iterations.total')),\r\n events.on('iteration.limit_reached', () => sink.counter('agent.iteration_limit.hit')),\r\n events.on('provider.response', (e) => {\r\n sink.counter('provider.responses.total', 1, { stop_reason: e.stopReason });\r\n sink.counter('provider.tokens.input', e.usage.input);\r\n sink.counter('provider.tokens.output', e.usage.output);\r\n if (e.usage.cacheRead) sink.counter('provider.tokens.cache_read', e.usage.cacheRead);\r\n if (e.usage.cacheWrite) sink.counter('provider.tokens.cache_write', e.usage.cacheWrite);\r\n }),\r\n events.on('provider.retry', (e) =>\r\n sink.counter('provider.retries.total', 1, {\r\n provider: e.providerId,\r\n status: String(e.status),\r\n }),\r\n ),\r\n events.on('provider.error', (e) =>\r\n sink.counter('provider.errors.total', 1, {\r\n provider: e.providerId,\r\n status: String(e.status),\r\n retryable: String(e.retryable),\r\n }),\r\n ),\r\n events.on('tool.started', (e) => sink.counter('tool.starts.total', 1, { tool: e.name })),\r\n events.on('tool.executed', (e) => {\r\n sink.counter('tool.executions.total', 1, { tool: e.name, ok: String(e.ok) });\r\n sink.histogram('tool.duration_ms', e.durationMs, { tool: e.name });\r\n }),\r\n events.on('token.threshold', (e) => sink.gauge('agent.tokens.used', e.used)),\r\n events.on('compaction.fired', (e) => {\r\n sink.counter('compaction.fired.total');\r\n sink.histogram('compaction.reduction_tokens', e.before - e.after);\r\n }),\r\n events.on('mcp.server.connected', (e) =>\r\n sink.counter('mcp.connects.total', 1, { server: e.name }),\r\n ),\r\n events.on('mcp.server.reconnected', (e) =>\r\n sink.counter('mcp.reconnects.total', 1, { server: e.name }),\r\n ),\r\n events.on('mcp.server.disconnected', (e) =>\r\n sink.counter('mcp.disconnects.total', 1, { server: e.name }),\r\n ),\r\n events.on('error', (e) => sink.counter('agent.errors.total', 1, { phase: e.phase })),\r\n );\r\n\r\n return () => {\r\n for (const u of unsubs) u();\r\n };\r\n}\r\n","import type {\n HealthRegistry,\n MetricsSink,\n MetricsSnapshot,\n} from '../../types/observability.js';\n\n/**\n * L3-C: Prometheus text exposition format renderer.\n *\n * Implements v0.0.4 (the line-oriented format every scraper accepts):\n * # HELP <name> <help>\n * # TYPE <name> <counter|gauge|histogram|summary>\n * <name>{label=\"value\"} <number>\n *\n * Histograms are emitted as Prometheus *summary* type because our in-memory\n * sink already stores quantiles (p50/p95/p99) rather than open bucket lists.\n * That maps 1:1 onto Prometheus summary semantics and avoids us having to\n * carry a bucket schema we cannot infer from samples.\n */\n\nconst NUMBER_FORMAT_INFINITY = 'NaN'; // Prometheus accepts `NaN` for missing values.\n\nfunction escapeLabelValue(v: string): string {\n return v.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nfunction formatLabels(labels: Record<string, string>): string {\n const keys = Object.keys(labels);\n if (keys.length === 0) return '';\n const parts = keys.map((k) => `${k}=\"${escapeLabelValue(labels[k] ?? '')}\"`);\n return `{${parts.join(',')}}`;\n}\n\nfunction formatNumber(n: number): string {\n if (!Number.isFinite(n)) return NUMBER_FORMAT_INFINITY;\n return Number.isInteger(n) ? n.toString() : n.toString();\n}\n\nfunction joinLabels(base: Record<string, string>, extra: Record<string, string>): Record<string, string> {\n return { ...base, ...extra };\n}\n\n/**\n * Render a `MetricsSnapshot` as Prometheus text-format bytes. The output\n * always ends with a trailing newline (Prometheus requires it).\n */\nexport function renderPrometheus(snapshot: MetricsSnapshot): string {\n // Group by name so we can emit one HELP/TYPE pair per metric.\n type Row = { labels: Record<string, string>; values: Record<string, number> };\n const groups = new Map<string, { type: MetricsSnapshot['series'][number]['type']; rows: Row[] }>();\n for (const s of snapshot.series) {\n let g = groups.get(s.name);\n if (!g) {\n g = { type: s.type, rows: [] };\n groups.set(s.name, g);\n }\n g.rows.push({ labels: s.labels, values: s.values });\n }\n\n const lines: string[] = [];\n for (const [name, g] of groups) {\n const promType = g.type === 'histogram' ? 'summary' : g.type;\n lines.push(`# HELP ${name} ${name}`);\n lines.push(`# TYPE ${name} ${promType}`);\n\n if (g.type === 'counter' || g.type === 'gauge') {\n for (const row of g.rows) {\n lines.push(`${name}${formatLabels(row.labels)} ${formatNumber(row.values.value ?? 0)}`);\n }\n } else {\n // histogram → summary\n for (const row of g.rows) {\n const { count = 0, sum = 0, p50 = 0, p95 = 0, p99 = 0 } = row.values;\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.5' }))} ${formatNumber(p50)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.95' }))} ${formatNumber(p95)}`,\n );\n lines.push(\n `${name}${formatLabels(joinLabels(row.labels, { quantile: '0.99' }))} ${formatNumber(p99)}`,\n );\n lines.push(`${name}_sum${formatLabels(row.labels)} ${formatNumber(sum)}`);\n lines.push(`${name}_count${formatLabels(row.labels)} ${formatNumber(count)}`);\n }\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** MIME type Prometheus servers must respond with on /metrics. */\nexport const PROMETHEUS_CONTENT_TYPE = 'text/plain; version=0.0.4; charset=utf-8';\n\nexport interface MetricsServerOptions {\n port: number;\n /** Bind address. Defaults to 127.0.0.1 so we don't accidentally expose metrics publicly. */\n host?: string;\n sink: MetricsSink;\n /** Path to serve on. Defaults to /metrics. */\n path?: string;\n /**\n * V2-C: optional health registry. When provided, the server also responds\n * on `/healthz` (configurable via `healthPath`) with a JSON aggregate of\n * every registered health check. K8s probes expect a single HTTP server\n * exposing both `/metrics` and `/healthz`, so we mount them on the same\n * port rather than opening a sibling listener.\n */\n healthRegistry?: HealthRegistry;\n /** Path to serve health JSON on. Defaults to /healthz. */\n healthPath?: string;\n}\n\nexport interface MetricsServerHandle {\n port: number;\n url: string;\n close(): Promise<void>;\n}\n\n/**\n * Start an HTTP server that exposes a Prometheus scrape endpoint.\n * Uses node:http directly to avoid pulling a framework into the core graph.\n *\n * Why bind to 127.0.0.1 by default: telemetry endpoints inside an agent\n * process can leak prompt content via metric labels (tool name, error\n * message, etc.). The default keeps that on the loopback interface;\n * operators who want network scraping opt in explicitly with host: '0.0.0.0'.\n */\nexport async function startMetricsServer(opts: MetricsServerOptions): Promise<MetricsServerHandle> {\n const { createServer } = await import('node:http');\n const host = opts.host ?? '127.0.0.1';\n const path = opts.path ?? '/metrics';\n const healthPath = opts.healthPath ?? '/healthz';\n const healthRegistry = opts.healthRegistry;\n\n const server = createServer((req, res) => {\n if (!req.url || req.method !== 'GET') {\n res.statusCode = req.url ? 405 : 400;\n res.end();\n return;\n }\n // Strip query string for the route match.\n const url = req.url.split('?')[0];\n\n if (url === path) {\n let body: string;\n try {\n body = renderPrometheus(opts.sink.snapshot());\n } catch (err) {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`metrics render failed: ${err instanceof Error ? err.message : String(err)}`);\n return;\n }\n res.statusCode = 200;\n res.setHeader('content-type', PROMETHEUS_CONTENT_TYPE);\n res.end(body);\n return;\n }\n\n if (healthRegistry && url === healthPath) {\n // Health responses are async — run the checks then emit JSON.\n healthRegistry.run().then(\n (agg) => {\n // Status maps: healthy → 200, degraded → 200 (still serving), unhealthy → 503.\n res.statusCode = agg.status === 'unhealthy' ? 503 : 200;\n res.setHeader('content-type', 'application/json; charset=utf-8');\n res.end(JSON.stringify(agg, null, 2));\n },\n (err: unknown) => {\n res.statusCode = 500;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end(`health run failed: ${err instanceof Error ? err.message : String(err)}`);\n },\n );\n return;\n }\n\n res.statusCode = 404;\n res.setHeader('content-type', 'text/plain; charset=utf-8');\n res.end('Not Found');\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (err: Error) => {\n server.off('listening', onListening);\n reject(err);\n };\n const onListening = () => {\n server.off('error', onError);\n resolve();\n };\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(opts.port, host);\n });\n\n const addr = server.address();\n const boundPort = typeof addr === 'object' && addr ? addr.port : opts.port;\n return {\n port: boundPort,\n url: `http://${host}:${boundPort}${path}`,\n close: () =>\n new Promise<void>((resolve, reject) => {\n server.close((err) => (err ? reject(err) : resolve()));\n }),\n };\n}\n","import type { MetricSeries, MetricsSink } from '../../types/observability.js';\n\n/**\n * V2-A: OTLP/JSON metrics push exporter.\n *\n * Periodically POSTs `MetricsSink.snapshot()` to an OTLP HTTP receiver\n * (the OpenTelemetry Collector, vendor agents like Honeycomb, Datadog,\n * Grafana Cloud, etc.). The wire format is OTLP/JSON v1.0 — covered by\n * the spec at github.com/open-telemetry/opentelemetry-proto.\n *\n * Why no `@opentelemetry/*` dep: the core graph is intentionally\n * dependency-free. The JSON shape is well-defined and stable; bringing\n * in the official SDK would add ~3MB and pin us to its release cadence.\n * Operators who need the OTLP gRPC transport or vendor-specific quirks\n * can wrap an `@opentelemetry/exporter-metrics-otlp-grpc` in a custom\n * `MetricsSink` instead — the seam exists.\n */\n\nexport interface OtlpMetricsExporterOptions {\n /** Source of metric data. The exporter reads `snapshot()` per interval. */\n sink: MetricsSink;\n /**\n * OTLP HTTP endpoint base URL. Path `/v1/metrics` is appended unless\n * the URL already ends with `/v1/metrics` (idempotent).\n * Example: `http://otel-collector:4318` or `https://otlp.example.com`.\n */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 30s (Prometheus default). */\n intervalMs?: number;\n /** Optional bearer token / API key (sent as `Authorization`). */\n authorization?: string;\n /** Extra request headers (vendor-specific keys go here). */\n headers?: Record<string, string>;\n /** Resource attributes attached to every export. Defaults: `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope. Default: `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout. Defaults to 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). Defaults to global `fetch`. */\n fetchImpl?: typeof globalThis.fetch;\n /** Called when a push fails. Defaults to silent (telemetry must never crash the host). */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpMetricsExporterHandle {\n /** Push immediately (in addition to the scheduled interval). */\n flush(): Promise<void>;\n /** Stop the timer, attempt a final flush, then resolve. */\n stop(): Promise<void>;\n}\n\nconst DEFAULT_INTERVAL_MS = 30_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/metrics\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/metrics';\n}\n\ninterface OtlpAttribute {\n key: string;\n value: { stringValue: string };\n}\n\ninterface OtlpDataPoint {\n attributes: OtlpAttribute[];\n timeUnixNano: string;\n asDouble?: number;\n asInt?: string;\n count?: string;\n sum?: number;\n quantileValues?: { quantile: number; value: number }[];\n}\n\ninterface OtlpMetric {\n name: string;\n description?: string;\n unit?: string;\n sum?: { dataPoints: OtlpDataPoint[]; aggregationTemporality: 2; isMonotonic: true };\n gauge?: { dataPoints: OtlpDataPoint[] };\n summary?: { dataPoints: OtlpDataPoint[] };\n}\n\ninterface OtlpExportRequest {\n resourceMetrics: {\n resource: { attributes: OtlpAttribute[] };\n scopeMetrics: {\n scope: { name: string; version?: string };\n metrics: OtlpMetric[];\n }[];\n }[];\n}\n\nfunction attributesFor(labels: Record<string, string>): OtlpAttribute[] {\n return Object.entries(labels).map(([key, value]) => ({\n key,\n value: { stringValue: value },\n }));\n}\n\nfunction buildExportBody(opts: {\n series: MetricSeries[];\n resourceAttributes: Record<string, string>;\n scopeName: string;\n timeUnixNano: string;\n}): OtlpExportRequest {\n const metrics: OtlpMetric[] = [];\n for (const s of opts.series) {\n const dp: OtlpDataPoint = {\n attributes: attributesFor(s.labels),\n timeUnixNano: opts.timeUnixNano,\n };\n\n if (s.type === 'counter') {\n // OTLP requires sum data points carry `startTimeUnixNano`, but the spec\n // accepts omission for cumulative counters when the receiver can\n // assume process start. Most collectors do; vendor-specific tightness\n // is the user's problem if they need it stricter.\n dp.asDouble = s.values.value ?? 0;\n metrics.push({\n name: s.name,\n sum: { dataPoints: [dp], aggregationTemporality: 2, isMonotonic: true },\n });\n } else if (s.type === 'gauge') {\n dp.asDouble = s.values.value ?? 0;\n metrics.push({ name: s.name, gauge: { dataPoints: [dp] } });\n } else {\n // histogram → OTLP summary (quantiles are pre-computed by the sink)\n dp.count = String(s.values.count ?? 0);\n dp.sum = s.values.sum ?? 0;\n dp.quantileValues = [\n { quantile: 0.5, value: s.values.p50 ?? 0 },\n { quantile: 0.95, value: s.values.p95 ?? 0 },\n { quantile: 0.99, value: s.values.p99 ?? 0 },\n ];\n metrics.push({ name: s.name, summary: { dataPoints: [dp] } });\n }\n }\n\n return {\n resourceMetrics: [\n {\n resource: { attributes: attributesFor(opts.resourceAttributes) },\n scopeMetrics: [\n {\n scope: { name: opts.scopeName },\n metrics,\n },\n ],\n },\n ],\n };\n}\n\n/**\n * Build the OTLP/JSON export body from a sink snapshot. Exported for tests\n * and for callers that want to ship via their own transport.\n */\nexport function buildOtlpMetricsRequest(\n sink: MetricsSink,\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpExportRequest {\n return buildExportBody({\n series: sink.snapshot().series,\n resourceAttributes: opts.resourceAttributes ?? { 'service.name': 'wrongstack' },\n scopeName: opts.scopeName ?? 'wrongstack',\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n}\n\n/**\n * Start pushing metrics to an OTLP HTTP receiver. Returns a handle with\n * `flush()` and `stop()`.\n */\nexport function startOtlpMetricsExporter(\n opts: OtlpMetricsExporterOptions,\n): OtlpMetricsExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n async function pushOnce(): Promise<void> {\n if (stopped) return;\n const body = buildExportBody({\n series: opts.sink.snapshot().series,\n resourceAttributes,\n scopeName,\n timeUnixNano: String(BigInt(Date.now()) * 1_000_000n),\n });\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n void pushOnce();\n }, intervalMs);\n // Don't keep the process alive just to push metrics — graceful shutdown\n // is the host's job.\n handle.unref?.();\n\n return {\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n };\n}\n","import * as crypto from 'node:crypto';\nimport type { Span, Tracer } from '../../types/observability.js';\n\n/**\n * V2-B: OTLP/JSON trace exporter.\n *\n * The `Tracer` produced here captures every started span into an\n * in-memory buffer; an exporter timer drains the buffer and POSTs to\n * `/v1/traces` on the configured OTLP HTTP endpoint.\n *\n * Two production paths:\n *\n * 1. **This adapter** — zero deps, single-process, no parent/child\n * relationships (every span is a root span). Suitable when you\n * mostly want to see the agent's iteration / provider-call /\n * tool-call timings in a vendor UI (Jaeger, Tempo, Honeycomb,\n * Datadog APM, Grafana Cloud, Lightstep, …).\n *\n * 2. **Wrap a real OTel SDK** via the existing `OTelTracer` adapter.\n * Use this when you need context propagation, distributed traces\n * across processes, or vendor-specific span attributes.\n *\n * Keep `@opentelemetry/*` out of the dependency graph by design — both\n * paths above let users opt in to that dep on their own.\n */\n\nconst SPAN_STATUS_CODE_UNSET = 0;\nconst SPAN_STATUS_CODE_OK = 1;\nconst SPAN_STATUS_CODE_ERROR = 2;\n\ntype SpanAttrValue = string | number | boolean;\n\ninterface RecordedSpan {\n traceId: string;\n spanId: string;\n name: string;\n startTimeUnixNano: bigint;\n endTimeUnixNano?: bigint;\n attributes: Record<string, SpanAttrValue>;\n status: { code: number; message?: string };\n}\n\nfunction hex(bytes: number): string {\n return crypto.randomBytes(bytes).toString('hex');\n}\n\nfunction nowNs(): bigint {\n // Date.now() resolution is 1ms — fine for spans whose work takes ≥1ms.\n // Performance.now-based high-res nanoseconds would help, but reference\n // monoclock differs across processes and the OTLP receiver expects\n // wall-clock anyway.\n return BigInt(Date.now()) * 1_000_000n;\n}\n\nclass CapturingSpan implements Span {\n constructor(\n private readonly state: RecordedSpan,\n private readonly onEnd: (s: RecordedSpan) => void,\n ) {}\n\n setAttribute(key: string, value: SpanAttrValue): void {\n this.state.attributes[key] = value;\n }\n\n recordError(err: Error): void {\n this.state.status = { code: SPAN_STATUS_CODE_ERROR, message: err.message };\n this.state.attributes['exception.message'] = err.message;\n if (err.name) this.state.attributes['exception.type'] = err.name;\n }\n\n end(): void {\n if (this.state.endTimeUnixNano !== undefined) return;\n this.state.endTimeUnixNano = nowNs();\n if (this.state.status.code === SPAN_STATUS_CODE_UNSET) {\n this.state.status.code = SPAN_STATUS_CODE_OK;\n }\n this.onEnd(this.state);\n }\n}\n\nexport interface OtlpTraceExporterOptions {\n /** OTLP HTTP endpoint base URL. `/v1/traces` is appended unless already present. */\n endpoint: string;\n /** Push interval in milliseconds. Defaults to 5s (traces are bursty). */\n intervalMs?: number;\n /** Hard cap on buffered spans. When exceeded, oldest are dropped. Defaults to 2048. */\n maxBufferedSpans?: number;\n /** Authorization header. */\n authorization?: string;\n /** Extra request headers. */\n headers?: Record<string, string>;\n /** Resource attributes. Defaults to `service.name=wrongstack`. */\n resourceAttributes?: Record<string, string>;\n /** Instrumentation scope name. Default `wrongstack`. */\n scopeName?: string;\n /** Per-request timeout in ms. Default 10s. */\n timeoutMs?: number;\n /** Override fetch (for tests). */\n fetchImpl?: typeof globalThis.fetch;\n /** Called on push failure. Defaults to silent. */\n onError?: (err: unknown) => void;\n}\n\nexport interface OtlpTraceExporterHandle {\n /** The Tracer to install on Agent / ToolExecutor. */\n readonly tracer: Tracer;\n /** Push buffered spans immediately. */\n flush(): Promise<void>;\n /** Stop the timer, push remaining spans, resolve. */\n stop(): Promise<void>;\n /** Test helper: snapshot of spans currently in the buffer (not yet pushed). */\n readonly buffered: () => readonly RecordedSpan[];\n}\n\nconst DEFAULT_INTERVAL_MS = 5_000;\nconst DEFAULT_BUFFER_CAP = 2048;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nfunction joinEndpoint(base: string): string {\n if (/\\/v1\\/traces\\/?$/.test(base)) return base;\n return base.replace(/\\/$/, '') + '/v1/traces';\n}\n\ninterface OtlpAttribute {\n key: string;\n value:\n | { stringValue: string }\n | { boolValue: boolean }\n | { doubleValue: number }\n | { intValue: string };\n}\n\nfunction encodeAttr(key: string, value: SpanAttrValue): OtlpAttribute {\n if (typeof value === 'boolean') return { key, value: { boolValue: value } };\n if (typeof value === 'number') {\n return Number.isInteger(value)\n ? { key, value: { intValue: String(value) } }\n : { key, value: { doubleValue: value } };\n }\n return { key, value: { stringValue: value } };\n}\n\ninterface OtlpSpan {\n traceId: string;\n spanId: string;\n name: string;\n kind: 1;\n startTimeUnixNano: string;\n endTimeUnixNano: string;\n attributes: OtlpAttribute[];\n status: { code: number; message?: string };\n}\n\ninterface OtlpTracesRequest {\n resourceSpans: {\n resource: { attributes: OtlpAttribute[] };\n scopeSpans: {\n scope: { name: string };\n spans: OtlpSpan[];\n }[];\n }[];\n}\n\nexport function buildOtlpTracesRequest(\n spans: readonly RecordedSpan[],\n opts: { resourceAttributes?: Record<string, string>; scopeName?: string } = {},\n): OtlpTracesRequest {\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n const otlpSpans: OtlpSpan[] = spans.map((s) => ({\n traceId: s.traceId,\n spanId: s.spanId,\n name: s.name,\n kind: 1, // SPAN_KIND_INTERNAL\n startTimeUnixNano: s.startTimeUnixNano.toString(),\n endTimeUnixNano: (s.endTimeUnixNano ?? s.startTimeUnixNano).toString(),\n attributes: Object.entries(s.attributes).map(([k, v]) => encodeAttr(k, v)),\n status: s.status,\n }));\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: Object.entries(resourceAttributes).map(([k, v]) =>\n encodeAttr(k, v),\n ),\n },\n scopeSpans: [{ scope: { name: scopeName }, spans: otlpSpans }],\n },\n ],\n };\n}\n\n/**\n * Start the OTLP trace exporter. Returns a `Tracer` to install on the\n * runtime (`Agent.run` etc.) and `flush()`/`stop()` controls.\n */\nexport function startOtlpTraceExporter(\n opts: OtlpTraceExporterOptions,\n): OtlpTraceExporterHandle {\n const url = joinEndpoint(opts.endpoint);\n const intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;\n const maxBuffered = opts.maxBufferedSpans ?? DEFAULT_BUFFER_CAP;\n const timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const onError = opts.onError ?? (() => {});\n const resourceAttributes = opts.resourceAttributes ?? { 'service.name': 'wrongstack' };\n const scopeName = opts.scopeName ?? 'wrongstack';\n\n let stopped = false;\n const buffer: RecordedSpan[] = [];\n\n const headers: Record<string, string> = {\n 'content-type': 'application/json',\n ...(opts.headers ?? {}),\n };\n if (opts.authorization) headers.authorization = opts.authorization;\n\n const tracer: Tracer = {\n startSpan(name, attrs) {\n const state: RecordedSpan = {\n traceId: hex(16),\n spanId: hex(8),\n name,\n startTimeUnixNano: nowNs(),\n attributes: { ...(attrs ?? {}) },\n status: { code: SPAN_STATUS_CODE_UNSET },\n };\n return new CapturingSpan(state, (ended) => {\n if (buffer.length >= maxBuffered) buffer.shift();\n buffer.push(ended);\n });\n },\n };\n\n async function pushOnce(): Promise<void> {\n if (buffer.length === 0) return;\n const batch = buffer.splice(0, buffer.length);\n const body = buildOtlpTracesRequest(batch, { resourceAttributes, scopeName });\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const res = await fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n onError(new Error(`OTLP traces push failed: ${res.status} ${res.statusText} ${text}`));\n }\n } catch (err) {\n onError(err);\n } finally {\n clearTimeout(timer);\n }\n }\n\n const handle = setInterval(() => {\n if (!stopped) void pushOnce();\n }, intervalMs);\n handle.unref?.();\n\n return {\n tracer,\n flush: pushOnce,\n async stop() {\n stopped = true;\n clearInterval(handle);\n await pushOnce().catch(onError);\n },\n buffered: () => [...buffer],\n };\n}\n","import type { Context } from '../core/context.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { Message } from '../types/messages.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\n\r\n/**\r\n * Context introspection and management tool.\r\n * Allows the model to:\r\n * - \"check\" → see token budget and message counts\r\n * - \"summary\" → summarize and replace a range of messages\r\n * - \"prune\" → remove specific message indices\r\n * - \"add_note\" → inject a summary note at a specific point\r\n * - \"compact\" → run compaction via the injected compactor\r\n */\r\nexport const CONTEXT_MANAGER_TOOL_NAME = 'context_manager';\r\n\r\nexport type ContextManagerAction = 'check' | 'summary' | 'prune' | 'add_note' | 'compact';\r\n\r\nexport interface ContextManagerInput {\r\n action: ContextManagerAction;\r\n /** 0-based message indices for prune/summary (inclusive). */\r\n from?: number;\r\n to?: number;\r\n /** Text for add_note / summary actions. For summary, this is the LLM-provided summary text. */\r\n text?: string;\r\n /** Inject after which index (for add_note). Defaults to prepend (0). */\r\n afterIndex?: number;\r\n}\r\n\r\nexport interface ContextManagerResult {\r\n action: ContextManagerAction;\r\n beforeTokens: number;\r\n afterTokens?: number;\r\n removedCount?: number;\r\n messageCount: number;\r\n summary?: string;\r\n notes?: string;\r\n}\r\n\r\n/**\r\n * Options for creating a context manager tool.\r\n * `compactor` is required for the \"compact\" action; without it the action returns an error.\r\n */\r\nexport interface ContextManagerToolOptions {\r\n compactor?: Compactor;\r\n /**\r\n * Optional sub-LLM summarizer. When provided, the \"summary\" action calls this\r\n * to produce real summaries of message ranges instead of placeholder text.\r\n * (signature matches Provider.complete — return the summary text in result.content[0].text)\r\n */\r\n summarizer?: (messages: Message[]) => Promise<string>;\r\n}\r\n\r\nfunction roughEstimate(messages: Message[]): number {\r\n let total = 0;\r\n for (const m of messages) {\r\n if (typeof m.content === 'string') {\r\n total += Math.ceil(m.content.length / 4);\r\n } else if (Array.isArray(m.content)) {\r\n for (const b of m.content) {\r\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\r\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\r\n total += Math.ceil(JSON.stringify(b).length / 4);\r\n }\r\n }\r\n }\r\n }\r\n return total;\r\n}\r\n\r\nexport function createContextManagerTool(opts: ContextManagerToolOptions = {}): Tool<ContextManagerInput, ContextManagerResult> {\r\n return {\r\n name: CONTEXT_MANAGER_TOOL_NAME,\r\n description:\r\n 'Inspect or reorganize the conversation context window. ' +\r\n 'Use \"check\" to see token budget. ' +\r\n 'Use \"summary\" to collapse a message range into a concise note (provide \"text\" for custom summary). ' +\r\n 'Use \"prune\" to remove specific messages by index. ' +\r\n 'Use \"add_note\" to inject a summary note. ' +\r\n 'Use \"compact\" to run aggressive compaction.',\r\n inputSchema: {\r\n type: 'object',\r\n properties: {\r\n action: {\r\n type: 'string',\r\n enum: ['check', 'summary', 'prune', 'add_note', 'compact'],\r\n description: 'The context operation to perform.',\r\n },\r\n from: {\r\n type: 'number',\r\n description: 'Start index (inclusive) for summary/prune operations.',\r\n },\r\n to: {\r\n type: 'number',\r\n description: 'End index (inclusive) for summary/prune operations.',\r\n },\r\n text: {\r\n type: 'string',\r\n description:\r\n 'Summary or note text. For \"summary\": the model-provided summary of the removed range. ' +\r\n 'For \"add_note\": the note to inject.',\r\n },\r\n afterIndex: {\r\n type: 'number',\r\n description: 'Insert after this index (for add_note). Defaults to prepend (0).',\r\n },\r\n },\r\n required: ['action'],\r\n },\r\n permission: 'auto',\r\n mutating: true,\r\n\r\n async execute(input: ContextManagerInput, ctx: Context): Promise<ContextManagerResult> {\r\n const messages = ctx.messages;\r\n const beforeTokens = roughEstimate(messages);\r\n\r\n switch (input.action) {\r\n case 'check': {\r\n return {\r\n action: 'check',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: JSON.stringify({\r\n messages: messages.length,\r\n tokens: beforeTokens,\r\n readFiles: ctx.readFiles.size,\r\n todos: ctx.todos.length,\r\n inProgress: ctx.todos.filter((t) => t.status === 'in_progress').length,\r\n }),\r\n };\r\n }\r\n\r\n case 'compact': {\r\n if (!opts.compactor) {\r\n return {\r\n action: 'compact',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: 'No compactor registered. Use /compact aggressive via slash command instead.',\r\n };\r\n }\r\n const report = await opts.compactor.compact(ctx);\r\n return {\r\n action: 'compact',\r\n beforeTokens,\r\n afterTokens: report.after,\r\n messageCount: messages.length,\r\n };\r\n }\r\n\r\n case 'prune': {\r\n const from = input.from ?? 0;\r\n const to = input.to ?? messages.length - 1;\r\n if (from < 0 || to >= messages.length || from > to) {\r\n return {\r\n action: 'prune',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\r\n };\r\n }\r\n const removed = messages.splice(from, to - from + 1);\r\n const afterTokens = roughEstimate(messages);\r\n return {\r\n action: 'prune',\r\n beforeTokens,\r\n afterTokens,\r\n messageCount: messages.length,\r\n removedCount: removed.length,\r\n };\r\n }\r\n\r\n case 'add_note': {\r\n const noteText = input.text ?? '(no summary)';\r\n const afterIdx = Math.min(input.afterIndex ?? 0, messages.length);\r\n const noteMsg: Message = {\r\n role: 'system',\r\n content: `[note: ${noteText}]`,\r\n };\r\n messages.splice(afterIdx, 0, noteMsg);\r\n const afterTokens = roughEstimate(messages);\r\n return {\r\n action: 'add_note',\r\n beforeTokens,\r\n afterTokens,\r\n messageCount: messages.length,\r\n summary: noteText,\r\n };\r\n }\r\n\r\n case 'summary': {\r\n const from = input.from ?? 0;\r\n const to = input.to ?? messages.length - 1;\r\n if (from < 0 || to >= messages.length || from > to) {\r\n return {\r\n action: 'summary',\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\r\n };\r\n }\r\n const summaryText = input.text ?? '[summary placeholder — provide \"text\" to record the summary]';\r\n const summaryMsg: Message = {\r\n role: 'system',\r\n content: `[summary of messages ${from}–${to}]: ${summaryText}`,\r\n };\r\n messages.splice(from, to - from + 1, summaryMsg);\r\n const afterTokens = roughEstimate(messages);\r\n return {\r\n action: 'summary',\r\n beforeTokens,\r\n afterTokens,\r\n messageCount: messages.length,\r\n summary: summaryText,\r\n };\r\n }\r\n\r\n default:\r\n return {\r\n action: input.action,\r\n beforeTokens,\r\n messageCount: messages.length,\r\n notes: `Unknown action: ${input.action}`,\r\n };\r\n }\r\n },\r\n };\r\n}\r\n\r\n/** Pre-built instance with no compactor — compact action will return an error. */\r\nexport const contextManagerTool: Tool<ContextManagerInput, ContextManagerResult> =\r\n createContextManagerTool();","import type { MCPServerConfig } from '../types/config.js';\n\n/**\n * Built-in MCP server presets available to all WrongStack users out of the box.\n * These servers must be explicitly enabled in config (disabled by default).\n *\n * To enable: set `mcpServers: { serverName: { enabled: true } }` in your config.\n *\n * Some servers require environment variables or additional config — see notes below.\n *\n * Transport types:\n * stdio — spawns a local npm package binary via child_process\n * sse — HTTP SSE endpoint (client POSTs requests)\n * streamable-http — session-based HTTP with NDJSON responses\n */\n\n/** Filesystem access: read, write, list, search, tree. Good for exploring projects. */\nexport const filesystemServer = (): MCPServerConfig => ({\n name: 'filesystem',\n description: 'Read, write, and navigate the local filesystem (read-heavy tools)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '.'],\n permission: 'confirm',\n});\n\n/** GitHub API: issues, PRs, repos, search, file operations. Requires GITHUB_PERSONAL_ACCESS_TOKEN. */\nexport const githubServer = (): MCPServerConfig => ({\n name: 'github',\n description: 'GitHub API — issues, PRs, repos, search, file ops (requires GITHUB_PERSONAL_ACCESS_TOKEN)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n env: { GITHUB_PERSONAL_ACCESS_TOKEN: process.env.GITHUB_PERSONAL_ACCESS_TOKEN ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Context7 — codebase-aware documentation and Q&A using context from your code.\n * Live documentation for any library, grounded in your actual versions.\n */\nexport const context7Server = (): MCPServerConfig => ({\n name: 'context7',\n description: 'Codebase-aware documentation and Q&A (context7.ai)',\n transport: 'streamable-http',\n url: 'https://server.context7.ai/mcp',\n permission: 'confirm',\n});\n\n/**\n * Brave Search — web search via Brave Browser's API.\n * Requires BRAVE_SEARCH_API_KEY. Free tier: 2,000 queries/month.\n * Sign up at https://api.search.brave.com/\n */\nexport const braveSearchServer = (): MCPServerConfig => ({\n name: 'brave-search',\n description: 'Web search (Brave). Requires BRAVE_SEARCH_API_KEY — free tier 2k queries/month',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-brave-search'],\n env: { BRAVE_SEARCH_API_KEY: process.env.BRAVE_SEARCH_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Block (Block, Inc.) — Postgres database access via SQL.\n * Useful for running queries against a connected database during development.\n */\nexport const blockServer = (): MCPServerConfig => ({\n name: 'block',\n description: 'Postgres database access via SQL (Block MCP server)',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-block'],\n permission: 'confirm',\n});\n\n/**\n * EverArt — AI image generation via various providers.\n * Requires EVERART_API_KEY.\n */\nexport const everArtServer = (): MCPServerConfig => ({\n name: 'everart',\n description: 'AI image generation (EverArt). Requires EVERART_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-everart'],\n env: { EVERART_API_KEY: process.env.EVERART_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/**\n * Slack — messaging, channels, search.\n * Requires SLACK_BOT_TOKEN and either SLACK_TEAM_ID or SLACK_USER_TOKEN.\n */\nexport const slackServer = (): MCPServerConfig => ({\n name: 'slack',\n description: 'Slack — messaging, channels, search. Requires SLACK_BOT_TOKEN + SLACK_TEAM_ID',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-slack'],\n env: {\n SLACK_BOT_TOKEN: process.env.SLACK_BOT_TOKEN ?? '',\n SLACK_TEAM_ID: process.env.SLACK_TEAM_ID ?? '',\n },\n permission: 'confirm',\n});\n\n/**\n * AWS knowledge base — EC2, S3, Lambda, IAM, CloudFormation, cost management.\n * Requires AWS access key + secret in environment.\n */\nexport const awsServer = (): MCPServerConfig => ({\n name: 'aws',\n description: 'AWS — EC2, S3, Lambda, IAM, CloudFormation, costs. Requires AWS credentials',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-aws'],\n permission: 'confirm',\n});\n\n/**\n * Google Maps — directions, distance matrix, geocoding, places.\n * Requires GOOGLE_MAPS_API_KEY.\n */\nexport const googleMapsServer = (): MCPServerConfig => ({\n name: 'google-maps',\n description: 'Google Maps — directions, geocoding, places. Requires GOOGLE_MAPS_API_KEY',\n transport: 'stdio',\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-google-maps'],\n env: { GOOGLE_MAPS_API_KEY: process.env.GOOGLE_MAPS_API_KEY ?? '' },\n permission: 'confirm',\n});\n\n/** Sentinel — security vulnerability scanning (sentinel-labs). */\nexport const sentinelServer = (): MCPServerConfig => ({\n name: 'sentinel',\n description: 'Security vulnerability scanning (Sentinel)',\n transport: 'streamable-http',\n url: 'https://mcp.sentinel.ai',\n permission: 'deny', // security tool — require explicit confirmation\n});\n\n/** Everything bundled — full set of built-in servers. Useful for `wstack mcp add --all`. */\nexport const allServers = (): Record<string, MCPServerConfig> => ({\n filesystem: { ...filesystemServer(), enabled: false },\n github: { ...githubServer(), enabled: false },\n context7: { ...context7Server(), enabled: false },\n 'brave-search': { ...braveSearchServer(), enabled: false },\n block: { ...blockServer(), enabled: false },\n everart: { ...everArtServer(), enabled: false },\n slack: { ...slackServer(), enabled: false },\n aws: { ...awsServer(), enabled: false },\n 'google-maps': { ...googleMapsServer(), enabled: false },\n sentinel: { ...sentinelServer(), enabled: false },\n});"]}