@wrongstack/core 0.1.4 → 0.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +155 -0
- package/dist/defaults/index.d.ts +68 -33
- package/dist/defaults/index.js +559 -239
- package/dist/defaults/index.js.map +1 -1
- package/dist/index.d.ts +26 -12
- package/dist/index.js +745 -322
- package/dist/index.js.map +1 -1
- package/dist/kernel/index.d.ts +5 -4
- package/dist/kernel/index.js +2 -1
- package/dist/kernel/index.js.map +1 -1
- package/dist/{secret-scrubber-qU3AwEiI.d.ts → mode-Pjt5vMS6.d.ts} +94 -3
- package/dist/{provider-DovtyuM8.d.ts → provider-txgB0Oq9.d.ts} +27 -30
- package/dist/{session-reader-DR4u3bu9.d.ts → session-reader-7AutWHut.d.ts} +13 -32
- package/dist/system-prompt-vAB0F54-.d.ts +23 -0
- package/dist/types/index.d.ts +4 -4
- package/dist/types/index.js +34 -15
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +16 -11
- package/dist/utils/index.js +40 -13
- package/dist/utils/index.js.map +1 -1
- package/dist/{wstack-paths-D24ynAz1.d.ts → wstack-paths-BGu2INTm.d.ts} +7 -0
- package/package.json +7 -4
- package/dist/system-prompt--mzZnenv.d.ts +0 -16
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/errors.ts","../src/kernel/container.ts","../src/kernel/pipeline.ts","../src/kernel/events.ts","../src/kernel/tokens.ts","../src/kernel/run-controller.ts","../src/types/blocks.ts","../src/types/messages.ts","../src/types/provider.ts","../src/types/secret-vault.ts","../src/types/mode.ts","../src/types/spec.ts","../src/types/task-graph.ts","../src/utils/atomic-write.ts","../src/utils/safe-json.ts","../src/utils/newline-normalize.ts","../src/utils/color.ts","../src/utils/glob-match.ts","../src/utils/diff.ts","../src/utils/wstack-paths.ts","../src/utils/tool-output-serializer.ts","../src/utils/token-estimate.ts","../src/utils/json-schema-validate.ts","../src/defaults/logger.ts","../src/defaults/path-resolver.ts","../src/defaults/token-counter.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/defaults/secret-vault.ts","../src/defaults/permission-policy.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/defaults/compactor.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/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/defaults/task-tracker.ts","../src/defaults/task-flow.ts","../src/defaults/recovery-lock.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","../src/core/streaming-response-builder.ts","../src/core/provider-runner.ts","../src/core/iteration-limit.ts","../src/core/agent.ts","../src/core/conversation-state.ts","../src/core/context.ts","../src/core/run-env.ts","../src/core/input-builder.ts","../src/core/system-prompt-builder.ts","../src/registry/tool-registry.ts","../src/registry/provider-registry.ts","../src/registry/slash-command-registry.ts","../src/plugin/api.ts","../src/plugin/loader.ts"],"names":["path","fs","stat","open","os","t","fs2","path3","path4","fs3","randomBytes","path5","path6","fsp2","fsp3","path7","fs4","path8","path9","walk","fsp4","fs6","fs7","path10","deepMerge","fs8","afterTokens","fs9","path11","path12","fs10","handlers","resolve","randomUUID","path13","os2","fsp5","DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint","finalText","use","platform","path14","fs11","entry"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 { WrongStackError } from '../types/errors.js';\r\n\r\n/**\r\n * Container — dependency injection with explicit bind / override / decorate.\r\n *\r\n * Invariants:\r\n * bind() — throws if token already bound\r\n * override() — throws if nothing to replace\r\n * decorate() — stacks; cached value cleared on register\r\n */\r\n\r\nexport type Token<T> = symbol & { readonly __type?: T };\r\nexport type Factory<T> = (c: Container) => T;\r\nexport type Decorator<T> = (inner: T, c: Container) => T;\r\n\r\ninterface Entry<T = unknown> {\r\n factory: Factory<T>;\r\n singleton: boolean;\r\n decorators: Decorator<T>[];\r\n cache?: T;\r\n owner: string;\r\n}\r\n\r\nexport interface BindOptions {\r\n singleton?: boolean;\r\n owner?: string;\r\n}\r\n\r\nexport class Container {\r\n private readonly entries = new Map<symbol, Entry>();\r\n\r\n bind<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\r\n if (this.entries.has(token)) {\r\n throw new WrongStackError({\r\n message: `Container: token \"${token.description ?? 'unknown'}\" already bound`,\r\n code: 'CONTAINER_TOKEN_ALREADY_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n this.entries.set(token, {\r\n factory: factory as Factory<unknown>,\r\n singleton: opts.singleton ?? true,\r\n decorators: [],\r\n owner: opts.owner ?? 'core',\r\n });\r\n }\r\n\r\n override<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\r\n const existing = this.entries.get(token);\r\n if (!existing) {\r\n throw new WrongStackError({\r\n message: `Container: cannot override \"${token.description ?? 'unknown'}\" — not bound`,\r\n code: 'CONTAINER_TOKEN_NOT_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n this.entries.set(token, {\r\n factory: factory as Factory<unknown>,\r\n singleton: opts.singleton ?? existing.singleton,\r\n decorators: existing.decorators,\r\n owner: opts.owner ?? existing.owner,\r\n });\r\n }\r\n\r\n decorate<T>(token: Token<T>, decorator: Decorator<T>, owner = 'core'): void {\r\n const existing = this.entries.get(token);\r\n if (!existing) {\r\n throw new WrongStackError({\r\n message: `Container: cannot decorate \"${token.description ?? 'unknown'}\" — not bound`,\r\n code: 'CONTAINER_TOKEN_NOT_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n existing.decorators.push(decorator as Decorator<unknown>);\r\n existing.cache = undefined;\r\n existing.owner = `${existing.owner}+${owner}`;\r\n }\r\n\r\n resolve<T>(token: Token<T>): T {\r\n const entry = this.entries.get(token);\r\n if (!entry) {\r\n throw new WrongStackError({\r\n message: `Container: token \"${token.description ?? 'unknown'}\" not bound`,\r\n code: 'CONTAINER_TOKEN_NOT_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n if (entry.singleton && entry.cache !== undefined) {\r\n return entry.cache as T;\r\n }\r\n let value: unknown = entry.factory(this);\r\n for (const d of entry.decorators) {\r\n value = d(value, this);\r\n }\r\n if (entry.singleton) {\r\n entry.cache = value;\r\n }\r\n return value as T;\r\n }\r\n\r\n has<T>(token: Token<T>): boolean {\r\n return this.entries.has(token);\r\n }\r\n\r\n ownerOf<T>(token: Token<T>): string | undefined {\r\n return this.entries.get(token)?.owner;\r\n }\r\n\r\n /**\r\n * Remove a token's binding (along with any decorators stacked on it).\r\n * Returns true if the token existed. Use this to withdraw temporary\r\n * bindings installed by a short-lived run or plugin — without it, the\r\n * entry persists in the map forever.\r\n */\r\n unbind<T>(token: Token<T>): boolean {\r\n return this.entries.delete(token);\r\n }\r\n\r\n /**\r\n * Drop every binding. Intended for tests and short-lived CLI invocations\r\n * that rebuild the container from scratch. Production code should prefer\r\n * `unbind` on the specific tokens it owns.\r\n */\r\n clear(): void {\r\n this.entries.clear();\r\n }\r\n\r\n list(): Array<{ token: symbol; owner: string }> {\r\n return Array.from(this.entries.entries()).map(([token, entry]) => ({\r\n token,\r\n owner: entry.owner,\r\n }));\r\n }\r\n\r\n /**\r\n * Inspect a binding's full shape, including decorator count and whether\r\n * a singleton value is cached. Returns null if the token is unbound.\r\n * Decorator and factory function references are not exposed — only counts\r\n * and metadata, to keep internal state hidden.\r\n */\r\n inspect<T>(token: Token<T>): {\r\n owner: string;\r\n singleton: boolean;\r\n decoratorCount: number;\r\n cached: boolean;\r\n } | null {\r\n const entry = this.entries.get(token);\r\n if (!entry) return null;\r\n return {\r\n owner: entry.owner,\r\n singleton: entry.singleton,\r\n decoratorCount: entry.decorators.length,\r\n cached: entry.cache !== undefined,\r\n };\r\n }\r\n}\r\n","/**\r\n * Pipeline — Koa-style middleware chain with named middleware\r\n * and position-aware insertion. Generic over input type T.\r\n */\r\n\r\nexport type NextFn<T> = (value: T) => Promise<T>;\r\nexport type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;\r\n\r\n/**\r\n * Called when a middleware crashes (throws or rejects). Used by the\r\n * Pipeline's error boundary to log the offender without aborting the run.\r\n *\r\n * Return `'rethrow'` to propagate the error (default for core middleware),\r\n * or `'swallow'` to skip past the crashing middleware and continue with the\r\n * value the previous one produced. Plugin middleware should usually be\r\n * swallowed so one bad plugin can't kill an agent run.\r\n */\r\nexport type PipelineErrorPolicy = 'rethrow' | 'swallow';\r\n\r\nexport interface PipelineErrorEvent {\r\n middleware: string;\r\n owner?: string;\r\n err: unknown;\r\n}\r\n\r\nexport type PipelineErrorHandler = (\r\n ev: PipelineErrorEvent,\r\n) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;\r\n\r\nexport interface Middleware<T> {\r\n name: string;\r\n handler: MiddlewareHandler<T>;\r\n owner?: string;\r\n}\r\n\r\nexport interface PipelineOptions {\r\n /** When true and the target middleware is not found, operations silently no-op instead of throwing. */\r\n optional?: boolean;\r\n}\r\n\r\n/**\r\n * Read-only view of a pipeline. Returned to consumers (plugins, hooks)\r\n * so they can inspect but not mutate the chain.\r\n */\r\nexport interface ReadonlyPipeline<T> {\r\n readonly size: number;\r\n list(): readonly string[];\r\n run(input: T): Promise<T>;\r\n}\r\n\r\nexport class Pipeline<T> {\r\n private readonly chain: Middleware<T>[] = [];\r\n private errorHandler?: PipelineErrorHandler;\r\n\r\n /**\r\n * Install an error boundary. When a middleware throws or rejects, the\r\n * handler is called and decides whether to swallow (continue with the\r\n * pre-handler value) or rethrow. Without a handler, errors propagate.\r\n *\r\n * Wire one per pipeline at boot — the host CLI typically installs a\r\n * single boundary that logs to the operational log and emits a\r\n * `pipeline.error` event for /diag.\r\n */\r\n setErrorHandler(handler: PipelineErrorHandler | undefined): this {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n use(mw: Middleware<T> | Middleware<unknown>): this {\r\n this.ensureUnique(mw.name);\r\n this.chain.push(mw as Middleware<T>);\r\n return this;\r\n }\r\n\r\n prepend(mw: Middleware<T>): this {\r\n this.ensureUnique(mw.name);\r\n this.chain.unshift(mw);\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert middleware at an explicit index. Out-of-range indices are clamped.\r\n * Use this when insertBefore/insertAfter are insufficient (e.g. to place\r\n * a middleware at a known position regardless of named targets).\r\n */\r\n insertAt(index: number, mw: Middleware<T>): this {\r\n this.ensureUnique(mw.name);\r\n const idx = Math.max(0, Math.min(index, this.chain.length));\r\n this.chain.splice(idx, 0, mw);\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert mw immediately before the first occurrence of target.\r\n * If called multiple times with the same target, each call inserts\r\n * before the target's current position — so after insertBefore('B', X)\r\n * then insertBefore('B', Y), the order is Y → X → B.\r\n */\r\n insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\r\n this.ensureUnique(mw.name);\r\n const idx = this.indexOf(target, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain.splice(idx, 0, mw);\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert mw immediately after the first occurrence of target.\r\n * If called multiple times with the same target, each call inserts\r\n * after the target's current position — so after insertAfter('B', X)\r\n * then insertAfter('B', Y), the order is B → X → Y.\r\n */\r\n insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\r\n this.ensureUnique(mw.name);\r\n const idx = this.indexOf(target, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain.splice(idx + 1, 0, mw);\r\n return this;\r\n }\r\n\r\n replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\r\n if (mw.name !== target) this.ensureUnique(mw.name);\r\n const idx = this.indexOf(target, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain[idx] = mw;\r\n return this;\r\n }\r\n\r\n remove(name: string, opts?: PipelineOptions): this {\r\n const idx = this.indexOf(name, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain.splice(idx, 1);\r\n return this;\r\n }\r\n\r\n list(): readonly string[] {\r\n return this.chain.map((m) => m.name);\r\n }\r\n\r\n size(): number {\r\n return this.chain.length;\r\n }\r\n\r\n /** Return a read-only view suitable for passing to plugins. */\r\n asReadonly(): ReadonlyPipeline<T> {\r\n // The returned object's methods close over `this`, so it always sees the live chain.\r\n // `list()` returns a frozen snapshot to prevent external mutation of the chain.\r\n const self = this;\r\n return Object.freeze({\r\n get size() { return self.size(); },\r\n list() { return Object.freeze(self.list()); },\r\n run(input: T) { return self.run(input); },\r\n });\r\n }\r\n\r\n async run(input: T): Promise<T> {\r\n let index = -1;\r\n const chain = this.chain;\r\n const errorHandler = this.errorHandler;\r\n\r\n const dispatch = async (i: number, value: T): Promise<T> => {\r\n if (i <= index) {\r\n throw new Error(`Pipeline: next() called multiple times in \"${chain[index]?.name}\"`);\r\n }\r\n index = i;\r\n const mw = chain[i];\r\n if (!mw) return value;\r\n try {\r\n return await mw.handler(value, (v) => dispatch(i + 1, v));\r\n } catch (err) {\r\n if (!errorHandler) throw err;\r\n const policy = await errorHandler({ middleware: mw.name, owner: mw.owner, err });\r\n if (policy === 'rethrow') throw err;\r\n // Swallow: continue with the value that was about to flow into this\r\n // middleware. Subsequent middleware after the crashed one is skipped\r\n // — error boundary is \"skip the broken layer\", not \"skip the rest\".\r\n return value;\r\n }\r\n };\r\n\r\n return dispatch(0, input);\r\n }\r\n\r\n private indexOf(name: string, optional = false): number {\r\n const idx = this.chain.findIndex((m) => m.name === name);\r\n if (idx === -1 && !optional) {\r\n throw new Error(`Pipeline: middleware \"${name}\" not found`);\r\n }\r\n return idx;\r\n }\r\n\r\n private ensureUnique(name: string): void {\r\n if (this.chain.some((m) => m.name === name)) {\r\n throw new Error(`Pipeline: middleware \"${name}\" already registered`);\r\n }\r\n }\r\n}\r\n","/**\r\n * EventBus — observe-only typed event bus.\r\n * Subscribers cannot modify or cancel. Subscriber exceptions are caught.\r\n */\r\n\r\nimport type { Usage } from '../types/provider.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { Tool, ToolProgressEvent } from '../types/tool.js';\r\n\r\nexport interface EventMap {\r\n 'session.started': { id: string };\r\n 'session.ended': { id: string; usage: Usage };\r\n 'session.damaged': { sessionId: string; detail: string };\r\n 'iteration.started': { ctx: Context; index: number };\r\n 'iteration.completed': { ctx: Context; index: number };\r\n /**\r\n * Fired when the agent hits its iteration limit. Listeners (CLI/TUI) can\r\n * call `grant(extra)` to allow more iterations, or `deny()` to stop.\r\n * If no listener responds within 30s the run ends with 'max_iterations'.\r\n */\r\n 'iteration.limit_reached': {\r\n currentIterations: number;\r\n currentLimit: number;\r\n grant: (extraIterations: number) => void;\r\n deny: () => void;\r\n };\r\n 'provider.response': { ctx: Context; usage: Usage; stopReason: string };\r\n 'provider.text_delta': { ctx: Context; text: string };\r\n 'provider.tool_use_start': { ctx: Context; id: string; name: string };\r\n 'provider.tool_use_stop': { ctx: Context; id: string };\r\n /**\r\n * Fired before each retry of a failed provider call. `attempt` is 1-based\r\n * (the first retry is attempt 1, etc.). `description` is the human-readable\r\n * one-liner from `ProviderError.describe()` — render this in the CLI/TUI\r\n * instead of grepping logger output for the raw JSON body.\r\n */\r\n 'provider.retry': {\r\n providerId: string;\r\n attempt: number;\r\n delayMs: number;\r\n status: number;\r\n description: string;\r\n };\r\n /**\r\n * Fired once when a provider call ultimately fails (retries exhausted, or\r\n * non-retryable error). Same shape as `provider.retry` minus the delay.\r\n */\r\n 'provider.error': {\r\n providerId: string;\r\n status: number;\r\n description: string;\r\n retryable: boolean;\r\n };\r\n 'tool.started': { name: string; id: string; input?: unknown };\r\n /**\r\n * Fired for each ToolProgressEvent yielded by `Tool.executeStream`. UIs\r\n * subscribe to render incremental progress (streaming bash output, file\r\n * tree counts, etc.) without the tool having to know about the UI.\r\n */\r\n 'tool.progress': { name: string; id: string; event: ToolProgressEvent };\r\n /**\r\n * Fired when a tool call needs user confirmation and no confirmHandler\r\n * is registered on the executor. The TUI renders a confirmation dialog\r\n * from this event. Resolution is driven by calling the resolve function\r\n * passed in the payload with a decision string ('yes' | 'no' | 'always' | 'deny').\r\n */\r\n 'tool.confirm_needed': {\r\n tool: Tool;\r\n input: unknown;\r\n toolUseId: string;\r\n suggestedPattern: string;\r\n resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\r\n };\r\n /**\r\n * `output` is a truncated preview of the tool's serialized result text\r\n * (capped at ~400 chars by the emitter). UIs render this inline in the\r\n * tool history line without re-fetching from the session log.\r\n */\r\n 'tool.executed': {\r\n name: string;\r\n durationMs: number;\r\n ok: boolean;\r\n input?: unknown;\r\n output?: string;\r\n };\r\n 'token.threshold': { used: number; limit: number };\r\n 'compaction.fired': { before: number; after: number };\r\n 'mcp.server.connected': { name: string; toolCount: number };\r\n 'mcp.server.reconnected': { name: string; toolCount: number };\r\n 'mcp.server.disconnected': { name: string; reason: string };\r\n 'token.cost_estimate_unavailable': { model: string };\r\n error: { err: Error; phase: string };\r\n}\r\n\r\nexport type EventName = keyof EventMap;\r\nexport type Listener<E extends EventName> = (payload: EventMap[E]) => void;\r\n\r\nexport interface EventLogger {\r\n error(msg: string, ctx?: unknown): void;\r\n}\r\n\r\nexport class EventBus {\r\n private readonly listeners = new Map<EventName, Set<Listener<EventName>>>();\r\n private logger?: EventLogger;\r\n\r\n setLogger(logger: EventLogger): void {\r\n this.logger = logger;\r\n }\r\n\r\n on<E extends EventName>(event: E, fn: Listener<E>): () => void {\r\n let set = this.listeners.get(event);\r\n if (!set) {\r\n set = new Set();\r\n this.listeners.set(event, set);\r\n }\r\n set.add(fn as Listener<EventName>);\r\n return () => this.off(event, fn);\r\n }\r\n\r\n off<E extends EventName>(event: E, fn: Listener<E>): void {\r\n this.listeners.get(event)?.delete(fn as Listener<EventName>);\r\n }\r\n\r\n once<E extends EventName>(event: E, fn: Listener<E>): () => void {\r\n const wrapper: Listener<E> = (payload) => {\r\n this.off(event, wrapper as Listener<EventName>);\r\n (fn as Listener<E>)(payload);\r\n };\r\n this.on(event, wrapper as Listener<E>);\r\n return () => {\r\n this.off(event, wrapper as Listener<EventName>);\r\n };\r\n }\r\n\r\n emit<E extends EventName>(event: E, payload: EventMap[E]): void {\r\n const set = this.listeners.get(event);\r\n if (!set) return;\r\n for (const fn of set) {\r\n try {\r\n (fn as Listener<E>)(payload);\r\n } catch (err) {\r\n this.logger?.error(`EventBus listener for \"${event}\" threw`, err);\r\n }\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n * V2-D: introspection helper. Pass an `event` to count handlers for a\r\n * single key, or omit to get the total across every event. Used by the\r\n * leak-detection smoke test to flag handler accumulation across runs.\r\n */\r\n listenerCount(event?: EventName): number {\r\n if (event !== undefined) return this.listeners.get(event)?.size ?? 0;\r\n let total = 0;\r\n for (const set of this.listeners.values()) total += set.size;\r\n return total;\r\n }\r\n}\r\n","import type { Token } from './container.js';\r\nimport type { Logger } from '../types/logger.js';\r\nimport type { TokenCounter } from '../types/token-counter.js';\r\nimport type { SessionStore } from '../types/session.js';\r\nimport type { MemoryStore } from '../types/memory.js';\r\nimport type { PermissionPolicy } from '../types/permission.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport type { PathResolver } from '../types/path-resolver.js';\r\nimport type { ConfigLoader, ConfigStore } from '../types/config.js';\r\nimport type { Renderer } from '../types/renderer.js';\r\nimport type { InputReader } from '../types/input-reader.js';\r\nimport type { ErrorHandler } from '../types/error-handler.js';\r\nimport type { RetryPolicy } from '../types/retry-policy.js';\r\nimport type { SkillLoader } from '../types/skill.js';\r\nimport type { SystemPromptBuilder } from '../types/system-prompt.js';\r\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\r\nimport type { ModelsRegistry } from '../types/models-registry.js';\r\n\r\nconst t = <T>(name: string): Token<T> => Symbol(name) as Token<T>;\r\n\r\nexport const TOKENS = {\r\n Logger: t<Logger>('Logger'),\r\n TokenCounter: t<TokenCounter>('TokenCounter'),\r\n SessionStore: t<SessionStore>('SessionStore'),\r\n MemoryStore: t<MemoryStore>('MemoryStore'),\r\n PermissionPolicy: t<PermissionPolicy>('PermissionPolicy'),\r\n Compactor: t<Compactor>('Compactor'),\r\n PathResolver: t<PathResolver>('PathResolver'),\r\n ConfigLoader: t<ConfigLoader>('ConfigLoader'),\r\n ConfigStore: t<ConfigStore>('ConfigStore'),\r\n Renderer: t<Renderer>('Renderer'),\r\n InputReader: t<InputReader>('InputReader'),\r\n ErrorHandler: t<ErrorHandler>('ErrorHandler'),\r\n RetryPolicy: t<RetryPolicy>('RetryPolicy'),\r\n SkillLoader: t<SkillLoader>('SkillLoader'),\r\n SystemPromptBuilder: t<SystemPromptBuilder>('SystemPromptBuilder'),\r\n SecretScrubber: t<SecretScrubber>('SecretScrubber'),\r\n ModelsRegistry: t<ModelsRegistry>('ModelsRegistry'),\r\n} as const;\r\n","/**\n * RunController centralises abort + cleanup for a single agent run. It\n * wraps a single AbortController and exposes a registry of teardown\n * hooks that fire (LIFO, exactly once) when the run aborts OR ends\n * normally. Anyone holding the controller can:\n *\n * - read `signal` to bail out cooperatively\n * - call `abort(reason?)` to abort the run\n * - call `onAbort(fn)` to register a cleanup hook\n * - call `dispose()` when the run ends normally — this fires the\n * hooks too, so cleanup runs regardless of outcome\n *\n * Hooks must be idempotent and synchronous-or-quick. Errors thrown\n * inside hooks are caught and surfaced through `errorSink` (or the\n * console as a last resort) so one bad hook can't block the others.\n */\nexport interface RunControllerOptions {\n /** Optional parent signal — abort propagates from parent → this. */\n parentSignal?: AbortSignal;\n /** Receives errors thrown by cleanup hooks. Defaults to console.warn. */\n errorSink?: (err: unknown, where: string) => void;\n}\n\nexport class RunController {\n private readonly ctrl = new AbortController();\n private readonly hooks: Array<() => void | Promise<void>> = [];\n private disposed = false;\n private hooksDrained = false;\n private readonly errorSink: (err: unknown, where: string) => void;\n\n constructor(opts: RunControllerOptions = {}) {\n this.errorSink =\n opts.errorSink ??\n ((err, where) => {\n console.warn(`[run] cleanup hook failed in ${where}:`, err);\n });\n if (opts.parentSignal) {\n const parent = opts.parentSignal;\n if (parent.aborted) {\n this.ctrl.abort(parent.reason);\n } else {\n const onParentAbort = () => this.ctrl.abort(parent.reason);\n parent.addEventListener('abort', onParentAbort, { once: true });\n // When this run finishes normally, stop listening on the parent.\n this.onAbort(() => parent.removeEventListener('abort', onParentAbort));\n }\n }\n this.ctrl.signal.addEventListener(\n 'abort',\n () => {\n void this.runHooks();\n },\n { once: true },\n );\n }\n\n get signal(): AbortSignal {\n return this.ctrl.signal;\n }\n\n get aborted(): boolean {\n return this.ctrl.signal.aborted;\n }\n\n abort(reason?: unknown): void {\n if (this.ctrl.signal.aborted) return;\n this.ctrl.abort(reason);\n }\n\n /**\n * Register a teardown hook. Returns an unsubscribe function so callers\n * can opt out before the hook fires (e.g. when a tool finishes cleanly\n * before abort happens).\n */\n onAbort(fn: () => void | Promise<void>): () => void {\n this.hooks.push(fn);\n return () => {\n const idx = this.hooks.indexOf(fn);\n if (idx !== -1) this.hooks.splice(idx, 1);\n };\n }\n\n /**\n * Fire cleanup hooks and tear down listeners — called when the run\n * ends *normally* so cleanup happens regardless of outcome. Subsequent\n * aborts become no-ops.\n */\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n await this.runHooks();\n }\n\n private async runHooks(): Promise<void> {\n if (this.hooksDrained) return;\n this.hooksDrained = true;\n // Snapshot + clear so hooks added during cleanup don't re-fire.\n const snapshot = this.hooks.splice(0, this.hooks.length).reverse();\n for (const hook of snapshot) {\n try {\n await hook();\n } catch (err) {\n this.errorSink(err, 'RunController.dispose');\n }\n }\n }\n}\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 { ContentBlock } from './blocks.js';\n\nexport type MessageRole = 'user' | 'assistant' | 'system';\n\nexport interface Message {\n role: MessageRole;\n content: string | ContentBlock[];\n}\n\nexport function asBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nexport function asText(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n}\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), kept for debugging. */\r\n raw?: string;\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","/**\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","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];","export type SpecStatus = 'draft' | 'review' | 'approved' | 'implemented' | 'deprecated';\nexport type SpecSectionType = 'overview' | 'requirements' | 'architecture' | 'api' | 'data' | 'security' | 'acceptance';\n\nexport interface SpecSection {\n type: SpecSectionType;\n title: string;\n content: string;\n level: number;\n children?: SpecSection[];\n}\n\nexport interface SpecRequirement {\n id: string;\n type: 'functional' | 'non-functional' | 'security' | 'performance' | 'ux';\n priority: 'critical' | 'high' | 'medium' | 'low';\n description: string;\n acceptanceCriteria: string[];\n blockedBy?: string[];\n implements?: string[];\n}\n\nexport interface SpecApiEndpoint {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n description: string;\n request?: Record<string, unknown>;\n response?: Record<string, unknown>;\n auth?: boolean;\n}\n\nexport interface Specification {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n overview: string;\n sections: SpecSection[];\n requirements: SpecRequirement[];\n apiEndpoints?: SpecApiEndpoint[];\n dependencies?: string[];\n createdAt: number;\n updatedAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpecAnalysis {\n specId: string;\n completeness: number; // 0-100\n coverage: {\n requirements: number;\n apiEndpoints: number;\n edgeCases: number;\n errorHandling: number;\n };\n gaps: string[];\n risks: { requirement: string; risk: string; severity: 'high' | 'medium' | 'low' }[];\n suggestions: string[];\n}\n\nexport interface SpecValidationResult {\n valid: boolean;\n errors: { path: string; message: string }[];\n warnings: { path: string; message: string }[];\n}\n\nexport interface SpecTemplate {\n id: string;\n name: string;\n description: string;\n sections: Omit<SpecSection, 'content'>[];\n defaultRequirements: Omit<SpecRequirement, 'id' | 'description'>[];\n}\n\nexport const DEFAULT_SPEC_TEMPLATE: SpecTemplate = {\n id: 'default',\n name: 'Default Feature Spec',\n description: 'Standard template for feature specifications',\n sections: [\n { type: 'overview', title: 'Overview', level: 1 },\n { type: 'requirements', title: 'Requirements', level: 1 },\n { type: 'architecture', title: 'Architecture', level: 1 },\n { type: 'api', title: 'API Design', level: 1 },\n { type: 'data', title: 'Data Model', level: 1 },\n { type: 'security', title: 'Security', level: 1 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 1 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'non-functional', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\n};","export type TaskStatus = 'pending' | 'in_progress' | 'blocked' | 'failed' | 'review' | 'completed';\nexport type TaskPriority = 'critical' | 'high' | 'medium' | 'low';\nexport type TaskType = 'feature' | 'bugfix' | 'refactor' | 'docs' | 'test' | 'chore';\n\nexport interface TaskNode {\n id: string;\n title: string;\n description: string;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n assignee?: string;\n estimateHours?: number;\n actualHours?: number;\n tags?: string[];\n specRequirementId?: string;\n parentId?: string;\n children?: string[];\n createdAt: number;\n updatedAt: number;\n completedAt?: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TaskEdge {\n id: string;\n from: string;\n to: string;\n type: 'blocks' | 'depends_on' | 'relates_to' | 'implements';\n weight?: number;\n}\n\nexport interface TaskGraph {\n id: string;\n specId: string;\n title: string;\n nodes: Map<string, TaskNode>;\n edges: TaskEdge[];\n rootNodes: string[];\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface TaskDependency {\n taskId: string;\n blockedBy: string[];\n blocking: string[];\n}\n\nexport interface TaskAssignment {\n taskId: string;\n assignee: string;\n assignedAt: number;\n}\n\nexport interface TaskProgress {\n total: number;\n pending: number;\n inProgress: number;\n blocked: number;\n failed: number;\n review: number;\n completed: number;\n percentComplete: number;\n estimatedHours: number;\n actualHours: number;\n}\n\nexport interface TaskFilter {\n status?: TaskStatus[];\n priority?: TaskPriority[];\n type?: TaskType[];\n assignee?: string[];\n tags?: string[];\n specRequirementId?: string;\n}\n\nexport interface TaskSort {\n field: 'priority' | 'createdAt' | 'updatedAt' | 'status';\n direction: 'asc' | 'desc';\n}\n\nexport interface CriticalPathResult {\n taskIds: string[];\n totalEstimateHours: number;\n bottleneckTasks: string[];\n}\n\nexport function computeTaskProgress(graph: TaskGraph): TaskProgress {\n const nodes = Array.from(graph.nodes.values());\n const total = nodes.length;\n const completed = nodes.filter((n) => n.status === 'completed').length;\n const pending = nodes.filter((n) => n.status === 'pending').length;\n const inProgress = nodes.filter((n) => n.status === 'in_progress').length;\n const blocked = nodes.filter((n) => n.status === 'blocked').length;\n const failed = nodes.filter((n) => n.status === 'failed').length;\n const review = nodes.filter((n) => n.status === 'review').length;\n\n const estimatedHours = nodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\n const actualHours = nodes.reduce((sum, n) => sum + (n.actualHours ?? 0), 0);\n\n return {\n total,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: total > 0 ? Math.round((completed / total) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\nexport function findCriticalPath(graph: TaskGraph): CriticalPathResult {\n const nodes = Array.from(graph.nodes.values());\n const criticalNodes = nodes.filter((n) => n.priority === 'critical');\n const bottleneckTasks = criticalNodes\n .filter((n) => graph.edges.some((e) => e.to === n.id && e.type === 'depends_on'))\n .map((n) => n.id);\n\n const totalEstimateHours = criticalNodes.reduce((sum, n) => sum + (n.estimateHours ?? 0), 0);\n\n return {\n taskIds: criticalNodes.map((n) => n.id),\n totalEstimateHours,\n bottleneckTasks,\n };\n}\n\nexport function topologicalSort(graph: TaskGraph): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n function visit(id: string) {\n if (visited.has(id)) return;\n visited.add(id);\n\n const node = graph.nodes.get(id);\n if (!node) return;\n\n const outgoing = graph.edges.filter((e) => e.from === id);\n for (const edge of outgoing) {\n visit(edge.to);\n }\n\n result.push(id);\n }\n\n for (const rootId of graph.rootNodes) {\n visit(rootId);\n }\n\n return result;\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","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/** 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 */\nexport function sanitizeJsonString(s: string): string {\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; if it fails, return the stripped version\n // so the caller can decide what to do. Return undefined on parse failure\n // so callers can distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return out; // 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","export type NewlineStyle = 'lf' | 'crlf' | 'cr';\n\nexport function detectNewlineStyle(text: string): NewlineStyle {\n let lf = 0;\n let crlf = 0;\n let cr = 0;\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (c === 0x0d) {\n if (text.charCodeAt(i + 1) === 0x0a) {\n crlf++;\n i++;\n } else {\n cr++;\n }\n } else if (c === 0x0a) {\n lf++;\n }\n }\n if (crlf > lf && crlf > cr) return 'crlf';\n if (cr > lf && cr > crlf) return 'cr';\n return 'lf';\n}\n\nexport function toStyle(text: string, style: NewlineStyle): string {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (style === 'lf') return normalized;\n if (style === 'crlf') return normalized.replace(/\\n/g, '\\r\\n');\n return normalized.replace(/\\n/g, '\\r');\n}\n\nexport function normalizeToLf(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n","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","/**\n * Minimal glob matcher for trust patterns.\n * Supports: *, **, ?, character classes [abc], [a-z], negation [!...] or [^...].\n *\n * Both `[!...]` (shell glob convention) and `[^...]` (regex convention) are\n * accepted because users coming from either world will reach for what they\n * know; rejecting one silently fails open in a security-sensitive context.\n */\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.+^${}()|\\\\/]/g, '\\\\$&');\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 compileGlob(pattern).test(input);\n}\n\nexport function matchAny(patterns: string[], input: string): boolean {\n return patterns.some((p) => matchGlob(p, input));\n}\n","/**\n * Myers diff with unified-format output. No external dependencies.\n * Operates on arrays of lines (newline-terminated or stripped).\n */\n\ninterface Edit {\n op: 'equal' | 'insert' | 'delete';\n a: number;\n b: number;\n line: string;\n}\n\nfunction myersDiff(a: string[], b: string[]): Edit[] {\n const N = a.length;\n const M = b.length;\n const max = N + M;\n if (max === 0) return [];\n\n const v = new Map<number, number>();\n v.set(1, 0);\n const trace: Map<number, number>[] = [];\n\n for (let d = 0; d <= max; d++) {\n const snapshot = new Map(v);\n trace.push(snapshot);\n for (let k = -d; k <= d; k += 2) {\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let x: number;\n if (k === -d || (k !== d && left < right)) {\n x = right;\n } else {\n x = left + 1;\n }\n let y = x - k;\n while (x < N && y < M && a[x] === b[y]) {\n x++;\n y++;\n }\n v.set(k, x);\n if (x >= N && y >= M) {\n return backtrack(trace, a, b, N, M, d);\n }\n }\n }\n return [];\n}\n\nfunction backtrack(\n trace: Map<number, number>[],\n a: string[],\n b: string[],\n N: number,\n M: number,\n finalD: number,\n): Edit[] {\n const edits: Edit[] = [];\n let x = N;\n let y = M;\n for (let d = finalD; d > 0; d--) {\n const v = trace[d];\n if (!v) break;\n const k = x - y;\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let prevK: number;\n if (k === -d || (k !== d && left < right)) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = v.get(prevK) ?? 0;\n const prevY = prevX - prevK;\n while (x > prevX && y > prevY) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n if (d > 0) {\n if (x === prevX) {\n edits.push({ op: 'insert', a: x, b: y - 1, line: b[y - 1] ?? '' });\n } else {\n edits.push({ op: 'delete', a: x - 1, b: y, line: a[x - 1] ?? '' });\n }\n x = prevX;\n y = prevY;\n }\n }\n while (x > 0 && y > 0) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n return edits.reverse();\n}\n\nexport interface UnifiedDiffOptions {\n context?: number;\n fromFile?: string;\n toFile?: string;\n}\n\nexport function unifiedDiff(\n oldText: string,\n newText: string,\n opts: UnifiedDiffOptions = {},\n): string {\n const context = opts.context ?? 3;\n const a = oldText.split('\\n');\n const b = newText.split('\\n');\n // Handle trailing newline: split adds an empty string we don't want to diff\n if (a[a.length - 1] === '') a.pop();\n if (b[b.length - 1] === '') b.pop();\n const edits = myersDiff(a, b);\n if (edits.every((e) => e.op === 'equal')) return '';\n\n const hunks: { aStart: number; bStart: number; lines: string[] }[] = [];\n let i = 0;\n while (i < edits.length) {\n while (i < edits.length && edits[i]?.op === 'equal') i++;\n if (i >= edits.length) break;\n const hunkStart = Math.max(0, i - context);\n const lines: string[] = [];\n let aStart = (edits[hunkStart]?.a ?? 0) + 1;\n let bStart = (edits[hunkStart]?.b ?? 0) + 1;\n let aCount = 0;\n let bCount = 0;\n let cursor = hunkStart;\n let trailing = 0;\n while (cursor < edits.length) {\n const e = edits[cursor];\n if (!e) break;\n if (e.op === 'equal') {\n trailing++;\n if (trailing > context * 2) break;\n } else {\n trailing = 0;\n }\n if (e.op === 'equal') {\n lines.push(` ${e.line}`);\n aCount++;\n bCount++;\n } else if (e.op === 'delete') {\n lines.push(`-${e.line}`);\n aCount++;\n } else {\n lines.push(`+${e.line}`);\n bCount++;\n }\n cursor++;\n }\n // Trim trailing context lines beyond `context`\n while (lines.length > 0 && lines[lines.length - 1]?.startsWith(' ') && trailing > context) {\n lines.pop();\n aCount--;\n bCount--;\n trailing--;\n }\n if (aCount === 0) aStart = 0;\n if (bCount === 0) bStart = 0;\n hunks.push({ aStart, bStart, lines });\n i = cursor;\n }\n if (hunks.length === 0) return '';\n\n let out = '';\n out += `--- ${opts.fromFile ?? 'a'}\\n`;\n out += `+++ ${opts.toFile ?? 'b'}\\n`;\n for (const h of hunks) {\n let aCount = 0;\n let bCount = 0;\n for (const l of h.lines) {\n if (l.startsWith(' ')) {\n aCount++;\n bCount++;\n } else if (l.startsWith('-')) aCount++;\n else if (l.startsWith('+')) bCount++;\n }\n out += `@@ -${h.aStart},${aCount} +${h.bStart},${bCount} @@\\n`;\n out += `${h.lines.join('\\n')}\\n`;\n }\n return out;\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { createHash } from 'node:crypto';\n\n/**\n * Path layout. All developer-level state lives in ~/.wrongstack/.\n * Per-project state is keyed by sha256(absoluteProjectRoot).slice(0,12)\n * under ~/.wrongstack/projects/<hash>/.\n *\n * The ONLY thing inside the project tree is the optional\n * .wrongstack/AGENTS.md (committed) and .wrongstack/skills/ (committed).\n */\n\nexport interface WstackPaths {\n /** ~/.wrongstack — global root. */\n globalRoot: string;\n /** ~/.wrongstack/config.json */\n globalConfig: string;\n /** ~/.wrongstack/.key — 32 random bytes, mode 0600, AES-GCM key for the secret vault. */\n secretsKey: string;\n /** ~/.wrongstack/memory.md — user-global memory. */\n globalMemory: string;\n /** ~/.wrongstack/skills — user-global skills. */\n globalSkills: string;\n /** ~/.wrongstack/cache — fetched data (models.dev, etc.). */\n cacheDir: string;\n /** ~/.wrongstack/cache/models.dev.json */\n modelsCache: string;\n /** ~/.wrongstack/history — REPL line history. */\n historyFile: string;\n /** ~/.wrongstack/logs/wrongstack.log */\n logFile: string;\n /** ~/.wrongstack/projects/<hash> */\n projectDir: string;\n /** ~/.wrongstack/projects/<hash>/memory.md */\n projectMemory: string;\n /** ~/.wrongstack/projects/<hash>/sessions */\n projectSessions: string;\n /** ~/.wrongstack/projects/<hash>/trust.json */\n projectTrust: string;\n /** ~/.wrongstack/projects/<hash>/meta.json */\n projectMeta: string;\n /** ~/.wrongstack/projects/<hash>/config.local.json — optional override */\n projectLocalConfig: string;\n /** <project>/.wrongstack/AGENTS.md — committed project memory. */\n inProjectAgentsFile: string;\n /** <project>/.wrongstack/skills — committed project skills. */\n inProjectSkills: string;\n /** Stable hash for the project root. */\n projectHash: string;\n}\n\nexport function projectHash(absRoot: string): string {\n return createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 12);\n}\n\nexport interface WstackPathOptions {\n userHome?: string;\n projectRoot: string;\n /** Override the global root (e.g. for tests). Default: `${userHome}/.wrongstack`. */\n globalRoot?: string;\n}\n\nexport function resolveWstackPaths(opts: WstackPathOptions): WstackPaths {\n const home = opts.userHome ?? os.homedir();\n const globalRoot = opts.globalRoot ?? path.join(home, '.wrongstack');\n const hash = projectHash(opts.projectRoot);\n const projectDir = path.join(globalRoot, 'projects', hash);\n return {\n globalRoot,\n globalConfig: path.join(globalRoot, 'config.json'),\n secretsKey: path.join(globalRoot, '.key'),\n globalMemory: path.join(globalRoot, 'memory.md'),\n globalSkills: path.join(globalRoot, 'skills'),\n cacheDir: path.join(globalRoot, 'cache'),\n modelsCache: path.join(globalRoot, 'cache', 'models.dev.json'),\n historyFile: path.join(globalRoot, 'history'),\n logFile: path.join(globalRoot, 'logs', 'wrongstack.log'),\n projectDir,\n projectMemory: path.join(projectDir, 'memory.md'),\n projectSessions: path.join(projectDir, 'sessions'),\n projectTrust: path.join(projectDir, 'trust.json'),\n projectMeta: path.join(projectDir, 'meta.json'),\n projectLocalConfig: path.join(projectDir, 'config.local.json'),\n inProjectAgentsFile: path.join(opts.projectRoot, '.wrongstack', 'AGENTS.md'),\n inProjectSkills: path.join(opts.projectRoot, '.wrongstack', 'skills'),\n projectHash: hash,\n };\n}\n","/**\n * Tool output serialization utilities.\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\n */\n\nexport interface ToolOutputSerializerOptions {\n perIterationOutputCapBytes?: number;\n estimator?: (text: string) => number;\n}\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') {\n if (Array.isArray(value)) return value.map(serialize).join('\\n');\n if ('text' in (value as Record<string, unknown>)) {\n const t = (value as Record<string, unknown>).text;\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\n if (remainingBudget <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const textBytes = Buffer.byteLength(text, 'utf8');\n if (textBytes <= remainingBudget) {\n return { text, newBudget: remainingBudget - textBytes };\n }\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\n const markerBytes = Buffer.byteLength(marker, 'utf8');\n const available = remainingBudget - markerBytes;\n if (available <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const half = Math.floor(available / 2);\n const first = text.slice(0, half);\n const textBytesHalf = Buffer.byteLength(first, 'utf8');\n const second = text.slice(text.length - half);\n return { text: `${first}${marker}${second}`, newBudget: 0 };\n }\n\n return { serialize, enforceCap, capBytes };\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 * Estimate tokens for a tool_use block input.\n * Caches the stringified result on the input object itself to avoid\n * repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n // If input is a string already, estimate directly\n if (typeof input === 'string') return RoughTokenEstimate(input);\n\n // Use cached estimate if available (set by this function or by caller)\n if (\n input !== null &&\n typeof input === 'object' &&\n '__tokenEstimate' in input\n ) {\n return (input as Record<string, unknown>).__tokenEstimate as number;\n }\n\n const str = typeof input === 'object' ? JSON.stringify(input) : String(input);\n const estimate = RoughTokenEstimate(str);\n\n // Cache on object for future calls (only for plain objects)\n if (input !== null && typeof input === 'object' && !Array.isArray(input)) {\n (input as Record<string, unknown>).__tokenEstimate = estimate;\n }\n\n return estimate;\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 return RoughTokenEstimate(JSON.stringify(content));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}","/**\r\n * Minimal JSON Schema validator — covers the subset needed for plugin\r\n * configSchema validation and tool inputSchema sanity checks. Intentionally\r\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\r\n * authors can mix in non-standard extensions without breaking validation.\r\n *\r\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\r\n * conditional schemas, format validation, or anything else exotic, it should\r\n * bring its own ajv-based validator and call this only for the cheap path.\r\n */\r\nimport type { JSONSchema } from '../types/tool.js';\r\n\r\nexport interface ValidationError {\r\n path: string;\r\n message: string;\r\n}\r\n\r\nexport interface ValidationResult {\r\n ok: boolean;\r\n errors: ValidationError[];\r\n}\r\n\r\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n walk(value, schema, '', errors);\r\n return { ok: errors.length === 0, errors };\r\n}\r\n\r\nfunction walk(value: unknown, schema: JSONSchema, path: string, errors: ValidationError[]): void {\r\n if (schema.enum !== undefined) {\r\n if (!schema.enum.some((e) => deepEqual(e, value))) {\r\n errors.push({\r\n path: path || '<root>',\r\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (typeof schema.type === 'string') {\r\n if (!checkType(value, schema.type)) {\r\n errors.push({\r\n path: path || '<root>',\r\n message: `expected ${schema.type}, got ${describeType(value)}`,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (schema.type === 'object' && isPlainObject(value)) {\r\n const obj = value as Record<string, unknown>;\r\n for (const req of schema.required ?? []) {\r\n if (!(req in obj)) {\r\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\r\n }\r\n }\r\n if (schema.properties) {\r\n for (const [key, subSchema] of Object.entries(schema.properties)) {\r\n if (key in obj) {\r\n walk(obj[key], subSchema, joinPath(path, key), errors);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\r\n value.forEach((item, i) => walk(item, schema.items as JSONSchema, `${path}[${i}]`, errors));\r\n }\r\n}\r\n\r\nfunction checkType(value: unknown, type: string): boolean {\r\n switch (type) {\r\n case 'string': return typeof value === 'string';\r\n case 'number': return typeof value === 'number' && !Number.isNaN(value);\r\n case 'integer': return typeof value === 'number' && Number.isInteger(value);\r\n case 'boolean': return typeof value === 'boolean';\r\n case 'null': return value === null;\r\n case 'array': return Array.isArray(value);\r\n case 'object': return isPlainObject(value);\r\n default: return true;\r\n }\r\n}\r\n\r\nfunction isPlainObject(v: unknown): boolean {\r\n return typeof v === 'object' && v !== null && !Array.isArray(v);\r\n}\r\n\r\nfunction describeType(v: unknown): string {\r\n if (v === null) return 'null';\r\n if (Array.isArray(v)) return 'array';\r\n return typeof v;\r\n}\r\n\r\nfunction joinPath(parent: string, key: string): string {\r\n if (!parent) return key;\r\n return `${parent}.${key}`;\r\n}\r\n\r\nfunction deepEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (typeof a !== typeof b) return false;\r\n if (a === null || b === null) return a === b;\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\r\n }\r\n if (typeof a === 'object' && typeof b === 'object') {\r\n const ak = Object.keys(a as object);\r\n const bk = Object.keys(b as object);\r\n if (ak.length !== bk.length) return false;\r\n return ak.every((k) =>\r\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\r\n );\r\n }\r\n return false;\r\n}\r\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 throw new Error(\n `Path \"${absPath}\" resolves outside the project root (${this.projectRoot})`,\n );\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 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 throw new Error(`Failed to open session file: ${err instanceof Error ? err.message : String(err)}`);\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 );\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 events.push(JSON.parse(line) as SessionEvent);\n } catch {\n // skip malformed lines\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) => (a.startedAt < b.startedAt ? 1 : -1));\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\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 console.warn('[session] append failed:', err instanceof Error ? err.message : String(err));\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 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 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 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 await this.consolidate(scope);\n }\n }\n\n async forget(query: string, scope: MemoryScope = 'project-memory'): 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 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 atomicWrite(this.files[scope], '');\n } else {\n for (const s of ['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]) {\n await atomicWrite(this.files[s], '');\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\nexport class DefaultSecretScrubber implements SecretScrubber {\n scrub(text: string): string {\n if (!text) return text;\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","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 return walk(cfg, vault, (v) => vault.decrypt(v));\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) => 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);\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/** Mutable counter passed to walkCount to accumulate the migration total. */\ninterface MigrationCounter {\n n: number;\n}\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 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","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context } from '../core/context.js';\nimport type { PermissionDecision, PermissionPolicy, TrustPolicy } from '../types/permission.js';\nimport type { Tool } from '../types/tool.js';\nimport type { InputReader } from '../types/input-reader.js';\nimport { matchAny, matchGlob } from '../utils/glob-match.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { safeParse } from '../utils/safe-json.js';\n\nexport interface PermissionPolicyOptions {\n trustFile: string;\n yolo?: boolean;\n promptDelegate?: (\n tool: Tool,\n input: unknown,\n suggestedPattern: string,\n ) => Promise<'yes' | 'no' | 'always' | 'deny'>;\n inputReader?: InputReader;\n}\n\nexport class DefaultPermissionPolicy implements PermissionPolicy {\n private policy: TrustPolicy = {};\n private loaded = false;\n private readonly trustFile: string;\n private readonly yolo: boolean;\n private readonly promptDelegate?: PermissionPolicyOptions['promptDelegate'];\n\n constructor(opts: PermissionPolicyOptions) {\n this.trustFile = opts.trustFile;\n this.yolo = opts.yolo ?? false;\n this.promptDelegate = opts.promptDelegate;\n }\n\n async reload(): Promise<void> {\n try {\n const raw = await fs.readFile(this.trustFile, 'utf8');\n const parsed = safeParse<TrustPolicy>(raw);\n if (parsed.ok && parsed.value) this.policy = parsed.value;\n } catch {\n this.policy = {};\n }\n this.loaded = true;\n }\n\n async evaluate(tool: Tool, input: unknown, _ctx: Context): Promise<PermissionDecision> {\n if (!this.loaded) await this.reload();\n\n // 1. Tool-namespace matching (mcp__server__* etc.)\n const namespaceEntry = this.findNamespaceEntry(tool.name);\n\n // 2. Tool-name entry\n const entry = this.policy[tool.name] ?? namespaceEntry;\n\n // 3. Compute subject (the thing being matched)\n const subject = this.subjectFor(tool.name, input);\n\n // 4. Deny — absolute\n if (entry?.deny && subject && matchAny(entry.deny, subject)) {\n return { permission: 'deny', source: 'deny', reason: 'matched deny pattern' };\n }\n if (tool.permission === 'deny') {\n return { permission: 'deny', source: 'default', reason: 'tool default deny' };\n }\n\n // 5. Allow\n if (entry?.allow && subject && matchAny(entry.allow, subject)) {\n return { permission: 'auto', source: 'trust', reason: 'matched allow pattern' };\n }\n if (entry?.auto) {\n return { permission: 'auto', source: 'trust' };\n }\n\n // 6. YOLO\n if (this.yolo) {\n return { permission: 'auto', source: 'yolo' };\n }\n\n // 7. Tool default\n if (tool.permission === 'auto') {\n return { permission: 'auto', source: 'default' };\n }\n\n // 8. Confirm — delegate to prompt\n if (this.promptDelegate) {\n const decision = await this.promptDelegate(tool, input, subject ?? tool.name);\n if (decision === 'always') {\n await this.trust({ tool: tool.name, pattern: subject ?? tool.name });\n return { permission: 'auto', source: 'user', reason: 'user always-allowed' };\n }\n if (decision === 'deny') {\n return { permission: 'deny', source: 'user', reason: 'user denied' };\n }\n return { permission: decision === 'yes' ? 'auto' : 'deny', source: 'user' };\n }\n return { permission: 'confirm', source: 'default' };\n }\n\n async trust(rule: { tool: string; pattern: string }): Promise<void> {\n if (!this.loaded) await this.reload();\n const entry = this.policy[rule.tool] ?? {};\n entry.allow = Array.from(new Set([...(entry.allow ?? []), rule.pattern]));\n this.policy[rule.tool] = entry;\n try {\n await atomicWrite(this.trustFile, JSON.stringify(this.policy, null, 2));\n } catch (err) {\n // Revert in-memory state since disk write failed\n const existing = this.policy[rule.tool];\n if (existing?.allow) {\n const idx = existing.allow.indexOf(rule.pattern);\n if (idx !== -1) existing.allow.splice(idx, 1);\n }\n throw err;\n }\n }\n\n private subjectFor(toolName: string, input: unknown): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n\n // Glob metacharacters are dangerous: a crafted subject like \"**\" or \"foo/**/bar\"\n // can match too broadly in the allow/deny pattern match. Escape them so the\n // matching is done on the literal string.\n const globChars = /[*?\\[\\]]/g;\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\n\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlob(obj.command);\n }\n if (typeof obj.path === 'string') {\n // normalize Windows backslashes for glob matching, then escape metachars\n return escapeGlob((obj.path as string).replace(/\\\\/g, '/'));\n }\n if (typeof obj.url === 'string') {\n return escapeGlob(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlob(obj.name);\n }\n return undefined;\n }\n\n private findNamespaceEntry(toolName: string): TrustPolicy[string] | undefined {\n for (const key of Object.keys(this.policy)) {\n if (key.includes('*') && matchGlob(key, toolName)) {\n return this.policy[key];\n }\n }\n return undefined;\n }\n}\n","import { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\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 = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i.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';\r\nimport type { ErrorHandler } from '../types/error-handler.js';\r\nimport type { Response } from '../types/provider.js';\r\nimport type { Context } from '../core/context.js';\r\n\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport type { ModelsRegistry } from '../types/models-registry.js';\r\n\r\n/**\r\n * Tiered error recovery strategies.\r\n * Each strategy is attempted in order until one succeeds.\r\n */\r\nexport interface RecoveryStrategy {\r\n /** Human-readable label for logs. */\r\n label: string;\r\n /** Optional compactor for context_overflow recovery. */\r\n compactor?: Compactor;\r\n /** Returns a substitute Response, or null to fall through to the next strategy. */\r\n attempt: (err: unknown, ctx: Context) => Promise<Response | null>;\r\n}\r\n\r\n/**\r\n * Builds the ordered list of recovery strategies used by DefaultErrorHandler.\r\n * Exported so callers can customise or extend the strategy chain.\r\n */\r\nexport function buildRecoveryStrategies(opts?: {\r\n compactor?: Compactor;\r\n modelsRegistry?: ModelsRegistry;\r\n}): RecoveryStrategy[] {\r\n return [\r\n {\r\n label: 'context_overflow_reduce',\r\n compactor: opts?.compactor,\r\n async attempt(err, ctx) {\r\n if (err instanceof ProviderError && (err.status === 413 || /context|too long|tokens/i.test(err.message))) {\r\n if (this.compactor) {\r\n try {\r\n const report = await this.compactor.compact(ctx, { aggressive: true });\r\n if (report.after < report.before) {\r\n return {\r\n content: [{ type: 'text', text: '[context compacted automatically — please retry]' }],\r\n stopReason: 'end_turn',\r\n usage: { input: 0, output: 0 },\r\n model: ctx.model,\r\n };\r\n }\r\n } catch {\r\n // compact failed — fall through\r\n }\r\n }\r\n return null;\r\n }\r\n return null;\r\n },\r\n },\r\n {\r\n label: 'rate_limit_backoff',\r\n async attempt(err, ctx) {\r\n if (err instanceof ProviderError && err.status === 429) {\r\n // Prefer the parsed Retry-After hint the provider extracted into\r\n // body.retryAfterMs; fall back to 5s when absent.\r\n const delayMs = err.body?.retryAfterMs ?? 5_000;\r\n // Clamp between 1s and 60s.\r\n const delay = Math.max(1_000, Math.min(delayMs, 60_000));\r\n await new Promise((r) => setTimeout(r, delay));\r\n return {\r\n content: [{ type: 'text', text: '[rate limit backoff applied — please retry]' }],\r\n stopReason: 'end_turn',\r\n usage: { input: 0, output: 0 },\r\n model: ctx.model,\r\n };\r\n }\r\n return null;\r\n },\r\n },\r\n {\r\n label: 'downgrade_model',\r\n async attempt(err, ctx) {\r\n if (err instanceof ProviderError && (err.status === 429 || err.status === 529 || err.status >= 500)) {\r\n const registry = opts?.modelsRegistry;\r\n if (!registry) return null;\r\n\r\n try {\r\n const providerId = ctx.provider?.id;\r\n if (!providerId) return null;\r\n const provider = await registry.getProvider(providerId);\r\n if (!provider) return null;\r\n\r\n const currentModel = await registry.getModel(providerId, ctx.model);\r\n if (!currentModel) return null;\r\n\r\n // Find a cheaper fallback model with the same capabilities.\r\n // Prefer models with lower input cost, preferring the same family.\r\n const candidates = provider.models.filter((m) => {\r\n const modelCost = m.cost?.input ?? Number.POSITIVE_INFINITY;\r\n const currentCost = currentModel.cost?.input ?? Number.POSITIVE_INFINITY;\r\n // Must be cheaper.\r\n if (modelCost >= currentCost) return false;\r\n // Must support tools if the original did.\r\n if (currentModel.capabilities.tools && !m.tool_call) return false;\r\n // Must support vision if the original did.\r\n if (currentModel.capabilities.vision && !m.modalities?.input?.includes('image')) return false;\r\n return true;\r\n });\r\n\r\n if (candidates.length === 0) return null;\r\n\r\n // Pick the cheapest one.\r\n const fallback = candidates.reduce((prev, curr) =>\r\n (curr.cost?.input ?? 0) < (prev.cost?.input ?? 0) ? curr : prev,\r\n );\r\n\r\n return {\r\n content: [\r\n {\r\n type: 'text',\r\n text: `[model downgrade: ${ctx.model} → ${fallback.id} — please retry]`,\r\n },\r\n ],\r\n stopReason: 'end_turn',\r\n usage: { input: 0, output: 0 },\r\n model: fallback.id,\r\n };\r\n } catch {\r\n return null;\r\n }\r\n }\r\n return null;\r\n },\r\n },\r\n ];\r\n}\r\n\r\nexport const DEFAULT_RECOVERY_STRATEGIES = buildRecoveryStrategies();\r\n\r\nexport class DefaultErrorHandler implements ErrorHandler {\r\n private readonly strategies: RecoveryStrategy[];\r\n\r\n constructor(strategies: RecoveryStrategy[] = DEFAULT_RECOVERY_STRATEGIES) {\r\n this.strategies = strategies;\r\n }\r\n\r\n classify(err: unknown): {\r\n kind:\r\n | 'rate_limit'\r\n | 'overloaded'\r\n | 'server'\r\n | 'client'\r\n | 'network'\r\n | 'abort'\r\n | 'context_overflow'\r\n | 'unknown';\r\n retryable: boolean;\r\n } {\r\n if (err instanceof DOMException && err.name === 'AbortError') {\r\n return { kind: 'abort', retryable: false };\r\n }\r\n if (err instanceof Error && err.name === 'AbortError') {\r\n return { kind: 'abort', retryable: false };\r\n }\r\n if (err instanceof ProviderError) {\r\n if (err.status === 429) return { kind: 'rate_limit', retryable: true };\r\n if (err.status === 529) return { kind: 'overloaded', retryable: true };\r\n if (err.status >= 500) return { kind: 'server', retryable: true };\r\n if (err.status === 413 || /context|too long|tokens/i.test(err.message)) {\r\n return { kind: 'context_overflow', retryable: false };\r\n }\r\n if (err.status >= 400) return { kind: 'client', retryable: false };\r\n }\r\n if (err instanceof Error && /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i.test(err.message)) {\r\n return { kind: 'network', retryable: true };\r\n }\r\n return { kind: 'unknown', retryable: false };\r\n }\r\n\r\n async recover(err: unknown, ctx: Context): Promise<Response | null> {\r\n for (const strategy of this.strategies) {\r\n const result = await strategy.attempt(err, ctx);\r\n if (result !== null) return result;\r\n }\r\n return null;\r\n }\r\n}\r\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { 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 lines = ['## Available skills'];\n for (const s of skills) {\n lines.push(`- **${s.name}** — ${s.description.replace(/\\n/g, ' ').trim()}`);\n lines.push(` Path: ${s.path}`);\n }\n return lines.join('\\n');\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","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\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 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 keys = (pcfg as { apiKeys?: Array<{ label: string; apiKey: string }> }).apiKeys;\n if (!Array.isArray(keys) || 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) this.validateIdentity(cfg);\n return Object.freeze(cfg) as Config;\n }\n\n private async readJson(file: string): Promise<PartialConfig> {\n try {\n const raw = await fs.readFile(file, 'utf8');\n const parsed = safeParse<PartialConfig>(raw);\n if (parsed.ok && parsed.value) return parsed.value;\n } catch {\n // missing or unreadable; skip\n }\n return {};\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 // NOTE: the following threshold check is always reachable because\n // BEHAVIOR_DEFAULTS always provides a context section. The guard\n // exists for hand-constructed PartialConfig objects.\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 { w(next, prev); } catch { /* ignore */ }\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","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 for (let i = 0; i < preserveStart; i++) {\r\n const msg = messages[i];\r\n if (!msg || !Array.isArray(msg.content)) continue;\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 messages[i] = { ...msg, content: newContent };\r\n }\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 += 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\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","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 const aggressive = 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 const idx = userIndex;\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 for (let i = 0; i < preserveStart; i++) {\r\n const msg = messages[i];\r\n if (!msg || !Array.isArray(msg.content)) continue;\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 messages[i] = { ...msg, content: newContent };\r\n }\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}","import type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\nexport interface LLMSelectorOptions {\n /** Provider used for the selector LLM call. Required. */\n provider: Provider;\n /** Model for the selector. Defaults to the provider's default model. */\n model?: string;\n /**\n * Maximum tokens to keep in context (target budget).\n * Selector will aim to keep total content below this.\n */\n maxContextTokens?: number;\n /**\n * Prompt instructing the selector how to behave.\n * Should guide the LLM on importance tiers and output format.\n */\n systemPrompt?: string;\n}\n\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.\n\nOutput a JSON object with this structure:\n{\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\n \"reasoning\": \"brief explanation of decisions\"\n}\n\nImportance tiers:\n- \"critical\": decisions, file edits, tool results that affect state, final answers\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\n\nRules:\n- Always keep the most recent K pairs (preserve recency)\n- Never collapse the final 2 user/assistant pairs (working memory)\n- Preserve tool results that modified files or had external effects\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\n- If unsure, keep rather than collapse (errors are more costly than waste)\n\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\n\n/** Rough token estimation for a message array */\nfunction estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n return total;\n}\n\n/** Format messages as a compact text dump for the selector LLM */\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\n const lines: string[] = [];\n let used = 0;\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i]!;\n const role = m.role.padEnd(10, ' ');\n let text: string;\n if (typeof m.content === 'string') {\n text = m.content.slice(0, 500);\n } else {\n const content = m.content as import('../types/blocks.js').ContentBlock[];\n text = content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n // Also capture tool names for context\n const toolUses = content.filter((b) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\n }\n }\n const line = `[${i}][${role}]: ${text}`;\n if (used + line.length > maxChars) break;\n lines.push(line);\n used += line.length;\n }\n return lines.join('\\n');\n}\n\n/**\n * LLM-powered message selector. Calls a sub-LLM to analyze the\n * message history and produce a keep/collapse plan — more surgical\n * than fixed-window rules.\n */\nexport class LLMSelector implements MessageSelector {\n private readonly provider: Provider;\n private readonly model: string;\n private readonly maxContextTokens: number;\n private readonly systemPrompt: string;\n\n constructor(opts: LLMSelectorOptions) {\n this.provider = opts.provider;\n this.model = opts.model ?? 'unknown';\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n }\n\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\n\n // Build a concise representation of the conversation\n const historyText = formatMessages(messages);\n const totalTokens = estimateTokens(messages);\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\n\n // Add instruction to stay within budget\n const budgetInstruction =\n totalTokens > effectiveBudget\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\n : '';\n\n const req: Request = {\n model: this.model,\n system: [{ type: 'text', text: systemText + budgetInstruction }],\n messages: [{ role: 'user', content: historyText }],\n maxTokens: 1024,\n };\n\n let raw: string;\n try {\n const res = await this.provider.complete(req, { signal: new AbortController().signal });\n const textBlocks = res.content.filter(isTextBlock);\n raw = textBlocks.map((b) => b.text).join('\\n').trim();\n } catch (err) {\n // Fallback: use simple recency-based selection\n return this.fallbackSelect(messages, effectiveBudget);\n }\n\n return this.parseSelectorOutput(raw, messages.length);\n }\n\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\n // Simple fallback: keep from the end until we hit budget\n const toKeep: SelectorResult['kept'] = [];\n const toCollapse: SelectorResult['collapsed'] = [];\n\n let tokenCount = 0;\n let startIdx = 0;\n\n // Scan from the end backwards\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i]!;\n const cost = typeof m.content === 'string'\n ? Math.ceil(m.content.length / 4)\n : m.content.reduce((acc, b) => acc + (b.type === 'text' ? Math.ceil(b.text.length / 4) : Math.ceil(JSON.stringify(b).length / 4)), 0);\n\n if (tokenCount + cost <= budget) {\n tokenCount += cost;\n } else {\n startIdx = i + 1;\n break;\n }\n }\n\n if (startIdx > 0) {\n toCollapse.push({ from: 0, to: startIdx - 1 });\n }\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\n\n return {\n kept: toKeep,\n collapsed: toCollapse,\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\n };\n }\n\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\n // Try to extract JSON from the response\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart === -1 || jsonEnd === -1) {\n // Can't parse — use fallback\n return this.fallbackSelect(\n Array.from({ length: messageCount }, (_, i) => ({ role: 'user', content: '' } as Message)),\n this.maxContextTokens,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\n } catch {\n return this.fallbackSelect(\n Array.from({ length: messageCount }, (_, i) => ({ role: 'user', content: '' } as Message)),\n this.maxContextTokens,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n const kept = (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\n const collapsed = (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\n\n return {\n kept: kept.map((k) => ({ from: k.from, to: k.to, importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium' })),\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\n };\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 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, opts.aggressive ?? false);\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, targetBudget);\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, targetBudget: number): number {\r\n const messages = ctx.messages;\r\n const before = this.estimateTokens(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, aggressive: boolean): 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 for (let i = 0; i < preserveStart; i++) {\r\n const msg = messages[i];\r\n if (!msg || !Array.isArray(msg.content)) continue;\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 messages[i] = { ...msg, content: newContent };\r\n }\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}","import type { MiddlewareHandler } from '../kernel/pipeline.js';\nimport type { Context } from '../core/context.js';\nimport type { Compactor } from '../types/compactor.js';\n\n/**\n * Pipeline middleware that monitors context token load and\n * automatically triggers compaction when the warn/soft/hard\n * thresholds are crossed. 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; // fraction of maxContext (0-1)\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\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 (ctx → token count)\n * @param thresholds Threshold fractions (0-1) of maxContext\n * @param aggressiveOn Which threshold triggers aggressive (full LLM summarization)\n */\n constructor(\n compactor: Compactor,\n maxContext: number,\n estimator: (ctx: Context) => number,\n thresholds: { warn: number; soft: number; hard: number },\n aggressiveOn: 'hard' | 'soft' | 'warn' = 'soft',\n ) {\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 = aggressiveOn;\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);\n } else if (load >= this.softThreshold) {\n await this.compact(ctx, this.aggressiveOn !== 'hard');\n } else if (load >= this.warnThreshold) {\n await this.compact(ctx, false);\n }\n\n return next(ctx);\n };\n }\n\n private async compact(ctx: Context, aggressive: boolean): Promise<void> {\n try {\n await this.compactor.compact(ctx, { aggressive });\n } catch {\n // compaction is best-effort; never crash the agent loop\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","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 // parentBridge: wired by the caller via setSubagentBridge() once the\r\n // bidirectional bridge is created. Reads gated by hasParentBridge().\r\n parentBridge: null as unknown as AgentBridge,\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 as unknown as AgentBridge;\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 for (const id of this.subagents.keys()) {\r\n await this.stop(id);\r\n }\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 void this.runDispatched(subagentId, task);\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 this.inFlight++;\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 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 if (!this.runner) {\r\n // No runner wired — caller drives execution via completeTask(). Leave\r\n // the subagent in 'running' state; status reverts when caller reports.\r\n return;\r\n }\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 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: budget.usage().iterations,\r\n toolCalls: budget.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 this.inFlight = Math.max(0, this.inFlight - 1);\r\n\r\n const subagent = this.subagents.get(result.subagentId);\r\n if (subagent && subagent.status !== 'stopped') {\r\n subagent.status = result.status === 'failed' || result.status === 'timeout' ? 'error' : 'idle';\r\n subagent.currentTask = undefined;\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 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 { randomUUID } from 'node:crypto';\r\nimport type { RunResult } from '../core/agent.js';\r\nimport type { Context, RunOptions } from '../core/context.js';\r\nimport type { Agent } from '../core/agent.js';\r\nimport type { DoneCondition } from '../types/multi-agent.js';\r\nimport { toWrongStackError } from '../types/errors.js';\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 constructor(private readonly condition: DoneCondition) {}\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.condition.pattern && state.lastOutput) {\r\n const regex = new RegExp(this.condition.pattern);\r\n if (regex.test(state.lastOutput)) {\r\n return { done: true, reason: `output matched pattern \"${this.condition.pattern}\"`, ...state };\r\n }\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: RunResult & { toolCalls: number; reason?: string }) => 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<RunResult & { toolCalls: number; reason?: string }> {\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: RunResult & { toolCalls: number; reason?: string } = {\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\r\n this.toolCalls++;\r\n\r\n if (result.status === 'failed' || result.status === 'aborted') {\r\n const failedResult: RunResult & { toolCalls: number; reason?: string } = {\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 // Continue on tool errors, abort on fatal errors\r\n if ((e as Error).message.includes('timeout')) {\r\n const timeoutResult: RunResult & { toolCalls: number; reason?: string } = {\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';\n\nexport interface SpecParserOptions {\n strict?: boolean;\n}\n\nexport class SpecParser {\n constructor(private readonly opts: SpecParserOptions = {}) {}\n\n parse(content: string): Specification {\n const lines = content.split('\\n');\n const sections = this.extractSections(lines);\n const requirements = this.extractRequirements(lines);\n\n return {\n id: crypto.randomUUID(),\n title: this.extractTitle(lines),\n version: this.extractVersion(lines),\n status: 'draft',\n overview: this.extractOverview(lines),\n sections,\n requirements,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n }\n\n private extractTitle(lines: string[]): string {\n for (const line of lines) {\n const m = /^#\\s+(.+)/.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return 'Untitled Specification';\n }\n\n private extractVersion(lines: string[]): string {\n for (const line of lines) {\n const m = /version[:\\s]+(\\d+\\.\\d+\\.\\d+)/i.exec(line.trim());\n if (m?.[1]) return m[1];\n }\n return '0.0.1';\n }\n\n private extractOverview(lines: string[]): string {\n const overviewLines: string[] = [];\n let inOverview = false;\n let foundHeading = false;\n\n for (const line of lines) {\n if (/^##\\s+Overview/i.test(line.trim())) {\n inOverview = true;\n foundHeading = true;\n continue;\n }\n if (foundHeading && /^##\\s+/.test(line.trim())) break;\n if (inOverview) overviewLines.push(line);\n }\n\n return overviewLines.join('\\n').trim() || 'No overview provided';\n }\n\n private extractSections(lines: string[]): SpecSection[] {\n const sections: SpecSection[] = [];\n let currentSection: Partial<SpecSection> | null = null;\n let currentLines: string[] = [];\n let depth = 1;\n\n for (const line of lines) {\n const h2 = /^##\\s+(.+)/.exec(line.trim());\n const h3 = /^###\\s+(.+)/.exec(line.trim());\n\n if (h2) {\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n currentSection = { title: h2[1] ?? 'Unknown' };\n currentLines = [];\n depth = 2;\n continue;\n }\n\n if (h3) {\n currentLines.push(line);\n continue;\n }\n\n if (currentSection) {\n currentLines.push(line);\n }\n }\n\n if (currentSection && currentLines.length > 0) {\n sections.push({\n type: this.mapSectionType(currentSection.title ?? 'unknown'),\n title: currentSection.title ?? 'Unknown',\n level: depth,\n content: currentLines.join('\\n').trim(),\n });\n }\n\n return sections;\n }\n\n private extractRequirements(lines: string[]): SpecRequirement[] {\n const requirements: SpecRequirement[] = [];\n let inRequirements = false;\n let idCounter = 0;\n\n for (const line of lines) {\n if (/^##\\s+Requirements/i.test(line.trim())) {\n inRequirements = true;\n continue;\n }\n if (inRequirements && /^##\\s+/.test(line.trim())) break;\n\n if (inRequirements) {\n const req = this.parseRequirementLine(line, `REQ-${++idCounter}`);\n if (req) requirements.push(req);\n }\n }\n\n return requirements;\n }\n\n private parseRequirementLine(line: string, id: string): SpecRequirement | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) return null;\n\n const typeMap: Record<string, SpecRequirement['type']> = {\n 'functional': 'functional',\n 'non-functional': 'non-functional',\n 'security': 'security',\n 'performance': 'performance',\n 'ux': 'ux',\n };\n\n let type: SpecRequirement['type'] = 'functional';\n let priority: SpecRequirement['priority'] = 'medium';\n\n for (const [key, val] of Object.entries(typeMap)) {\n if (trimmed.toLowerCase().includes(`[${key}]`)) {\n type = val;\n }\n }\n\n if (trimmed.includes('[critical]') || trimmed.includes('[prio:high]')) {\n priority = 'critical';\n } else if (trimmed.includes('[high]')) {\n priority = 'high';\n } else if (trimmed.includes('[low]')) {\n priority = 'low';\n }\n\n return {\n id,\n type,\n priority,\n description: trimmed.replace(/\\[[^\\]]+\\]/g, '').trim(),\n acceptanceCriteria: [],\n };\n }\n\n private mapSectionType(title: string): SpecSection['type'] {\n const t = title.toLowerCase();\n if (t.includes('overview')) return 'overview';\n if (t.includes('requirement')) return 'requirements';\n if (t.includes('architect')) return 'architecture';\n if (t.includes('api')) return 'api';\n if (t.includes('data')) return 'data';\n if (t.includes('security')) return 'security';\n if (t.includes('acceptance')) return 'acceptance';\n return 'overview';\n }\n\n analyze(spec: Specification): SpecAnalysis {\n const gaps: string[] = [];\n const suggestions: string[] = [];\n const risks: SpecAnalysis['risks'] = [];\n\n // Check completeness\n const hasOverview = spec.sections.some((s) => s.type === 'overview');\n const hasRequirements = spec.sections.some((s) => s.type === 'requirements');\n const hasAcceptance = spec.sections.some((s) => s.type === 'acceptance');\n\n if (!hasOverview) gaps.push('Missing Overview section');\n if (!hasRequirements) gaps.push('Missing Requirements section');\n if (!hasAcceptance) gaps.push('Missing Acceptance Criteria section');\n\n if (spec.requirements.length === 0) {\n gaps.push('No requirements defined');\n suggestions.push('Add specific functional and non-functional requirements');\n }\n\n const unverifiedReqs = spec.requirements.filter((r) => r.acceptanceCriteria.length === 0);\n if (unverifiedReqs.length > 0) {\n gaps.push(`${unverifiedReqs.length} requirements without acceptance criteria`);\n suggestions.push('Define clear acceptance criteria for each requirement');\n }\n\n const criticalUnresolved = spec.requirements.filter(\n (r) => r.priority === 'critical' && r.blockedBy && r.blockedBy.length > 0,\n );\n for (const req of criticalUnresolved) {\n risks.push({\n requirement: req.id,\n risk: `Critical requirement blocked by ${req.blockedBy?.length} other requirements`,\n severity: 'high',\n });\n }\n\n const completeness = Math.round(\n ((hasOverview ? 1 : 0) + (hasRequirements ? 1 : 0) + (hasAcceptance ? 1 : 0) +\n (spec.requirements.length > 0 ? 1 : 0) +\n (spec.sections.length > 3 ? 1 : 0)) / 5 * 100,\n );\n\n return {\n specId: spec.id,\n completeness,\n coverage: {\n requirements: spec.requirements.length,\n apiEndpoints: spec.apiEndpoints?.length ?? 0,\n edgeCases: 0,\n errorHandling: 0,\n },\n gaps,\n risks,\n suggestions,\n };\n }\n\n validate(spec: Specification): SpecValidationResult {\n const errors: SpecValidationResult['errors'] = [];\n const warnings: SpecValidationResult['warnings'] = [];\n\n if (!spec.title.trim()) {\n errors.push({ path: 'title', message: 'Title is required' });\n }\n\n if (!spec.version.trim()) {\n errors.push({ path: 'version', message: 'Version is required' });\n }\n\n for (const req of spec.requirements) {\n if (!req.description.trim()) {\n errors.push({ path: `requirement.${req.id}`, message: 'Requirement description is empty' });\n }\n if (req.acceptanceCriteria.length === 0) {\n warnings.push({ path: `requirement.${req.id}`, message: 'No acceptance criteria defined' });\n }\n }\n\n const blockedByIds = new Set(spec.requirements.flatMap((r) => r.blockedBy ?? []));\n for (const id of blockedByIds) {\n if (!spec.requirements.find((r) => r.id === id)) {\n errors.push({ path: 'requirements', message: `BlockedBy references non-existent requirement: ${id}` });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\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 } from './task-tracker.js';\r\nimport type { 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\r\n const criticalReqs = spec.requirements.filter((r) => r.priority === 'critical');\r\n const highReqs = spec.requirements.filter((r) => r.priority === 'high');\r\n const mediumReqs = spec.requirements.filter((r) => r.priority === 'medium');\r\n const lowReqs = spec.requirements.filter((r) => r.priority === 'low');\r\n\r\n for (const req of criticalReqs) {\r\n const task = this.createTaskFromRequirement(req, spec.title);\r\n this.opts.taskTracker.addNode(task);\r\n }\r\n\r\n for (const req of highReqs) {\r\n const task = this.createTaskFromRequirement(req, spec.title);\r\n this.opts.taskTracker.addNode(task);\r\n }\r\n\r\n for (const req of mediumReqs) {\r\n const task = this.createTaskFromRequirement(req, spec.title);\r\n this.opts.taskTracker.addNode(task);\r\n }\r\n\r\n for (const req of lowReqs) {\r\n const task = this.createTaskFromRequirement(req, spec.title);\r\n this.opts.taskTracker.addNode(task);\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 const testTask = 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 const docsTask = 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, specTitle: string): Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'> {\r\n const type = this.mapRequirementType(req.type);\r\n const tags = [req.type, req.priority];\r\n\r\n return {\r\n title: req.description,\r\n description: this.buildDescription(req, specTitle),\r\n type,\r\n priority: this.mapPriority(req.priority),\r\n status: 'pending',\r\n specRequirementId: req.id,\r\n tags,\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, specTitle: string): 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 mapPriority(priority: SpecRequirement['priority']): TaskPriority {\r\n switch (priority) {\r\n case 'critical': return 'critical';\r\n case 'high': return 'high';\r\n case 'medium': return 'medium';\r\n case 'low': return 'low';\r\n default: return 'medium';\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}","import type { TaskNode, TaskGraph, TaskFilter, TaskSort, TaskProgress } from '../types/task-graph.js';\nimport { computeTaskProgress } from '../types/task-graph.js';\n\nexport interface TaskStore {\n saveGraph(graph: TaskGraph): Promise<void>;\n loadGraph(id: string): Promise<TaskGraph | null>;\n listGraphs(): Promise<{ id: string; title: string; updatedAt: number }[]>;\n deleteGraph(id: string): Promise<void>;\n}\n\nexport interface TaskTrackerOptions {\n store: TaskStore;\n}\n\nexport interface TaskTransition {\n from: TaskNode['status'];\n to: TaskNode['status'];\n timestamp: number;\n reason?: string;\n}\n\nexport class TaskTracker {\n private graph: TaskGraph | null = null;\n private transitions: TaskTransition[] = [];\n\n constructor(private readonly opts: TaskTrackerOptions) {}\n\n async createGraph(specId: string, title: string): Promise<TaskGraph> {\n this.graph = {\n id: crypto.randomUUID(),\n specId,\n title,\n nodes: new Map(),\n edges: [],\n rootNodes: [],\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n await this.opts.store.saveGraph(this.graph);\n return this.graph;\n }\n\n async loadGraph(id: string): Promise<TaskGraph | null> {\n this.graph = await this.opts.store.loadGraph(id);\n return this.graph;\n }\n\n addNode(node: Omit<TaskNode, 'id' | 'createdAt' | 'updatedAt'>): TaskNode {\n if (!this.graph) throw new Error('No graph loaded');\n\n const now = Date.now();\n const newNode: TaskNode = {\n ...node,\n id: crypto.randomUUID(),\n status: node.status ?? 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.graph.nodes.set(newNode.id, newNode);\n\n if (!node.parentId) {\n this.graph.rootNodes.push(newNode.id);\n }\n\n this.graph.updatedAt = now;\n this.opts.store.saveGraph(this.graph);\n\n return newNode;\n }\n\n addEdge(from: string, to: string, type: TaskGraph['edges'][0]['type'] = 'depends_on'): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n const edge = {\n id: crypto.randomUUID(),\n from,\n to,\n type,\n };\n\n this.graph.edges.push(edge);\n this.graph.updatedAt = Date.now();\n this.opts.store.saveGraph(this.graph);\n }\n\n updateNodeStatus(id: string, status: TaskNode['status'], reason?: string): void {\n if (!this.graph) throw new Error('No graph loaded');\n\n const node = this.graph.nodes.get(id);\n if (!node) throw new Error(`Node ${id} not found`);\n\n const from = node.status;\n node.status = status;\n node.updatedAt = Date.now();\n\n if (status === 'completed') {\n node.completedAt = Date.now();\n }\n\n this.transitions.push({ from, to: status, timestamp: Date.now(), reason });\n\n // Auto-unblock dependents\n if (status === 'completed') {\n this.unblockDependents(id);\n }\n\n // Auto-block blockers\n if (status === 'in_progress') {\n this.checkAndBlockIfNeeded(id);\n }\n\n this.graph.updatedAt = Date.now();\n this.opts.store.saveGraph(this.graph);\n }\n\n getNode(id: string): TaskNode | undefined {\n return this.graph?.nodes.get(id);\n }\n\n getAllNodes(filter?: TaskFilter, sort?: TaskSort): TaskNode[] {\n if (!this.graph) return [];\n\n let nodes = Array.from(this.graph.nodes.values());\n\n if (filter) {\n nodes = nodes.filter((n) => {\n if (filter.status?.length && !filter.status.includes(n.status)) return false;\n if (filter.priority?.length && !filter.priority.includes(n.priority)) return false;\n if (filter.type?.length && !filter.type.includes(n.type)) return false;\n if (filter.assignee?.length && n.assignee && !filter.assignee.includes(n.assignee)) return false;\n if (filter.tags?.length && n.tags && !n.tags.some((t) => filter.tags!.includes(t))) return false;\n if (filter.specRequirementId && n.specRequirementId !== filter.specRequirementId) return false;\n return true;\n });\n }\n\n if (sort) {\n nodes.sort((a, b) => {\n const aVal = a[sort.field] ?? '';\n const bVal = b[sort.field] ?? '';\n const cmp = aVal < bVal ? -1 : aVal > bVal ? 1 : 0;\n return sort.direction === 'asc' ? cmp : -cmp;\n });\n }\n\n return nodes;\n }\n\n getChildren(parentId: string): TaskNode[] {\n if (!this.graph) return [];\n return Array.from(this.graph.nodes.values()).filter((n) => n.parentId === parentId);\n }\n\n getDependents(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.from === taskId && e.type === 'depends_on')\n .map((e) => e.to);\n }\n\n getBlockers(taskId: string): string[] {\n if (!this.graph) return [];\n return this.graph.edges\n .filter((e) => e.to === taskId && e.type === 'depends_on')\n .map((e) => e.from);\n }\n\n canStart(taskId: string): boolean {\n const blockers = this.getBlockers(taskId);\n return blockers.every((id) => {\n const node = this.graph?.nodes.get(id);\n return node?.status === 'completed';\n });\n }\n\n getProgress(): TaskProgress {\n if (!this.graph) {\n return {\n total: 0, pending: 0, inProgress: 0, blocked: 0,\n failed: 0, review: 0, completed: 0,\n percentComplete: 0, estimatedHours: 0, actualHours: 0,\n };\n }\n return computeTaskProgress(this.graph);\n }\n\n getTransitions(taskId?: string): TaskTransition[] {\n if (!taskId) return [...this.transitions];\n // Would need taskId tracking per transition\n return [...this.transitions];\n }\n\n private unblockDependents(completedId: string): void {\n if (!this.graph) return;\n const dependents = this.getDependents(completedId);\n for (const depId of dependents) {\n const dep = this.graph.nodes.get(depId);\n if (dep?.status === 'blocked') {\n const remainingBlockers = this.getBlockers(depId);\n const allUnblocked = remainingBlockers.every((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status === 'completed';\n });\n if (allUnblocked) {\n dep.status = 'pending';\n dep.updatedAt = Date.now();\n }\n }\n }\n }\n\n private checkAndBlockIfNeeded(taskId: string): void {\n if (!this.graph) return;\n const blockers = this.getBlockers(taskId);\n const someBlocked = blockers.some((id) => {\n const blocker = this.graph?.nodes.get(id);\n return blocker?.status !== 'completed';\n });\n if (someBlocked) {\n const node = this.graph.nodes.get(taskId);\n if (node) {\n node.status = 'blocked';\n node.updatedAt = Date.now();\n }\n }\n }\n}","import type { TaskGraph, TaskNode, TaskStatus } from '../types/task-graph.js';\nimport type { Specification, SpecAnalysis } from '../types/spec.js';\nimport type { DoneCondition } from '../types/multi-agent.js';\nimport { TaskTracker } from './task-tracker.js';\nimport { SpecParser } from './spec-parser.js';\nimport { TaskGenerator, DefaultTaskStore } from './task-generator.js';\nimport type { EventBus } from '../kernel/events.js';\n\n/**\n * Extended event map used internally by TaskFlow and multi-agent components.\n * These events are emitted on the injected EventBus and are a subset of\n * the full EventMap — they do not require a separate registration.\n */\nexport interface TaskFlowEventMap {\n 'phase.change': { from: TaskFlowPhase; to: TaskFlowPhase };\n 'task.started': { taskId: string };\n 'task.completed': { taskId: string; result?: unknown };\n 'task.failed': { taskId: string; error: string };\n 'task.review': { taskId: string };\n 'spec.analyzed': { analysis: SpecAnalysis };\n 'progress': { percent: number; message: string };\n 'done': { graph: TaskGraph };\n 'error': { phase: TaskFlowPhase; error: Error };\n}\n\nexport type TaskFlowPhase =\n | 'idle'\n | 'parsing'\n | 'analyzing'\n | 'generating'\n | 'executing'\n | 'reviewing'\n | 'completing'\n | 'done'\n | 'failed';\n\nexport type TaskFlowEventName = keyof TaskFlowEventMap;\n\nexport interface TaskFlowOptions {\n tracker: TaskTracker;\n events: EventBus;\n doneCondition?: DoneCondition;\n maxConcurrent?: number;\n}\n\nexport interface TaskFlowExecutionContext {\n executeTask: (task: TaskNode) => Promise<unknown>;\n onTaskComplete?: (task: TaskNode, result: unknown) => void;\n onTaskFail?: (task: TaskNode, error: Error) => void;\n}\n\nexport class TaskFlow {\n private phase: TaskFlowPhase = 'idle';\n private spec: Specification | null = null;\n private graph: TaskGraph | null = null;\n private stopped = false;\n\n constructor(private readonly opts: TaskFlowOptions) {\n this.setPhase('idle');\n }\n\n private emit<K extends TaskFlowEventName>(event: K, payload: TaskFlowEventMap[K]): void {\n (this.opts.events.emit as (event: string, payload: unknown) => void)(event, payload);\n }\n\n async fromSpec(specContent: string): Promise<TaskGraph> {\n this.setPhase('parsing');\n\n const parser = new SpecParser();\n this.spec = parser.parse(specContent);\n\n this.setPhase('analyzing');\n const analysis = parser.analyze(this.spec);\n this.emit('spec.analyzed', { analysis });\n\n if (analysis.completeness < 50) {\n this.emit('error', {\n phase: 'analyzing',\n error: new Error(`Spec completeness too low: ${analysis.completeness}%`),\n });\n this.setPhase('failed');\n throw new Error('Spec too incomplete');\n }\n\n this.setPhase('generating');\n const store = new DefaultTaskStore();\n const generator = new TaskGenerator({ taskTracker: this.opts.tracker });\n this.graph = await generator.generateFromSpec(this.spec);\n\n return this.graph;\n }\n\n async execute(ctx: TaskFlowExecutionContext): Promise<TaskGraph> {\n if (!this.graph) throw new Error('No graph loaded. Call fromSpec first.');\n\n this.setPhase('executing');\n this.stopped = false;\n\n const pendingTasks = this.getExecutableTasks();\n const maxConcurrent = this.opts.maxConcurrent ?? 2;\n\n while (pendingTasks.length > 0 && !this.stopped) {\n const batch = pendingTasks.splice(0, maxConcurrent);\n const results = await Promise.allSettled(\n batch.map((task) => this.executeSingleTask(task, ctx)),\n );\n\n for (let i = 0; i < results.length; i++) {\n const result = results[i];\n const task = batch[i];\n\n if (!result || !task) continue;\n\n if (result.status === 'rejected') {\n this.opts.tracker.updateNodeStatus(task.id, 'failed', (result as PromiseRejectedResult).reason?.message);\n this.emit('task.failed', { taskId: task.id, error: (result as PromiseRejectedResult).reason?.message ?? 'unknown' });\n ctx.onTaskFail?.(task, (result as PromiseRejectedResult).reason as Error);\n } else {\n this.opts.tracker.updateNodeStatus(task.id, 'completed');\n this.emit('task.completed', { taskId: task.id, result: (result as PromiseFulfilledResult<unknown>).value });\n ctx.onTaskComplete?.(task, (result as PromiseFulfilledResult<unknown>).value);\n }\n\n this.emitProgress();\n }\n\n // Re-evaluate pending tasks (some may have become unblocked)\n const stillPending = this.getExecutableTasks();\n pendingTasks.length = 0;\n pendingTasks.push(...stillPending);\n\n // Check done condition\n if (this.checkDoneCondition()) {\n break;\n }\n }\n\n this.setPhase('completing');\n this.emit('done', { graph: this.graph });\n this.setPhase('done');\n\n return this.graph;\n }\n\n async reviewTask(taskId: string, approved: boolean, comment?: string): Promise<void> {\n const task = this.opts.tracker.getNode(taskId);\n if (!task) throw new Error(`Task ${taskId} not found`);\n\n if (approved) {\n this.opts.tracker.updateNodeStatus(taskId, 'completed', comment);\n this.emit('task.completed', { taskId });\n } else {\n this.opts.tracker.updateNodeStatus(taskId, 'in_progress', comment ?? 'Needs revision');\n this.emit('task.review', { taskId });\n }\n }\n\n stop(): void {\n this.stopped = true;\n }\n\n getPhase(): TaskFlowPhase {\n return this.phase;\n }\n\n getGraph(): TaskGraph | null {\n return this.graph;\n }\n\n getSpec(): Specification | null {\n return this.spec;\n }\n\n private setPhase(phase: TaskFlowPhase): void {\n const from = this.phase;\n this.phase = phase;\n this.emit('phase.change', { from, to: phase });\n }\n\n private getExecutableTasks(): TaskNode[] {\n return this.opts.tracker\n .getAllNodes({ status: ['pending', 'blocked'] })\n .filter((n) => n.status === 'pending' && this.opts.tracker.canStart(n.id))\n .sort((a, b) => {\n const priorityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return (priorityOrder[a.priority] ?? 4) - (priorityOrder[b.priority] ?? 4);\n });\n }\n\n private async executeSingleTask(task: TaskNode, ctx: TaskFlowExecutionContext): Promise<unknown> {\n this.opts.tracker.updateNodeStatus(task.id, 'in_progress');\n this.emit('task.started', { taskId: task.id });\n return ctx.executeTask(task);\n }\n\n private checkDoneCondition(): boolean {\n const condition = this.opts.doneCondition;\n if (!condition) {\n const progress = this.opts.tracker.getProgress();\n return progress.percentComplete === 100;\n }\n\n switch (condition.type) {\n case 'all_tasks_done': {\n const progress = this.opts.tracker.getProgress();\n return progress.pending === 0 && progress.inProgress === 0;\n }\n case 'iterations':\n return false; // Not tracked here\n case 'tool_calls':\n return false;\n default:\n return false;\n }\n }\n\n private emitProgress(): void {\n const progress = this.opts.tracker.getProgress();\n this.emit('progress', {\n percent: progress.percentComplete,\n message: `${progress.completed}/${progress.total} tasks completed`,\n });\n }\n}\n\nexport interface SpecDrivenDevOptions {\n workingDirectory: string;\n events: EventBus;\n doneCondition?: DoneCondition;\n}\n\nexport class SpecDrivenDev {\n private store: DefaultTaskStore;\n private tracker: TaskTracker;\n private readonly events: EventBus;\n private flows = new Map<string, TaskFlow>();\n\n constructor(opts: SpecDrivenDevOptions) {\n this.store = new DefaultTaskStore();\n this.tracker = new TaskTracker({ store: this.store });\n this.events = opts.events;\n }\n\n async createFlow(specContent: string, options?: Partial<TaskFlowOptions>): Promise<TaskFlow> {\n const flow = new TaskFlow({\n tracker: this.tracker,\n events: this.events,\n ...options,\n });\n\n const graph = await flow.fromSpec(specContent);\n this.flows.set(graph.id, flow);\n\n return flow;\n }\n\n getTracker(): TaskTracker {\n return this.tracker;\n }\n\n getFlow(graphId: string): TaskFlow | undefined {\n return this.flows.get(graphId);\n }\n\n listFlows(): { id: string; title: string; phase: TaskFlowPhase }[] {\n return Array.from(this.flows.entries()).map(([id, flow]) => ({\n id,\n title: flow.getGraph()?.title ?? 'Untitled',\n phase: flow.getPhase(),\n }));\n }\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","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.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 if (strategy === 'sequential') {\r\n const outputs: ToolExecutionOutput[] = [];\r\n for (const use of toolUses) {\r\n if (use) outputs.push(await runOne(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) => runOne(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) => runOne(use)));\r\n const secondPass: ToolExecutionOutput[] = [];\r\n for (const use of mutating) {\r\n secondPass.push(await runOne(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 throw parentSignal.reason instanceof Error\r\n ? parentSignal.reason\r\n : 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(toolName: string, input: unknown): 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 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 escapeGlob(obj.path.replace(/\\\\/g, '/'));\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 const timeout = new Promise<HealthCheckResult>((resolve) => {\r\n 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 }\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';\nimport type { Tool } from '../types/tool.js';\nimport type { Message } from '../types/messages.js';\nimport type { Compactor } from '../types/compactor.js';\n\n/**\n * Context introspection and management tool.\n * Allows the model to:\n * - \"check\" → see token budget and message counts\n * - \"summary\" → summarize and replace a range of messages\n * - \"prune\" → remove specific message indices\n * - \"add_note\" → inject a summary note at a specific point\n * - \"compact\" → run compaction via the injected compactor\n */\nexport const CONTEXT_MANAGER_TOOL_NAME = 'context_manager';\n\nexport type ContextManagerAction = 'check' | 'summary' | 'prune' | 'add_note' | 'compact';\n\nexport interface ContextManagerInput {\n action: ContextManagerAction;\n /** 0-based message indices for prune/summary (inclusive). */\n from?: number;\n to?: number;\n /** Text for add_note / summary actions. For summary, this is the LLM-provided summary text. */\n text?: string;\n /** Inject after which index (for add_note). Defaults to prepend (0). */\n afterIndex?: number;\n}\n\nexport interface ContextManagerResult {\n action: ContextManagerAction;\n beforeTokens: number;\n afterTokens?: number;\n removedCount?: number;\n messageCount: number;\n summary?: string;\n notes?: string;\n}\n\n/**\n * Options for creating a context manager tool.\n * `compactor` is required for the \"compact\" action; without it the action returns an error.\n */\nexport interface ContextManagerToolOptions {\n compactor?: Compactor;\n /**\n * Optional sub-LLM summarizer. When provided, the \"summary\" action calls this\n * to produce real summaries of message ranges instead of placeholder text.\n * (signature matches Provider.complete — return the summary text in result.content[0].text)\n */\n summarizer?: (messages: Message[]) => Promise<string>;\n}\n\nfunction roughEstimate(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else if (b.type === 'tool_use' || b.type === 'tool_result') {\n total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n }\n return total;\n}\n\nexport function createContextManagerTool(opts: ContextManagerToolOptions = {}): Tool<ContextManagerInput, ContextManagerResult> {\n return {\n name: CONTEXT_MANAGER_TOOL_NAME,\n description:\n 'Inspect or reorganize the conversation context window. ' +\n 'Use \"check\" to see token budget. ' +\n 'Use \"summary\" to collapse a message range into a concise note (provide \"text\" for custom summary). ' +\n 'Use \"prune\" to remove specific messages by index. ' +\n 'Use \"add_note\" to inject a summary note. ' +\n 'Use \"compact\" to run aggressive compaction.',\n inputSchema: {\n type: 'object',\n properties: {\n action: {\n type: 'string',\n enum: ['check', 'summary', 'prune', 'add_note', 'compact'],\n description: 'The context operation to perform.',\n },\n from: {\n type: 'number',\n description: 'Start index (inclusive) for summary/prune operations.',\n },\n to: {\n type: 'number',\n description: 'End index (inclusive) for summary/prune operations.',\n },\n text: {\n type: 'string',\n description:\n 'Summary or note text. For \"summary\": the model-provided summary of the removed range. ' +\n 'For \"add_note\": the note to inject.',\n },\n afterIndex: {\n type: 'number',\n description: 'Insert after this index (for add_note). Defaults to prepend (0).',\n },\n },\n required: ['action'],\n },\n permission: 'auto',\n mutating: true,\n\n async execute(input: ContextManagerInput, ctx: Context): Promise<ContextManagerResult> {\n const messages = ctx.messages;\n const beforeTokens = roughEstimate(messages);\n\n switch (input.action) {\n case 'check': {\n return {\n action: 'check',\n beforeTokens,\n messageCount: messages.length,\n notes: JSON.stringify({\n messages: messages.length,\n tokens: beforeTokens,\n readFiles: ctx.readFiles.size,\n todos: ctx.todos.length,\n inProgress: ctx.todos.filter((t) => t.status === 'in_progress').length,\n }),\n };\n }\n\n case 'compact': {\n if (!opts.compactor) {\n return {\n action: 'compact',\n beforeTokens,\n messageCount: messages.length,\n notes: 'No compactor registered. Use /compact aggressive via slash command instead.',\n };\n }\n const report = await opts.compactor.compact(ctx);\n return {\n action: 'compact',\n beforeTokens,\n afterTokens: report.after,\n messageCount: messages.length,\n };\n }\n\n case 'prune': {\n const from = input.from ?? 0;\n const to = input.to ?? messages.length - 1;\n if (from < 0 || to >= messages.length || from > to) {\n return {\n action: 'prune',\n beforeTokens,\n messageCount: messages.length,\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\n };\n }\n const removed = messages.splice(from, to - from + 1);\n const afterTokens = roughEstimate(messages);\n return {\n action: 'prune',\n beforeTokens,\n afterTokens,\n messageCount: messages.length,\n removedCount: removed.length,\n };\n }\n\n case 'add_note': {\n const noteText = input.text ?? '(no summary)';\n const afterIdx = Math.min(input.afterIndex ?? 0, messages.length);\n const noteMsg: Message = {\n role: 'system',\n content: `[note: ${noteText}]`,\n };\n messages.splice(afterIdx, 0, noteMsg);\n const afterTokens = roughEstimate(messages);\n return {\n action: 'add_note',\n beforeTokens,\n afterTokens,\n messageCount: messages.length,\n summary: noteText,\n };\n }\n\n case 'summary': {\n const from = input.from ?? 0;\n const to = input.to ?? messages.length - 1;\n if (from < 0 || to >= messages.length || from > to) {\n return {\n action: 'summary',\n beforeTokens,\n messageCount: messages.length,\n notes: `Invalid range [${from}, ${to}] for ${messages.length} messages.`,\n };\n }\n const toSummarize = messages.slice(from, to + 1);\n const summaryText = input.text ?? '[summary placeholder — provide \"text\" to record the summary]';\n const summaryMsg: Message = {\n role: 'system',\n content: `[summary of messages ${from}–${to}]: ${summaryText}`,\n };\n messages.splice(from, to - from + 1, summaryMsg);\n const afterTokens = roughEstimate(messages);\n return {\n action: 'summary',\n beforeTokens,\n afterTokens,\n messageCount: messages.length,\n summary: summaryText,\n };\n }\n\n default:\n return {\n action: input.action,\n beforeTokens,\n messageCount: messages.length,\n notes: `Unknown action: ${input.action}`,\n };\n }\n },\n };\n}\n\n/** Pre-built instance with no compactor — compact action will return an error. */\nexport const contextManagerTool: Tool<ContextManagerInput, ContextManagerResult> =\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});","import type { Provider, Request, Response } from '../types/provider.js';\nimport type { ContentBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { EventBus } from '../kernel/events.js';\nimport type { Context } from './context.js';\n\ninterface StreamingState {\n model: string;\n stopReason: Response['stopReason'];\n usage: Response['usage'];\n textBuffers: string[];\n currentTextIndex: number;\n tools: Map<string, { name: string; partial: string; input?: unknown; providerMeta?: Record<string, unknown> }>;\n blockOrder: Array<{ kind: 'text'; idx: number } | { kind: 'tool'; id: string }>;\n}\n\nexport function buildResponse(state: StreamingState): Response {\n const content: ContentBlock[] = [];\n for (const b of state.blockOrder) {\n if (b.kind === 'text') {\n const txt = state.textBuffers[b.idx] ?? '';\n if (txt) content.push({ type: 'text', text: txt });\n } else {\n const tb = state.tools.get(b.id);\n if (tb) {\n const block: ToolUseBlock = {\n type: 'tool_use',\n id: b.id,\n name: tb.name,\n input: (tb.input as Record<string, unknown>) ?? {},\n };\n if (tb.providerMeta && Object.keys(tb.providerMeta).length > 0) {\n block.providerMeta = tb.providerMeta;\n }\n content.push(block);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: '' });\n return { content, stopReason: state.stopReason, usage: state.usage, model: state.model };\n}\n\nexport function createStreamingState(model: string): StreamingState {\n return {\n model,\n stopReason: 'end_turn',\n usage: { input: 0, output: 0 },\n textBuffers: [],\n currentTextIndex: -1,\n tools: new Map(),\n blockOrder: [],\n };\n}\n\nexport function handleMessageStart(state: StreamingState, model: string): void {\n state.model = model;\n}\n\nexport function handleContentBlockStart(\n state: StreamingState,\n ev: { kind?: string; id?: string; name?: string },\n): void {\n const kind = ev.kind ?? 'text';\n if (kind === 'text') {\n state.currentTextIndex = state.textBuffers.length;\n state.textBuffers.push('');\n state.blockOrder.push({ kind: 'text', idx: state.currentTextIndex });\n } else if (kind === 'tool_use') {\n const id = ev.id ?? crypto.randomUUID();\n state.tools.set(id, { name: ev.name ?? 'unknown', partial: '' });\n state.blockOrder.push({ kind: 'tool', id });\n state.currentTextIndex = -1;\n }\n}\n\nexport function handleContentBlockStop(state: StreamingState, ev: { index?: number }): void {\n // No-op for now, but tracks block boundaries for providers that need it\n void ev;\n}\n\nexport function handleTextDelta(state: StreamingState, text: string): void {\n if (state.currentTextIndex === -1) {\n state.currentTextIndex = state.textBuffers.length;\n state.textBuffers.push('');\n state.blockOrder.push({ kind: 'text', idx: state.currentTextIndex });\n }\n state.textBuffers[state.currentTextIndex] = (state.textBuffers[state.currentTextIndex] ?? '') + text;\n}\n\nexport function handleToolUseStart(\n state: StreamingState,\n ev: { id: string; name: string },\n): void {\n state.currentTextIndex = -1;\n state.tools.set(ev.id, { name: ev.name, partial: '' });\n state.blockOrder.push({ kind: 'tool', id: ev.id });\n}\n\nexport function handleToolUseInputDelta(state: StreamingState, ev: { id: string; partial: string }): void {\n const t = state.tools.get(ev.id);\n if (t) t.partial += ev.partial;\n}\n\nexport function safeJsonOrRaw(s: string): unknown {\n if (!s) return {};\n try {\n return JSON.parse(s);\n } catch {\n return { _raw: s };\n }\n}\n\nexport function handleToolUseStop(\n state: StreamingState,\n ev: { id: string; input?: unknown; providerMeta?: Record<string, unknown> },\n): void {\n const t = state.tools.get(ev.id);\n if (t) {\n t.input = ev.input !== undefined ? ev.input : safeJsonOrRaw(t.partial);\n if (ev.providerMeta) t.providerMeta = ev.providerMeta;\n }\n state.currentTextIndex = -1;\n}\n\nexport function handleMessageStop(\n state: StreamingState,\n ev: { stopReason?: Response['stopReason']; usage?: Response['usage'] },\n): void {\n state.stopReason = ev.stopReason ?? 'end_turn';\n state.usage = ev.usage ?? { input: 0, output: 0 };\n}\n\nexport async function streamProviderToResponse(\n provider: Provider,\n req: Request,\n signal: AbortSignal,\n ctx: Context,\n events: EventBus,\n): Promise<Response> {\n const state = createStreamingState(req.model);\n\n const iter = provider.stream(req, { signal })[Symbol.asyncIterator]();\n try {\n for (;;) {\n const next = await iter.next();\n if (next.done) break;\n const ev = next.value;\n switch (ev.type) {\n case 'message_start':\n handleMessageStart(state, ev.model);\n break;\n case 'content_block_start':\n handleContentBlockStart(state, ev as Parameters<typeof handleContentBlockStart>[1]);\n break;\n case 'content_block_stop':\n handleContentBlockStop(state, ev as Parameters<typeof handleContentBlockStop>[1]);\n break;\n case 'text_delta':\n handleTextDelta(state, ev.text);\n events.emit('provider.text_delta', { ctx, text: ev.text });\n break;\n case 'tool_use_start':\n handleToolUseStart(state, ev as Parameters<typeof handleToolUseStart>[1]);\n events.emit('provider.tool_use_start', { ctx, id: ev.id, name: ev.name });\n break;\n case 'tool_use_input_delta':\n handleToolUseInputDelta(state, ev as Parameters<typeof handleToolUseInputDelta>[1]);\n break;\n case 'tool_use_stop':\n handleToolUseStop(state, ev as Parameters<typeof handleToolUseStop>[1]);\n events.emit('provider.tool_use_stop', { ctx, id: ev.id });\n break;\n case 'message_stop':\n handleMessageStop(state, ev as Parameters<typeof handleMessageStop>[1]);\n break;\n }\n }\n } catch (err) {\n if (signal.aborted) {\n state.stopReason = 'max_tokens';\n return buildResponse(state);\n }\n throw err;\n } finally {\n try {\n await iter.return?.();\n } catch {\n // best-effort\n }\n }\n return buildResponse(state);\n}","import type { EventBus } from '../kernel/events.js';\nimport type { Context } from './context.js';\nimport type { Provider, Request, Response } from '../types/provider.js';\nimport { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\nimport type { Logger } from '../types/logger.js';\nimport type { Tracer } from '../types/observability.js';\nimport { streamProviderToResponse } from './streaming-response-builder.js';\n\nexport interface RunProviderOptions {\n provider: Provider;\n request: Request;\n signal: AbortSignal;\n ctx: Context;\n events: EventBus;\n retry: RetryPolicy;\n logger: Logger;\n tracer?: Tracer;\n}\n\n/**\n * Call a provider with the retry policy applied. Emits `provider.retry`\n * before each retry and `provider.error` once when the retries are\n * exhausted. Streaming providers route through the streaming-response\n * builder so deltas reach the renderer.\n */\nexport async function runProviderWithRetry(opts: RunProviderOptions): Promise<Response> {\n const { provider, request, signal, ctx, events, retry, logger, tracer } = opts;\n let attempt = 0;\n for (;;) {\n const span = tracer?.startSpan('provider.complete', {\n 'provider.id': provider.id,\n 'provider.model': request.model,\n 'provider.streaming': provider.capabilities.streaming,\n 'provider.attempt': attempt,\n });\n try {\n const res = provider.capabilities.streaming\n ? await streamProviderToResponse(provider, request, signal, ctx, events)\n : await provider.complete(request, { signal });\n span?.setAttribute('provider.stopReason', res.stopReason);\n span?.setAttribute('provider.usage_in', res.usage.input);\n span?.setAttribute('provider.usage_out', res.usage.output);\n span?.end();\n return res;\n } catch (err) {\n if (err instanceof Error) span?.recordError(err);\n span?.end();\n if (signal.aborted) throw err;\n const isProviderErr = err instanceof ProviderError;\n const errAsErr = err instanceof Error ? err : new Error(String(err));\n const canRetry = retry.shouldRetry(isProviderErr ? err : errAsErr, attempt);\n const description = isProviderErr ? (err as ProviderError).describe() : errAsErr.message;\n if (!canRetry) {\n if (isProviderErr) {\n events.emit('provider.error', {\n providerId: (err as ProviderError).providerId,\n status: (err as ProviderError).status,\n description,\n retryable: false,\n });\n }\n throw err;\n }\n const delay = Math.round(retry.delayMs(attempt));\n const attemptNum = attempt + 1;\n logger.warn(`Provider retry ${attemptNum} in ${delay}ms — ${description}`);\n if (isProviderErr) {\n events.emit('provider.retry', {\n providerId: (err as ProviderError).providerId,\n attempt: attemptNum,\n delayMs: delay,\n status: (err as ProviderError).status,\n description,\n });\n }\n await new Promise<void>((resolve, reject) => {\n const t = setTimeout(resolve, delay);\n const onAbort = () => {\n clearTimeout(t);\n reject(new Error('aborted'));\n };\n if (signal.aborted) onAbort();\n signal.addEventListener('abort', onAbort, { once: true });\n });\n attempt++;\n }\n }\n}\n","import type { EventBus } from '../kernel/events.js';\n\nexport interface RequestLimitExtensionOptions {\n events: EventBus;\n currentIterations: number;\n currentLimit: number;\n /** When true (default), auto-grant 100 extra after giving listeners a tick to deny. */\n autoExtend: boolean;\n /** Timeout in ms before falling back to \"0 extra\" if no listener responds. */\n timeoutMs?: number;\n}\n\n/**\n * Emit `iteration.limit_reached` and wait for a listener to grant or\n * deny. Resolves with the number of extra iterations to grant (0 = stop).\n * When `autoExtend` is true the listener gets a microtask window to call\n * `deny()`; otherwise we resolve to 100.\n */\nexport function requestLimitExtension(opts: RequestLimitExtensionOptions): Promise<number> {\n const { events, currentIterations, currentLimit, autoExtend, timeoutMs = 30_000 } = opts;\n return new Promise((resolve) => {\n let resolved = false;\n const timer = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n resolve(0);\n }\n }, timeoutMs);\n const deny = () => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(0);\n }\n };\n const grant = (extra: number) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(Math.max(0, extra));\n }\n };\n events.emit('iteration.limit_reached', {\n currentIterations,\n currentLimit,\n grant,\n deny,\n });\n if (autoExtend) {\n // Give listeners a tick to deny synchronously; otherwise auto-grant 100.\n setImmediate(() => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(100);\n }\n });\n }\n });\n}\n","import type { Container } from '../kernel/container.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport { Pipeline } from '../kernel/pipeline.js';\r\nimport { RunController } from '../kernel/run-controller.js';\r\nimport { TOKENS } from '../kernel/tokens.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { ContentBlock, TextBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\r\nimport { isTextBlock, isToolUseBlock } from '../types/blocks.js';\r\nimport type { Request, Response } from '../types/provider.js';\r\nimport { type WrongStackError, AgentError, toWrongStackError } from '../types/errors.js';\r\nimport type { Tracer } from '../types/observability.js';\r\nimport type { Logger } from '../types/logger.js';\r\nimport type { RetryPolicy } from '../types/retry-policy.js';\r\nimport type { ErrorHandler } from '../types/error-handler.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport type { PermissionPolicy } from '../types/permission.js';\r\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\r\nimport type { Renderer } from '../types/renderer.js';\r\nimport type { Plugin, PluginAPI } from '../types/plugin.js';\r\nimport type { Context, RunOptions } from './context.js';\r\nimport type { ToolRegistry } from '../registry/tool-registry.js';\r\nimport type { ProviderRegistry } from '../registry/provider-registry.js';\r\nimport { ToolExecutor } from '../defaults/tool-executor.js';\r\nimport { runProviderWithRetry } from './provider-runner.js';\r\nimport { requestLimitExtension } from './iteration-limit.js';\r\n\r\n/** Default iteration cap. Use 0 or Infinity via config to disable. */\r\nexport const DEFAULT_MAX_ITERATIONS = 100;\r\n\r\nexport interface RunResult {\r\n status: 'done' | 'failed' | 'max_iterations' | 'aborted';\r\n /**\r\n * Set when `status === 'failed'` (always) or `'aborted'` (when the abort\r\n * carried an error context). Always a `WrongStackError` so callers can\r\n * branch on `code`, `severity`, and `recoverable` without parsing strings.\r\n * Raw throws are wrapped into an `AgentError` with code `AGENT_RUN_FAILED`\r\n * by `Agent.run` before they reach this field.\r\n */\r\n error?: WrongStackError;\r\n finalText?: string;\r\n iterations: number;\r\n}\r\n\r\nexport interface AgentInit {\r\n container: Container;\r\n tools: ToolRegistry;\r\n providers: ProviderRegistry;\r\n events: EventBus;\r\n pipelines: AgentPipelines;\r\n context: Context;\r\n maxIterations?: number;\r\n iterationTimeoutMs?: number;\r\n executionStrategy?: 'parallel' | 'sequential' | 'smart';\r\n perIterationOutputCapBytes?: number;\r\n /**\r\n * When true (default), the agent automatically extends its iteration\r\n * limit by 100 when hit, without asking the user. Set to false to\r\n * emit `iteration.limit_reached` and wait for a listener to grant/deny.\r\n */\r\n autoExtendLimit?: boolean;\r\n /**\r\n * Optional confirm handler. When set, the executor calls it synchronously\r\n * when a tool needs user confirmation (CLI path). When omitted, the\r\n * executor returns a `ToolConfirmPendingResult` and the agent emits\r\n * `tool.confirm_needed` for the TUI to resolve.\r\n */\r\n confirmAwaiter?: import('../types/tool-executor.js').ConfirmAwaiter | undefined;\r\n /**\r\n * Optional tracer. When provided, `Agent.run` opens an `agent.run` span,\r\n * per-iteration `agent.iteration` spans, and `provider.complete` spans\r\n * inside the retry loop. Tool spans are opened by the ToolExecutor.\r\n * Default is `NoopTracer` (zero overhead).\r\n */\r\n tracer?: Tracer | undefined;\r\n}\r\n\r\nexport interface AgentPipelines {\r\n request: Pipeline<Request>;\r\n response: Pipeline<Response>;\r\n toolCall: Pipeline<ToolCallPipelinePayload>;\r\n userInput: Pipeline<UserInputPayload>;\r\n assistantOutput: Pipeline<TextBlock>;\r\n contextWindow: Pipeline<Context>;\r\n}\r\n\r\nexport interface UserInputPayload {\r\n content: ContentBlock[];\r\n /** Concatenation of text blocks — convenience for middleware that only cares about text. */\r\n text: string;\r\n ctx: Context;\r\n}\r\n\r\nexport type AgentInput = string | ContentBlock[];\r\n\r\nfunction normalizeInput(input: AgentInput): { blocks: ContentBlock[]; text: string } {\r\n if (typeof input === 'string') {\r\n return { blocks: [{ type: 'text', text: input }], text: input };\r\n }\r\n const text = input\r\n .filter(isTextBlock)\r\n .map((b) => b.text)\r\n .join('');\r\n return { blocks: input, text };\r\n}\r\n\r\nexport interface ToolCallPipelinePayload {\r\n toolUse: ToolUseBlock;\r\n result: ToolResultBlock;\r\n ctx: Context;\r\n /** Undefined when the model invoked a tool name we don't know. */\r\n tool?: Tool;\r\n}\r\n\r\nexport function createDefaultPipelines(): AgentPipelines {\r\n return {\r\n request: new Pipeline<Request>(),\r\n response: new Pipeline<Response>(),\r\n toolCall: new Pipeline<ToolCallPipelinePayload>(),\r\n userInput: new Pipeline<UserInputPayload>(),\r\n assistantOutput: new Pipeline<TextBlock>(),\r\n contextWindow: new Pipeline<Context>(),\r\n };\r\n}\r\n\r\nexport class Agent {\r\n readonly container: Container;\r\n readonly tools: ToolRegistry;\r\n readonly providers: ProviderRegistry;\r\n readonly events: EventBus;\r\n readonly pipelines: AgentPipelines;\r\n readonly ctx: Context;\r\n private readonly maxIterations: number;\r\n private readonly iterationTimeoutMs: number;\r\n private readonly executionStrategy: 'parallel' | 'sequential' | 'smart';\r\n private readonly perIterationOutputCapBytes: number;\r\n private readonly plugins: { plugin: Plugin; api: PluginAPI }[] = [];\r\n private readonly toolExecutor: ToolExecutor;\r\n private readonly autoExtendLimit: boolean;\r\n private readonly tracer: Tracer | undefined;\r\n\r\n constructor(init: AgentInit) {\r\n this.container = init.container;\r\n this.tools = init.tools;\r\n this.providers = init.providers;\r\n this.events = init.events;\r\n this.pipelines = init.pipelines;\r\n this.ctx = init.context;\r\n this.maxIterations = init.maxIterations ?? DEFAULT_MAX_ITERATIONS;\r\n this.iterationTimeoutMs = init.iterationTimeoutMs ?? 300_000;\r\n this.executionStrategy = init.executionStrategy ?? 'smart';\r\n this.perIterationOutputCapBytes = init.perIterationOutputCapBytes ?? 100_000;\r\n this.autoExtendLimit = init.autoExtendLimit ?? true;\r\n this.tracer = init.tracer;\r\n this.toolExecutor = new ToolExecutor(this.tools, {\r\n permissionPolicy: this.permission,\r\n secretScrubber: this.scrubber,\r\n renderer: this.renderer,\r\n events: this.events,\r\n confirmAwaiter: init.confirmAwaiter,\r\n iterationTimeoutMs: this.iterationTimeoutMs,\r\n perIterationOutputCapBytes: this.perIterationOutputCapBytes,\r\n tracer: this.tracer,\r\n });\r\n }\r\n\r\n private get logger(): Logger {\r\n return this.container.resolve(TOKENS.Logger);\r\n }\r\n private get retry(): RetryPolicy {\r\n return this.container.resolve(TOKENS.RetryPolicy);\r\n }\r\n private get errorHandler(): ErrorHandler {\r\n return this.container.resolve(TOKENS.ErrorHandler);\r\n }\r\n private get permission(): PermissionPolicy {\r\n return this.container.resolve(TOKENS.PermissionPolicy);\r\n }\r\n private get scrubber(): SecretScrubber {\r\n return this.container.resolve(TOKENS.SecretScrubber);\r\n }\r\n private get compactor(): Compactor | undefined {\r\n return this.container.has(TOKENS.Compactor)\r\n ? this.container.resolve(TOKENS.Compactor)\r\n : undefined;\r\n }\r\n private get renderer(): Renderer | undefined {\r\n return this.container.has(TOKENS.Renderer)\r\n ? this.container.resolve(TOKENS.Renderer)\r\n : undefined;\r\n }\r\n\r\n register(tool: Tool): void {\r\n this.tools.register(tool);\r\n }\r\n\r\n async use(plugin: Plugin, api: PluginAPI): Promise<void> {\r\n await plugin.setup(api);\r\n this.plugins.push({ plugin, api });\r\n }\r\n\r\n async run(userInput: AgentInput, opts: RunOptions = {}): Promise<RunResult> {\r\n const controller = new RunController({ parentSignal: opts.signal });\r\n const signal = controller.signal;\r\n this.ctx.signal = signal;\r\n // Flush abort hooks registered on the context when this run ends or\r\n // is aborted. Tools / MCP / file handles register via ctx.registerAbortHook.\r\n controller.onAbort(() => this.ctx.drainAbortHooks());\r\n\r\n const span = this.tracer?.startSpan('agent.run', {\r\n 'agent.model': opts.model ?? this.ctx.model,\r\n 'agent.executionStrategy': opts.executionStrategy ?? this.executionStrategy,\r\n });\r\n try {\r\n const result = await this.runInner(userInput, opts, controller);\r\n span?.setAttribute('agent.status', result.status);\r\n span?.setAttribute('agent.iterations', result.iterations);\r\n return result;\r\n } catch (err) {\r\n // Any throw that escapes runInner is treated as a hard agent failure.\r\n // Wrap into a WrongStackError so callers always see a structured error\r\n // and never have to unwrap `unknown` in user-facing paths.\r\n const wse = err instanceof AgentError ? err : toWrongStackError(err);\r\n this.events.emit('error', { err: toError(err), phase: 'agent' });\r\n if (err instanceof Error) span?.recordError(err);\r\n span?.setAttribute('agent.status', 'failed');\r\n return {\r\n status: signal.aborted ? 'aborted' : 'failed',\r\n iterations: 0,\r\n error: wse,\r\n };\r\n } finally {\r\n span?.end();\r\n await controller.dispose();\r\n }\r\n }\r\n\r\n private async runInner(\r\n userInput: AgentInput,\r\n opts: RunOptions,\r\n controller: RunController,\r\n ): Promise<RunResult> {\r\n await this.normalizeAndEmitUserInput(userInput);\r\n\r\n let finalText = '';\r\n let iterations = 0;\r\n let effectiveLimit = opts.maxIterations ?? this.maxIterations;\r\n const hasHardLimit = effectiveLimit > 0 && Number.isFinite(effectiveLimit);\r\n\r\n for (let i = 0; ; i++) {\r\n iterations = i + 1;\r\n if (controller.signal.aborted) {\r\n return { status: 'aborted', iterations };\r\n }\r\n\r\n const limitCheck = await this.checkIterationLimit(\r\n i,\r\n effectiveLimit,\r\n hasHardLimit,\r\n iterations,\r\n );\r\n effectiveLimit = limitCheck.limit;\r\n if (limitCheck.exit) {\r\n return { ...limitCheck.exit, finalText };\r\n }\r\n\r\n this.events.emit('iteration.started', { ctx: this.ctx, index: i });\r\n\r\n const req = await this.buildAndRunRequestPipeline(opts);\r\n\r\n let res: Response;\r\n try {\r\n res = await runProviderWithRetry({\r\n provider: this.ctx.provider,\r\n request: req,\r\n signal: controller.signal,\r\n ctx: this.ctx,\r\n events: this.events,\r\n retry: this.retry,\r\n logger: this.logger,\r\n tracer: this.tracer,\r\n });\r\n } catch (err) {\r\n if (controller.signal.aborted) {\r\n this.events.emit('error', { err: toError(err), phase: 'provider' });\r\n return { status: 'aborted', iterations, error: toWrongStackError(err, 'AGENT_ABORTED') };\r\n }\r\n const recovered = await this.errorHandler.recover(err, this.ctx);\r\n if (!recovered) {\r\n this.events.emit('error', { err: toError(err), phase: 'provider' });\r\n return { status: 'failed', iterations, error: toWrongStackError(err) };\r\n }\r\n res = recovered;\r\n }\r\n\r\n const responseResult = await this.processResponse(res, req);\r\n if (responseResult.aborted) {\r\n return { status: 'aborted', iterations, finalText: responseResult.finalText };\r\n }\r\n if (responseResult.done) {\r\n return { status: 'done', iterations, finalText: responseResult.finalText };\r\n }\r\n\r\n finalText = responseResult.finalText;\r\n\r\n const toolUses = res.content.filter(isToolUseBlock);\r\n if (toolUses.length === 0) {\r\n this.events.emit('iteration.completed', { ctx: this.ctx, index: i });\r\n return { status: 'done', iterations, finalText };\r\n }\r\n\r\n await this.executeTools(toolUses);\r\n this.events.emit('iteration.completed', { ctx: this.ctx, index: i });\r\n\r\n await this.compactContextIfNeeded();\r\n }\r\n }\r\n\r\n /**\r\n * Normalize user input and emit through userInput pipeline + session append.\r\n */\r\n private async normalizeAndEmitUserInput(userInput: AgentInput): Promise<void> {\r\n const { blocks, text } = normalizeInput(userInput);\r\n await this.pipelines.userInput.run({ content: blocks, text, ctx: this.ctx });\r\n this.ctx.state.appendMessage({ role: 'user', content: blocks });\r\n await this.ctx.session.append({\r\n type: 'user_input',\r\n ts: new Date().toISOString(),\r\n content: blocks,\r\n });\r\n }\r\n\r\n /**\r\n * Check if iteration limit has been reached and request extension if needed.\r\n * Returns the new effective limit (possibly extended) and a RunResult if\r\n * the loop should exit. Returns `{ limit }` with no result when the\r\n * iteration may proceed.\r\n */\r\n private async checkIterationLimit(\r\n iterationIndex: number,\r\n limit: number,\r\n hasHardLimit: boolean,\r\n currentIterations: number,\r\n ): Promise<{ limit: number; exit?: RunResult }> {\r\n if (hasHardLimit && iterationIndex >= limit) {\r\n const extendBy = await requestLimitExtension({\r\n events: this.events,\r\n currentIterations,\r\n currentLimit: this.maxIterations,\r\n autoExtend: this.autoExtendLimit,\r\n });\r\n if (extendBy > 0) {\r\n const newLimit = limit + extendBy;\r\n this.logger.info(`Iteration limit extended by ${extendBy} (new limit: ${newLimit})`);\r\n return { limit: newLimit };\r\n }\r\n return { limit, exit: { status: 'max_iterations', iterations: currentIterations } };\r\n }\r\n return { limit };\r\n }\r\n\r\n /**\r\n * Build request and run through request pipeline.\r\n */\r\n private async buildAndRunRequestPipeline(opts: RunOptions): Promise<Request> {\r\n const baseReq: Request = {\r\n model: opts.model ?? this.ctx.model,\r\n system: this.ctx.systemPrompt,\r\n messages: this.ctx.messages,\r\n tools: this.tools.list(),\r\n maxTokens: 8192,\r\n };\r\n return this.pipelines.request.run(baseReq);\r\n }\r\n\r\n /**\r\n * Process the provider response: run response pipeline, emit events,\r\n * update session, render text, handle abort.\r\n */\r\n private async processResponse(\r\n res: Response,\r\n req: Request,\r\n ): Promise<{ finalText: string; aborted: boolean; done: boolean }> {\r\n const processedRes = await this.pipelines.response.run(res);\r\n this.events.emit('provider.response', {\r\n ctx: this.ctx,\r\n usage: res.usage,\r\n stopReason: res.stopReason,\r\n });\r\n this.ctx.tokenCounter.account(res.usage, req.model);\r\n\r\n // Persist the partial assistant message even when the run was\r\n // aborted mid-stream — having the partial text in `ctx.messages`\r\n // means the next turn can continue with full context and the\r\n // session log is consistent.\r\n this.ctx.state.appendMessage({ role: 'assistant', content: res.content });\r\n await this.ctx.session.append({\r\n type: 'llm_response',\r\n ts: new Date().toISOString(),\r\n content: res.content,\r\n stopReason: res.stopReason,\r\n usage: res.usage,\r\n });\r\n\r\n if (this.ctx.signal.aborted) {\r\n // Accumulate any text the user did see so callers can show \"you\r\n // got this much before cancelling\" if they want.\r\n let finalText = '';\r\n for (const block of res.content) {\r\n if (isTextBlock(block)) finalText += block.text;\r\n }\r\n return { finalText, aborted: true, done: false };\r\n }\r\n\r\n // Render text blocks. For streaming providers the renderer already\r\n // saw the text via provider.text_delta events; we still run the\r\n // assistantOutput pipeline (for transforms) and accumulate finalText,\r\n // but we don't double-write to the renderer.\r\n let finalText = '';\r\n const streamed = this.ctx.provider.capabilities.streaming;\r\n for (const block of res.content) {\r\n if (isTextBlock(block)) {\r\n const rendered = await this.pipelines.assistantOutput.run(block);\r\n finalText += rendered.text;\r\n if (!streamed) this.renderer?.write(rendered);\r\n }\r\n }\r\n\r\n return { finalText, aborted: false, done: false };\r\n }\r\n\r\n /**\r\n * Execute tools and append tool results to context.\r\n * When a tool returns `tool_confirm_pending` (no confirmAwaiter set),\r\n * we pause and emit `tool.confirm_needed`. The run is blocked until\r\n * the event listener resolves the confirmation, then we re-run the\r\n * single tool.\r\n */\r\n private async executeTools(toolUses: ToolUseBlock[]): Promise<void> {\r\n const { outputs } = await this.toolExecutor.executeBatch(\r\n toolUses,\r\n this.ctx,\r\n this.executionStrategy,\r\n );\r\n\r\n // Post-processing: pipeline, session, events\r\n const useById = new Map(toolUses.map((u) => [u.id, u]));\r\n for (const { result, tool, durationMs } of outputs) {\r\n // Handle pending confirm: block the agent loop and wait for TUI resolution\r\n if (result.type === 'tool_confirm_pending') {\r\n const decision = await this.waitForConfirm({\r\n tool: tool!,\r\n input: result.input,\r\n toolUseId: result.toolUseId,\r\n suggestedPattern: result.suggestedPattern,\r\n });\r\n // Re-run this single tool with the resolved decision\r\n const reRunResult = await this.executeSingleWithDecision(\r\n tool!,\r\n { id: result.toolUseId, name: tool!.name, input: result.input },\r\n decision,\r\n );\r\n const use = useById.get(reRunResult.result.tool_use_id);\r\n if (use) {\r\n await this.pipelines.toolCall.run({ toolUse: use, result: reRunResult.result, ctx: this.ctx, tool });\r\n await this.ctx.session.append({\r\n type: 'tool_result',\r\n ts: new Date().toISOString(),\r\n id: reRunResult.result.tool_use_id,\r\n content: reRunResult.result.content,\r\n isError: !!reRunResult.result.is_error,\r\n });\r\n this.events.emit('tool.executed', {\r\n name: tool!.name,\r\n durationMs: reRunResult.durationMs,\r\n ok: !reRunResult.result.is_error,\r\n input: result.input,\r\n output: truncateForEvent(reRunResult.result.content),\r\n });\r\n }\r\n // Add the tool result to messages\r\n this.ctx.state.appendMessage({ role: 'user', content: [reRunResult.result] });\r\n continue;\r\n }\r\n\r\n const use = useById.get(result.tool_use_id);\r\n if (!use) continue;\r\n await this.pipelines.toolCall.run({\r\n toolUse: use,\r\n result,\r\n ctx: this.ctx,\r\n tool: tool ?? undefined,\r\n });\r\n await this.ctx.session.append({\r\n type: 'tool_result',\r\n ts: new Date().toISOString(),\r\n id: result.tool_use_id,\r\n content: result.content,\r\n isError: !!result.is_error,\r\n });\r\n this.events.emit('tool.executed', {\r\n name: use.name,\r\n durationMs,\r\n ok: !result.is_error,\r\n input: use.input,\r\n output: truncateForEvent(result.content),\r\n });\r\n }\r\n\r\n this.ctx.state.appendMessage({ role: 'user', content: outputs.map((o) => o.result) as ToolResultBlock[] });\r\n }\r\n\r\n private waitForConfirm(info: {\r\n tool: Tool;\r\n input: unknown;\r\n toolUseId: string;\r\n suggestedPattern: string;\r\n }): Promise<'yes' | 'no' | 'always' | 'deny'> {\r\n return new Promise((resolve) => {\r\n this.events.emit('tool.confirm_needed', {\r\n tool: info.tool,\r\n input: info.input,\r\n toolUseId: info.toolUseId,\r\n suggestedPattern: info.suggestedPattern,\r\n resolve,\r\n });\r\n });\r\n }\r\n\r\n private async executeSingleWithDecision(\r\n tool: Tool,\r\n use: { id: string; name: string; input: unknown },\r\n decision: 'yes' | 'no' | 'always' | 'deny',\r\n ): Promise<{ result: ToolResultBlock; durationMs: number }> {\r\n const start = Date.now();\r\n if (decision === 'no' || decision === 'deny') {\r\n return {\r\n result: { type: 'tool_result', tool_use_id: use.id, content: `Tool \"${tool.name}\" denied by user.`, is_error: true },\r\n durationMs: Date.now() - start,\r\n };\r\n }\r\n // 'yes' or 'always' — execute\r\n try {\r\n const result = await this.toolExecutor.executeTool(tool, use as ToolUseBlock, this.ctx, this.perIterationOutputCapBytes);\r\n return { result, durationMs: Date.now() - start };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n return {\r\n result: { type: 'tool_result', tool_use_id: use.id, content: `Tool \"${tool.name}\" threw: ${msg}`, is_error: true },\r\n durationMs: Date.now() - start,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Run context window pipeline if compactor is present.\r\n */\r\n private async compactContextIfNeeded(): Promise<void> {\r\n if (this.compactor) {\r\n await this.pipelines.contextWindow.run(this.ctx);\r\n }\r\n }\r\n\r\n}\r\n\r\nfunction toError(err: unknown): Error {\r\n return err instanceof Error ? err : new Error(String(err));\r\n}\r\n\r\n/**\r\n * Render a tool result body for inclusion in the `tool.executed` event.\r\n * Tool outputs can be large (file dumps, command output); UIs only want a\r\n * preview line, so cap at ~400 chars with an ellipsis marker. Structured\r\n * content blocks are flattened to their text portions.\r\n */\r\nfunction truncateForEvent(content: ToolResultBlock['content'], max = 400): string {\r\n if (!content) return '';\r\n return content.length <= max ? content : `${content.slice(0, max - 1)}…`;\r\n}","import type { Message } from '../types/messages.js';\nimport type { TodoItem, Context } from './context.js';\n\n/**\n * Observable wrapper for the mutable conversation state. Provides snapshot\n * and change-notification semantics on top of the existing `Context`\n * mutable fields (messages, todos, meta), without forcing every call site\n * to migrate.\n *\n * Design notes:\n *\n * - This is a **wrapper**, not a replacement. The underlying `Context`\n * fields are still mutated directly by tools and middleware that don't\n * know about ConversationState. The wrapper observes those mutations by\n * snapshotting on each accessor call, comparing length/identity, and\n * firing onChange. This is intentional during migration: it lets new\n * code subscribe to changes without breaking the unaware-existing code.\n *\n * - For full decoupling (the dev-plan #1 target), every mutation must go\n * through `ConversationState.appendMessage()` etc. instead of\n * `ctx.messages.push(...)`. That's a follow-up refactor — the API shape\n * here is designed to support it.\n *\n * - `meta` is a free-form bag; we shallow-watch its keys. Deep mutations\n * inside `meta.foo` won't trigger onChange. Use immutable replacement\n * (`setMeta('foo', newValue)`) if you need notification.\n */\nexport type StateChange =\n | { kind: 'message_appended'; message: Message }\n | { kind: 'messages_replaced'; messages: readonly Message[] }\n | { kind: 'todos_replaced'; todos: readonly TodoItem[] }\n | { kind: 'meta_set'; key: string; value: unknown }\n | { kind: 'meta_deleted'; key: string };\n\nexport type StateChangeHandler = (change: StateChange, state: ConversationState) => void;\n\nexport interface ReadonlyConversationState {\n readonly messages: readonly Message[];\n readonly todos: readonly TodoItem[];\n readonly meta: Readonly<Record<string, unknown>>;\n}\n\nexport class ConversationState {\n private readonly ctx: Context;\n private readonly listeners = new Set<StateChangeHandler>();\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n\n // ─── Read API ───────────────────────────────────────────────────────\n\n get messages(): readonly Message[] {\n return this.ctx.messages;\n }\n\n get todos(): readonly TodoItem[] {\n return this.ctx.todos;\n }\n\n get meta(): Readonly<Record<string, unknown>> {\n return this.ctx.meta;\n }\n\n /**\n * Cheap immutable snapshot. Useful for tests and for compaction passes\n * that need a stable view across an async boundary.\n */\n snapshot(): ReadonlyConversationState {\n return {\n messages: [...this.ctx.messages],\n todos: [...this.ctx.todos],\n meta: { ...this.ctx.meta },\n };\n }\n\n // ─── Write API (preferred — fires onChange) ─────────────────────────\n\n appendMessage(message: Message): void {\n this.ctx.messages.push(message);\n this.emit({ kind: 'message_appended', message });\n }\n\n replaceMessages(messages: Message[]): void {\n this.ctx.messages.length = 0;\n this.ctx.messages.push(...messages);\n this.emit({ kind: 'messages_replaced', messages: [...messages] });\n }\n\n replaceTodos(todos: TodoItem[]): void {\n this.ctx.todos.length = 0;\n this.ctx.todos.push(...todos);\n this.emit({ kind: 'todos_replaced', todos: [...todos] });\n }\n\n setMeta(key: string, value: unknown): void {\n this.ctx.meta[key] = value;\n this.emit({ kind: 'meta_set', key, value });\n }\n\n deleteMeta(key: string): void {\n if (!(key in this.ctx.meta)) return;\n delete this.ctx.meta[key];\n this.emit({ kind: 'meta_deleted', key });\n }\n\n // ─── Subscription ───────────────────────────────────────────────────\n\n /**\n * Subscribe to mutations that go through this wrapper. Note: mutations\n * that bypass the wrapper (e.g. `ctx.messages.push(...)` directly) are\n * NOT observed — by design during migration, since we don't want to\n * monkey-patch arrays. Migrating call sites to use this API is the\n * dev-plan #1 work.\n */\n onChange(listener: StateChangeHandler): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private emit(change: StateChange): void {\n for (const h of this.listeners) {\n try { h(change, this); } catch { /* ignore listener errors */ }\n }\n }\n}\n\n/**\n * Convenience constructor — creates a ConversationState bound to the\n * given Context. The wrapper holds a reference, not a copy.\n */\nexport function wrapAsState(ctx: Context): ConversationState {\n return new ConversationState(ctx);\n}\n","import type { Message } from '../types/messages.js';\r\nimport type { TextBlock } from '../types/blocks.js';\r\nimport type { SessionWriter } from '../types/session.js';\r\nimport type { Provider, Usage } from '../types/provider.js';\r\nimport type { TokenCounter } from '../types/token-counter.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { RunEnv } from './run-env.js';\r\nimport { ConversationState } from './conversation-state.js';\r\n\r\nexport interface TodoItem {\r\n id: string;\r\n content: string;\r\n status: 'pending' | 'in_progress' | 'completed';\r\n activeForm?: string;\r\n}\r\n\r\nexport interface RunOptions {\r\n signal?: AbortSignal;\r\n model?: string;\r\n executionStrategy?: 'parallel' | 'sequential' | 'smart';\r\n maxIterations?: number;\r\n}\r\n\r\nexport interface ContextInit {\r\n systemPrompt: TextBlock[];\r\n provider: Provider;\r\n session: SessionWriter;\r\n signal: AbortSignal;\r\n tokenCounter: TokenCounter;\r\n cwd: string;\r\n projectRoot: string;\r\n model: string;\r\n tools?: Tool[];\r\n}\r\n\r\n/**\r\n * L1-A: `Context` is the live agent-run object. Its read-only environment\r\n * shape is exposed by the `RunEnv` interface (every field below the\r\n * conversation state) and its mutable shape by `ConversationState` (the\r\n * `state` accessor). New code should declare the narrower type at its\r\n * parameter — pass `ctx` for it. Existing tools that accept `Context`\r\n * still work because `Context` structurally satisfies both.\r\n */\r\nexport class Context implements RunEnv {\r\n messages: Message[] = [];\r\n todos: TodoItem[] = [];\r\n readFiles = new Set<string>();\r\n fileMtimes = new Map<string, number>();\r\n systemPrompt: TextBlock[];\r\n provider: Provider;\r\n session: SessionWriter;\r\n signal: AbortSignal;\r\n tokenCounter: TokenCounter;\r\n cwd: string;\r\n projectRoot: string;\r\n model: string;\r\n tools: Tool[] = [];\r\n meta: Record<string, unknown> = {};\r\n\r\n constructor(init: ContextInit) {\r\n this.systemPrompt = init.systemPrompt;\r\n this.provider = init.provider;\r\n this.session = init.session;\r\n this.signal = init.signal;\r\n this.tokenCounter = init.tokenCounter;\r\n this.cwd = init.cwd;\r\n this.projectRoot = init.projectRoot;\r\n this.model = init.model;\r\n this.tools = init.tools ?? [];\r\n }\r\n\r\n /**\r\n * Observable wrapper over the mutable conversation state. Lazy so\r\n * subsystems that don't subscribe pay nothing. Mutations made directly\r\n * on `ctx.messages` / `ctx.todos` are still visible through this\r\n * wrapper's read API (it holds a reference, not a copy) but only\r\n * mutations that go through `state.appendMessage()` etc. fire\r\n * `onChange`. New code should prefer the wrapper API.\r\n */\r\n private _state: ConversationState | null = null;\r\n get state(): ConversationState {\r\n if (!this._state) this._state = new ConversationState(this);\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Register a teardown hook tied to the current run's abort signal. The\r\n * hook fires when the run aborts OR ends normally — Agent.run wires\r\n * this through a RunController. When no run is active the hook fires\r\n * immediately so callers don't leak resources.\r\n *\r\n * **Scope:** these hooks fire on the **whole agent run's** abort, not on\r\n * an individual tool call. For per-tool teardown of resources owned by\r\n * the tool author (child processes, handles), prefer `Tool.cleanup` —\r\n * see its JSDoc for the full rule.\r\n */\r\n private abortHooks = new Set<() => void | Promise<void>>();\r\n registerAbortHook(fn: () => void | Promise<void>): () => void {\r\n this.abortHooks.add(fn);\r\n return () => this.abortHooks.delete(fn);\r\n }\r\n async drainAbortHooks(): Promise<void> {\r\n const snapshot = [...this.abortHooks].reverse();\r\n // Clear before running so new hooks registered during iteration\r\n // fire on the next abort cycle (not the current one — hook chains\r\n // are intentionally not supported).\r\n this.abortHooks.clear();\r\n for (const fn of snapshot) {\r\n try {\r\n await fn();\r\n } catch {\r\n // hooks must be best-effort; swallow so siblings still fire\r\n }\r\n }\r\n }\r\n\r\n recordRead(absPath: string, mtimeMs: number): void {\r\n this.readFiles.add(absPath);\r\n this.fileMtimes.set(absPath, mtimeMs);\r\n }\r\n\r\n hasRead(absPath: string): boolean {\r\n return this.readFiles.has(absPath);\r\n }\r\n\r\n lastReadMtime(absPath: string): number | undefined {\r\n return this.fileMtimes.get(absPath);\r\n }\r\n\r\n usage(): Usage {\r\n return this.tokenCounter.total();\r\n }\r\n}\r\n","import type { Provider } from '../types/provider.js';\nimport type { SessionWriter } from '../types/session.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { TextBlock } from '../types/blocks.js';\nimport type { Tool } from '../types/tool.js';\nimport type { Context } from './context.js';\n\n/**\n * Immutable run environment — the set-once dependencies for an agent run.\n *\n * `Context` today doubles as both a DI bag (provider, session, tokenCounter,\n * cwd, …) and a mutable state container (messages, todos, meta). That makes\n * it hard to test (every test reconstructs the full bag) and easy to abuse\n * (any tool can swap the provider mid-run).\n *\n * `RunEnv` is the immutable half: a read-only projection that subsystems\n * can hold instead of the whole `Context`. It's a view, not a copy — pulling\n * a `RunEnv` from a `Context` is O(1) and reflects the same underlying\n * references. The opposite direction (set things on Context) still works,\n * and `extractRunEnv` rebuilds the view if you need a snapshot.\n *\n * Migration path: new APIs accept `RunEnv` instead of `Context` when they\n * only need read access. Existing APIs continue to accept `Context` until\n * a full split is scheduled.\n */\nexport interface RunEnv {\n readonly provider: Provider;\n readonly session: SessionWriter;\n readonly signal: AbortSignal;\n readonly tokenCounter: TokenCounter;\n readonly cwd: string;\n readonly projectRoot: string;\n readonly model: string;\n readonly systemPrompt: readonly TextBlock[];\n readonly tools: readonly Tool[];\n}\n\n/**\n * Build a `RunEnv` view from a Context. The returned object is a shallow\n * frozen view — mutations to `Context` are visible (it's the same\n * references), but the view itself can't be mutated.\n *\n * Use this in subsystems that want to declare \"I only need read access to\n * the env\" without rewriting their signature to accept the full Context.\n */\nexport function extractRunEnv(ctx: Context): RunEnv {\n return Object.freeze({\n provider: ctx.provider,\n session: ctx.session,\n signal: ctx.signal,\n tokenCounter: ctx.tokenCounter,\n cwd: ctx.cwd,\n projectRoot: ctx.projectRoot,\n model: ctx.model,\n systemPrompt: ctx.systemPrompt,\n tools: ctx.tools,\n });\n}\n","import type { AddAttachmentInput, AttachmentRef, AttachmentStore } from '../types/attachment.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\nexport interface InputBuilderOptions {\n store: AttachmentStore;\n /**\n * Pastes ≥ this many lines collapse to a `[pasted #N]` placeholder.\n * Default: 8 lines.\n */\n pasteLineThreshold?: number;\n /**\n * Pastes ≥ this many characters collapse to a placeholder regardless of\n * line count. Default: 2000 chars.\n */\n pasteCharThreshold?: number;\n}\n\nexport interface InputBuilderEvent {\n /** Current display string (with placeholders, before submit). */\n display: string;\n refs: AttachmentRef[];\n}\n\n/**\n * UI-agnostic accumulator for user input. The frontend (CLI/TUI) feeds in:\n * - typed text via `appendText()`\n * - large pastes via `appendPaste()` → returns placeholder string\n * - image paste via `appendImage()` → returns placeholder string\n * - file refs (`@path`) via `appendFile()` → returns placeholder string\n *\n * On `submit()` the builder runs the display string through AttachmentStore.expand()\n * and returns the final ContentBlock[] ready for `agent.run()`.\n *\n * The builder does not know what a \"line\" or \"key\" is — that is the\n * frontend's job. It only operates on strings and byte payloads.\n */\nexport class InputBuilder {\n private readonly store: AttachmentStore;\n private readonly pasteLineThreshold: number;\n private readonly pasteCharThreshold: number;\n private display = '';\n private readonly refs: AttachmentRef[] = [];\n\n constructor(opts: InputBuilderOptions) {\n this.store = opts.store;\n this.pasteLineThreshold = opts.pasteLineThreshold ?? 8;\n this.pasteCharThreshold = opts.pasteCharThreshold ?? 2000;\n }\n\n get text(): string {\n return this.display;\n }\n\n get attachments(): AttachmentRef[] {\n return [...this.refs];\n }\n\n get isEmpty(): boolean {\n return this.display.trim().length === 0;\n }\n\n appendText(text: string): void {\n this.display += text;\n }\n\n /**\n * Decide whether a chunk of pasted text is \"big\" enough to collapse.\n * If yes, store it and append a placeholder. If no, inline it.\n * Returns the placeholder string actually appended (or `null` if inlined).\n */\n async appendPaste(text: string): Promise<string | null> {\n if (this.shouldCollapse(text)) {\n const ref = await this.store.add({\n kind: 'text',\n data: text,\n meta: { label: paragraphLabel(text) },\n });\n const placeholder = `[pasted #${ref.seq}]`;\n this.display += placeholder;\n this.refs.push(ref);\n return placeholder;\n }\n this.display += text;\n return null;\n }\n\n /**\n * Always collapses to `[image #N]` — images are never inlined.\n * `dataBase64` is the raw base64 payload (no data: prefix).\n */\n async appendImage(dataBase64: string, mediaType: string): Promise<string> {\n const ref = await this.store.add({\n kind: 'image',\n data: dataBase64,\n meta: { mediaType, label: `${mediaType.split('/')[1]?.toUpperCase() ?? 'IMG'}` },\n });\n const placeholder = `[image #${ref.seq}]`;\n this.display += placeholder;\n this.refs.push(ref);\n return placeholder;\n }\n\n async appendFile(input: AddAttachmentInput): Promise<string> {\n const ref = await this.store.add({ ...input, kind: 'file' });\n const placeholder = `[file #${ref.seq}]`;\n this.display += placeholder;\n this.refs.push(ref);\n return placeholder;\n }\n\n /** Reset display and ref list. Does NOT clear the store itself. */\n reset(): void {\n this.display = '';\n this.refs.length = 0;\n }\n\n /**\n * Resolve the current display string into ContentBlock[]. Empty\n * input returns an empty array — caller decides what to do.\n */\n async submit(): Promise<ContentBlock[]> {\n const text = this.display;\n this.reset();\n return text ? this.store.expand(text) : [];\n }\n\n private shouldCollapse(text: string): boolean {\n if (text.length >= this.pasteCharThreshold) return true;\n let lines = 1;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) lines++;\n if (lines >= this.pasteLineThreshold) return true;\n }\n return false;\n }\n}\n\nfunction paragraphLabel(text: string): string {\n const lines = text.split('\\n').length;\n const bytes = Buffer.byteLength(text, 'utf8');\n if (bytes < 1024) return `${lines} lines, ${bytes} B`;\n return `${lines} lines, ${(bytes / 1024).toFixed(1)} KB`;\n}\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { spawn } from 'node:child_process';\nimport type { TextBlock } from '../types/blocks.js';\nimport type { Tool } from '../types/tool.js';\nimport type { SystemPromptBuilder, BuildContext } from '../types/system-prompt.js';\nimport type { MemoryStore } from '../types/memory.js';\nimport type { SkillLoader } from '../types/skill.js';\nimport type { ModeStore } from '../types/mode.js';\n\nexport const LAYER_1_IDENTITY = `You are WrongStack, a command-line AI coding agent.\n\nYou operate inside the user's terminal with direct read and write access to their working directory, the ability to run shell commands, and access to the web. You assist a developer who knows what they're doing — your job is to accelerate them, not to second-guess them.\n\n## Core principles\n\n1. Read before you write. Always inspect the relevant files before proposing changes. Assumptions about code you haven't read are bugs in waiting.\n\n2. Prefer surgical edits over rewrites. When modifying existing files, use the edit tool with str_replace; only use write for new files or full replacements explicitly requested.\n\n3. Show your work. Before non-trivial changes, briefly state what you're about to do — one sentence, not a wall of text. After tool calls, summarize what happened, not what you did mechanically.\n\n4. Honest about limits. If you don't know, say so. If something failed, say what failed and what you'll try next. Never fabricate file contents, API responses, or test results.\n\n5. Concise output. The user is a developer in a terminal. No marketing language, no \"great question!\", no bullet-point lists when prose works. If a one-liner answers, a one-liner is the answer.\n\n6. Ask when blocked, proceed when not. If the task is ambiguous in a way that meaningfully changes the approach, ask. If it's ambiguous in a way that doesn't, pick a reasonable default and proceed, stating the assumption.\n\n7. Trust the tools. If a permission prompt is shown, the user will answer. Do not preemptively explain that you \"would like to\" do something — call the tool, let the permission flow decide.\n\n## What you do not do\n\n- You do not lecture about software engineering principles unless asked.\n- You do not add comments to code unless they materially help or were requested.\n- You do not refactor adjacent code while fixing a bug, unless asked.\n- You do not claim work is \"production-ready\" or \"fully tested\" — the user decides that.\n- You do not apologize for failures. You report them and proceed.`;\n\nexport interface DefaultSystemPromptBuilderOptions {\n memoryStore?: MemoryStore;\n skillLoader?: SkillLoader;\n modeStore?: ModeStore;\n todayIso?: string;\n}\n\nexport class DefaultSystemPromptBuilder implements SystemPromptBuilder {\n private envCache?: string;\n constructor(private readonly opts: DefaultSystemPromptBuilderOptions = {}) {}\n\n async build(ctx: BuildContext): Promise<TextBlock[]> {\n const layer1 = LAYER_1_IDENTITY;\n const layer2 = this.buildToolUsage(ctx.tools);\n const layer3 = await this.buildEnvironment(ctx);\n const layer4 = await this.buildMemoryAndSkills();\n const layer5 = await this.buildMode();\n\n const blocks: TextBlock[] = [\n { type: 'text', text: layer1 },\n { type: 'text', text: layer2 },\n { type: 'text', text: layer3 },\n ];\n\n if (layer4.trim()) {\n blocks.push({\n type: 'text',\n text: layer4,\n cache_control: { type: 'ephemeral' },\n });\n }\n\n if (layer5.trim()) {\n blocks.push({\n type: 'text',\n text: layer5,\n cache_control: { type: 'ephemeral' },\n });\n }\n\n return blocks;\n }\n\n private buildToolUsage(tools: Tool[]): string {\n if (tools.length === 0) return '## Tool usage\\n\\nNo tools registered.';\n const lines = ['## Tool usage'];\n for (const t of tools) {\n const hint = t.usageHint ?? t.description;\n lines.push(`\\n### ${t.name}\\n${hint.trim()}`);\n }\n\n // Context management guidance — included when context_manager is present.\n // This layer teaches the model WHEN and HOW to use it proactively.\n const hasContextManager = tools.some((t) => t.name === 'context_manager');\n if (hasContextManager) {\n lines.push(`\n## Context management\n\nWhen the conversation grows long and context window usage exceeds what you can track,\nuse the context_manager tool proactively — do NOT wait to be told:\n\n- Call \\`context_manager\\` with \\`{\"action\":\"check\"}\\` to see current token budget and message counts.\n- When the conversation exceeds ~70% of your context window, call \\`{\"action\":\"summary\"}\\` or \\`{\"action\":\"compact\"}\\` to reclaim space.\n- Use \\`{\"action\":\"prune\"}\\` to surgically remove specific irrelevant message ranges (e.g. old debug output).\n- Use \\`{\"action\":\"add_note\"}\\` to inject a summary note at a specific point after a complex operation.\n\n**Never** stuff redundant information into a tool result. If you summarize a file, do not paste its full content —\nsummarize it, and let the tool result hold only the summary.`);\n }\n\n return lines.join('\\n');\n }\n\n private async buildEnvironment(ctx: BuildContext): Promise<string> {\n if (this.envCache) return this.envCache;\n const today = this.opts.todayIso ?? new Date().toISOString().slice(0, 10);\n const platform = `${os.platform()} ${os.release()}`;\n const shell = process.env.SHELL ?? process.env.ComSpec ?? 'unknown';\n const node = process.version;\n const isGit = await this.dirExists(path.join(ctx.projectRoot, '.git'));\n const git = isGit ? await this.gitStatus(ctx.projectRoot) : 'not a git repo';\n const langs = await this.detectLanguages(ctx.projectRoot);\n\n const lines = [\n '## Environment',\n '',\n `- Working directory: ${ctx.cwd}`,\n `- Project root: ${ctx.projectRoot}`,\n `- Operating system: ${platform}`,\n `- Shell: ${shell}`,\n `- Node.js: ${node}`,\n `- Detected languages: ${langs}`,\n `- Git status: ${git}`,\n `- Today's date: ${today}`,\n ];\n if (ctx.provider || ctx.model) {\n lines.push(\n `- Running on: ${ctx.provider ?? '<unknown provider>'}/${ctx.model ?? '<unknown model>'}`,\n );\n }\n const text = lines.join('\\n');\n this.envCache = text;\n return text;\n }\n\n private async buildMemoryAndSkills(): Promise<string> {\n const parts: string[] = [];\n if (this.opts.memoryStore) {\n try {\n const mem = await this.opts.memoryStore.readAll();\n if (mem.trim()) parts.push(`# Project Memory\\n\\n${mem}`);\n } catch {\n // skip\n }\n }\n if (this.opts.skillLoader) {\n try {\n const manifest = await this.opts.skillLoader.manifestText();\n if (manifest.trim()) parts.push(manifest);\n } catch {\n // skip\n }\n }\n return parts.join('\\n\\n');\n }\n\n private async buildMode(): Promise<string> {\n if (!this.opts.modeStore) return '';\n const mode = await this.opts.modeStore.getActiveMode();\n if (!mode?.prompt) return '';\n return mode.prompt;\n }\n\n private async dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n }\n\n private async gitStatus(root: string): Promise<string> {\n return new Promise((resolve) => {\n try {\n const proc = spawn('git', ['status', '--porcelain=v1', '--branch'], {\n cwd: root,\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n let buf = '';\n proc.stdout?.on('data', (c) => {\n buf += c.toString();\n });\n proc.on('error', () => resolve('git error'));\n proc.on('close', () => {\n const lines = buf.split('\\n').filter(Boolean);\n const branchLine = lines[0] ?? '';\n const branchMatch = /## ([^\\s.]+)/.exec(branchLine);\n const branch = branchMatch?.[1] ?? 'detached';\n const dirty = lines.slice(1);\n const staged = dirty.filter((l) => /^[MARCD]/.test(l)).length;\n const modified = dirty.length - staged;\n resolve(`branch=${branch}, ${modified} modified, ${staged} staged`);\n });\n } catch {\n resolve('git unavailable');\n }\n });\n }\n\n private async detectLanguages(root: string): Promise<string> {\n const checks: Array<[string, string]> = [\n ['package.json', 'JavaScript/TypeScript'],\n ['tsconfig.json', 'TypeScript'],\n ['go.mod', 'Go'],\n ['Cargo.toml', 'Rust'],\n ['pyproject.toml', 'Python'],\n ['requirements.txt', 'Python'],\n ['Gemfile', 'Ruby'],\n ['pom.xml', 'Java'],\n ['build.gradle', 'Java/Kotlin'],\n ['composer.json', 'PHP'],\n ['mix.exs', 'Elixir'],\n ];\n const langs = new Set<string>();\n for (const [marker, lang] of checks) {\n try {\n await fs.access(path.join(root, marker));\n langs.add(lang);\n } catch {\n // skip\n }\n }\n return langs.size === 0 ? 'unknown' : Array.from(langs).join(', ');\n }\n}\n","import type { Tool } from '../types/tool.js';\r\nimport { WrongStackError } from '../types/errors.js';\r\n\r\nexport class ToolRegistry {\r\n private readonly tools = new Map<string, { tool: Tool; owner: string }>();\r\n\r\n register(tool: Tool, owner = 'core'): void {\r\n if (this.tools.has(tool.name)) {\r\n throw new WrongStackError({\r\n message: `Tool \"${tool.name}\" already registered`,\r\n code: 'REGISTRY_DUPLICATE',\r\n subsystem: 'container',\r\n context: { tool: tool.name },\r\n });\r\n }\r\n this.tools.set(tool.name, { tool, owner });\r\n }\r\n\r\n /**\r\n * Attempt to register a tool. Returns true if successful, false if a tool\r\n * with the same name is already registered. Useful in multi-agent or plugin\r\n * scenarios where duplicate registration may be intentional.\r\n */\r\n tryRegister(tool: Tool, owner = 'core'): boolean {\r\n if (this.tools.has(tool.name)) return false;\r\n this.tools.set(tool.name, { tool, owner });\r\n return true;\r\n }\r\n\r\n /**\r\n * Register a tool as a default. If the tool name is already registered,\r\n * this is a no-op — the existing registration (from core or another\r\n * plugin) takes precedence. Use `override` to intentionally replace.\r\n */\r\n registerDefault(tool: Tool, owner = 'core'): void {\r\n if (this.tools.has(tool.name)) return;\r\n this.tools.set(tool.name, { tool, owner });\r\n }\r\n\r\n unregister(name: string): boolean {\r\n return this.tools.delete(name);\r\n }\r\n\r\n /**\r\n * Override an existing tool. Throws if the tool is not already registered.\r\n * Plugins use this to replace built-in tools with custom implementations.\r\n */\r\n override(name: string, tool: Tool, owner = 'core'): void {\r\n if (!this.tools.has(name)) {\r\n throw new WrongStackError({\r\n message: `Tool \"${name}\" not registered; cannot override`,\r\n code: 'REGISTRY_NOT_FOUND',\r\n subsystem: 'container',\r\n context: { tool: name },\r\n });\r\n }\r\n this.tools.set(name, { tool, owner });\r\n }\r\n\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name)?.tool;\r\n }\r\n\r\n ownerOf(name: string): string | undefined {\r\n return this.tools.get(name)?.owner;\r\n }\r\n\r\n list(): Tool[] {\r\n return Array.from(this.tools.values()).map((e) => e.tool);\r\n }\r\n\r\n listWithOwner(): { tool: Tool; owner: string }[] {\r\n return Array.from(this.tools.values());\r\n }\r\n\r\n clear(): void {\r\n this.tools.clear();\r\n }\r\n}\r\n","import type { Provider } from '../types/provider.js';\nimport type { ProviderConfig } from '../types/config.js';\nimport type { WireFamily } from '../types/models-registry.js';\n\n/**\n * Factory for constructing a Provider instance. The `family` field\n * declares the wire protocol so callers can route without inspecting\n * the returned instance. The `type` is the registry key (e.g. a\n * provider's models.dev id or a user-chosen alias).\n */\nexport interface ProviderFactory {\n /**\n * Unique identifier used as the registry key. When registered via\n * a plugin, this becomes `cfg.type` in `ProviderRegistry.create(cfg)`.\n */\n type: string;\n /**\n * Declares the wire protocol family so consumers can route based on\n * capability (e.g. which tool-format converter to use) without\n * instantiating the provider.\n */\n family: WireFamily;\n create(cfg: ProviderConfig): Provider;\n}\n\nexport class ProviderRegistry {\n private readonly factories = new Map<string, ProviderFactory>();\n\n /**\n * Register a provider factory. If a factory with the same type already\n * exists, it is replaced. Use this for both initial registration and\n * runtime overrides (e.g. from plugins or CLI flags).\n */\n register(f: ProviderFactory): void {\n this.factories.set(f.type, f);\n }\n\n /**\n * Override an existing factory. Throws if no factory is registered\n * for the given type. Use this to safely replace a provider at runtime\n * (e.g. in tests or when a plugin provides a custom implementation).\n */\n override(type: string, f: ProviderFactory): void {\n if (!this.factories.has(type)) {\n throw new Error(`Provider type \"${type}\" not registered; cannot override`);\n }\n this.factories.set(type, f);\n }\n\n has(type: string): boolean {\n return this.factories.has(type);\n }\n\n create(cfg: ProviderConfig): Provider {\n const f = this.factories.get(cfg.type);\n if (!f) {\n throw new Error(\n `Provider type \"${cfg.type}\" not registered. Available: ${Array.from(this.factories.keys()).join(', ')}`,\n );\n }\n return f.create(cfg);\n }\n\n list(): string[] {\n return Array.from(this.factories.keys());\n }\n}\n","import type { Context } from '../core/context.js';\r\nimport type { SlashCommand } from '../types/slash-command.js';\r\n\r\n/**\r\n * A slash command registered with the CLI or available to plugins.\r\n * Plugins receive a view of the registry via PluginAPI.slashCommands.\r\n *\r\n * Commands registered by plugins use a namespaced name: `pluginName:commandName`.\r\n * This prevents collisions with built-in commands and other plugins.\r\n */\r\nexport type { SlashCommand };\r\n\r\nexport class SlashCommandRegistry {\r\n private readonly cmds = new Map<string, { cmd: SlashCommand; owner: string }>();\r\n\r\n /**\r\n * Register a command. For plugins the `owner` is the plugin name and the\r\n * registry auto-prefixes the command name as `owner:name` to prevent\r\n * collisions with built-in commands and other plugins.\r\n */\r\n register(cmd: SlashCommand, owner = 'core'): void {\r\n const isPlugin = owner !== 'core';\r\n const fullName = isPlugin ? `${owner}:${cmd.name}` : cmd.name;\r\n\r\n // Cross-owner collision on the bare name: even though plugin commands\r\n // get namespaced (`plugin:x`) and don't share a key with a builtin\r\n // `x`, allowing both to coexist would confuse users (they type `/x`\r\n // expecting one and get the other). Throw so the conflict surfaces\r\n // at registration time rather than as a silent shadowing bug.\r\n for (const entry of this.cmds.values()) {\r\n if (entry.cmd.name === cmd.name && entry.owner !== owner) {\r\n throw new Error(\r\n `Slash command \"${cmd.name}\" already registered by ${entry.owner}`,\r\n );\r\n }\r\n }\r\n\r\n if (this.cmds.has(fullName)) {\r\n // Same owner re-registering: plugins legitimately do this for hot\r\n // reload / dev iteration. Built-ins are added once at startup, so\r\n // a second core register signals a programming bug — throw loudly.\r\n if (!isPlugin) {\r\n throw new Error(`Built-in slash command \"${fullName}\" is already registered.`);\r\n }\r\n this.cmds.set(fullName, { cmd, owner });\r\n for (const a of cmd.aliases ?? []) {\r\n this.cmds.set(`${owner}:${a}`, { cmd, owner });\r\n }\r\n return;\r\n }\r\n\r\n this.cmds.set(fullName, { cmd, owner });\r\n for (const a of cmd.aliases ?? []) {\r\n this.cmds.set(isPlugin ? `${owner}:${a}` : a, { cmd, owner });\r\n }\r\n }\r\n\r\n unregister(name: string): boolean {\r\n const entry = this.cmds.get(name);\r\n if (!entry) return false;\r\n for (const a of entry.cmd.aliases ?? []) {\r\n const fullAlias = entry.owner !== 'core' ? `${entry.owner}:${a}` : a;\r\n this.cmds.delete(fullAlias);\r\n }\r\n return this.cmds.delete(name);\r\n }\r\n\r\n get(name: string): SlashCommand | undefined {\r\n return this.cmds.get(name)?.cmd;\r\n }\r\n\r\n ownerOf(name: string): string | undefined {\r\n return this.cmds.get(name)?.owner;\r\n }\r\n\r\n list(): SlashCommand[] {\r\n const seen = new Set<SlashCommand>();\r\n const out: SlashCommand[] = [];\r\n for (const { cmd } of this.cmds.values()) {\r\n if (!seen.has(cmd)) {\r\n seen.add(cmd);\r\n out.push(cmd);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n listWithOwner(): Array<{ cmd: SlashCommand; owner: string; fullName: string }> {\r\n const seen = new Set<SlashCommand>();\r\n const out: Array<{ cmd: SlashCommand; owner: string; fullName: string }> = [];\r\n for (const [fullName, { cmd, owner }] of this.cmds.entries()) {\r\n if (!seen.has(cmd)) {\r\n seen.add(cmd);\r\n out.push({ cmd, owner, fullName });\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Parse a slash command line. Accepts both:\r\n * `/cmd args` → builtin command (owner=core)\r\n * `/pluginName:cmd args` → plugin command\r\n * The command name is split at the first `:` if the prefix matches a known owner.\r\n */\r\n async dispatch(line: string, ctx: Context): Promise<{ exit?: boolean; message?: string } | null> {\r\n if (!line.startsWith('/')) return null;\r\n const trimmed = line.slice(1);\r\n const spaceIdx = trimmed.indexOf(' ');\r\n const firstColonIdx = trimmed.indexOf(':');\r\n\r\n let name: string;\r\n let args: string;\r\n\r\n if (firstColonIdx !== -1 && (spaceIdx === -1 || firstColonIdx < spaceIdx)) {\r\n // `/owner:cmd` or `/owner:cmd args` — plugin namespaced\r\n const prefix = trimmed.slice(0, firstColonIdx);\r\n name = trimmed.slice(0, spaceIdx === -1 ? undefined : spaceIdx);\r\n args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1);\r\n // Verify the prefix is a known owner\r\n const entry = this.cmds.get(name);\r\n if (!entry || entry.owner !== prefix) {\r\n // Not a namespaced plugin command — treat the whole thing as a builtin command name\r\n name = trimmed.slice(0, spaceIdx === -1 ? undefined : spaceIdx);\r\n args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1);\r\n }\r\n } else {\r\n name = trimmed.slice(0, spaceIdx === -1 ? undefined : spaceIdx);\r\n args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1);\r\n }\r\n\r\n const entry = this.cmds.get(name);\r\n if (!entry) {\r\n return { message: `Unknown command \"/${name}\". Type /help for a list.` };\r\n }\r\n const res = await entry.cmd.run(args, ctx);\r\n return res ?? {};\r\n }\r\n}\r\n","import type { Container } from '../kernel/container.js';\nimport type { EventBus, EventName, Listener } from '../kernel/events.js';\nimport type { Pipeline } from '../kernel/pipeline.js';\nimport type { Tool } from '../types/tool.js';\nimport type { Config } from '../types/config.js';\nimport type { Logger } from '../types/logger.js';\nimport type {\n PluginAPI,\n PluginPipelines,\n ToolRegistryView,\n ProviderRegistryView,\n MCPRegistryView,\n SlashCommandRegistryView,\n ProviderFactory,\n} from '../types/plugin.js';\nimport type { ToolRegistry } from '../registry/tool-registry.js';\nimport type { ProviderRegistry } from '../registry/provider-registry.js';\nimport type { SlashCommandRegistry } from '../registry/slash-command-registry.js';\n\nexport interface PluginAPIInit {\n ownerName: string;\n container: Container;\n events: EventBus;\n /**\n * The agent's concrete pipelines. `DefaultPluginAPI` converts each to a\n * `ReadonlyPipeline` before exposing them to the plugin — plugins can\n * inspect and invoke pipelines but cannot mutate them.\n */\n pipelines: PluginPipelines;\n toolRegistry: ToolRegistry;\n providerRegistry: ProviderRegistry;\n slashCommandRegistry?: SlashCommandRegistry;\n mcpRegistry?: MCPRegistryView;\n config: Config;\n log: Logger;\n}\n\nexport class DefaultPluginAPI implements PluginAPI {\n readonly container: Container;\n readonly events: EventBus;\n readonly pipelines: PluginPipelines;\n readonly tools: ToolRegistryView;\n readonly providers: ProviderRegistryView;\n readonly mcp: MCPRegistryView;\n readonly slashCommands: SlashCommandRegistryView;\n readonly config: Config;\n readonly log: Logger;\n private readonly pluginCleanupFns: Array<() => void> = [];\n\n constructor(init: PluginAPIInit) {\n const owner = init.ownerName;\n this.container = init.container;\n this.events = init.events;\n this.config = init.config;\n this.log = init.log.child({ plugin: owner });\n\n // Convert concrete pipelines to read-only views before passing to plugins.\n const pipelines = init.pipelines as unknown as Record<string, Pipeline<unknown>>;\n const readonlyPipelines: PluginPipelines = {} as PluginPipelines;\n for (const [key, pipeline] of Object.entries(pipelines)) {\n readonlyPipelines[key] = pipeline.asReadonly() as PluginPipelines[typeof key];\n }\n this.pipelines = readonlyPipelines;\n\n const tr = init.toolRegistry;\n this.tools = {\n register: (t: Tool) => tr.register(t, owner),\n unregister: (name: string) => tr.unregister(name),\n get: (name: string) => tr.get(name),\n list: () => tr.list(),\n };\n\n const pr = init.providerRegistry;\n this.providers = {\n register: (f: ProviderFactory) => pr.register(f),\n create: (cfg) => pr.create(cfg as { type: string }),\n list: () => pr.list(),\n };\n\n this.mcp = init.mcpRegistry ?? noopMcp;\n\n const scr = init.slashCommandRegistry;\n this.slashCommands = scr\n ? {\n register: (cmd) => scr.register(cmd, owner),\n unregister: (name) => scr.unregister(name),\n get: (name) => scr.get(name),\n list: () => scr.list(),\n }\n : noopSlashCommands;\n }\n\n onEvent<K extends EventName>(event: K, handler: Listener<K>): () => void {\n const off = this.events.once(event, handler);\n this.pluginCleanupFns.push(off);\n return off;\n }\n\n /** Called by the plugin loader when uninstalling the plugin. */\n drainCleanup(): void {\n for (const fn of this.pluginCleanupFns.splice(0)) {\n try { fn(); } catch { /* best-effort */ }\n }\n }\n}\n\nconst noopMcp: MCPRegistryView = {\n start: async () => undefined,\n stop: async () => undefined,\n restart: async () => undefined,\n list: () => [],\n};\n\nconst noopSlashCommands: SlashCommandRegistryView = {\n register() { /* noop */ },\n unregister() { return false; },\n get() { return undefined; },\n list() { return []; },\n};\n","import type { Plugin, PluginAPI, PluginDependency } from '../types/plugin.js';\r\nimport type { Logger } from '../types/logger.js';\r\nimport { PluginError } from '../types/errors.js';\r\nimport { validateAgainstSchema } from '../utils/json-schema-validate.js';\r\n\r\n/**\r\n * Stable plugin API contract version. This is intentionally independent of\r\n * the package version: bump only when the surface visible to plugins\r\n * (PluginAPI, types/plugin) changes in a way that breaks existing setup\r\n * functions. Plugins declare `apiVersion: \"^1.0\"` to opt into this contract.\r\n */\r\nexport const KERNEL_API_VERSION = '0.1.1';\r\n\r\nexport interface LoadPluginsOptions {\r\n apiFactory: (plugin: Plugin) => PluginAPI;\r\n log: Logger;\r\n kernelApiVersion?: string;\r\n /**\r\n * Per-plugin options keyed by plugin name. When a plugin declares\r\n * `configSchema`, the loader validates `pluginOptions[plugin.name]`\r\n * against it before calling `setup`. Pass `Config.plugins` shaped\r\n * `{ [name]: { options } }` or any flat record.\r\n */\r\n pluginOptions?: Record<string, unknown>;\r\n}\r\n\r\nfunction parseSemver(v: string): [number, number, number] {\r\n const parts = v.replace(/^[^0-9]*/, '').split('.').map((s) => Number.parseInt(s, 10) || 0);\r\n return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];\r\n}\r\n\r\nfunction satisfies(range: string, version: string): boolean {\r\n const [vMaj, vMin, vPatch] = parseSemver(version);\r\n const trimmed = range.trim();\r\n const op = trimmed.startsWith('^') ? '^' : trimmed.startsWith('~') ? '~' : '=';\r\n const ver = trimmed.replace(/^[\\^~=]/, '');\r\n const [rMaj, rMin, rPatch] = parseSemver(ver);\r\n if (op === '^') {\r\n if (rMaj === 0) return vMaj === 0 && vMin === rMin && vPatch >= rPatch;\r\n return vMaj === rMaj && (vMin > rMin || (vMin === rMin && vPatch >= rPatch));\r\n }\r\n if (op === '~') {\r\n return vMaj === rMaj && vMin === rMin && vPatch >= rPatch;\r\n }\r\n return vMaj === rMaj && vMin === rMin && vPatch === rPatch;\r\n}\r\n\r\n/** Normalize either `string` or `PluginDependency` into the structured form. */\r\nfunction normalizeDep(d: string | PluginDependency): PluginDependency {\r\n return typeof d === 'string' ? { name: d } : d;\r\n}\r\n\r\nfunction topoSort(plugins: Plugin[]): Plugin[] {\r\n const map = new Map<string, Plugin>();\r\n for (const p of plugins) map.set(p.name, p);\r\n const visited = new Set<string>();\r\n const visiting = new Set<string>();\r\n const order: Plugin[] = [];\r\n\r\n const visit = (p: Plugin, stack: string[]) => {\r\n if (visited.has(p.name)) return;\r\n if (visiting.has(p.name)) {\r\n throw new PluginError({\r\n message: `Plugin dependency cycle: ${[...stack, p.name].join(' -> ')}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n });\r\n }\r\n visiting.add(p.name);\r\n for (const raw of p.dependsOn ?? []) {\r\n const dep = normalizeDep(raw);\r\n const d = map.get(dep.name);\r\n if (!d) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" depends on missing plugin \"${dep.name}\"`,\r\n code: 'PLUGIN_MISSING_DEPENDENCY',\r\n pluginName: p.name,\r\n context: { dependency: dep.name },\r\n });\r\n }\r\n // Version constraint check — only when both declared range and the\r\n // dependency's actual version are available. Missing either side is\r\n // tolerated: plugins without `version` are treated as wildcard.\r\n if (dep.version && d.version && !satisfies(dep.version, d.version)) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" requires \"${dep.name}@${dep.version}\", found ${d.version}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n context: { dependency: dep.name, required: dep.version, found: d.version },\r\n });\r\n }\r\n visit(d, [...stack, p.name]);\r\n }\r\n // Optional deps are silently skipped if the plugin is not loaded.\r\n for (const raw of p.optionalDeps ?? []) {\r\n const dep = normalizeDep(raw);\r\n const d = map.get(dep.name);\r\n if (d) {\r\n if (dep.version && d.version && !satisfies(dep.version, d.version)) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" optional dep \"${dep.name}@${dep.version}\" found ${d.version}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n context: { dependency: dep.name, required: dep.version, found: d.version },\r\n });\r\n }\r\n visit(d, [...stack, p.name]);\r\n }\r\n }\r\n visiting.delete(p.name);\r\n visited.add(p.name);\r\n order.push(p);\r\n };\r\n\r\n for (const p of plugins) visit(p, []);\r\n return order;\r\n}\r\n\r\nexport async function loadPlugins(\r\n plugins: Plugin[],\r\n opts: LoadPluginsOptions,\r\n): Promise<{ loaded: Plugin[]; failed: { plugin: Plugin; err: unknown }[] }> {\r\n const kernelVersion = opts.kernelApiVersion ?? KERNEL_API_VERSION;\r\n const loaded: Plugin[] = [];\r\n const failed: { plugin: Plugin; err: unknown }[] = [];\r\n\r\n // Conflict check\r\n const names = new Set(plugins.map((p) => p.name));\r\n for (const p of plugins) {\r\n for (const c of p.conflictsWith ?? []) {\r\n if (names.has(c)) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" conflicts with loaded plugin \"${c}\"`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n context: { conflictsWith: c },\r\n });\r\n }\r\n }\r\n }\r\n\r\n let sorted: Plugin[];\r\n try {\r\n sorted = topoSort(plugins);\r\n } catch (err) {\r\n opts.log.error('Plugin sort failed', err);\r\n throw err;\r\n }\r\n\r\n for (const plugin of sorted) {\r\n if (!satisfies(plugin.apiVersion, kernelVersion)) {\r\n const err = new PluginError({\r\n message: `Plugin \"${plugin.name}\" requires apiVersion ${plugin.apiVersion}; kernel is ${kernelVersion}`,\r\n code: 'PLUGIN_API_MISMATCH',\r\n pluginName: plugin.name,\r\n context: { required: plugin.apiVersion, kernel: kernelVersion },\r\n });\r\n opts.log.error(err.message);\r\n failed.push({ plugin, err });\r\n continue;\r\n }\r\n // configSchema validation — runs before setup() so a bad config never\r\n // reaches plugin code. The plugin's options are looked up by plugin name\r\n // in the host-supplied options bag.\r\n if (plugin.configSchema && opts.pluginOptions) {\r\n const pluginOpts = opts.pluginOptions[plugin.name];\r\n if (pluginOpts !== undefined) {\r\n const result = validateAgainstSchema(pluginOpts, plugin.configSchema);\r\n if (!result.ok) {\r\n const firstErr = result.errors[0];\r\n const detail = firstErr\r\n ? `${firstErr.path}: ${firstErr.message}`\r\n : 'config invalid';\r\n const err = new PluginError({\r\n message: `Plugin \"${plugin.name}\" config invalid — ${detail}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: plugin.name,\r\n context: { errors: result.errors },\r\n });\r\n opts.log.error(err.message);\r\n failed.push({ plugin, err });\r\n continue;\r\n }\r\n }\r\n }\r\n try {\r\n const rawApi = opts.apiFactory(plugin);\r\n const api = plugin.capabilities ? wrapApiForCapabilityCheck(plugin, rawApi, opts.log) : rawApi;\r\n await plugin.setup(api);\r\n loaded.push(plugin);\r\n opts.log.info(`Plugin \"${plugin.name}\" loaded`);\r\n } catch (err) {\r\n opts.log.error(`Plugin \"${plugin.name}\" setup failed`, err);\r\n failed.push({ plugin, err });\r\n }\r\n }\r\n return { loaded, failed };\r\n}\r\n\r\n/**\r\n * Tear down loaded plugins in reverse-dependency order. `teardown()` is\r\n * best-effort: errors are caught and logged so a single misbehaving plugin\r\n * can't abort the host shutdown sequence.\r\n *\r\n * Pass the result of a prior `loadPlugins(...)` call's `loaded` array, plus\r\n * the original `LoadPluginsOptions` so the same `apiFactory` (and the same\r\n * PluginAPI surface the plugin saw during `setup`) is used for `teardown`.\r\n */\r\nexport async function unloadPlugins(\r\n loadedPlugins: Plugin[],\r\n opts: LoadPluginsOptions,\r\n): Promise<void> {\r\n // Reverse order — last loaded is first torn down, mirroring stack-style\r\n // resource ownership when plugin B depends on plugin A.\r\n const ordered = [...loadedPlugins].reverse();\r\n for (const plugin of ordered) {\r\n if (typeof plugin.teardown !== 'function') continue;\r\n try {\r\n const api = opts.apiFactory(plugin);\r\n await plugin.teardown(api);\r\n opts.log.info(`Plugin \"${plugin.name}\" torn down`);\r\n } catch (err) {\r\n opts.log.error(`Plugin \"${plugin.name}\" teardown failed`, err);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wrap the PluginAPI so calls that contradict the plugin's declared\r\n * capabilities are logged. Doesn't block the call — plugin keeps working;\r\n * we just surface the lie so the host can flag it (or escalate to a hard\r\n * fail in a dev build via env var).\r\n */\r\nfunction wrapApiForCapabilityCheck(plugin: Plugin, api: PluginAPI, log: { error(msg: string, ctx?: unknown): void; warn?(msg: string, ctx?: unknown): void; info?(msg: string, ctx?: unknown): void }): PluginAPI {\r\n const caps = plugin.capabilities ?? {};\r\n const warn = (subsystem: string, detail: string) => {\r\n const msg = `Plugin \"${plugin.name}\" used ${subsystem} without declaring capabilities.${subsystem} — ${detail}`;\r\n if (typeof log.warn === 'function') log.warn(msg);\r\n else log.error(msg);\r\n };\r\n\r\n // Wrap tools.register\r\n const wrappedTools = caps.tools !== false ? api.tools : new Proxy(api.tools, {\r\n get(target, prop, receiver) {\r\n if (prop === 'register') {\r\n return (t: unknown) => {\r\n warn('tools', `register(${(t as { name?: string })?.name ?? '<unknown>'})`);\r\n return (target.register as (x: unknown) => unknown)(t);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n // Wrap providers.register\r\n const wrappedProviders = caps.providers !== false ? api.providers : new Proxy(api.providers, {\r\n get(target, prop, receiver) {\r\n if (prop === 'register') {\r\n return (f: unknown) => {\r\n warn('providers', `register(${(f as { type?: string })?.type ?? '<unknown>'})`);\r\n return (target.register as (x: unknown) => unknown)(f);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n // Wrap slashCommands.register\r\n const wrappedSlash = caps.slashCommands !== false ? api.slashCommands : new Proxy(api.slashCommands, {\r\n get(target, prop, receiver) {\r\n if (prop === 'register') {\r\n return (c: unknown) => {\r\n warn('slashCommands', `register(${(c as { name?: string })?.name ?? '<unknown>'})`);\r\n return (target.register as (x: unknown) => unknown)(c);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n // Wrap mcp.start\r\n const wrappedMcp = caps.mcp !== false ? api.mcp : new Proxy(api.mcp, {\r\n get(target, prop, receiver) {\r\n if (prop === 'start') {\r\n return (cfg: unknown) => {\r\n warn('mcp', `start(${(cfg as { name?: string })?.name ?? '<unknown>'})`);\r\n return (target.start as (x: unknown) => unknown)(cfg);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n\r\n return new Proxy(api, {\r\n get(target, prop, receiver) {\r\n switch (prop) {\r\n case 'tools': return wrappedTools;\r\n case 'providers': return wrappedProviders;\r\n case 'slashCommands': return wrappedSlash;\r\n case 'mcp': return wrappedMcp;\r\n default: return Reflect.get(target, prop, receiver);\r\n }\r\n },\r\n });\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/errors.ts","../src/kernel/container.ts","../src/kernel/pipeline.ts","../src/kernel/events.ts","../src/kernel/tokens.ts","../src/kernel/run-controller.ts","../src/types/blocks.ts","../src/types/messages.ts","../src/types/provider.ts","../src/types/secret-vault.ts","../src/types/mode.ts","../src/types/spec.ts","../src/types/task-graph.ts","../src/utils/atomic-write.ts","../src/utils/safe-json.ts","../src/utils/newline-normalize.ts","../src/utils/color.ts","../src/utils/glob-match.ts","../src/utils/diff.ts","../src/utils/wstack-paths.ts","../src/utils/tool-output-serializer.ts","../src/utils/token-estimate.ts","../src/utils/json-schema-validate.ts","../src/defaults/logger.ts","../src/defaults/path-resolver.ts","../src/defaults/token-counter.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/defaults/secret-vault.ts","../src/defaults/permission-policy.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/defaults/compactor.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/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/defaults/task-tracker.ts","../src/defaults/task-flow.ts","../src/defaults/recovery-lock.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","../src/core/streaming-response-builder.ts","../src/core/provider-runner.ts","../src/core/iteration-limit.ts","../src/core/agent.ts","../src/core/conversation-state.ts","../src/core/context.ts","../src/core/run-env.ts","../src/core/input-builder.ts","../src/core/system-prompt-builder.ts","../src/registry/tool-registry.ts","../src/registry/provider-registry.ts","../src/registry/slash-command-registry.ts","../src/plugin/api.ts","../src/plugin/loader.ts"],"names":["path","fs","stat","open","os","t","fs2","path3","path4","fs3","randomBytes","path5","path6","fsp2","fsp3","path7","fs4","path8","path9","walk","fsp4","fs6","fs7","path10","FORBIDDEN_PROTO_KEYS","deepMerge","fs8","afterTokens","fs9","path11","path12","fs10","handlers","resolve","randomUUID","path13","os2","fsp5","DEFAULT_INTERVAL_MS","DEFAULT_TIMEOUT_MS","joinEndpoint","finalText","use","platform","path14","fs11","entry"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 { WrongStackError } from '../types/errors.js';\r\n\r\n/**\r\n * Container — dependency injection with explicit bind / override / decorate.\r\n *\r\n * Invariants:\r\n * bind() — throws if token already bound\r\n * override() — throws if nothing to replace\r\n * decorate() — stacks; cached value cleared on register\r\n */\r\n\r\nexport type Token<T> = symbol & { readonly __type?: T };\r\nexport type Factory<T> = (c: Container) => T;\r\nexport type Decorator<T> = (inner: T, c: Container) => T;\r\n\r\ninterface Entry<T = unknown> {\r\n factory: Factory<T>;\r\n singleton: boolean;\r\n decorators: Decorator<T>[];\r\n cache?: T;\r\n owner: string;\r\n}\r\n\r\nexport interface BindOptions {\r\n singleton?: boolean;\r\n owner?: string;\r\n}\r\n\r\nexport class Container {\r\n private readonly entries = new Map<symbol, Entry>();\r\n\r\n bind<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\r\n if (this.entries.has(token)) {\r\n throw new WrongStackError({\r\n message: `Container: token \"${token.description ?? 'unknown'}\" already bound`,\r\n code: 'CONTAINER_TOKEN_ALREADY_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n this.entries.set(token, {\r\n factory: factory as Factory<unknown>,\r\n singleton: opts.singleton ?? true,\r\n decorators: [],\r\n owner: opts.owner ?? 'core',\r\n });\r\n }\r\n\r\n override<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\r\n const existing = this.entries.get(token);\r\n if (!existing) {\r\n throw new WrongStackError({\r\n message: `Container: cannot override \"${token.description ?? 'unknown'}\" — not bound`,\r\n code: 'CONTAINER_TOKEN_NOT_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n this.entries.set(token, {\r\n factory: factory as Factory<unknown>,\r\n singleton: opts.singleton ?? existing.singleton,\r\n decorators: existing.decorators,\r\n owner: opts.owner ?? existing.owner,\r\n });\r\n }\r\n\r\n decorate<T>(token: Token<T>, decorator: Decorator<T>, owner = 'core'): void {\r\n const existing = this.entries.get(token);\r\n if (!existing) {\r\n throw new WrongStackError({\r\n message: `Container: cannot decorate \"${token.description ?? 'unknown'}\" — not bound`,\r\n code: 'CONTAINER_TOKEN_NOT_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n existing.decorators.push(decorator as Decorator<unknown>);\r\n existing.cache = undefined;\r\n existing.owner = `${existing.owner}+${owner}`;\r\n }\r\n\r\n resolve<T>(token: Token<T>): T {\r\n const entry = this.entries.get(token);\r\n if (!entry) {\r\n throw new WrongStackError({\r\n message: `Container: token \"${token.description ?? 'unknown'}\" not bound`,\r\n code: 'CONTAINER_TOKEN_NOT_BOUND',\r\n subsystem: 'container',\r\n context: { token: token.description },\r\n });\r\n }\r\n if (entry.singleton && entry.cache !== undefined) {\r\n return entry.cache as T;\r\n }\r\n let value: unknown = entry.factory(this);\r\n for (const d of entry.decorators) {\r\n value = d(value, this);\r\n }\r\n if (entry.singleton) {\r\n entry.cache = value;\r\n }\r\n return value as T;\r\n }\r\n\r\n has<T>(token: Token<T>): boolean {\r\n return this.entries.has(token);\r\n }\r\n\r\n ownerOf<T>(token: Token<T>): string | undefined {\r\n return this.entries.get(token)?.owner;\r\n }\r\n\r\n /**\r\n * Remove a token's binding (along with any decorators stacked on it).\r\n * Returns true if the token existed. Use this to withdraw temporary\r\n * bindings installed by a short-lived run or plugin — without it, the\r\n * entry persists in the map forever.\r\n */\r\n unbind<T>(token: Token<T>): boolean {\r\n return this.entries.delete(token);\r\n }\r\n\r\n /**\r\n * Drop every binding. Intended for tests and short-lived CLI invocations\r\n * that rebuild the container from scratch. Production code should prefer\r\n * `unbind` on the specific tokens it owns.\r\n */\r\n clear(): void {\r\n this.entries.clear();\r\n }\r\n\r\n list(): Array<{ token: symbol; owner: string }> {\r\n return Array.from(this.entries.entries()).map(([token, entry]) => ({\r\n token,\r\n owner: entry.owner,\r\n }));\r\n }\r\n\r\n /**\r\n * Inspect a binding's full shape, including decorator count and whether\r\n * a singleton value is cached. Returns null if the token is unbound.\r\n * Decorator and factory function references are not exposed — only counts\r\n * and metadata, to keep internal state hidden.\r\n */\r\n inspect<T>(token: Token<T>): {\r\n owner: string;\r\n singleton: boolean;\r\n decoratorCount: number;\r\n cached: boolean;\r\n } | null {\r\n const entry = this.entries.get(token);\r\n if (!entry) return null;\r\n return {\r\n owner: entry.owner,\r\n singleton: entry.singleton,\r\n decoratorCount: entry.decorators.length,\r\n cached: entry.cache !== undefined,\r\n };\r\n }\r\n}\r\n","/**\r\n * Pipeline — Koa-style middleware chain with named middleware\r\n * and position-aware insertion. Generic over input type T.\r\n */\r\n\r\nexport type NextFn<T> = (value: T) => Promise<T>;\r\nexport type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;\r\n\r\n/**\r\n * Called when a middleware crashes (throws or rejects). Used by the\r\n * Pipeline's error boundary to log the offender without aborting the run.\r\n *\r\n * Return `'rethrow'` to propagate the error (default for core middleware),\r\n * or `'swallow'` to skip past the crashing middleware and continue with the\r\n * value the previous one produced. Plugin middleware should usually be\r\n * swallowed so one bad plugin can't kill an agent run.\r\n */\r\nexport type PipelineErrorPolicy = 'rethrow' | 'swallow';\r\n\r\nexport interface PipelineErrorEvent {\r\n middleware: string;\r\n owner?: string;\r\n err: unknown;\r\n}\r\n\r\nexport type PipelineErrorHandler = (\r\n ev: PipelineErrorEvent,\r\n) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;\r\n\r\nexport interface Middleware<T> {\r\n name: string;\r\n handler: MiddlewareHandler<T>;\r\n owner?: string;\r\n}\r\n\r\nexport interface PipelineOptions {\r\n /** When true and the target middleware is not found, operations silently no-op instead of throwing. */\r\n optional?: boolean;\r\n}\r\n\r\n/**\r\n * Read-only view of a pipeline. Returned to consumers (plugins, hooks)\r\n * so they can inspect but not mutate the chain.\r\n */\r\nexport interface ReadonlyPipeline<T> {\r\n readonly size: number;\r\n list(): readonly string[];\r\n run(input: T): Promise<T>;\r\n}\r\n\r\nexport class Pipeline<T> {\r\n private readonly chain: Middleware<T>[] = [];\r\n private errorHandler?: PipelineErrorHandler;\r\n\r\n /**\r\n * Install an error boundary. When a middleware throws or rejects, the\r\n * handler is called and decides whether to swallow (continue with the\r\n * pre-handler value) or rethrow. Without a handler, errors propagate.\r\n *\r\n * Wire one per pipeline at boot — the host CLI typically installs a\r\n * single boundary that logs to the operational log and emits a\r\n * `pipeline.error` event for /diag.\r\n */\r\n setErrorHandler(handler: PipelineErrorHandler | undefined): this {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n use(mw: Middleware<T> | Middleware<unknown>): this {\r\n this.ensureUnique(mw.name);\r\n this.chain.push(mw as Middleware<T>);\r\n return this;\r\n }\r\n\r\n prepend(mw: Middleware<T>): this {\r\n this.ensureUnique(mw.name);\r\n this.chain.unshift(mw);\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert middleware at an explicit index. Out-of-range indices are clamped.\r\n * Use this when insertBefore/insertAfter are insufficient (e.g. to place\r\n * a middleware at a known position regardless of named targets).\r\n */\r\n insertAt(index: number, mw: Middleware<T>): this {\r\n this.ensureUnique(mw.name);\r\n const idx = Math.max(0, Math.min(index, this.chain.length));\r\n this.chain.splice(idx, 0, mw);\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert mw immediately before the first occurrence of target.\r\n * If called multiple times with the same target, each call inserts\r\n * before the target's current position — so after insertBefore('B', X)\r\n * then insertBefore('B', Y), the order is Y → X → B.\r\n */\r\n insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\r\n this.ensureUnique(mw.name);\r\n const idx = this.indexOf(target, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain.splice(idx, 0, mw);\r\n return this;\r\n }\r\n\r\n /**\r\n * Insert mw immediately after the first occurrence of target.\r\n * If called multiple times with the same target, each call inserts\r\n * after the target's current position — so after insertAfter('B', X)\r\n * then insertAfter('B', Y), the order is B → X → Y.\r\n */\r\n insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\r\n this.ensureUnique(mw.name);\r\n const idx = this.indexOf(target, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain.splice(idx + 1, 0, mw);\r\n return this;\r\n }\r\n\r\n replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\r\n if (mw.name !== target) this.ensureUnique(mw.name);\r\n const idx = this.indexOf(target, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain[idx] = mw;\r\n return this;\r\n }\r\n\r\n remove(name: string, opts?: PipelineOptions): this {\r\n const idx = this.indexOf(name, opts?.optional);\r\n if (idx === -1) return this;\r\n this.chain.splice(idx, 1);\r\n return this;\r\n }\r\n\r\n list(): readonly string[] {\r\n return this.chain.map((m) => m.name);\r\n }\r\n\r\n size(): number {\r\n return this.chain.length;\r\n }\r\n\r\n /** Return a read-only view suitable for passing to plugins. */\r\n asReadonly(): ReadonlyPipeline<T> {\r\n // The returned object's methods close over `this`, so it always sees the live chain.\r\n // `list()` returns a frozen snapshot to prevent external mutation of the chain.\r\n const self = this;\r\n return Object.freeze({\r\n get size() { return self.size(); },\r\n list() { return Object.freeze(self.list()); },\r\n run(input: T) { return self.run(input); },\r\n });\r\n }\r\n\r\n async run(input: T): Promise<T> {\r\n let index = -1;\r\n const chain = this.chain;\r\n const errorHandler = this.errorHandler;\r\n\r\n const dispatch = async (i: number, value: T): Promise<T> => {\r\n if (i <= index) {\r\n throw new Error(`Pipeline: next() called multiple times in \"${chain[index]?.name}\"`);\r\n }\r\n index = i;\r\n const mw = chain[i];\r\n if (!mw) return value;\r\n try {\r\n return await mw.handler(value, (v) => dispatch(i + 1, v));\r\n } catch (err) {\r\n if (!errorHandler) throw err;\r\n const policy = await errorHandler({ middleware: mw.name, owner: mw.owner, err });\r\n if (policy === 'rethrow') throw err;\r\n // Swallow: continue with the value that was about to flow into this\r\n // middleware. Subsequent middleware after the crashed one is skipped\r\n // — error boundary is \"skip the broken layer\", not \"skip the rest\".\r\n return value;\r\n }\r\n };\r\n\r\n return dispatch(0, input);\r\n }\r\n\r\n private indexOf(name: string, optional = false): number {\r\n const idx = this.chain.findIndex((m) => m.name === name);\r\n if (idx === -1 && !optional) {\r\n throw new Error(`Pipeline: middleware \"${name}\" not found`);\r\n }\r\n return idx;\r\n }\r\n\r\n private ensureUnique(name: string): void {\r\n if (this.chain.some((m) => m.name === name)) {\r\n throw new Error(`Pipeline: middleware \"${name}\" already registered`);\r\n }\r\n }\r\n}\r\n","/**\r\n * EventBus — observe-only typed event bus.\r\n * Subscribers cannot modify or cancel. Subscriber exceptions are caught.\r\n */\r\n\r\nimport type { Usage } from '../types/provider.js';\r\nimport type { Context } from '../core/context.js';\r\nimport type { Tool, ToolProgressEvent } from '../types/tool.js';\r\n\r\nexport interface EventMap {\r\n 'session.started': { id: string };\r\n 'session.ended': { id: string; usage: Usage };\r\n 'session.damaged': { sessionId: string; detail: string };\r\n 'iteration.started': { ctx: Context; index: number };\r\n 'iteration.completed': { ctx: Context; index: number };\r\n /**\r\n * Fired when the agent hits its iteration limit. Listeners (CLI/TUI) can\r\n * call `grant(extra)` to allow more iterations, or `deny()` to stop.\r\n * If no listener responds within 30s the run ends with 'max_iterations'.\r\n */\r\n 'iteration.limit_reached': {\r\n currentIterations: number;\r\n currentLimit: number;\r\n grant: (extraIterations: number) => void;\r\n deny: () => void;\r\n };\r\n 'provider.response': { ctx: Context; usage: Usage; stopReason: string };\r\n 'provider.text_delta': { ctx: Context; text: string };\r\n 'provider.tool_use_start': { ctx: Context; id: string; name: string };\r\n 'provider.tool_use_stop': { ctx: Context; id: string };\r\n /**\r\n * Fired before each retry of a failed provider call. `attempt` is 1-based\r\n * (the first retry is attempt 1, etc.). `description` is the human-readable\r\n * one-liner from `ProviderError.describe()` — render this in the CLI/TUI\r\n * instead of grepping logger output for the raw JSON body.\r\n */\r\n 'provider.retry': {\r\n providerId: string;\r\n attempt: number;\r\n delayMs: number;\r\n status: number;\r\n description: string;\r\n };\r\n /**\r\n * Fired once when a provider call ultimately fails (retries exhausted, or\r\n * non-retryable error). Same shape as `provider.retry` minus the delay.\r\n */\r\n 'provider.error': {\r\n providerId: string;\r\n status: number;\r\n description: string;\r\n retryable: boolean;\r\n };\r\n 'tool.started': { name: string; id: string; input?: unknown };\r\n /**\r\n * Fired for each ToolProgressEvent yielded by `Tool.executeStream`. UIs\r\n * subscribe to render incremental progress (streaming bash output, file\r\n * tree counts, etc.) without the tool having to know about the UI.\r\n */\r\n 'tool.progress': { name: string; id: string; event: ToolProgressEvent };\r\n /**\r\n * Fired when a tool call needs user confirmation and no confirmHandler\r\n * is registered on the executor. The TUI renders a confirmation dialog\r\n * from this event. Resolution is driven by calling the resolve function\r\n * passed in the payload with a decision string ('yes' | 'no' | 'always' | 'deny').\r\n */\r\n 'tool.confirm_needed': {\r\n tool: Tool;\r\n input: unknown;\r\n toolUseId: string;\r\n suggestedPattern: string;\r\n resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\r\n };\r\n /**\r\n * `output` is a truncated preview of the tool's serialized result text\r\n * (capped at ~400 chars by the emitter). UIs render this inline in the\r\n * tool history line without re-fetching from the session log.\r\n */\r\n 'tool.executed': {\r\n /**\r\n * The tool_use id (e.g. \"toolu_…\") issued by the provider for this call.\r\n * Pairs with `tool.started.id` so subscribers can correlate start/finish\r\n * even when the model fires multiple tools in parallel with identical\r\n * inputs. Optional only for legacy emit sites — new code should always\r\n * set it.\r\n */\r\n id?: string;\r\n name: string;\r\n durationMs: number;\r\n ok: boolean;\r\n input?: unknown;\r\n output?: string;\r\n };\r\n 'token.threshold': { used: number; limit: number };\r\n 'compaction.fired': { before: number; after: number };\r\n /**\r\n * Fired when the auto-compaction middleware's compactor.compact() call\r\n * throws. Compaction is best-effort by design so we don't crash the agent\r\n * loop, but a persistent failure (misconfigured summarizer model, network\r\n * outage) means the next iteration may hit context overflow. Observability\r\n * layers / dashboards subscribe to this to surface the silent regression.\r\n */\r\n 'compaction.failed': {\r\n err: Error;\r\n aggressive: boolean;\r\n level: 'warn' | 'soft' | 'hard';\r\n tokens: number;\r\n maxContext: number;\r\n load: number;\r\n fatal: boolean;\r\n };\r\n 'mcp.server.connected': { name: string; toolCount: number };\r\n 'mcp.server.reconnected': { name: string; toolCount: number };\r\n 'mcp.server.disconnected': { name: string; reason: string };\r\n 'token.cost_estimate_unavailable': { model: string };\r\n error: { err: Error; phase: string };\r\n}\r\n\r\nexport type EventName = keyof EventMap;\r\nexport type Listener<E extends EventName> = (payload: EventMap[E]) => void;\r\n\r\nexport interface EventLogger {\r\n error(msg: string, ctx?: unknown): void;\r\n}\r\n\r\nexport class EventBus {\r\n private readonly listeners = new Map<EventName, Set<Listener<EventName>>>();\r\n private logger?: EventLogger;\r\n\r\n setLogger(logger: EventLogger): void {\r\n this.logger = logger;\r\n }\r\n\r\n on<E extends EventName>(event: E, fn: Listener<E>): () => void {\r\n let set = this.listeners.get(event);\r\n if (!set) {\r\n set = new Set();\r\n this.listeners.set(event, set);\r\n }\r\n set.add(fn as Listener<EventName>);\r\n return () => this.off(event, fn);\r\n }\r\n\r\n off<E extends EventName>(event: E, fn: Listener<E>): void {\r\n this.listeners.get(event)?.delete(fn as Listener<EventName>);\r\n }\r\n\r\n once<E extends EventName>(event: E, fn: Listener<E>): () => void {\r\n const wrapper: Listener<E> = (payload) => {\r\n this.off(event, wrapper as Listener<EventName>);\r\n (fn as Listener<E>)(payload);\r\n };\r\n this.on(event, wrapper as Listener<E>);\r\n return () => {\r\n this.off(event, wrapper as Listener<EventName>);\r\n };\r\n }\r\n\r\n emit<E extends EventName>(event: E, payload: EventMap[E]): void {\r\n const set = this.listeners.get(event);\r\n if (!set) return;\r\n for (const fn of set) {\r\n try {\r\n (fn as Listener<E>)(payload);\r\n } catch (err) {\r\n this.logger?.error(`EventBus listener for \"${event}\" threw`, err);\r\n }\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n }\r\n\r\n /**\r\n * V2-D: introspection helper. Pass an `event` to count handlers for a\r\n * single key, or omit to get the total across every event. Used by the\r\n * leak-detection smoke test to flag handler accumulation across runs.\r\n */\r\n listenerCount(event?: EventName): number {\r\n if (event !== undefined) return this.listeners.get(event)?.size ?? 0;\r\n let total = 0;\r\n for (const set of this.listeners.values()) total += set.size;\r\n return total;\r\n }\r\n}\r\n","import type { Token } from './container.js';\r\nimport type { Logger } from '../types/logger.js';\r\nimport type { TokenCounter } from '../types/token-counter.js';\r\nimport type { SessionStore } from '../types/session.js';\r\nimport type { MemoryStore } from '../types/memory.js';\r\nimport type { PermissionPolicy } from '../types/permission.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport type { PathResolver } from '../types/path-resolver.js';\r\nimport type { ConfigLoader, ConfigStore } from '../types/config.js';\r\nimport type { Renderer } from '../types/renderer.js';\r\nimport type { InputReader } from '../types/input-reader.js';\r\nimport type { ErrorHandler } from '../types/error-handler.js';\r\nimport type { RetryPolicy } from '../types/retry-policy.js';\r\nimport type { SkillLoader } from '../types/skill.js';\r\nimport type { SystemPromptBuilder } from '../types/system-prompt.js';\r\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\r\nimport type { ModelsRegistry } from '../types/models-registry.js';\r\nimport type { ModeStore } from '../types/mode.js';\r\n\r\nconst t = <T>(name: string): Token<T> => Symbol(name) as Token<T>;\r\n\r\nexport const TOKENS = {\r\n Logger: t<Logger>('Logger'),\r\n TokenCounter: t<TokenCounter>('TokenCounter'),\r\n SessionStore: t<SessionStore>('SessionStore'),\r\n MemoryStore: t<MemoryStore>('MemoryStore'),\r\n PermissionPolicy: t<PermissionPolicy>('PermissionPolicy'),\r\n Compactor: t<Compactor>('Compactor'),\r\n PathResolver: t<PathResolver>('PathResolver'),\r\n ConfigLoader: t<ConfigLoader>('ConfigLoader'),\r\n ConfigStore: t<ConfigStore>('ConfigStore'),\r\n Renderer: t<Renderer>('Renderer'),\r\n InputReader: t<InputReader>('InputReader'),\r\n ErrorHandler: t<ErrorHandler>('ErrorHandler'),\r\n RetryPolicy: t<RetryPolicy>('RetryPolicy'),\r\n SkillLoader: t<SkillLoader>('SkillLoader'),\r\n SystemPromptBuilder: t<SystemPromptBuilder>('SystemPromptBuilder'),\r\n SecretScrubber: t<SecretScrubber>('SecretScrubber'),\r\n ModelsRegistry: t<ModelsRegistry>('ModelsRegistry'),\r\n ModeStore: t<ModeStore>('ModeStore'),\r\n} as const;\r\n","/**\n * RunController centralises abort + cleanup for a single agent run. It\n * wraps a single AbortController and exposes a registry of teardown\n * hooks that fire (LIFO, exactly once) when the run aborts OR ends\n * normally. Anyone holding the controller can:\n *\n * - read `signal` to bail out cooperatively\n * - call `abort(reason?)` to abort the run\n * - call `onAbort(fn)` to register a cleanup hook\n * - call `dispose()` when the run ends normally — this fires the\n * hooks too, so cleanup runs regardless of outcome\n *\n * Hooks must be idempotent and synchronous-or-quick. Errors thrown\n * inside hooks are caught and surfaced through `errorSink` (or the\n * console as a last resort) so one bad hook can't block the others.\n */\nexport interface RunControllerOptions {\n /** Optional parent signal — abort propagates from parent → this. */\n parentSignal?: AbortSignal;\n /** Receives errors thrown by cleanup hooks. Defaults to console.warn. */\n errorSink?: (err: unknown, where: string) => void;\n}\n\nexport class RunController {\n private readonly ctrl = new AbortController();\n private readonly hooks: Array<() => void | Promise<void>> = [];\n private disposed = false;\n private hooksDrained = false;\n private readonly errorSink: (err: unknown, where: string) => void;\n\n constructor(opts: RunControllerOptions = {}) {\n this.errorSink =\n opts.errorSink ??\n ((err, where) => {\n console.warn(`[run] cleanup hook failed in ${where}:`, err);\n });\n if (opts.parentSignal) {\n const parent = opts.parentSignal;\n if (parent.aborted) {\n this.ctrl.abort(parent.reason);\n } else {\n const onParentAbort = () => this.ctrl.abort(parent.reason);\n parent.addEventListener('abort', onParentAbort, { once: true });\n // When this run finishes normally, stop listening on the parent.\n this.onAbort(() => parent.removeEventListener('abort', onParentAbort));\n }\n }\n this.ctrl.signal.addEventListener(\n 'abort',\n () => {\n void this.runHooks();\n },\n { once: true },\n );\n }\n\n get signal(): AbortSignal {\n return this.ctrl.signal;\n }\n\n get aborted(): boolean {\n return this.ctrl.signal.aborted;\n }\n\n abort(reason?: unknown): void {\n if (this.ctrl.signal.aborted) return;\n this.ctrl.abort(reason);\n }\n\n /**\n * Register a teardown hook. Returns an unsubscribe function so callers\n * can opt out before the hook fires (e.g. when a tool finishes cleanly\n * before abort happens).\n */\n onAbort(fn: () => void | Promise<void>): () => void {\n this.hooks.push(fn);\n return () => {\n const idx = this.hooks.indexOf(fn);\n if (idx !== -1) this.hooks.splice(idx, 1);\n };\n }\n\n /**\n * Fire cleanup hooks and tear down listeners — called when the run\n * ends *normally* so cleanup happens regardless of outcome. Subsequent\n * aborts become no-ops.\n */\n async dispose(): Promise<void> {\n if (this.disposed) return;\n this.disposed = true;\n await this.runHooks();\n }\n\n private async runHooks(): Promise<void> {\n if (this.hooksDrained) return;\n this.hooksDrained = true;\n // Snapshot + clear so hooks added during cleanup don't re-fire.\n const snapshot = this.hooks.splice(0, this.hooks.length).reverse();\n for (const hook of snapshot) {\n try {\n await hook();\n } catch (err) {\n this.errorSink(err, 'RunController.dispose');\n }\n }\n }\n}\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 { ContentBlock } from './blocks.js';\n\nexport type MessageRole = 'user' | 'assistant' | 'system';\n\nexport interface Message {\n role: MessageRole;\n content: string | ContentBlock[];\n}\n\nexport function asBlocks(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nexport function asText(content: string | ContentBlock[]): string {\n if (typeof content === 'string') return content;\n return content\n .filter((b) => b.type === 'text')\n .map((b) => (b as { text: string }).text)\n .join('');\n}\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","/**\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","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];","export type SpecStatus = 'draft' | 'review' | 'approved' | 'implemented' | 'deprecated';\nexport type SpecSectionType = 'overview' | 'requirements' | 'architecture' | 'api' | 'data' | 'security' | 'acceptance';\n\nexport interface SpecSection {\n type: SpecSectionType;\n title: string;\n content: string;\n level: number;\n children?: SpecSection[];\n}\n\nexport interface SpecRequirement {\n id: string;\n type: 'functional' | 'non-functional' | 'security' | 'performance' | 'ux';\n priority: 'critical' | 'high' | 'medium' | 'low';\n description: string;\n acceptanceCriteria: string[];\n blockedBy?: string[];\n implements?: string[];\n}\n\nexport interface SpecApiEndpoint {\n method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';\n path: string;\n description: string;\n request?: Record<string, unknown>;\n response?: Record<string, unknown>;\n auth?: boolean;\n}\n\nexport interface Specification {\n id: string;\n title: string;\n version: string;\n status: SpecStatus;\n overview: string;\n sections: SpecSection[];\n requirements: SpecRequirement[];\n apiEndpoints?: SpecApiEndpoint[];\n dependencies?: string[];\n createdAt: number;\n updatedAt: number;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpecAnalysis {\n specId: string;\n completeness: number; // 0-100\n coverage: {\n requirements: number;\n apiEndpoints: number;\n edgeCases: number;\n errorHandling: number;\n };\n gaps: string[];\n risks: { requirement: string; risk: string; severity: 'high' | 'medium' | 'low' }[];\n suggestions: string[];\n}\n\nexport interface SpecValidationResult {\n valid: boolean;\n errors: { path: string; message: string }[];\n warnings: { path: string; message: string }[];\n}\n\nexport interface SpecTemplate {\n id: string;\n name: string;\n description: string;\n sections: Omit<SpecSection, 'content'>[];\n defaultRequirements: Omit<SpecRequirement, 'id' | 'description'>[];\n}\n\nexport const DEFAULT_SPEC_TEMPLATE: SpecTemplate = {\n id: 'default',\n name: 'Default Feature Spec',\n description: 'Standard template for feature specifications',\n sections: [\n { type: 'overview', title: 'Overview', level: 1 },\n { type: 'requirements', title: 'Requirements', level: 1 },\n { type: 'architecture', title: 'Architecture', level: 1 },\n { type: 'api', title: 'API Design', level: 1 },\n { type: 'data', title: 'Data Model', level: 1 },\n { type: 'security', title: 'Security', level: 1 },\n { type: 'acceptance', title: 'Acceptance Criteria', level: 1 },\n ],\n defaultRequirements: [\n { type: 'functional', priority: 'high', acceptanceCriteria: [], blockedBy: [], implements: [] },\n { type: 'non-functional', priority: 'medium', acceptanceCriteria: [], blockedBy: [], implements: [] },\n ],\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 * 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","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","export type NewlineStyle = 'lf' | 'crlf' | 'cr';\n\nexport function detectNewlineStyle(text: string): NewlineStyle {\n let lf = 0;\n let crlf = 0;\n let cr = 0;\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (c === 0x0d) {\n if (text.charCodeAt(i + 1) === 0x0a) {\n crlf++;\n i++;\n } else {\n cr++;\n }\n } else if (c === 0x0a) {\n lf++;\n }\n }\n if (crlf > lf && crlf > cr) return 'crlf';\n if (cr > lf && cr > crlf) return 'cr';\n return 'lf';\n}\n\nexport function toStyle(text: string, style: NewlineStyle): string {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (style === 'lf') return normalized;\n if (style === 'crlf') return normalized.replace(/\\n/g, '\\r\\n');\n return normalized.replace(/\\n/g, '\\r');\n}\n\nexport function normalizeToLf(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n","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","/**\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}","/**\n * Myers diff with unified-format output. No external dependencies.\n * Operates on arrays of lines (newline-terminated or stripped).\n */\n\ninterface Edit {\n op: 'equal' | 'insert' | 'delete';\n a: number;\n b: number;\n line: string;\n}\n\nfunction myersDiff(a: string[], b: string[]): Edit[] {\n const N = a.length;\n const M = b.length;\n const max = N + M;\n if (max === 0) return [];\n\n const v = new Map<number, number>();\n v.set(1, 0);\n const trace: Map<number, number>[] = [];\n\n for (let d = 0; d <= max; d++) {\n const snapshot = new Map(v);\n trace.push(snapshot);\n for (let k = -d; k <= d; k += 2) {\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let x: number;\n if (k === -d || (k !== d && left < right)) {\n x = right;\n } else {\n x = left + 1;\n }\n let y = x - k;\n while (x < N && y < M && a[x] === b[y]) {\n x++;\n y++;\n }\n v.set(k, x);\n if (x >= N && y >= M) {\n return backtrack(trace, a, b, N, M, d);\n }\n }\n }\n return [];\n}\n\nfunction backtrack(\n trace: Map<number, number>[],\n a: string[],\n b: string[],\n N: number,\n M: number,\n finalD: number,\n): Edit[] {\n const edits: Edit[] = [];\n let x = N;\n let y = M;\n for (let d = finalD; d > 0; d--) {\n const v = trace[d];\n if (!v) break;\n const k = x - y;\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let prevK: number;\n if (k === -d || (k !== d && left < right)) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = v.get(prevK) ?? 0;\n const prevY = prevX - prevK;\n while (x > prevX && y > prevY) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n if (d > 0) {\n if (x === prevX) {\n edits.push({ op: 'insert', a: x, b: y - 1, line: b[y - 1] ?? '' });\n } else {\n edits.push({ op: 'delete', a: x - 1, b: y, line: a[x - 1] ?? '' });\n }\n x = prevX;\n y = prevY;\n }\n }\n while (x > 0 && y > 0) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n return edits.reverse();\n}\n\nexport interface UnifiedDiffOptions {\n context?: number;\n fromFile?: string;\n toFile?: string;\n}\n\nexport function unifiedDiff(\n oldText: string,\n newText: string,\n opts: UnifiedDiffOptions = {},\n): string {\n const context = opts.context ?? 3;\n const a = oldText.split('\\n');\n const b = newText.split('\\n');\n // Handle trailing newline: split adds an empty string we don't want to diff\n if (a[a.length - 1] === '') a.pop();\n if (b[b.length - 1] === '') b.pop();\n const edits = myersDiff(a, b);\n if (edits.every((e) => e.op === 'equal')) return '';\n\n const hunks: { aStart: number; bStart: number; lines: string[] }[] = [];\n let i = 0;\n while (i < edits.length) {\n while (i < edits.length && edits[i]?.op === 'equal') i++;\n if (i >= edits.length) break;\n const hunkStart = Math.max(0, i - context);\n const lines: string[] = [];\n let aStart = (edits[hunkStart]?.a ?? 0) + 1;\n let bStart = (edits[hunkStart]?.b ?? 0) + 1;\n let aCount = 0;\n let bCount = 0;\n let cursor = hunkStart;\n let trailing = 0;\n while (cursor < edits.length) {\n const e = edits[cursor];\n if (!e) break;\n if (e.op === 'equal') {\n trailing++;\n if (trailing > context * 2) break;\n } else {\n trailing = 0;\n }\n if (e.op === 'equal') {\n lines.push(` ${e.line}`);\n aCount++;\n bCount++;\n } else if (e.op === 'delete') {\n lines.push(`-${e.line}`);\n aCount++;\n } else {\n lines.push(`+${e.line}`);\n bCount++;\n }\n cursor++;\n }\n // Trim trailing context lines beyond `context`\n while (lines.length > 0 && lines[lines.length - 1]?.startsWith(' ') && trailing > context) {\n lines.pop();\n aCount--;\n bCount--;\n trailing--;\n }\n if (aCount === 0) aStart = 0;\n if (bCount === 0) bStart = 0;\n hunks.push({ aStart, bStart, lines });\n i = cursor;\n }\n if (hunks.length === 0) return '';\n\n let out = '';\n out += `--- ${opts.fromFile ?? 'a'}\\n`;\n out += `+++ ${opts.toFile ?? 'b'}\\n`;\n for (const h of hunks) {\n let aCount = 0;\n let bCount = 0;\n for (const l of h.lines) {\n if (l.startsWith(' ')) {\n aCount++;\n bCount++;\n } else if (l.startsWith('-')) aCount++;\n else if (l.startsWith('+')) bCount++;\n }\n out += `@@ -${h.aStart},${aCount} +${h.bStart},${bCount} @@\\n`;\n out += `${h.lines.join('\\n')}\\n`;\n }\n return out;\n}\n","import * as path from 'node:path';\nimport * as os from 'node:os';\nimport { createHash } from 'node:crypto';\n\n/**\n * Path layout. All developer-level state lives in ~/.wrongstack/.\n * Per-project state is keyed by sha256(absoluteProjectRoot).slice(0,12)\n * under ~/.wrongstack/projects/<hash>/.\n *\n * The ONLY thing inside the project tree is the optional\n * .wrongstack/AGENTS.md (committed) and .wrongstack/skills/ (committed).\n */\n\nexport interface WstackPaths {\n /** ~/.wrongstack — global root. */\n globalRoot: string;\n /**\n * ~/.wrongstack — directory for user-global stateful config files\n * (mode.json, theme.json, …). Currently an alias for `globalRoot`;\n * separate name lets us split out per-OS XDG_CONFIG_HOME later\n * without rewriting callers.\n */\n configDir: string;\n /** ~/.wrongstack/config.json */\n globalConfig: string;\n /** ~/.wrongstack/.key — 32 random bytes, mode 0600, AES-GCM key for the secret vault. */\n secretsKey: string;\n /** ~/.wrongstack/memory.md — user-global memory. */\n globalMemory: string;\n /** ~/.wrongstack/skills — user-global skills. */\n globalSkills: string;\n /** ~/.wrongstack/cache — fetched data (models.dev, etc.). */\n cacheDir: string;\n /** ~/.wrongstack/cache/models.dev.json */\n modelsCache: string;\n /** ~/.wrongstack/history — REPL line history. */\n historyFile: string;\n /** ~/.wrongstack/logs/wrongstack.log */\n logFile: string;\n /** ~/.wrongstack/projects/<hash> */\n projectDir: string;\n /** ~/.wrongstack/projects/<hash>/memory.md */\n projectMemory: string;\n /** ~/.wrongstack/projects/<hash>/sessions */\n projectSessions: string;\n /** ~/.wrongstack/projects/<hash>/trust.json */\n projectTrust: string;\n /** ~/.wrongstack/projects/<hash>/meta.json */\n projectMeta: string;\n /** ~/.wrongstack/projects/<hash>/config.local.json — optional override */\n projectLocalConfig: string;\n /** <project>/.wrongstack/AGENTS.md — committed project memory. */\n inProjectAgentsFile: string;\n /** <project>/.wrongstack/skills — committed project skills. */\n inProjectSkills: string;\n /** Stable hash for the project root. */\n projectHash: string;\n}\n\nexport function projectHash(absRoot: string): string {\n return createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 12);\n}\n\nexport interface WstackPathOptions {\n userHome?: string;\n projectRoot: string;\n /** Override the global root (e.g. for tests). Default: `${userHome}/.wrongstack`. */\n globalRoot?: string;\n}\n\nexport function resolveWstackPaths(opts: WstackPathOptions): WstackPaths {\n const home = opts.userHome ?? os.homedir();\n const globalRoot = opts.globalRoot ?? path.join(home, '.wrongstack');\n const hash = projectHash(opts.projectRoot);\n const projectDir = path.join(globalRoot, 'projects', hash);\n return {\n globalRoot,\n configDir: globalRoot,\n globalConfig: path.join(globalRoot, 'config.json'),\n secretsKey: path.join(globalRoot, '.key'),\n globalMemory: path.join(globalRoot, 'memory.md'),\n globalSkills: path.join(globalRoot, 'skills'),\n cacheDir: path.join(globalRoot, 'cache'),\n modelsCache: path.join(globalRoot, 'cache', 'models.dev.json'),\n historyFile: path.join(globalRoot, 'history'),\n logFile: path.join(globalRoot, 'logs', 'wrongstack.log'),\n projectDir,\n projectMemory: path.join(projectDir, 'memory.md'),\n projectSessions: path.join(projectDir, 'sessions'),\n projectTrust: path.join(projectDir, 'trust.json'),\n projectMeta: path.join(projectDir, 'meta.json'),\n projectLocalConfig: path.join(projectDir, 'config.local.json'),\n inProjectAgentsFile: path.join(opts.projectRoot, '.wrongstack', 'AGENTS.md'),\n inProjectSkills: path.join(opts.projectRoot, '.wrongstack', 'skills'),\n projectHash: hash,\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}","/**\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}","/**\r\n * Minimal JSON Schema validator — covers the subset needed for plugin\r\n * configSchema validation and tool inputSchema sanity checks. Intentionally\r\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\r\n * authors can mix in non-standard extensions without breaking validation.\r\n *\r\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\r\n * conditional schemas, format validation, or anything else exotic, it should\r\n * bring its own ajv-based validator and call this only for the cheap path.\r\n */\r\nimport type { JSONSchema } from '../types/tool.js';\r\n\r\nexport interface ValidationError {\r\n path: string;\r\n message: string;\r\n}\r\n\r\nexport interface ValidationResult {\r\n ok: boolean;\r\n errors: ValidationError[];\r\n}\r\n\r\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\r\n const errors: ValidationError[] = [];\r\n walk(value, schema, '', errors);\r\n return { ok: errors.length === 0, errors };\r\n}\r\n\r\nfunction walk(value: unknown, schema: JSONSchema, path: string, errors: ValidationError[]): void {\r\n if (schema.enum !== undefined) {\r\n if (!schema.enum.some((e) => deepEqual(e, value))) {\r\n errors.push({\r\n path: path || '<root>',\r\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (typeof schema.type === 'string') {\r\n if (!checkType(value, schema.type)) {\r\n errors.push({\r\n path: path || '<root>',\r\n message: `expected ${schema.type}, got ${describeType(value)}`,\r\n });\r\n return;\r\n }\r\n }\r\n\r\n if (schema.type === 'object' && isPlainObject(value)) {\r\n const obj = value as Record<string, unknown>;\r\n for (const req of schema.required ?? []) {\r\n if (!(req in obj)) {\r\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\r\n }\r\n }\r\n if (schema.properties) {\r\n for (const [key, subSchema] of Object.entries(schema.properties)) {\r\n if (key in obj) {\r\n walk(obj[key], subSchema, joinPath(path, key), errors);\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\r\n value.forEach((item, i) => walk(item, schema.items as JSONSchema, `${path}[${i}]`, errors));\r\n }\r\n}\r\n\r\nfunction checkType(value: unknown, type: string): boolean {\r\n switch (type) {\r\n case 'string': return typeof value === 'string';\r\n case 'number': return typeof value === 'number' && !Number.isNaN(value);\r\n case 'integer': return typeof value === 'number' && Number.isInteger(value);\r\n case 'boolean': return typeof value === 'boolean';\r\n case 'null': return value === null;\r\n case 'array': return Array.isArray(value);\r\n case 'object': return isPlainObject(value);\r\n default: return true;\r\n }\r\n}\r\n\r\nfunction isPlainObject(v: unknown): boolean {\r\n return typeof v === 'object' && v !== null && !Array.isArray(v);\r\n}\r\n\r\nfunction describeType(v: unknown): string {\r\n if (v === null) return 'null';\r\n if (Array.isArray(v)) return 'array';\r\n return typeof v;\r\n}\r\n\r\nfunction joinPath(parent: string, key: string): string {\r\n if (!parent) return key;\r\n return `${parent}.${key}`;\r\n}\r\n\r\nfunction deepEqual(a: unknown, b: unknown): boolean {\r\n if (a === b) return true;\r\n if (typeof a !== typeof b) return false;\r\n if (a === null || b === null) return a === b;\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\r\n }\r\n if (typeof a === 'object' && typeof b === 'object') {\r\n const ak = Object.keys(a as object);\r\n const bk = Object.keys(b as object);\r\n if (ak.length !== bk.length) return false;\r\n return ak.every((k) =>\r\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\r\n );\r\n }\r\n return false;\r\n}\r\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 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","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","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","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","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","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","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}","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","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});","import type { Provider, Request, Response } from '../types/provider.js';\r\nimport type { ContentBlock, ToolUseBlock } from '../types/blocks.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type { Context } from './context.js';\r\n\r\ninterface StreamingState {\r\n model: string;\r\n stopReason: Response['stopReason'];\r\n usage: Response['usage'];\r\n textBuffers: string[];\r\n currentTextIndex: number;\r\n tools: Map<string, { name: string; partial: string; input?: unknown; providerMeta?: Record<string, unknown> }>;\r\n blockOrder: Array<{ kind: 'text'; idx: number } | { kind: 'tool'; id: string }>;\r\n}\r\n\r\nexport function buildResponse(state: StreamingState): Response {\r\n const content: ContentBlock[] = [];\r\n for (const b of state.blockOrder) {\r\n if (b.kind === 'text') {\r\n const txt = state.textBuffers[b.idx] ?? '';\r\n if (txt) content.push({ type: 'text', text: txt });\r\n } else {\r\n const tb = state.tools.get(b.id);\r\n if (tb) {\r\n const block: ToolUseBlock = {\r\n type: 'tool_use',\r\n id: b.id,\r\n name: tb.name,\r\n input: (tb.input as Record<string, unknown>) ?? {},\r\n };\r\n if (tb.providerMeta && Object.keys(tb.providerMeta).length > 0) {\r\n block.providerMeta = tb.providerMeta;\r\n }\r\n content.push(block);\r\n }\r\n }\r\n }\r\n if (content.length === 0) content.push({ type: 'text', text: '' });\r\n return { content, stopReason: state.stopReason, usage: state.usage, model: state.model };\r\n}\r\n\r\nexport function createStreamingState(model: string): StreamingState {\r\n return {\r\n model,\r\n stopReason: 'end_turn',\r\n usage: { input: 0, output: 0 },\r\n textBuffers: [],\r\n currentTextIndex: -1,\r\n tools: new Map(),\r\n blockOrder: [],\r\n };\r\n}\r\n\r\nexport function handleMessageStart(state: StreamingState, model: string): void {\r\n state.model = model;\r\n}\r\n\r\nexport function handleContentBlockStart(\r\n state: StreamingState,\r\n ev: { kind?: string; id?: string; name?: string },\r\n): void {\r\n const kind = ev.kind ?? 'text';\r\n if (kind === 'text') {\r\n state.currentTextIndex = state.textBuffers.length;\r\n state.textBuffers.push('');\r\n state.blockOrder.push({ kind: 'text', idx: state.currentTextIndex });\r\n } else if (kind === 'tool_use') {\r\n const id = ev.id ?? crypto.randomUUID();\r\n state.tools.set(id, { name: ev.name ?? 'unknown', partial: '' });\r\n state.blockOrder.push({ kind: 'tool', id });\r\n state.currentTextIndex = -1;\r\n }\r\n}\r\n\r\nexport function handleContentBlockStop(state: StreamingState, ev: { index?: number }): void {\r\n // No-op for now, but tracks block boundaries for providers that need it\r\n void state;\r\n void ev;\r\n}\r\n\r\nexport function handleTextDelta(state: StreamingState, text: string): void {\r\n if (state.currentTextIndex === -1) {\r\n // No open text block — create one and track it.\r\n state.currentTextIndex = state.textBuffers.length;\r\n state.textBuffers.push('');\r\n state.blockOrder.push({ kind: 'text', idx: state.currentTextIndex });\r\n }\r\n state.textBuffers[state.currentTextIndex] = (state.textBuffers[state.currentTextIndex] ?? '') + text;\r\n}\r\n\r\nexport function handleToolUseStart(\r\n state: StreamingState,\r\n ev: { id: string; name: string },\r\n): void {\r\n state.currentTextIndex = -1;\r\n state.tools.set(ev.id, { name: ev.name, partial: '' });\r\n state.blockOrder.push({ kind: 'tool', id: ev.id });\r\n}\r\n\r\nexport function handleToolUseInputDelta(state: StreamingState, ev: { id: string; partial: string }): void {\r\n const t = state.tools.get(ev.id);\r\n if (t) t.partial += ev.partial;\r\n}\r\n\r\nexport function safeJsonOrRaw(s: string): unknown {\r\n if (!s) return {};\r\n try {\r\n return JSON.parse(s);\r\n } catch {\r\n return { _raw: s };\r\n }\r\n}\r\n\r\nexport function handleToolUseStop(\r\n state: StreamingState,\r\n ev: { id: string; input?: unknown; providerMeta?: Record<string, unknown> },\r\n): void {\r\n const t = state.tools.get(ev.id);\r\n if (t) {\r\n t.input = ev.input !== undefined ? ev.input : safeJsonOrRaw(t.partial);\r\n if (ev.providerMeta) t.providerMeta = ev.providerMeta;\r\n }\r\n state.currentTextIndex = -1;\r\n}\r\n\r\nexport function handleMessageStop(\r\n state: StreamingState,\r\n ev: { stopReason?: Response['stopReason']; usage?: Response['usage'] },\r\n): void {\r\n state.stopReason = ev.stopReason ?? 'end_turn';\r\n state.usage = ev.usage ?? { input: 0, output: 0 };\r\n}\r\n\r\nexport async function streamProviderToResponse(\r\n provider: Provider,\r\n req: Request,\r\n signal: AbortSignal,\r\n ctx: Context,\r\n events: EventBus,\r\n): Promise<Response> {\r\n const state = createStreamingState(req.model);\r\n\r\n const iter = provider.stream(req, { signal })[Symbol.asyncIterator]();\r\n try {\r\n for (;;) {\r\n const next = await iter.next();\r\n if (next.done) break;\r\n const ev = next.value;\r\n switch (ev.type) {\r\n case 'message_start':\r\n handleMessageStart(state, ev.model);\r\n break;\r\n case 'content_block_start':\r\n handleContentBlockStart(state, ev as Parameters<typeof handleContentBlockStart>[1]);\r\n break;\r\n case 'content_block_stop':\r\n handleContentBlockStop(state, ev as Parameters<typeof handleContentBlockStop>[1]);\r\n break;\r\n case 'text_delta':\r\n handleTextDelta(state, ev.text);\r\n events.emit('provider.text_delta', { ctx, text: ev.text });\r\n break;\r\n case 'tool_use_start':\r\n handleToolUseStart(state, ev as Parameters<typeof handleToolUseStart>[1]);\r\n events.emit('provider.tool_use_start', { ctx, id: ev.id, name: ev.name });\r\n break;\r\n case 'tool_use_input_delta':\r\n handleToolUseInputDelta(state, ev as Parameters<typeof handleToolUseInputDelta>[1]);\r\n break;\r\n case 'tool_use_stop':\r\n handleToolUseStop(state, ev as Parameters<typeof handleToolUseStop>[1]);\r\n events.emit('provider.tool_use_stop', { ctx, id: ev.id });\r\n break;\r\n case 'message_stop':\r\n handleMessageStop(state, ev as Parameters<typeof handleMessageStop>[1]);\r\n break;\r\n }\r\n }\r\n } catch (err) {\r\n if (signal.aborted) {\r\n // Preserve partial state so the agent can persist what was already\r\n // streamed before honoring the abort. The agent's outer loop checks\r\n // `controller.signal.aborted` after consuming this response and\r\n // returns `status: 'aborted'` with the finalText we built here.\r\n //\r\n // The stop reason `end_turn` is the most accurate of the available\r\n // StopReason values — the stream simply ended early, it was NOT a\r\n // token-budget hit (the previous code mis-attributed this as\r\n // `max_tokens`, which corrupted telemetry and broke retry logic\r\n // that branches on max_tokens specifically).\r\n state.stopReason = 'end_turn';\r\n return buildResponse(state);\r\n }\r\n throw err;\r\n } finally {\r\n try {\r\n // Race the drain against a short deadline so a non-cooperative\r\n // provider stream can't pin shutdown.\r\n let drainTimer: ReturnType<typeof setTimeout> | null = null;\r\n try {\r\n await Promise.race([\r\n Promise.resolve(iter.return?.()),\r\n new Promise<void>((resolve) => {\r\n drainTimer = setTimeout(resolve, 500);\r\n }),\r\n ]);\r\n } finally {\r\n if (drainTimer) clearTimeout(drainTimer);\r\n }\r\n } catch {\r\n // best-effort\r\n }\r\n }\r\n return buildResponse(state);\r\n}\r\n","import type { EventBus } from '../kernel/events.js';\nimport type { Context } from './context.js';\nimport type { Provider, Request, Response } from '../types/provider.js';\nimport { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\nimport type { Logger } from '../types/logger.js';\nimport type { Tracer } from '../types/observability.js';\nimport { streamProviderToResponse } from './streaming-response-builder.js';\n\nexport interface RunProviderOptions {\n provider: Provider;\n request: Request;\n signal: AbortSignal;\n ctx: Context;\n events: EventBus;\n retry: RetryPolicy;\n logger: Logger;\n tracer?: Tracer;\n}\n\n/**\n * Call a provider with the retry policy applied. Emits `provider.retry`\n * before each retry and `provider.error` once when the retries are\n * exhausted. Streaming providers route through the streaming-response\n * builder so deltas reach the renderer.\n */\nexport async function runProviderWithRetry(opts: RunProviderOptions): Promise<Response> {\n const { provider, request, signal, ctx, events, retry, logger, tracer } = opts;\n let attempt = 0;\n for (;;) {\n const span = tracer?.startSpan('provider.complete', {\n 'provider.id': provider.id,\n 'provider.model': request.model,\n 'provider.streaming': provider.capabilities.streaming,\n 'provider.attempt': attempt,\n });\n try {\n const res = provider.capabilities.streaming\n ? await streamProviderToResponse(provider, request, signal, ctx, events)\n : await provider.complete(request, { signal });\n span?.setAttribute('provider.stopReason', res.stopReason);\n span?.setAttribute('provider.usage_in', res.usage.input);\n span?.setAttribute('provider.usage_out', res.usage.output);\n span?.end();\n return res;\n } catch (err) {\n if (err instanceof Error) span?.recordError(err);\n span?.end();\n if (signal.aborted) throw err;\n const isProviderErr = err instanceof ProviderError;\n const errAsErr = err instanceof Error ? err : new Error(String(err));\n const canRetry = retry.shouldRetry(isProviderErr ? err : errAsErr, attempt);\n const description = isProviderErr ? (err as ProviderError).describe() : errAsErr.message;\n if (!canRetry) {\n if (isProviderErr) {\n events.emit('provider.error', {\n providerId: (err as ProviderError).providerId,\n status: (err as ProviderError).status,\n description,\n retryable: false,\n });\n }\n throw err;\n }\n const delay = Math.round(retry.delayMs(attempt));\n const attemptNum = attempt + 1;\n logger.warn(`Provider retry ${attemptNum} in ${delay}ms — ${description}`);\n if (isProviderErr) {\n events.emit('provider.retry', {\n providerId: (err as ProviderError).providerId,\n attempt: attemptNum,\n delayMs: delay,\n status: (err as ProviderError).status,\n description,\n });\n }\n await new Promise<void>((resolve, reject) => {\n // The previous version only removed the abort listener if it fired\n // (via { once: true }). On the timeout-resolves path the listener\n // stayed attached to the long-lived parent signal, accumulating one\n // per retry attempt across many requests.\n let settled = false;\n const cleanup = () => {\n if (settled) return;\n settled = true;\n clearTimeout(t);\n // Note: listener is auto-removed via { once: true }, no need to call\n // removeEventListener. Calling it here after the signal has already\n // aborted (and the listener already fired) would be a no-op, but\n // keeping it removed avoids confusion about lifetime.\n };\n const onAbort = () => {\n cleanup();\n reject(new Error('aborted'));\n };\n const t = setTimeout(() => {\n cleanup();\n resolve();\n }, delay);\n if (signal.aborted) {\n onAbort();\n return;\n }\n signal.addEventListener('abort', onAbort, { once: true });\n });\n attempt++;\n }\n }\n}\n","import type { EventBus } from '../kernel/events.js';\n\nexport interface RequestLimitExtensionOptions {\n events: EventBus;\n currentIterations: number;\n currentLimit: number;\n /** When true (default), auto-grant 100 extra after giving listeners a tick to deny. */\n autoExtend: boolean;\n /** Timeout in ms before falling back to \"0 extra\" if no listener responds. */\n timeoutMs?: number;\n}\n\n/**\n * Emit `iteration.limit_reached` and wait for a listener to grant or\n * deny. Resolves with the number of extra iterations to grant (0 = stop).\n * When `autoExtend` is true the listener gets a `setImmediate` window to\n * react; otherwise the resolution stays open until the timer fires.\n *\n * Listener contract — **important for `autoExtend: true` callers**:\n *\n * - `grant(extra)` and `deny()` must be invoked **synchronously** from\n * the event listener (or earlier than the next `setImmediate` tick).\n * The auto-grant path resolves to 100 inside `setImmediate`, so any\n * async work between receiving the event and calling grant/deny will\n * lose the race and the auto-grant wins.\n *\n * - If you need to make an async decision (await a confirm dialog,\n * query a remote policy), pass `autoExtend: false`. The promise will\n * stay pending until the listener calls grant/deny or `timeoutMs`\n * fires (default 30s).\n *\n * - Multiple listeners are allowed but the first to call grant/deny\n * wins; subsequent calls are no-ops.\n */\nexport function requestLimitExtension(opts: RequestLimitExtensionOptions): Promise<number> {\n const { events, currentIterations, currentLimit, autoExtend, timeoutMs = 30_000 } = opts;\n return new Promise((resolve) => {\n let resolved = false;\n const timer = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n resolve(0);\n }\n }, timeoutMs);\n const deny = () => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(0);\n }\n };\n const grant = (extra: number) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(Math.max(0, extra));\n }\n };\n events.emit('iteration.limit_reached', {\n currentIterations,\n currentLimit,\n grant,\n deny,\n });\n if (autoExtend) {\n // Give listeners a tick to deny synchronously; otherwise auto-grant 100.\n setImmediate(() => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timer);\n resolve(100);\n }\n });\n }\n });\n}\n","import type { Container } from '../kernel/container.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport { Pipeline } from '../kernel/pipeline.js';\r\nimport { RunController } from '../kernel/run-controller.js';\r\nimport { TOKENS } from '../kernel/tokens.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { ContentBlock, TextBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\r\nimport { isTextBlock, isToolUseBlock } from '../types/blocks.js';\r\nimport type { Request, Response } from '../types/provider.js';\r\nimport { type WrongStackError, AgentError, toWrongStackError } from '../types/errors.js';\r\nimport type { Tracer } from '../types/observability.js';\r\nimport type { Logger } from '../types/logger.js';\r\nimport type { RetryPolicy } from '../types/retry-policy.js';\r\nimport type { ErrorHandler } from '../types/error-handler.js';\r\nimport type { PermissionPolicy } from '../types/permission.js';\r\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\r\nimport type { Renderer } from '../types/renderer.js';\r\nimport type { Plugin, PluginAPI } from '../types/plugin.js';\r\nimport type { Context, RunOptions } from './context.js';\r\nimport type { ToolRegistry } from '../registry/tool-registry.js';\r\nimport type { ProviderRegistry } from '../registry/provider-registry.js';\r\nimport { ToolExecutor } from '../defaults/tool-executor.js';\r\nimport { runProviderWithRetry } from './provider-runner.js';\r\nimport { requestLimitExtension } from './iteration-limit.js';\r\n\r\n/** Default iteration cap. Use 0 or Infinity via config to disable. */\r\nexport const DEFAULT_MAX_ITERATIONS = 100;\r\n\r\nexport interface RunResult {\r\n status: 'done' | 'failed' | 'max_iterations' | 'aborted';\r\n /**\r\n * Set when `status === 'failed'` (always) or `'aborted'` (when the abort\r\n * carried an error context). Always a `WrongStackError` so callers can\r\n * branch on `code`, `severity`, and `recoverable` without parsing strings.\r\n * Raw throws are wrapped into an `AgentError` with code `AGENT_RUN_FAILED`\r\n * by `Agent.run` before they reach this field.\r\n */\r\n error?: WrongStackError;\r\n finalText?: string;\r\n iterations: number;\r\n}\r\n\r\nexport interface AgentInit {\r\n container: Container;\r\n tools: ToolRegistry;\r\n providers: ProviderRegistry;\r\n events: EventBus;\r\n pipelines: AgentPipelines;\r\n context: Context;\r\n maxIterations?: number;\r\n iterationTimeoutMs?: number;\r\n executionStrategy?: 'parallel' | 'sequential' | 'smart';\r\n perIterationOutputCapBytes?: number;\r\n /**\r\n * When true (default), the agent automatically extends its iteration\r\n * limit by 100 when hit, without asking the user. Set to false to\r\n * emit `iteration.limit_reached` and wait for a listener to grant/deny.\r\n */\r\n autoExtendLimit?: boolean;\r\n /**\r\n * Optional confirm handler. When set, the executor calls it synchronously\r\n * when a tool needs user confirmation (CLI path). When omitted, the\r\n * executor returns a `ToolConfirmPendingResult` and the agent emits\r\n * `tool.confirm_needed` for the TUI to resolve.\r\n */\r\n confirmAwaiter?: import('../types/tool-executor.js').ConfirmAwaiter | undefined;\r\n /**\r\n * Optional tracer. When provided, `Agent.run` opens an `agent.run` span,\r\n * per-iteration `agent.iteration` spans, and `provider.complete` spans\r\n * inside the retry loop. Tool spans are opened by the ToolExecutor.\r\n * Default is `NoopTracer` (zero overhead).\r\n */\r\n tracer?: Tracer | undefined;\r\n}\r\n\r\nexport interface AgentPipelines {\r\n request: Pipeline<Request>;\r\n response: Pipeline<Response>;\r\n toolCall: Pipeline<ToolCallPipelinePayload>;\r\n userInput: Pipeline<UserInputPayload>;\r\n assistantOutput: Pipeline<TextBlock>;\r\n contextWindow: Pipeline<Context>;\r\n}\r\n\r\nexport interface UserInputPayload {\r\n content: ContentBlock[];\r\n /** Concatenation of text blocks — convenience for middleware that only cares about text. */\r\n text: string;\r\n ctx: Context;\r\n}\r\n\r\nexport type AgentInput = string | ContentBlock[];\r\n\r\nfunction normalizeInput(input: AgentInput): { blocks: ContentBlock[]; text: string } {\r\n if (typeof input === 'string') {\r\n return { blocks: [{ type: 'text', text: input }], text: input };\r\n }\r\n const text = input\r\n .filter(isTextBlock)\r\n .map((b) => b.text)\r\n .join('');\r\n return { blocks: input, text };\r\n}\r\n\r\nexport interface ToolCallPipelinePayload {\r\n toolUse: ToolUseBlock;\r\n result: ToolResultBlock;\r\n ctx: Context;\r\n /** Undefined when the model invoked a tool name we don't know. */\r\n tool?: Tool;\r\n}\r\n\r\nexport function createDefaultPipelines(): AgentPipelines {\r\n return {\r\n request: new Pipeline<Request>(),\r\n response: new Pipeline<Response>(),\r\n toolCall: new Pipeline<ToolCallPipelinePayload>(),\r\n userInput: new Pipeline<UserInputPayload>(),\r\n assistantOutput: new Pipeline<TextBlock>(),\r\n contextWindow: new Pipeline<Context>(),\r\n };\r\n}\r\n\r\nexport class Agent {\r\n readonly container: Container;\r\n readonly tools: ToolRegistry;\r\n readonly providers: ProviderRegistry;\r\n readonly events: EventBus;\r\n readonly pipelines: AgentPipelines;\r\n readonly ctx: Context;\r\n private readonly maxIterations: number;\r\n private readonly iterationTimeoutMs: number;\r\n private readonly executionStrategy: 'parallel' | 'sequential' | 'smart';\r\n private readonly perIterationOutputCapBytes: number;\r\n private readonly plugins: { plugin: Plugin; api: PluginAPI }[] = [];\r\n private readonly toolExecutor: ToolExecutor;\r\n private readonly autoExtendLimit: boolean;\r\n private readonly tracer: Tracer | undefined;\r\n\r\n constructor(init: AgentInit) {\r\n this.container = init.container;\r\n this.tools = init.tools;\r\n this.providers = init.providers;\r\n this.events = init.events;\r\n this.pipelines = init.pipelines;\r\n this.ctx = init.context;\r\n this.maxIterations = init.maxIterations ?? DEFAULT_MAX_ITERATIONS;\r\n this.iterationTimeoutMs = init.iterationTimeoutMs ?? 300_000;\r\n this.executionStrategy = init.executionStrategy ?? 'smart';\r\n this.perIterationOutputCapBytes = init.perIterationOutputCapBytes ?? 100_000;\r\n this.autoExtendLimit = init.autoExtendLimit ?? true;\r\n this.tracer = init.tracer;\r\n this.toolExecutor = new ToolExecutor(this.tools, {\r\n permissionPolicy: this.permission,\r\n secretScrubber: this.scrubber,\r\n renderer: this.renderer,\r\n events: this.events,\r\n confirmAwaiter: init.confirmAwaiter,\r\n iterationTimeoutMs: this.iterationTimeoutMs,\r\n perIterationOutputCapBytes: this.perIterationOutputCapBytes,\r\n tracer: this.tracer,\r\n });\r\n }\r\n\r\n private get logger(): Logger {\r\n return this.container.resolve(TOKENS.Logger);\r\n }\r\n private get retry(): RetryPolicy {\r\n return this.container.resolve(TOKENS.RetryPolicy);\r\n }\r\n private get errorHandler(): ErrorHandler {\r\n return this.container.resolve(TOKENS.ErrorHandler);\r\n }\r\n private get permission(): PermissionPolicy {\r\n return this.container.resolve(TOKENS.PermissionPolicy);\r\n }\r\n private get scrubber(): SecretScrubber {\r\n return this.container.resolve(TOKENS.SecretScrubber);\r\n }\r\n private get renderer(): Renderer | undefined {\r\n return this.container.has(TOKENS.Renderer)\r\n ? this.container.resolve(TOKENS.Renderer)\r\n : undefined;\r\n }\r\n\r\n register(tool: Tool): void {\r\n this.tools.register(tool);\r\n }\r\n\r\n async use(plugin: Plugin, api: PluginAPI): Promise<void> {\r\n await plugin.setup(api);\r\n this.plugins.push({ plugin, api });\r\n }\r\n\r\n async run(userInput: AgentInput, opts: RunOptions = {}): Promise<RunResult> {\r\n const controller = new RunController({ parentSignal: opts.signal });\r\n const signal = controller.signal;\r\n this.ctx.signal = signal;\r\n // Flush abort hooks registered on the context when this run ends or\r\n // is aborted. Tools / MCP / file handles register via ctx.registerAbortHook.\r\n controller.onAbort(() => this.ctx.drainAbortHooks());\r\n\r\n const span = this.tracer?.startSpan('agent.run', {\r\n 'agent.model': opts.model ?? this.ctx.model,\r\n 'agent.executionStrategy': opts.executionStrategy ?? this.executionStrategy,\r\n });\r\n try {\r\n const result = await this.runInner(userInput, opts, controller);\r\n span?.setAttribute('agent.status', result.status);\r\n span?.setAttribute('agent.iterations', result.iterations);\r\n return result;\r\n } catch (err) {\r\n // Any throw that escapes runInner is treated as a hard agent failure.\r\n // Wrap into a WrongStackError so callers always see a structured error\r\n // and never have to unwrap `unknown` in user-facing paths.\r\n const wse = err instanceof AgentError ? err : toWrongStackError(err);\r\n this.events.emit('error', { err: toError(err), phase: 'agent' });\r\n if (err instanceof Error) span?.recordError(err);\r\n span?.setAttribute('agent.status', 'failed');\r\n return {\r\n status: signal.aborted ? 'aborted' : 'failed',\r\n iterations: 0,\r\n error: wse,\r\n };\r\n } finally {\r\n span?.end();\r\n await controller.dispose();\r\n }\r\n }\r\n\r\n private async runInner(\r\n userInput: AgentInput,\r\n opts: RunOptions,\r\n controller: RunController,\r\n ): Promise<RunResult> {\r\n await this.normalizeAndEmitUserInput(userInput);\r\n\r\n let finalText = '';\r\n let iterations = 0;\r\n let effectiveLimit = opts.maxIterations ?? this.maxIterations;\r\n const hasHardLimit = effectiveLimit > 0 && Number.isFinite(effectiveLimit);\r\n let recoveryRetries = 0;\r\n\r\n for (let i = 0; ; i++) {\r\n iterations = i + 1;\r\n if (controller.signal.aborted) {\r\n return { status: 'aborted', iterations };\r\n }\r\n\r\n const limitCheck = await this.checkIterationLimit(\r\n i,\r\n effectiveLimit,\r\n hasHardLimit,\r\n iterations,\r\n );\r\n effectiveLimit = limitCheck.limit;\r\n if (limitCheck.exit) {\r\n return { ...limitCheck.exit, finalText };\r\n }\r\n\r\n this.events.emit('iteration.started', { ctx: this.ctx, index: i });\r\n\r\n const req = await this.buildAndRunRequestPipeline(opts);\r\n\r\n let res: Response;\r\n try {\r\n res = await runProviderWithRetry({\r\n provider: this.ctx.provider,\r\n request: req,\r\n signal: controller.signal,\r\n ctx: this.ctx,\r\n events: this.events,\r\n retry: this.retry,\r\n logger: this.logger,\r\n tracer: this.tracer,\r\n });\r\n recoveryRetries = 0;\r\n } catch (err) {\r\n if (controller.signal.aborted) {\r\n this.events.emit('error', { err: toError(err), phase: 'provider' });\r\n return { status: 'aborted', iterations, error: toWrongStackError(err, 'AGENT_ABORTED') };\r\n }\r\n const recovered = await this.errorHandler.recover(err, this.ctx);\r\n if (!recovered || recovered.action === 'fail') {\r\n this.events.emit('error', { err: toError(err), phase: 'provider' });\r\n return {\r\n status: 'failed',\r\n iterations,\r\n error: toWrongStackError(recovered?.error ?? err),\r\n };\r\n }\r\n if (recovered.action === 'retry') {\r\n recoveryRetries++;\r\n if (recoveryRetries > 2) {\r\n this.events.emit('error', { err: toError(err), phase: 'provider' });\r\n return { status: 'failed', iterations, error: toWrongStackError(err) };\r\n }\r\n if (recovered.model) this.ctx.model = recovered.model;\r\n this.logger.info(`Recovered provider error via ${recovered.reason}; retrying turn`);\r\n continue;\r\n }\r\n recoveryRetries = 0;\r\n res = recovered.response;\r\n }\r\n\r\n const responseResult = await this.processResponse(res, req);\r\n if (responseResult.aborted) {\r\n return { status: 'aborted', iterations, finalText: responseResult.finalText };\r\n }\r\n if (responseResult.done) {\r\n return { status: 'done', iterations, finalText: responseResult.finalText };\r\n }\r\n\r\n finalText = responseResult.finalText;\r\n\r\n const toolUses = res.content.filter(isToolUseBlock);\r\n if (toolUses.length === 0) {\r\n this.events.emit('iteration.completed', { ctx: this.ctx, index: i });\r\n return { status: 'done', iterations, finalText };\r\n }\r\n\r\n await this.executeTools(toolUses);\r\n this.events.emit('iteration.completed', { ctx: this.ctx, index: i });\r\n\r\n await this.compactContextIfNeeded();\r\n }\r\n }\r\n\r\n /**\r\n * Normalize user input and emit through userInput pipeline + session append.\r\n */\r\n private async normalizeAndEmitUserInput(userInput: AgentInput): Promise<void> {\r\n const { blocks, text } = normalizeInput(userInput);\r\n await this.pipelines.userInput.run({ content: blocks, text, ctx: this.ctx });\r\n this.ctx.state.appendMessage({ role: 'user', content: blocks });\r\n await this.ctx.session.append({\r\n type: 'user_input',\r\n ts: new Date().toISOString(),\r\n content: blocks,\r\n });\r\n }\r\n\r\n /**\r\n * Check if iteration limit has been reached and request extension if needed.\r\n * Returns the new effective limit (possibly extended) and a RunResult if\r\n * the loop should exit. Returns `{ limit }` with no result when the\r\n * iteration may proceed.\r\n */\r\n private async checkIterationLimit(\r\n iterationIndex: number,\r\n limit: number,\r\n hasHardLimit: boolean,\r\n currentIterations: number,\r\n ): Promise<{ limit: number; exit?: RunResult }> {\r\n if (hasHardLimit && iterationIndex >= limit) {\r\n const extendBy = await requestLimitExtension({\r\n events: this.events,\r\n currentIterations,\r\n currentLimit: this.maxIterations,\r\n autoExtend: this.autoExtendLimit,\r\n });\r\n if (extendBy > 0) {\r\n const newLimit = limit + extendBy;\r\n this.logger.info(`Iteration limit extended by ${extendBy} (new limit: ${newLimit})`);\r\n return { limit: newLimit };\r\n }\r\n return { limit, exit: { status: 'max_iterations', iterations: currentIterations } };\r\n }\r\n return { limit };\r\n }\r\n\r\n /**\r\n * Build request and run through request pipeline.\r\n */\r\n private async buildAndRunRequestPipeline(opts: RunOptions): Promise<Request> {\r\n const baseReq: Request = {\r\n model: opts.model ?? this.ctx.model,\r\n system: this.ctx.systemPrompt,\r\n messages: this.ctx.messages,\r\n tools: this.tools.list(),\r\n maxTokens: 8192,\r\n };\r\n return this.pipelines.request.run(baseReq);\r\n }\r\n\r\n /**\r\n * Process the provider response: run response pipeline, emit events,\r\n * update session, render text, handle abort.\r\n */\r\n private async processResponse(\r\n res: Response,\r\n req: Request,\r\n ): Promise<{ finalText: string; aborted: boolean; done: boolean }> {\r\n // Run response middleware and adopt any transform it returns so later code\r\n // sees the processed value (currently no middleware is registered, but the\r\n // pattern matches `assistantOutput` below).\r\n res = await this.pipelines.response.run(res);\r\n this.events.emit('provider.response', {\r\n ctx: this.ctx,\r\n usage: res.usage,\r\n stopReason: res.stopReason,\r\n });\r\n this.ctx.tokenCounter.account(res.usage, req.model);\r\n\r\n // Persist the partial assistant message even when the run was\r\n // aborted mid-stream — having the partial text in `ctx.messages`\r\n // means the next turn can continue with full context and the\r\n // session log is consistent.\r\n this.ctx.state.appendMessage({ role: 'assistant', content: res.content });\r\n await this.ctx.session.append({\r\n type: 'llm_response',\r\n ts: new Date().toISOString(),\r\n content: res.content,\r\n stopReason: res.stopReason,\r\n usage: res.usage,\r\n });\r\n\r\n if (this.ctx.signal.aborted) {\r\n // Accumulate any text the user did see so callers can show \"you\r\n // got this much before cancelling\" if they want.\r\n let finalText = '';\r\n for (const block of res.content) {\r\n if (isTextBlock(block)) finalText += block.text;\r\n }\r\n return { finalText, aborted: true, done: false };\r\n }\r\n\r\n // Render text blocks. For streaming providers the renderer already\r\n // saw the text via provider.text_delta events; we still run the\r\n // assistantOutput pipeline (for transforms) and accumulate finalText,\r\n // but we don't double-write to the renderer.\r\n let finalText = '';\r\n const streamed = this.ctx.provider.capabilities.streaming;\r\n for (const block of res.content) {\r\n if (isTextBlock(block)) {\r\n const rendered = await this.pipelines.assistantOutput.run(block);\r\n finalText += rendered.text;\r\n if (!streamed) this.renderer?.write(rendered);\r\n }\r\n }\r\n\r\n return { finalText, aborted: false, done: false };\r\n }\r\n\r\n /**\r\n * Execute tools and append tool results to context.\r\n * When a tool returns `tool_confirm_pending` (no confirmAwaiter set),\r\n * we pause and emit `tool.confirm_needed`. The run is blocked until\r\n * the event listener resolves the confirmation, then we re-run the\r\n * single tool.\r\n */\r\n private async executeTools(toolUses: ToolUseBlock[]): Promise<void> {\r\n const { outputs } = await this.toolExecutor.executeBatch(\r\n toolUses,\r\n this.ctx,\r\n this.executionStrategy,\r\n );\r\n\r\n // Post-processing: pipeline, session, events\r\n const useById = new Map(toolUses.map((u) => [u.id, u]));\r\n for (const { result, tool, durationMs } of outputs) {\r\n // Handle pending confirm: block the agent loop and wait for TUI resolution\r\n if (result.type === 'tool_confirm_pending') {\r\n const decision = await this.waitForConfirm({\r\n tool: tool!,\r\n input: result.input,\r\n toolUseId: result.toolUseId,\r\n suggestedPattern: result.suggestedPattern,\r\n });\r\n // Re-run this single tool with the resolved decision\r\n const reRunResult = await this.executeSingleWithDecision(\r\n tool!,\r\n { id: result.toolUseId, name: tool!.name, input: result.input },\r\n decision,\r\n );\r\n const use = useById.get(reRunResult.result.tool_use_id);\r\n if (use) {\r\n await this.pipelines.toolCall.run({ toolUse: use, result: reRunResult.result, ctx: this.ctx, tool });\r\n await this.ctx.session.append({\r\n type: 'tool_result',\r\n ts: new Date().toISOString(),\r\n id: reRunResult.result.tool_use_id,\r\n content: reRunResult.result.content,\r\n isError: !!reRunResult.result.is_error,\r\n });\r\n this.events.emit('tool.executed', {\r\n id: reRunResult.result.tool_use_id,\r\n name: tool!.name,\r\n durationMs: reRunResult.durationMs,\r\n ok: !reRunResult.result.is_error,\r\n input: result.input,\r\n output: truncateForEvent(reRunResult.result.content),\r\n });\r\n }\r\n // Re-run result already appended above — skip the generic append at loop end.\r\n continue;\r\n }\r\n\r\n const use = useById.get(result.tool_use_id);\r\n if (!use) continue;\r\n await this.pipelines.toolCall.run({\r\n toolUse: use,\r\n result,\r\n ctx: this.ctx,\r\n tool: tool ?? undefined,\r\n });\r\n await this.ctx.session.append({\r\n type: 'tool_result',\r\n ts: new Date().toISOString(),\r\n id: result.tool_use_id,\r\n content: result.content,\r\n isError: !!result.is_error,\r\n });\r\n this.events.emit('tool.executed', {\r\n id: result.tool_use_id,\r\n name: use.name,\r\n durationMs,\r\n ok: !result.is_error,\r\n input: use.input,\r\n output: truncateForEvent(result.content),\r\n });\r\n }\r\n\r\n this.ctx.state.appendMessage({ role: 'user', content: outputs.map((o) => o.result) as ToolResultBlock[] });\r\n }\r\n\r\n private waitForConfirm(info: {\r\n tool: Tool;\r\n input: unknown;\r\n toolUseId: string;\r\n suggestedPattern: string;\r\n }): Promise<'yes' | 'no' | 'always' | 'deny'> {\r\n return new Promise((resolve) => {\r\n this.events.emit('tool.confirm_needed', {\r\n tool: info.tool,\r\n input: info.input,\r\n toolUseId: info.toolUseId,\r\n suggestedPattern: info.suggestedPattern,\r\n resolve,\r\n });\r\n });\r\n }\r\n\r\n private async executeSingleWithDecision(\r\n tool: Tool,\r\n use: { id: string; name: string; input: unknown },\r\n decision: 'yes' | 'no' | 'always' | 'deny',\r\n ): Promise<{ result: ToolResultBlock; durationMs: number }> {\r\n const start = Date.now();\r\n if (decision === 'no' || decision === 'deny') {\r\n return {\r\n result: { type: 'tool_result', tool_use_id: use.id, content: `Tool \"${tool.name}\" denied by user.`, is_error: true },\r\n durationMs: Date.now() - start,\r\n };\r\n }\r\n // 'yes' or 'always' — execute\r\n try {\r\n const result = await this.toolExecutor.executeTool(tool, use as ToolUseBlock, this.ctx, this.perIterationOutputCapBytes);\r\n return { result, durationMs: Date.now() - start };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n return {\r\n result: { type: 'tool_result', tool_use_id: use.id, content: `Tool \"${tool.name}\" threw: ${msg}`, is_error: true },\r\n durationMs: Date.now() - start,\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Run context window pipeline. The pipeline may be empty, or it may contain\r\n * middleware with its own injected dependencies.\r\n */\r\n private async compactContextIfNeeded(): Promise<void> {\r\n await this.pipelines.contextWindow.run(this.ctx);\r\n }\r\n\r\n}\r\n\r\nfunction toError(err: unknown): Error {\r\n return err instanceof Error ? err : new Error(String(err));\r\n}\r\n\r\n/**\r\n * Render a tool result body for inclusion in the `tool.executed` event.\r\n * Tool outputs can be large (file dumps, command output); UIs only want a\r\n * preview line, so cap at ~400 chars with an ellipsis marker. Structured\r\n * content blocks are flattened to their text portions.\r\n */\r\nfunction truncateForEvent(content: ToolResultBlock['content'], max = 400): string {\r\n if (!content) return '';\r\n return content.length <= max ? content : `${content.slice(0, max - 1)}…`;\r\n}\r\n","import type { Message } from '../types/messages.js';\nimport type { TodoItem, Context } from './context.js';\n\n/**\n * Observable wrapper for mutable conversation state. Production code should\n * mutate messages, todos, and meta through this API so subscribers see a\n * deterministic change stream. The underlying Context arrays are still\n * exposed for read compatibility and legacy tests.\n */\nexport type StateChange =\n | { kind: 'message_appended'; message: Message }\n | { kind: 'messages_replaced'; messages: readonly Message[] }\n | { kind: 'todos_replaced'; todos: readonly TodoItem[] }\n | { kind: 'meta_set'; key: string; value: unknown }\n | { kind: 'meta_deleted'; key: string }\n | { kind: 'meta_cleared' };\n\nexport type StateChangeHandler = (change: StateChange, state: ConversationState) => void;\n\nexport interface ReadonlyConversationState {\n readonly messages: readonly Message[];\n readonly todos: readonly TodoItem[];\n readonly meta: Readonly<Record<string, unknown>>;\n}\n\nexport class ConversationState {\n private readonly ctx: Context;\n private readonly listeners = new Set<StateChangeHandler>();\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n\n get messages(): readonly Message[] {\n return this.ctx.messages;\n }\n\n get todos(): readonly TodoItem[] {\n return this.ctx.todos;\n }\n\n get meta(): Readonly<Record<string, unknown>> {\n return this.ctx.meta;\n }\n\n /**\n * Cheap immutable snapshot. Useful for tests and for compaction passes\n * that need a stable view across an async boundary.\n */\n snapshot(): ReadonlyConversationState {\n // Return a frozen view — no defensive spread needed since the returned\n // object is deep-frozen and callers receive it as ReadonlyConversationState.\n return Object.freeze({\n messages: Object.freeze([...this.ctx.messages]),\n todos: Object.freeze([...this.ctx.todos]),\n meta: Object.freeze({ ...this.ctx.meta }),\n });\n }\n\n appendMessage(message: Message): void {\n this.ctx.messages.splice(this.ctx.messages.length, 0, message);\n this.emit({ kind: 'message_appended', message });\n }\n\n replaceMessages(messages: Message[]): void {\n this.ctx.messages.length = 0;\n this.ctx.messages.splice(0, 0, ...messages);\n this.emit({ kind: 'messages_replaced', messages: [...messages] });\n }\n\n replaceTodos(todos: TodoItem[]): void {\n this.ctx.todos.length = 0;\n this.ctx.todos.splice(0, 0, ...todos);\n this.emit({ kind: 'todos_replaced', todos: [...todos] });\n }\n\n setMeta(key: string, value: unknown): void {\n this.ctx.meta[key] = value;\n this.emit({ kind: 'meta_set', key, value });\n }\n\n deleteMeta(key: string): void {\n if (!(key in this.ctx.meta)) return;\n delete this.ctx.meta[key];\n this.emit({ kind: 'meta_deleted', key });\n }\n\n clearMeta(): void {\n const keys = Object.keys(this.ctx.meta);\n if (keys.length === 0) return;\n for (const key of keys) delete this.ctx.meta[key];\n this.emit({ kind: 'meta_cleared' });\n }\n\n /**\n * Subscribe to mutations that go through this wrapper. Direct mutations of\n * the compatibility arrays are intentionally not observed.\n */\n onChange(listener: StateChangeHandler): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private emit(change: StateChange): void {\n for (const h of this.listeners) {\n try {\n h(change, this);\n } catch {\n // Listeners are observational only; one bad subscriber must not\n // prevent state mutation or block sibling listeners.\n }\n }\n }\n}\n\n/**\n * Convenience constructor. The wrapper holds a reference, not a copy.\n */\nexport function wrapAsState(ctx: Context): ConversationState {\n return new ConversationState(ctx);\n}\n","import type { Message } from '../types/messages.js';\r\nimport type { TextBlock } from '../types/blocks.js';\r\nimport type { SessionWriter } from '../types/session.js';\r\nimport type { Provider, Usage } from '../types/provider.js';\r\nimport type { TokenCounter } from '../types/token-counter.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport type { RunEnv } from './run-env.js';\r\nimport { ConversationState } from './conversation-state.js';\r\n\r\nexport interface TodoItem {\r\n id: string;\r\n content: string;\r\n status: 'pending' | 'in_progress' | 'completed';\r\n activeForm?: string;\r\n}\r\n\r\nexport interface RunOptions {\r\n signal?: AbortSignal;\r\n model?: string;\r\n executionStrategy?: 'parallel' | 'sequential' | 'smart';\r\n maxIterations?: number;\r\n}\r\n\r\nexport interface ContextInit {\r\n systemPrompt: TextBlock[];\r\n provider: Provider;\r\n session: SessionWriter;\r\n signal: AbortSignal;\r\n tokenCounter: TokenCounter;\r\n cwd: string;\r\n projectRoot: string;\r\n model: string;\r\n tools?: Tool[];\r\n}\r\n\r\n/**\r\n * L1-A: `Context` is the live agent-run object. Its read-only environment\r\n * shape is exposed by the `RunEnv` interface (every field below the\r\n * conversation state) and its mutable shape by `ConversationState` (the\r\n * `state` accessor). New code should declare the narrower type at its\r\n * parameter — pass `ctx` for it. Existing tools that accept `Context`\r\n * still work because `Context` structurally satisfies both.\r\n */\r\nexport class Context implements RunEnv {\r\n messages: Message[] = [];\r\n todos: TodoItem[] = [];\r\n readFiles = new Set<string>();\r\n fileMtimes = new Map<string, number>();\r\n systemPrompt: TextBlock[];\r\n provider: Provider;\r\n session: SessionWriter;\r\n signal: AbortSignal;\r\n tokenCounter: TokenCounter;\r\n cwd: string;\r\n projectRoot: string;\r\n model: string;\r\n tools: Tool[] = [];\r\n meta: Record<string, unknown> = {};\r\n\r\n constructor(init: ContextInit) {\r\n this.systemPrompt = init.systemPrompt;\r\n this.provider = init.provider;\r\n this.session = init.session;\r\n this.signal = init.signal;\r\n this.tokenCounter = init.tokenCounter;\r\n this.cwd = init.cwd;\r\n this.projectRoot = init.projectRoot;\r\n this.model = init.model;\r\n this.tools = init.tools ?? [];\r\n }\r\n\r\n /**\r\n * Observable wrapper over the mutable conversation state. Lazy so\r\n * subsystems that don't subscribe pay nothing. Mutations made directly\r\n * on `ctx.messages` / `ctx.todos` are still visible through this\r\n * wrapper's read API (it holds a reference, not a copy) but only\r\n * mutations that go through `state.appendMessage()` etc. fire\r\n * `onChange`. New code should prefer the wrapper API.\r\n */\r\n private _state: ConversationState | null = null;\r\n get state(): ConversationState {\r\n if (!this._state) this._state = new ConversationState(this);\r\n return this._state;\r\n }\r\n\r\n /**\r\n * Register a teardown hook tied to the current run's abort signal. The\r\n * hook fires when the run aborts OR ends normally — Agent.run wires\r\n * this through a RunController. When no run is active the hook fires\r\n * immediately so callers don't leak resources.\r\n *\r\n * **Scope:** these hooks fire on the **whole agent run's** abort, not on\r\n * an individual tool call. For per-tool teardown of resources owned by\r\n * the tool author (child processes, handles), prefer `Tool.cleanup` —\r\n * see its JSDoc for the full rule.\r\n */\r\n private abortHooks = new Set<() => void | Promise<void>>();\r\n registerAbortHook(fn: () => void | Promise<void>): () => void {\r\n this.abortHooks.add(fn);\r\n return () => this.abortHooks.delete(fn);\r\n }\r\n async drainAbortHooks(): Promise<void> {\r\n const snapshot = [...this.abortHooks].reverse();\r\n // Clear before running so new hooks registered during iteration\r\n // fire on the next abort cycle (not the current one — hook chains\r\n // are intentionally not supported).\r\n this.abortHooks.clear();\r\n for (const fn of snapshot) {\r\n try {\r\n await fn();\r\n } catch {\r\n // hooks must be best-effort; swallow so siblings still fire\r\n }\r\n }\r\n }\r\n\r\n recordRead(absPath: string, mtimeMs: number): void {\r\n this.readFiles.add(absPath);\r\n this.fileMtimes.set(absPath, mtimeMs);\r\n }\r\n\r\n hasRead(absPath: string): boolean {\r\n return this.readFiles.has(absPath);\r\n }\r\n\r\n lastReadMtime(absPath: string): number | undefined {\r\n return this.fileMtimes.get(absPath);\r\n }\r\n\r\n usage(): Usage {\r\n return this.tokenCounter.total();\r\n }\r\n}\r\n","import type { Provider } from '../types/provider.js';\nimport type { SessionWriter } from '../types/session.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { TextBlock } from '../types/blocks.js';\nimport type { Tool } from '../types/tool.js';\nimport type { Context } from './context.js';\n\n/**\n * Immutable run environment — the set-once dependencies for an agent run.\n *\n * `Context` today doubles as both a DI bag (provider, session, tokenCounter,\n * cwd, …) and a mutable state container (messages, todos, meta). That makes\n * it hard to test (every test reconstructs the full bag) and easy to abuse\n * (any tool can swap the provider mid-run).\n *\n * `RunEnv` is the immutable half: a read-only projection that subsystems\n * can hold instead of the whole `Context`. It's a view, not a copy — pulling\n * a `RunEnv` from a `Context` is O(1) and reflects the same underlying\n * references. The opposite direction (set things on Context) still works,\n * and `extractRunEnv` rebuilds the view if you need a snapshot.\n *\n * Migration path: new APIs accept `RunEnv` instead of `Context` when they\n * only need read access. Existing APIs continue to accept `Context` until\n * a full split is scheduled.\n */\nexport interface RunEnv {\n readonly provider: Provider;\n readonly session: SessionWriter;\n readonly signal: AbortSignal;\n readonly tokenCounter: TokenCounter;\n readonly cwd: string;\n readonly projectRoot: string;\n readonly model: string;\n readonly systemPrompt: readonly TextBlock[];\n readonly tools: readonly Tool[];\n}\n\n/**\n * Build a `RunEnv` view from a Context. The returned object is a shallow\n * frozen view — mutations to `Context` are visible (it's the same\n * references), but the view itself can't be mutated.\n *\n * Use this in subsystems that want to declare \"I only need read access to\n * the env\" without rewriting their signature to accept the full Context.\n */\nexport function extractRunEnv(ctx: Context): RunEnv {\n return Object.freeze({\n provider: ctx.provider,\n session: ctx.session,\n signal: ctx.signal,\n tokenCounter: ctx.tokenCounter,\n cwd: ctx.cwd,\n projectRoot: ctx.projectRoot,\n model: ctx.model,\n systemPrompt: ctx.systemPrompt,\n tools: ctx.tools,\n });\n}\n","import type { AddAttachmentInput, AttachmentRef, AttachmentStore } from '../types/attachment.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\nexport interface InputBuilderOptions {\n store: AttachmentStore;\n /**\n * Pastes ≥ this many lines collapse to a `[pasted #N]` placeholder.\n * Default: 8 lines.\n */\n pasteLineThreshold?: number;\n /**\n * Pastes ≥ this many characters collapse to a placeholder regardless of\n * line count. Default: 2000 chars.\n */\n pasteCharThreshold?: number;\n}\n\nexport interface InputBuilderEvent {\n /** Current display string (with placeholders, before submit). */\n display: string;\n refs: AttachmentRef[];\n}\n\n/**\n * UI-agnostic accumulator for user input. The frontend (CLI/TUI) feeds in:\n * - typed text via `appendText()`\n * - large pastes via `appendPaste()` → returns placeholder string\n * - image paste via `appendImage()` → returns placeholder string\n * - file refs (`@path`) via `appendFile()` → returns placeholder string\n *\n * On `submit()` the builder runs the display string through AttachmentStore.expand()\n * and returns the final ContentBlock[] ready for `agent.run()`.\n *\n * The builder does not know what a \"line\" or \"key\" is — that is the\n * frontend's job. It only operates on strings and byte payloads.\n */\nexport class InputBuilder {\n private readonly store: AttachmentStore;\n private readonly pasteLineThreshold: number;\n private readonly pasteCharThreshold: number;\n private display = '';\n private readonly refs: AttachmentRef[] = [];\n\n constructor(opts: InputBuilderOptions) {\n this.store = opts.store;\n this.pasteLineThreshold = opts.pasteLineThreshold ?? 8;\n this.pasteCharThreshold = opts.pasteCharThreshold ?? 2000;\n }\n\n get text(): string {\n return this.display;\n }\n\n get attachments(): AttachmentRef[] {\n return [...this.refs];\n }\n\n get isEmpty(): boolean {\n return this.display.trim().length === 0;\n }\n\n appendText(text: string): void {\n this.display += text;\n }\n\n /**\n * Decide whether a chunk of pasted text is \"big\" enough to collapse.\n * If yes, store it and append a placeholder. If no, inline it.\n * Returns the placeholder string actually appended (or `null` if inlined).\n */\n async appendPaste(text: string): Promise<string | null> {\n if (this.shouldCollapse(text)) {\n const ref = await this.store.add({\n kind: 'text',\n data: text,\n meta: { label: paragraphLabel(text) },\n });\n const placeholder = `[pasted #${ref.seq}]`;\n this.display += placeholder;\n this.refs.push(ref);\n return placeholder;\n }\n this.display += text;\n return null;\n }\n\n /**\n * Always collapses to `[image #N]` — images are never inlined.\n * `dataBase64` is the raw base64 payload (no data: prefix).\n */\n async appendImage(dataBase64: string, mediaType: string): Promise<string> {\n const ref = await this.store.add({\n kind: 'image',\n data: dataBase64,\n meta: { mediaType, label: `${mediaType.split('/')[1]?.toUpperCase() ?? 'IMG'}` },\n });\n const placeholder = `[image #${ref.seq}]`;\n this.display += placeholder;\n this.refs.push(ref);\n return placeholder;\n }\n\n async appendFile(input: AddAttachmentInput): Promise<string> {\n const ref = await this.store.add({ ...input, kind: 'file' });\n const placeholder = `[file #${ref.seq}]`;\n this.display += placeholder;\n this.refs.push(ref);\n return placeholder;\n }\n\n /** Reset display and ref list. Does NOT clear the store itself. */\n reset(): void {\n this.display = '';\n this.refs.length = 0;\n }\n\n /**\n * Resolve the current display string into ContentBlock[]. Empty\n * input returns an empty array — caller decides what to do.\n */\n async submit(): Promise<ContentBlock[]> {\n const text = this.display;\n this.reset();\n return text ? this.store.expand(text) : [];\n }\n\n private shouldCollapse(text: string): boolean {\n if (text.length >= this.pasteCharThreshold) return true;\n let lines = 1;\n for (let i = 0; i < text.length; i++) {\n if (text.charCodeAt(i) === 10) lines++;\n if (lines >= this.pasteLineThreshold) return true;\n }\n return false;\n }\n}\n\nfunction paragraphLabel(text: string): string {\n const lines = text.split('\\n').length;\n const bytes = Buffer.byteLength(text, 'utf8');\n if (bytes < 1024) return `${lines} lines, ${bytes} B`;\n return `${lines} lines, ${(bytes / 1024).toFixed(1)} KB`;\n}\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { spawn } from 'node:child_process';\nimport type { TextBlock } from '../types/blocks.js';\nimport type { Tool } from '../types/tool.js';\nimport type { SystemPromptBuilder, BuildContext, ModelCapabilities } from '../types/system-prompt.js';\nimport type { MemoryStore } from '../types/memory.js';\nimport type { SkillLoader } from '../types/skill.js';\nimport type { ModeStore } from '../types/mode.js';\n\nexport const LAYER_1_IDENTITY = `You are WrongStack, a command-line AI coding agent.\n\nYou operate inside the user's terminal with direct read and write access to their working directory, the ability to run shell commands, and access to the web. You assist a developer who knows what they're doing — your job is to accelerate them, not to second-guess them.\n\n## Core principles\n\n1. **Read before you write.** Always inspect the relevant files before proposing changes. Assumptions about code you haven't read are bugs in waiting.\n2. **Prefer surgical edits over rewrites.** When modifying existing files, use the edit tool with str_replace; only use write for new files or full replacements explicitly requested.\n3. **Show your work.** Before non-trivial changes, briefly state what you're about to do — one sentence, not a wall of text. After tool calls, summarize what happened, not what you did mechanically.\n4. **Be honest about limits.** If you don't know, say so. If something failed, say what failed and what you'll try next. Never fabricate file contents, API responses, or test results.\n5. **Be concise.** The user is a developer in a terminal. No marketing language, no \"great question!\", no bullet-point lists when prose works. If a one-liner answers, a one-liner is the answer.\n6. **Ask when blocked, proceed when not.** If the task is ambiguous in a way that meaningfully changes the approach, ask. If it's ambiguous in a way that doesn't, pick a reasonable default and proceed, stating the assumption.\n7. **Trust the tools.** If a permission prompt is shown, the user will answer. Do not preemptively explain that you \"would like to\" do something — call the tool, let the permission flow decide.\n8. **Format for scanability.** Use code blocks for code, backticks for file paths, bold for key terms. One-liners stay one line. Paragraphs max 3 sentences.\n9. **Recover explicitly.** When a tool fails, state: (1) what failed, (2) what you tried, (3) what you'll attempt next. Never silently skip.\n\n## Decision heuristics\n\n- **Task is ambiguous** (unclear which file, conflicting requirements) → ask before proceeding\n- **Task is clear, approach is unknown** → try one approach, report what happened\n- **Tool fails** → retry once with adjusted params, then report failure\n- **Permission prompt shown** → wait for user, do not act unilaterally\n- **Context window filling up** → use context_manager proactively; don't wait to be told\n\n## How you work\n\n- **Stay focused.** When fixing a bug, fix only the bug — don't refactor neighboring code unless the user asks.\n- **Comment with purpose.** Add comments only when they explain why, not what. The code already says what.\n- **Own your output.** Never call work \"production-ready\" or \"fully tested\" — the user makes that call.\n- **Move on from mistakes.** When something fails, report what happened and what you'll do next. No apologies, no hand-wringing.\n- **Stay in your lane.** Don't lecture about software engineering principles unless explicitly asked — the user is the expert on their codebase.`;\n\nexport interface DefaultSystemPromptBuilderOptions {\n memoryStore?: MemoryStore;\n skillLoader?: SkillLoader;\n modeStore?: ModeStore;\n /** Pre-resolved active mode id — shown in environment block. */\n modeId?: string;\n /** Pre-resolved mode prompt — avoids redundant modeStore.getActiveMode() call. */\n modePrompt?: string;\n /** Pre-resolved model capabilities — enables adaptive context thresholds. */\n modelCapabilities?: ModelCapabilities;\n todayIso?: string;\n}\n\nexport class DefaultSystemPromptBuilder implements SystemPromptBuilder {\n /**\n * Cached environment block, keyed by projectRoot. A single builder\n * instance is normally reused across turns of the same agent run, but\n * tests and library consumers may reuse it across runs with different\n * roots; keying the cache prevents leaking the first call's project\n * state into a later call against an unrelated project.\n */\n private envCacheByRoot = new Map<string, string>();\n private skillCache?: string;\n constructor(private readonly opts: DefaultSystemPromptBuilderOptions = {}) {}\n\n async build(ctx: BuildContext): Promise<TextBlock[]> {\n // Pre-load skill entries so we can include them in the environment block\n // (which is cached). Skills are static per-session, so this is safe.\n if (this.opts.skillLoader && !this.skillCache) {\n try {\n const entries = await this.opts.skillLoader.listEntries();\n if (entries.length > 0) {\n const lines: string[] = [];\n for (const e of entries) {\n const scopeTag = e.scope.length > 0 ? ` — ${e.scope.slice(0, 4).join(', ')}` : '';\n lines.push(`- **${e.name}**${scopeTag} (${e.trigger})`);\n }\n this.skillCache = lines.join('\\n');\n }\n } catch {\n // skip\n }\n }\n\n const layer1 = LAYER_1_IDENTITY;\n const layer2 = this.buildToolUsage(ctx.tools);\n const layer3 = await this.buildEnvironment(ctx);\n const layer4 = await this.buildMemoryAndSkills();\n const layer5 = await this.buildMode();\n\n const blocks: TextBlock[] = [\n { type: 'text', text: layer1 },\n { type: 'text', text: layer2 },\n { type: 'text', text: layer3 },\n ];\n\n if (layer4.trim()) {\n blocks.push({\n type: 'text',\n text: layer4,\n cache_control: { type: 'ephemeral' },\n });\n }\n\n if (layer5.trim()) {\n blocks.push({\n type: 'text',\n text: layer5,\n cache_control: { type: 'ephemeral' },\n });\n }\n\n return blocks;\n }\n\n private buildToolUsage(tools: Tool[]): string {\n if (tools.length === 0) return '## Tool usage\\n\\nNo tools registered.';\n const lines = ['## Tool usage'];\n for (const t of tools) {\n const hint = t.usageHint ?? t.description;\n lines.push(`\\n### ${t.name}\\n${hint.trim()}`);\n }\n\n // Common tool chain patterns — teaches model how to compose tools effectively.\n lines.push(`\n## Common patterns\n\n- **Inspect before edit:** \\`read\\`/\\`glob\\`/\\`grep\\` → locate target → \\`edit\\`\n- **Search then operate:** \\`grep\\`/\\`glob\\` → identify targets → \\`batch_tool_use\\` or iterative \\`edit\\`\n- **Verify after mutate:** \\`write\\`/\\`edit\\`/\\`patch\\` → \\`read\\` back to confirm → report outcome\n- **Explore project:** \\`glob\\` for structure → \\`read\\` key files → \\`grep\\` for patterns\n- **Batch ops:** Use \\`replace\\` with glob patterns for multi-file surgical changes\n\nWhen unsure about a file's current state, read it first rather than assuming.`);\n\n // Context management guidance — included when context_manager is present.\n // This layer teaches the model WHEN and HOW to use it proactively.\n const hasContextManager = tools.some((t) => t.name === 'context_manager');\n if (hasContextManager) {\n // Adaptive threshold based on model context window size.\n // Small context (<=32k) → trigger earlier; large context (>=128k) → more relaxed.\n const maxCtx = this.opts.modelCapabilities?.maxContextTokens ?? 128000;\n const threshold = maxCtx <= 32000 ? '50' : '70';\n lines.push(`\n## Context management\n\nWhen the conversation grows long and context window usage exceeds what you can track,\nuse the context_manager tool proactively — do NOT wait to be told:\n\n- Call \\`context_manager\\` with \\`{\"action\":\"check\"}\\` to see current token budget and message counts.\n- When the conversation exceeds ~${threshold}% of your context window, call \\`{\"action\":\"summary\"}\\` or \\`{\"action\":\"compact\"}\\` to reclaim space.\n- Use \\`{\"action\":\"prune\"}\\` to surgically remove specific irrelevant message ranges (e.g. old debug output).\n- Use \\`{\"action\":\"add_note\"}\\` to inject a summary note at a specific point after a complex operation.\n\n**Never** stuff redundant information into a tool result. If you summarize a file, do not paste its full content —\nsummarize it, and let the tool result hold only the summary.`);\n }\n\n return lines.join('\\n');\n }\n\n private async buildEnvironment(ctx: BuildContext): Promise<string> {\n const cached = this.envCacheByRoot.get(ctx.projectRoot);\n if (cached) return cached;\n const today = this.opts.todayIso ?? new Date().toISOString().slice(0, 10);\n const platform = `${os.platform()} ${os.release()}`;\n const shell = process.env.SHELL ?? process.env.ComSpec ?? 'unknown';\n const node = process.version;\n const isGit = await this.dirExists(path.join(ctx.projectRoot, '.git'));\n // Fan out the per-root probes so the prompt build doesn't serialize\n // ~12 fs.access calls plus the git status spawn back-to-back. On a\n // cold cache (CI / first turn) this trims hundreds of ms.\n const [git, langs] = await Promise.all([\n isGit ? this.gitStatus(ctx.projectRoot) : Promise.resolve('not a git repo'),\n this.detectLanguages(ctx.projectRoot),\n ]);\n\n const lines = [\n '## Environment',\n '',\n `- Working directory: ${ctx.cwd}`,\n `- Project root: ${ctx.projectRoot}`,\n `- Operating system: ${platform}`,\n `- Shell: ${shell}`,\n `- Node.js: ${node}`,\n `- Detected languages: ${langs}`,\n `- Git status: ${git}`,\n `- Today's date: ${today}`,\n ];\n if (ctx.provider || ctx.model) {\n lines.push(\n `- Running on: ${ctx.provider ?? '<unknown provider>'}/${ctx.model ?? '<unknown model>'}`,\n );\n }\n if (this.opts.modeId && this.opts.modeId !== 'default') {\n lines.push(`- Mode: ${this.opts.modeId}`);\n }\n if (this.opts.modelCapabilities) {\n lines.push(`- Context window: ${this.opts.modelCapabilities.maxContextTokens.toLocaleString()} tokens max`);\n }\n if (this.skillCache) {\n lines.push('', '## Skills in scope for this session', this.skillCache);\n }\n const text = lines.join('\\n');\n this.envCacheByRoot.set(ctx.projectRoot, text);\n return text;\n }\n\n private async buildMemoryAndSkills(): Promise<string> {\n const parts: string[] = [];\n if (this.opts.memoryStore) {\n try {\n const mem = await this.opts.memoryStore.readAll();\n if (mem.trim()) parts.push(`# Project Memory\\n\\n${mem}`);\n } catch {\n // skip\n }\n }\n // Skills are rendered in buildEnvironment (envCache) to benefit from caching.\n // Layer 4 only contains memory content.\n return parts.join('\\n\\n');\n }\n\n private async buildMode(): Promise<string> {\n // Use pre-resolved modePrompt if available (avoids redundant async call).\n if (this.opts.modePrompt) return this.opts.modePrompt;\n if (!this.opts.modeStore) return '';\n const mode = await this.opts.modeStore.getActiveMode();\n if (!mode?.prompt) return '';\n return mode.prompt;\n }\n\n private async dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n }\n\n private async gitStatus(root: string): Promise<string> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (s: string): void => {\n if (settled) return;\n settled = true;\n resolve(s);\n };\n let proc: ReturnType<typeof spawn> | undefined;\n // 2 s ceiling: a hung git status (corrupt index, .git/index.lock\n // held by another process, network FS hiccup) must not stall the\n // whole prompt build for a turn.\n const timer = setTimeout(() => {\n proc?.kill('SIGKILL');\n finish('git timeout');\n }, 2000);\n try {\n proc = spawn('git', ['status', '--porcelain=v1', '--branch'], {\n cwd: root,\n stdio: ['ignore', 'pipe', 'ignore'],\n });\n let buf = '';\n proc.stdout?.on('data', (c) => {\n buf += c.toString();\n });\n proc.on('error', () => {\n clearTimeout(timer);\n finish('git error');\n });\n proc.on('close', () => {\n clearTimeout(timer);\n const lines = buf.split('\\n').filter(Boolean);\n const branchLine = lines[0] ?? '';\n const branchMatch = branchLine.match(/## ([^\\s.]+)/);\n const branch = branchMatch?.[1] ?? 'detached';\n const dirty = lines.slice(1);\n const staged = dirty.filter((l) => /^[MARCD]/.test(l)).length;\n const modified = dirty.length - staged;\n finish(`branch=${branch}, ${modified} modified, ${staged} staged`);\n });\n } catch {\n clearTimeout(timer);\n finish('git unavailable');\n }\n });\n }\n\n private async detectLanguages(root: string): Promise<string> {\n const checks: Array<[string, string]> = [\n ['package.json', 'JavaScript/TypeScript'],\n ['tsconfig.json', 'TypeScript'],\n ['go.mod', 'Go'],\n ['Cargo.toml', 'Rust'],\n ['pyproject.toml', 'Python'],\n ['requirements.txt', 'Python'],\n ['Gemfile', 'Ruby'],\n ['pom.xml', 'Java'],\n ['build.gradle', 'Java/Kotlin'],\n ['composer.json', 'PHP'],\n ['mix.exs', 'Elixir'],\n ];\n // Fan out the marker probes. Sequential await on 11 fs.access calls\n // adds latency on cold cache for no reason — each probe is independent.\n const hits = await Promise.all(\n checks.map(async ([marker, lang]) => {\n try {\n await fs.access(path.join(root, marker));\n return lang;\n } catch {\n return null;\n }\n }),\n );\n const langs = new Set(hits.filter((l): l is string => l !== null));\n return langs.size === 0 ? 'unknown' : Array.from(langs).join(', ');\n }\n}\n","import type { Tool } from '../types/tool.js';\r\nimport { WrongStackError } from '../types/errors.js';\r\n\r\nexport class ToolRegistry {\r\n private readonly tools = new Map<string, { tool: Tool; owner: string }>();\r\n\r\n register(tool: Tool, owner = 'core'): void {\r\n if (this.tools.has(tool.name)) {\r\n throw new WrongStackError({\r\n message: `Tool \"${tool.name}\" already registered`,\r\n code: 'REGISTRY_DUPLICATE',\r\n subsystem: 'container',\r\n context: { tool: tool.name },\r\n });\r\n }\r\n this.tools.set(tool.name, { tool, owner });\r\n }\r\n\r\n /**\r\n * Attempt to register a tool. Returns true if successful, false if a tool\r\n * with the same name is already registered. Useful in multi-agent or plugin\r\n * scenarios where duplicate registration may be intentional.\r\n */\r\n tryRegister(tool: Tool, owner = 'core'): boolean {\r\n if (this.tools.has(tool.name)) return false;\r\n this.tools.set(tool.name, { tool, owner });\r\n return true;\r\n }\r\n\r\n /**\r\n * Register a tool as a default. If the tool name is already registered,\r\n * this is a no-op — the existing registration (from core or another\r\n * plugin) takes precedence. Use `override` to intentionally replace.\r\n */\r\n registerDefault(tool: Tool, owner = 'core'): void {\r\n if (this.tools.has(tool.name)) return;\r\n this.tools.set(tool.name, { tool, owner });\r\n }\r\n\r\n unregister(name: string): boolean {\r\n return this.tools.delete(name);\r\n }\r\n\r\n /**\r\n * Override an existing tool. Throws if the tool is not already registered.\r\n * Plugins use this to replace built-in tools with custom implementations.\r\n */\r\n override(name: string, tool: Tool, owner = 'core'): void {\r\n if (!this.tools.has(name)) {\r\n throw new WrongStackError({\r\n message: `Tool \"${name}\" not registered; cannot override`,\r\n code: 'REGISTRY_NOT_FOUND',\r\n subsystem: 'container',\r\n context: { tool: name },\r\n });\r\n }\r\n this.tools.set(name, { tool, owner });\r\n }\r\n\r\n get(name: string): Tool | undefined {\r\n return this.tools.get(name)?.tool;\r\n }\r\n\r\n ownerOf(name: string): string | undefined {\r\n return this.tools.get(name)?.owner;\r\n }\r\n\r\n list(): Tool[] {\r\n return Array.from(this.tools.values()).map((e) => e.tool);\r\n }\r\n\r\n listWithOwner(): { tool: Tool; owner: string }[] {\r\n return Array.from(this.tools.values());\r\n }\r\n\r\n clear(): void {\r\n this.tools.clear();\r\n }\r\n}\r\n","import type { Provider } from '../types/provider.js';\nimport type { ProviderConfig } from '../types/config.js';\nimport type { WireFamily } from '../types/models-registry.js';\n\n/**\n * Factory for constructing a Provider instance. The `family` field\n * declares the wire protocol so callers can route without inspecting\n * the returned instance. The `type` is the registry key (e.g. a\n * provider's models.dev id or a user-chosen alias).\n */\nexport interface ProviderFactory {\n /**\n * Unique identifier used as the registry key. When registered via\n * a plugin, this becomes `cfg.type` in `ProviderRegistry.create(cfg)`.\n */\n type: string;\n /**\n * Declares the wire protocol family so consumers can route based on\n * capability (e.g. which tool-format converter to use) without\n * instantiating the provider.\n */\n family: WireFamily;\n create(cfg: ProviderConfig): Provider;\n}\n\nexport class ProviderRegistry {\n private readonly factories = new Map<string, ProviderFactory>();\n\n /**\n * Register a provider factory. If a factory with the same type already\n * exists, it is replaced. Use this for both initial registration and\n * runtime overrides (e.g. from plugins or CLI flags).\n */\n register(f: ProviderFactory): void {\n this.factories.set(f.type, f);\n }\n\n /**\n * Override an existing factory. Throws if no factory is registered\n * for the given type. Use this to safely replace a provider at runtime\n * (e.g. in tests or when a plugin provides a custom implementation).\n */\n override(type: string, f: ProviderFactory): void {\n if (!this.factories.has(type)) {\n throw new Error(`Provider type \"${type}\" not registered; cannot override`);\n }\n this.factories.set(type, f);\n }\n\n has(type: string): boolean {\n return this.factories.has(type);\n }\n\n create(cfg: ProviderConfig): Provider {\n const f = this.factories.get(cfg.type);\n if (!f) {\n throw new Error(\n `Provider type \"${cfg.type}\" not registered. Available: ${Array.from(this.factories.keys()).join(', ')}`,\n );\n }\n return f.create(cfg);\n }\n\n list(): string[] {\n return Array.from(this.factories.keys());\n }\n}\n","import type { Context } from '../core/context.js';\r\nimport type { SlashCommand } from '../types/slash-command.js';\r\n\r\n/**\r\n * A slash command registered with the CLI or available to plugins.\r\n * Plugins receive a view of the registry via PluginAPI.slashCommands.\r\n *\r\n * Commands registered by plugins use a namespaced name: `pluginName:commandName`.\r\n * This prevents collisions with built-in commands and other plugins.\r\n */\r\nexport type { SlashCommand };\r\n\r\nexport class SlashCommandRegistry {\r\n private readonly cmds = new Map<string, { cmd: SlashCommand; owner: string }>();\r\n\r\n /**\r\n * Register a command. For plugins the `owner` is the plugin name and the\r\n * registry auto-prefixes the command name as `owner:name` to prevent\r\n * collisions with built-in commands and other plugins.\r\n */\r\n register(cmd: SlashCommand, owner = 'core'): void {\r\n const isPlugin = owner !== 'core';\r\n const fullName = isPlugin ? `${owner}:${cmd.name}` : cmd.name;\r\n\r\n // Cross-owner collision on the bare name: even though plugin commands\r\n // get namespaced (`plugin:x`) and don't share a key with a builtin\r\n // `x`, allowing both to coexist would confuse users (they type `/x`\r\n // expecting one and get the other). Throw so the conflict surfaces\r\n // at registration time rather than as a silent shadowing bug.\r\n for (const entry of this.cmds.values()) {\r\n if (entry.cmd.name === cmd.name && entry.owner !== owner) {\r\n throw new Error(\r\n `Slash command \"${cmd.name}\" already registered by ${entry.owner}`,\r\n );\r\n }\r\n }\r\n\r\n if (this.cmds.has(fullName)) {\r\n // Same owner re-registering: plugins legitimately do this for hot\r\n // reload / dev iteration. Built-ins are added once at startup, so\r\n // a second core register signals a programming bug — throw loudly.\r\n if (!isPlugin) {\r\n throw new Error(`Built-in slash command \"${fullName}\" is already registered.`);\r\n }\r\n this.cmds.set(fullName, { cmd, owner });\r\n for (const a of cmd.aliases ?? []) {\r\n this.cmds.set(`${owner}:${a}`, { cmd, owner });\r\n }\r\n return;\r\n }\r\n\r\n this.cmds.set(fullName, { cmd, owner });\r\n for (const a of cmd.aliases ?? []) {\r\n this.cmds.set(isPlugin ? `${owner}:${a}` : a, { cmd, owner });\r\n }\r\n }\r\n\r\n unregister(name: string): boolean {\r\n const entry = this.cmds.get(name);\r\n if (!entry) return false;\r\n for (const a of entry.cmd.aliases ?? []) {\r\n const fullAlias = entry.owner !== 'core' ? `${entry.owner}:${a}` : a;\r\n this.cmds.delete(fullAlias);\r\n }\r\n return this.cmds.delete(name);\r\n }\r\n\r\n get(name: string): SlashCommand | undefined {\r\n return this.cmds.get(name)?.cmd;\r\n }\r\n\r\n ownerOf(name: string): string | undefined {\r\n return this.cmds.get(name)?.owner;\r\n }\r\n\r\n list(): SlashCommand[] {\r\n const seen = new Set<SlashCommand>();\r\n const out: SlashCommand[] = [];\r\n for (const { cmd } of this.cmds.values()) {\r\n if (!seen.has(cmd)) {\r\n seen.add(cmd);\r\n out.push(cmd);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n listWithOwner(): Array<{ cmd: SlashCommand; owner: string; fullName: string }> {\r\n const seen = new Set<SlashCommand>();\r\n const out: Array<{ cmd: SlashCommand; owner: string; fullName: string }> = [];\r\n for (const [fullName, { cmd, owner }] of this.cmds.entries()) {\r\n if (!seen.has(cmd)) {\r\n seen.add(cmd);\r\n out.push({ cmd, owner, fullName });\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * Parse a slash command line. Accepts both:\r\n * `/cmd args` → builtin command (owner=core)\r\n * `/pluginName:cmd args` → plugin command\r\n * The command name is split at the first `:` if the prefix matches a known owner.\r\n */\r\n async dispatch(line: string, ctx: Context): Promise<{ exit?: boolean; message?: string } | null> {\r\n if (!line.startsWith('/')) return null;\r\n const trimmed = line.slice(1);\r\n const spaceIdx = trimmed.indexOf(' ');\r\n const firstColonIdx = trimmed.indexOf(':');\r\n\r\n let name: string;\r\n let args: string;\r\n\r\n if (firstColonIdx !== -1 && (spaceIdx === -1 || firstColonIdx < spaceIdx)) {\r\n // `/owner:cmd` or `/owner:cmd args` — plugin namespaced\r\n const prefix = trimmed.slice(0, firstColonIdx);\r\n name = trimmed.slice(0, spaceIdx === -1 ? undefined : spaceIdx);\r\n args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1);\r\n // Verify the prefix is a known owner\r\n const entry = this.cmds.get(name);\r\n if (!entry || entry.owner !== prefix) {\r\n // Not a namespaced plugin command — treat the whole thing as a builtin command name\r\n name = trimmed.slice(0, spaceIdx === -1 ? undefined : spaceIdx);\r\n args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1);\r\n }\r\n } else {\r\n name = trimmed.slice(0, spaceIdx === -1 ? undefined : spaceIdx);\r\n args = spaceIdx === -1 ? '' : trimmed.slice(spaceIdx + 1);\r\n }\r\n\r\n const entry = this.cmds.get(name);\r\n if (!entry) {\r\n return { message: `Unknown command \"/${name}\". Type /help for a list.` };\r\n }\r\n const res = await entry.cmd.run(args, ctx);\r\n return res ?? {};\r\n }\r\n}\r\n","import type { Container } from '../kernel/container.js';\nimport type { EventBus, EventName, Listener } from '../kernel/events.js';\nimport type { Pipeline } from '../kernel/pipeline.js';\nimport type { Tool } from '../types/tool.js';\nimport type { Config } from '../types/config.js';\nimport type { Logger } from '../types/logger.js';\nimport type {\n PluginAPI,\n PluginPipelines,\n ToolRegistryView,\n ProviderRegistryView,\n MCPRegistryView,\n SlashCommandRegistryView,\n ProviderFactory,\n} from '../types/plugin.js';\nimport type { ToolRegistry } from '../registry/tool-registry.js';\nimport type { ProviderRegistry } from '../registry/provider-registry.js';\nimport type { SlashCommandRegistry } from '../registry/slash-command-registry.js';\n\nexport interface PluginAPIInit {\n ownerName: string;\n container: Container;\n events: EventBus;\n /**\n * The agent's concrete pipelines. `DefaultPluginAPI` converts each to a\n * `ReadonlyPipeline` before exposing them to the plugin — plugins can\n * inspect and invoke pipelines but cannot mutate them.\n */\n pipelines: PluginPipelines;\n toolRegistry: ToolRegistry;\n providerRegistry: ProviderRegistry;\n slashCommandRegistry?: SlashCommandRegistry;\n mcpRegistry?: MCPRegistryView;\n config: Config;\n log: Logger;\n}\n\nexport class DefaultPluginAPI implements PluginAPI {\n readonly container: Container;\n readonly events: EventBus;\n readonly pipelines: PluginPipelines;\n readonly tools: ToolRegistryView;\n readonly providers: ProviderRegistryView;\n readonly mcp: MCPRegistryView;\n readonly slashCommands: SlashCommandRegistryView;\n readonly config: Config;\n readonly log: Logger;\n private readonly pluginCleanupFns: Array<() => void> = [];\n\n constructor(init: PluginAPIInit) {\n const owner = init.ownerName;\n this.container = init.container;\n this.events = init.events;\n this.config = init.config;\n this.log = init.log.child({ plugin: owner });\n\n // Convert concrete pipelines to read-only views before passing to plugins.\n const pipelines = init.pipelines as unknown as Record<string, Pipeline<unknown>>;\n const readonlyPipelines: PluginPipelines = {} as PluginPipelines;\n for (const [key, pipeline] of Object.entries(pipelines)) {\n readonlyPipelines[key] = pipeline.asReadonly() as PluginPipelines[typeof key];\n }\n this.pipelines = readonlyPipelines;\n\n const tr = init.toolRegistry;\n this.tools = {\n register: (t: Tool) => tr.register(t, owner),\n unregister: (name: string) => tr.unregister(name),\n get: (name: string) => tr.get(name),\n list: () => tr.list(),\n };\n\n const pr = init.providerRegistry;\n this.providers = {\n register: (f: ProviderFactory) => pr.register(f),\n create: (cfg) => pr.create(cfg as { type: string }),\n list: () => pr.list(),\n };\n\n this.mcp = init.mcpRegistry ?? noopMcp;\n\n const scr = init.slashCommandRegistry;\n this.slashCommands = scr\n ? {\n register: (cmd) => scr.register(cmd, owner),\n unregister: (name) => scr.unregister(name),\n get: (name) => scr.get(name),\n list: () => scr.list(),\n }\n : noopSlashCommands;\n }\n\n onEvent<K extends EventName>(event: K, handler: Listener<K>): () => void {\n const off = this.events.once(event, handler);\n this.pluginCleanupFns.push(off);\n return off;\n }\n\n /** Called by the plugin loader when uninstalling the plugin. */\n drainCleanup(): void {\n for (const fn of this.pluginCleanupFns.splice(0)) {\n try { fn(); } catch { /* best-effort */ }\n }\n }\n}\n\nconst noopMcp: MCPRegistryView = {\n start: async () => undefined,\n stop: async () => undefined,\n restart: async () => undefined,\n list: () => [],\n};\n\nconst noopSlashCommands: SlashCommandRegistryView = {\n register() { /* noop */ },\n unregister() { return false; },\n get() { return undefined; },\n list() { return []; },\n};\n","import type { Plugin, PluginAPI, PluginDependency } from '../types/plugin.js';\r\nimport type { Logger } from '../types/logger.js';\r\nimport { PluginError } from '../types/errors.js';\r\nimport { validateAgainstSchema } from '../utils/json-schema-validate.js';\r\n\r\n/**\r\n * Stable plugin API contract version. This is intentionally independent of\r\n * the package version: bump only when the surface visible to plugins\r\n * (PluginAPI, types/plugin) changes in a way that breaks existing setup\r\n * functions. Plugins declare `apiVersion: \"^1.0\"` to opt into this contract.\r\n */\r\nexport const KERNEL_API_VERSION = '0.1.1';\r\n\r\nexport interface LoadPluginsOptions {\r\n apiFactory: (plugin: Plugin) => PluginAPI;\r\n log: Logger;\r\n kernelApiVersion?: string;\r\n /**\r\n * Per-plugin options keyed by plugin name. When a plugin declares\r\n * `configSchema`, the loader validates `pluginOptions[plugin.name]`\r\n * against it before calling `setup`. Pass `Config.plugins` shaped\r\n * `{ [name]: { options } }` or any flat record.\r\n */\r\n pluginOptions?: Record<string, unknown>;\r\n}\r\n\r\nfunction parseSemver(v: string): [number, number, number] {\r\n const parts = v.replace(/^[^0-9]*/, '').split('.').map((s) => Number.parseInt(s, 10) || 0);\r\n return [parts[0] ?? 0, parts[1] ?? 0, parts[2] ?? 0];\r\n}\r\n\r\nfunction satisfies(range: string, version: string): boolean {\r\n const [vMaj, vMin, vPatch] = parseSemver(version);\r\n const trimmed = range.trim();\r\n const op = trimmed.startsWith('^') ? '^' : trimmed.startsWith('~') ? '~' : '=';\r\n const ver = trimmed.replace(/^[\\^~=]/, '');\r\n const [rMaj, rMin, rPatch] = parseSemver(ver);\r\n if (op === '^') {\r\n if (rMaj === 0) return vMaj === 0 && vMin === rMin && vPatch >= rPatch;\r\n return vMaj === rMaj && (vMin > rMin || (vMin === rMin && vPatch >= rPatch));\r\n }\r\n if (op === '~') {\r\n return vMaj === rMaj && vMin === rMin && vPatch >= rPatch;\r\n }\r\n return vMaj === rMaj && vMin === rMin && vPatch === rPatch;\r\n}\r\n\r\n/** Normalize either `string` or `PluginDependency` into the structured form. */\r\nfunction normalizeDep(d: string | PluginDependency): PluginDependency {\r\n return typeof d === 'string' ? { name: d } : d;\r\n}\r\n\r\nfunction topoSort(plugins: Plugin[]): Plugin[] {\r\n const map = new Map<string, Plugin>();\r\n for (const p of plugins) map.set(p.name, p);\r\n const visited = new Set<string>();\r\n const visiting = new Set<string>();\r\n const order: Plugin[] = [];\r\n\r\n const visit = (p: Plugin, stack: string[]) => {\r\n if (visited.has(p.name)) return;\r\n if (visiting.has(p.name)) {\r\n throw new PluginError({\r\n message: `Plugin dependency cycle: ${[...stack, p.name].join(' -> ')}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n });\r\n }\r\n visiting.add(p.name);\r\n for (const raw of p.dependsOn ?? []) {\r\n const dep = normalizeDep(raw);\r\n const d = map.get(dep.name);\r\n if (!d) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" depends on missing plugin \"${dep.name}\"`,\r\n code: 'PLUGIN_MISSING_DEPENDENCY',\r\n pluginName: p.name,\r\n context: { dependency: dep.name },\r\n });\r\n }\r\n // Version constraint check — only when both declared range and the\r\n // dependency's actual version are available. Missing either side is\r\n // tolerated: plugins without `version` are treated as wildcard.\r\n if (dep.version && d.version && !satisfies(dep.version, d.version)) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" requires \"${dep.name}@${dep.version}\", found ${d.version}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n context: { dependency: dep.name, required: dep.version, found: d.version },\r\n });\r\n }\r\n visit(d, [...stack, p.name]);\r\n }\r\n // Optional deps are silently skipped if the plugin is not loaded.\r\n for (const raw of p.optionalDeps ?? []) {\r\n const dep = normalizeDep(raw);\r\n const d = map.get(dep.name);\r\n if (d) {\r\n if (dep.version && d.version && !satisfies(dep.version, d.version)) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" optional dep \"${dep.name}@${dep.version}\" found ${d.version}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n context: { dependency: dep.name, required: dep.version, found: d.version },\r\n });\r\n }\r\n visit(d, [...stack, p.name]);\r\n }\r\n }\r\n visiting.delete(p.name);\r\n visited.add(p.name);\r\n order.push(p);\r\n };\r\n\r\n for (const p of plugins) visit(p, []);\r\n return order;\r\n}\r\n\r\nexport async function loadPlugins(\r\n plugins: Plugin[],\r\n opts: LoadPluginsOptions,\r\n): Promise<{ loaded: Plugin[]; failed: { plugin: Plugin; err: unknown }[] }> {\r\n const kernelVersion = opts.kernelApiVersion ?? KERNEL_API_VERSION;\r\n const loaded: Plugin[] = [];\r\n const failed: { plugin: Plugin; err: unknown }[] = [];\r\n\r\n // Conflict check\r\n const names = new Set(plugins.map((p) => p.name));\r\n for (const p of plugins) {\r\n for (const c of p.conflictsWith ?? []) {\r\n if (names.has(c)) {\r\n throw new PluginError({\r\n message: `Plugin \"${p.name}\" conflicts with loaded plugin \"${c}\"`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: p.name,\r\n context: { conflictsWith: c },\r\n });\r\n }\r\n }\r\n }\r\n\r\n let sorted: Plugin[];\r\n try {\r\n sorted = topoSort(plugins);\r\n } catch (err) {\r\n opts.log.error('Plugin sort failed', err);\r\n throw err;\r\n }\r\n\r\n for (const plugin of sorted) {\r\n if (!satisfies(plugin.apiVersion, kernelVersion)) {\r\n const err = new PluginError({\r\n message: `Plugin \"${plugin.name}\" requires apiVersion ${plugin.apiVersion}; kernel is ${kernelVersion}`,\r\n code: 'PLUGIN_API_MISMATCH',\r\n pluginName: plugin.name,\r\n context: { required: plugin.apiVersion, kernel: kernelVersion },\r\n });\r\n opts.log.error(err.message);\r\n failed.push({ plugin, err });\r\n continue;\r\n }\r\n // configSchema validation — runs before setup() so a bad config never\r\n // reaches plugin code. The plugin's options are looked up by plugin name\r\n // in the host-supplied options bag.\r\n if (plugin.configSchema && opts.pluginOptions) {\r\n const pluginOpts = opts.pluginOptions[plugin.name];\r\n if (pluginOpts !== undefined) {\r\n const result = validateAgainstSchema(pluginOpts, plugin.configSchema);\r\n if (!result.ok) {\r\n const firstErr = result.errors[0];\r\n const detail = firstErr\r\n ? `${firstErr.path}: ${firstErr.message}`\r\n : 'config invalid';\r\n const err = new PluginError({\r\n message: `Plugin \"${plugin.name}\" config invalid — ${detail}`,\r\n code: 'PLUGIN_LOAD_FAILED',\r\n pluginName: plugin.name,\r\n context: { errors: result.errors },\r\n });\r\n opts.log.error(err.message);\r\n failed.push({ plugin, err });\r\n continue;\r\n }\r\n }\r\n }\r\n try {\r\n const rawApi = opts.apiFactory(plugin);\r\n const api = plugin.capabilities ? wrapApiForCapabilityCheck(plugin, rawApi, opts.log) : rawApi;\r\n await plugin.setup(api);\r\n loaded.push(plugin);\r\n opts.log.info(`Plugin \"${plugin.name}\" loaded`);\r\n } catch (err) {\r\n opts.log.error(`Plugin \"${plugin.name}\" setup failed`, err);\r\n failed.push({ plugin, err });\r\n }\r\n }\r\n return { loaded, failed };\r\n}\r\n\r\n/**\r\n * Tear down loaded plugins in reverse-dependency order. `teardown()` is\r\n * best-effort: errors are caught and logged so a single misbehaving plugin\r\n * can't abort the host shutdown sequence.\r\n *\r\n * Pass the result of a prior `loadPlugins(...)` call's `loaded` array, plus\r\n * the original `LoadPluginsOptions` so the same `apiFactory` (and the same\r\n * PluginAPI surface the plugin saw during `setup`) is used for `teardown`.\r\n */\r\nexport async function unloadPlugins(\r\n loadedPlugins: Plugin[],\r\n opts: LoadPluginsOptions,\r\n): Promise<void> {\r\n // Reverse order — last loaded is first torn down, mirroring stack-style\r\n // resource ownership when plugin B depends on plugin A.\r\n const ordered = [...loadedPlugins].reverse();\r\n for (const plugin of ordered) {\r\n if (typeof plugin.teardown !== 'function') continue;\r\n try {\r\n const api = opts.apiFactory(plugin);\r\n await plugin.teardown(api);\r\n opts.log.info(`Plugin \"${plugin.name}\" torn down`);\r\n } catch (err) {\r\n opts.log.error(`Plugin \"${plugin.name}\" teardown failed`, err);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Wrap the PluginAPI so calls that contradict the plugin's declared\r\n * capabilities are logged. Doesn't block the call — plugin keeps working;\r\n * we just surface the lie so the host can flag it (or escalate to a hard\r\n * fail in a dev build via env var).\r\n */\r\nfunction wrapApiForCapabilityCheck(plugin: Plugin, api: PluginAPI, log: { error(msg: string, ctx?: unknown): void; warn?(msg: string, ctx?: unknown): void; info?(msg: string, ctx?: unknown): void }): PluginAPI {\r\n const caps = plugin.capabilities ?? {};\r\n const warn = (subsystem: string, detail: string) => {\r\n const msg = `Plugin \"${plugin.name}\" used ${subsystem} without declaring capabilities.${subsystem} — ${detail}`;\r\n if (typeof log.warn === 'function') log.warn(msg);\r\n else log.error(msg);\r\n };\r\n\r\n // Wrap tools.register\r\n const wrappedTools = caps.tools !== false ? api.tools : new Proxy(api.tools, {\r\n get(target, prop, receiver) {\r\n if (prop === 'register') {\r\n return (t: unknown) => {\r\n warn('tools', `register(${(t as { name?: string })?.name ?? '<unknown>'})`);\r\n return (target.register as (x: unknown) => unknown)(t);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n // Wrap providers.register\r\n const wrappedProviders = caps.providers !== false ? api.providers : new Proxy(api.providers, {\r\n get(target, prop, receiver) {\r\n if (prop === 'register') {\r\n return (f: unknown) => {\r\n warn('providers', `register(${(f as { type?: string })?.type ?? '<unknown>'})`);\r\n return (target.register as (x: unknown) => unknown)(f);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n // Wrap slashCommands.register\r\n const wrappedSlash = caps.slashCommands !== false ? api.slashCommands : new Proxy(api.slashCommands, {\r\n get(target, prop, receiver) {\r\n if (prop === 'register') {\r\n return (c: unknown) => {\r\n warn('slashCommands', `register(${(c as { name?: string })?.name ?? '<unknown>'})`);\r\n return (target.register as (x: unknown) => unknown)(c);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n // Wrap mcp.start\r\n const wrappedMcp = caps.mcp !== false ? api.mcp : new Proxy(api.mcp, {\r\n get(target, prop, receiver) {\r\n if (prop === 'start') {\r\n return (cfg: unknown) => {\r\n warn('mcp', `start(${(cfg as { name?: string })?.name ?? '<unknown>'})`);\r\n return (target.start as (x: unknown) => unknown)(cfg);\r\n };\r\n }\r\n return Reflect.get(target, prop, receiver);\r\n },\r\n });\r\n\r\n return new Proxy(api, {\r\n get(target, prop, receiver) {\r\n switch (prop) {\r\n case 'tools': return wrappedTools;\r\n case 'providers': return wrappedProviders;\r\n case 'slashCommands': return wrappedSlash;\r\n case 'mcp': return wrappedMcp;\r\n default: return Reflect.get(target, prop, receiver);\r\n }\r\n },\r\n });\r\n}\r\n"]}
|