@wrongstack/core 0.41.0 → 0.51.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{agent-bridge-D_XcS2HL.d.ts → agent-bridge-CjbD-i7-.d.ts} +1 -1
- package/dist/{agent-subagent-runner-C66vi4Gq.d.ts → agent-subagent-runner-DfvlBx5N.d.ts} +3 -3
- package/dist/coordination/index.d.ts +8 -8
- package/dist/coordination/index.js +234 -32
- package/dist/coordination/index.js.map +1 -1
- package/dist/defaults/index.d.ts +11 -11
- package/dist/defaults/index.js +151 -59
- package/dist/defaults/index.js.map +1 -1
- package/dist/{events-BrQiweXN.d.ts → events-Bt44ikPN.d.ts} +135 -1
- package/dist/execution/index.d.ts +34 -8
- package/dist/execution/index.js +61 -28
- package/dist/execution/index.js.map +1 -1
- package/dist/extension/index.d.ts +2 -2
- package/dist/{index-DkVgH3wC.d.ts → index-OzA1XjHL.d.ts} +4 -2
- package/dist/{index-6_csX32J.d.ts → index-mAWBdLyJ.d.ts} +1 -1
- package/dist/index.d.ts +96 -20
- package/dist/index.js +532 -132
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/index.d.ts +2 -2
- package/dist/kernel/index.d.ts +3 -3
- package/dist/kernel/index.js +3 -1
- package/dist/kernel/index.js.map +1 -1
- package/dist/models/index.js +5 -2
- package/dist/models/index.js.map +1 -1
- package/dist/{multi-agent-C8Z1i__e.d.ts → multi-agent-Ba9Ni2hC.d.ts} +1 -1
- package/dist/{multi-agent-coordinator-BUsjiRWl.d.ts → multi-agent-coordinator-BuKq0q89.d.ts} +2 -2
- package/dist/{null-fleet-bus-FvgHnZah.d.ts → null-fleet-bus-C0xd73YP.d.ts} +21 -9
- package/dist/observability/index.d.ts +1 -1
- package/dist/{path-resolver-DumKAi0n.d.ts → path-resolver-nkmdiFgi.d.ts} +1 -1
- package/dist/{plan-templates-DYCeRCDN.d.ts → plan-templates-BmDdJ7UL.d.ts} +1 -1
- package/dist/{provider-runner-Dlv8Fvw9.d.ts → provider-runner-BGro2qQB.d.ts} +1 -1
- package/dist/sdd/index.d.ts +4 -4
- package/dist/storage/index.d.ts +2 -2
- package/dist/{tool-executor-BpK-SWtJ.d.ts → tool-executor-p4tP9tGF.d.ts} +1 -1
- package/dist/types/index.d.ts +7 -7
- package/dist/types/index.js +5 -2
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export { D as DefaultLogger, a as DefaultLoggerOptions } from '../logger-bOzkF5LL.js';
|
|
2
|
-
export { D as DefaultPathResolver, a as DefaultTokenCounter } from '../path-resolver-
|
|
2
|
+
export { D as DefaultPathResolver, a as DefaultTokenCounter } from '../path-resolver-nkmdiFgi.js';
|
|
3
3
|
export { C as ContextManagerAction, a as ContextManagerInput, b as ContextManagerResult, c as ContextManagerToolOptions, d as allServers, e as awsServer, f as blockServer, g as braveSearchServer, h as context7Server, i as contextManagerTool, j as createContextManagerTool, k as everArtServer, l as filesystemServer, m as githubServer, n as googleMapsServer, o as miniMaxVisionServer, s as sentinelServer, p as slackServer, z as zaiVisionServer } from '../mcp-servers-DONdo-XM.js';
|
|
4
4
|
import '../logger-DDd5C--Z.js';
|
|
5
|
-
import '../events-
|
|
5
|
+
import '../events-Bt44ikPN.js';
|
|
6
6
|
import '../context-7u93AcGD.js';
|
|
7
7
|
import '../models-registry-BcYJDKLm.js';
|
|
8
8
|
import '../path-resolver-CPRj4bFY.js';
|
package/dist/kernel/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { B as BindOptions, C as Container, D as Decorator, F as Factory, M as Middleware, b as MiddlewareHandler, N as NextFn, P as Pipeline, d as PipelineOptions, T as Token } from '../system-prompt-CM6zOhd2.js';
|
|
2
|
-
export { E as EventBus,
|
|
3
|
-
export { R as RunController, b as RunControllerOptions, T as TOKENS } from '../index-
|
|
2
|
+
export { E as EventBus, i as EventLogger, j as EventMap, k as EventName, L as Listener, S as ScopedEventBus } from '../events-Bt44ikPN.js';
|
|
3
|
+
export { R as RunController, b as RunControllerOptions, T as TOKENS } from '../index-OzA1XjHL.js';
|
|
4
4
|
import '../context-7u93AcGD.js';
|
|
5
5
|
import '../compactor-D1RHFRmF.js';
|
|
6
6
|
import '../config-ZRCf7sTu.js';
|
|
@@ -12,7 +12,7 @@ import '../memory-CEXuo7sz.js';
|
|
|
12
12
|
import '../mode-CV077NjV.js';
|
|
13
13
|
import '../path-resolver-CPRj4bFY.js';
|
|
14
14
|
import '../permission-B6sldrSp.js';
|
|
15
|
-
import '../provider-runner-
|
|
15
|
+
import '../provider-runner-BGro2qQB.js';
|
|
16
16
|
import '../observability-BhnVLBLS.js';
|
|
17
17
|
import '../secret-scrubber-3MHDDAtm.js';
|
|
18
18
|
import '../skill-CxuWrsKK.js';
|
package/dist/kernel/index.js
CHANGED
|
@@ -610,7 +610,9 @@ var TOKENS = {
|
|
|
610
610
|
/** Replaces the entire provider call layer — retry, streaming, tracing. */
|
|
611
611
|
ProviderRunner: t("ProviderRunner"),
|
|
612
612
|
/** Optional git-worktree lifecycle manager (per-phase isolation in AutoPhase). */
|
|
613
|
-
WorktreeManager: t("WorktreeManager")
|
|
613
|
+
WorktreeManager: t("WorktreeManager"),
|
|
614
|
+
/** Optional global Brain arbiter for policy/decision escalation. */
|
|
615
|
+
BrainArbiter: t("BrainArbiter")
|
|
614
616
|
};
|
|
615
617
|
|
|
616
618
|
// src/kernel/run-controller.ts
|
package/dist/kernel/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"],"names":["t"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n","import { WrongStackError, ERROR_CODES } from '../types/errors.js';\n\n/**\n * Container — dependency injection with explicit bind / override / decorate.\n *\n * Invariants:\n * bind() — throws if token already bound\n * override() — throws if nothing to replace\n * decorate() — stacks; cached value cleared on register\n */\n\nexport type Token<T> = symbol & { readonly __type?: T };\nexport type Factory<T> = (c: Container) => T;\nexport type Decorator<T> = (inner: T, c: Container) => T;\n\ninterface Entry<T = unknown> {\n factory: Factory<T>;\n singleton: boolean;\n decorators: Decorator<T>[];\n cache?: T;\n owner: string;\n}\n\nexport interface BindOptions {\n singleton?: boolean;\n owner?: string;\n}\n\nexport class Container {\n private readonly entries = new Map<symbol, Entry>();\n /**\n * Tokens currently mid-resolve. Tracked so we can detect circular\n * dependencies (A → B → A) and throw a structured error instead of\n * overflowing the call stack with \"Maximum call stack size exceeded\".\n *\n * Not a memoization cache — the per-entry `cache` field is the source\n * of truth for \"have I built this before?\". This set only lives for\n * the duration of a single resolve call.\n */\n private readonly resolving = new Set<symbol>();\n\n bind<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n if (this.entries.has(token)) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" already bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_ALREADY_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? true,\n decorators: [],\n owner: opts.owner ?? 'core',\n });\n }\n\n override<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot override \"${token.description ?? 'unknown'}\" — not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? existing.singleton,\n decorators: existing.decorators,\n owner: opts.owner ?? existing.owner,\n });\n }\n\n decorate<T>(token: Token<T>, decorator: Decorator<T>, owner = 'core'): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot decorate \"${token.description ?? 'unknown'}\" — not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n existing.decorators.push(decorator as Decorator<unknown>);\n existing.cache = undefined;\n existing.owner = `${existing.owner}+${owner}`;\n }\n\n resolve<T>(token: Token<T>): T {\n const entry = this.entries.get(token);\n if (!entry) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n if (entry.singleton && entry.cache !== undefined) {\n return entry.cache as T;\n }\n if (this.resolving.has(token)) {\n const cycle = this.describeCycle(token);\n throw new WrongStackError({\n message: `Container: circular dependency detected — ${cycle}`,\n code: ERROR_CODES.CONTAINER_CIRCULAR_DEPENDENCY,\n subsystem: 'container',\n context: { token: token.description, cycle },\n });\n }\n this.resolving.add(token);\n try {\n let value: unknown = entry.factory(this);\n for (const d of entry.decorators) {\n value = d(value, this);\n }\n if (entry.singleton) {\n entry.cache = value;\n }\n return value as T;\n } finally {\n this.resolving.delete(token);\n }\n }\n\n /**\n * Build a human-readable description of the dependency cycle that\n * caused the resolution to re-enter. Lists the tokens in the order\n * they were entered, then appends the re-entered token to close the\n * loop. Falls back to a generic message if the resolving set is\n * somehow empty (shouldn't happen, but defensive).\n */\n private describeCycle(reentry: symbol): string {\n const descs: string[] = [];\n for (const t of this.resolving) {\n descs.push(t.description ?? 'unknown');\n }\n descs.push(reentry.description ?? 'unknown');\n return descs.join(' → ');\n }\n\n has<T>(token: Token<T>): boolean {\n return this.entries.has(token);\n }\n\n ownerOf<T>(token: Token<T>): string | undefined {\n return this.entries.get(token)?.owner;\n }\n\n /**\n * Remove a token's binding (along with any decorators stacked on it).\n * Returns true if the token existed. Use this to withdraw temporary\n * bindings installed by a short-lived run or plugin — without it, the\n * entry persists in the map forever.\n */\n unbind<T>(token: Token<T>): boolean {\n return this.entries.delete(token);\n }\n\n /**\n * Drop every binding. Intended for tests and short-lived CLI invocations\n * that rebuild the container from scratch. Production code should prefer\n * `unbind` on the specific tokens it owns.\n */\n clear(): void {\n this.entries.clear();\n }\n\n list(): Array<{ token: symbol; owner: string }> {\n return Array.from(this.entries.entries()).map(([token, entry]) => ({\n token,\n owner: entry.owner,\n }));\n }\n\n /**\n * Inspect a binding's full shape, including decorator count and whether\n * a singleton value is cached. Returns null if the token is unbound.\n * Decorator and factory function references are not exposed — only counts\n * and metadata, to keep internal state hidden.\n */\n inspect<T>(token: Token<T>): {\n owner: string;\n singleton: boolean;\n decoratorCount: number;\n cached: boolean;\n } | null {\n const entry = this.entries.get(token);\n if (!entry) return null;\n return {\n owner: entry.owner,\n singleton: entry.singleton,\n decoratorCount: entry.decorators.length,\n cached: entry.cache !== undefined,\n };\n }\n}\n","/**\n * Pipeline — Koa-style middleware chain with named middleware\n * and position-aware insertion. Generic over input type T.\n */\n\nexport type NextFn<T> = (value: T) => Promise<T>;\nexport type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;\n\n/**\n * Called when a middleware crashes (throws or rejects). Used by the\n * Pipeline's error boundary to log the offender without aborting the run.\n *\n * Return `'rethrow'` to propagate the error (default for core middleware),\n * or `'swallow'` to skip past the crashing middleware and continue with the\n * value the previous one produced. Plugin middleware should usually be\n * swallowed so one bad plugin can't kill an agent run.\n */\nexport type PipelineErrorPolicy = 'rethrow' | 'swallow';\n\nexport interface PipelineErrorEvent {\n middleware: string;\n owner?: string;\n err: unknown;\n}\n\nexport type PipelineErrorHandler = (\n ev: PipelineErrorEvent,\n) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;\n\nexport interface Middleware<T> {\n name: string;\n handler: MiddlewareHandler<T>;\n owner?: string;\n}\n\nexport interface PipelineOptions {\n /** When true and the target middleware is not found, operations silently no-op instead of throwing. */\n optional?: boolean;\n}\n\n/**\n * Read-only view of a pipeline. Returned to consumers (plugins, hooks)\n * so they can inspect but not mutate the chain.\n */\nexport interface ReadonlyPipeline<T> {\n readonly size: number;\n list(): readonly string[];\n run(input: T): Promise<T>;\n}\n\nexport class Pipeline<T> {\n private readonly chain: Middleware<T>[] = [];\n private errorHandler?: PipelineErrorHandler;\n\n /**\n * Install an error boundary. When a middleware throws or rejects, the\n * handler is called and decides whether to swallow (continue with the\n * pre-handler value) or rethrow. Without a handler, errors propagate.\n *\n * Wire one per pipeline at boot — the host CLI typically installs a\n * single boundary that logs to the operational log and emits a\n * `pipeline.error` event for /diag.\n */\n setErrorHandler(handler: PipelineErrorHandler | undefined): this {\n this.errorHandler = handler;\n return this;\n }\n\n use(mw: Middleware<T> | Middleware<unknown>): this {\n this.ensureUnique(mw.name);\n this.chain.push(mw as Middleware<T>);\n return this;\n }\n\n prepend(mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n this.chain.unshift(mw);\n return this;\n }\n\n /**\n * Insert middleware at an explicit index. Out-of-range indices are clamped.\n * Use this when insertBefore/insertAfter are insufficient (e.g. to place\n * a middleware at a known position regardless of named targets).\n */\n insertAt(index: number, mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n const idx = Math.max(0, Math.min(index, this.chain.length));\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately before the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * before the target's current position — so after insertBefore('B', X)\n * then insertBefore('B', Y), the order is Y → X → B.\n */\n insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately after the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * after the target's current position — so after insertAfter('B', X)\n * then insertAfter('B', Y), the order is B → X → Y.\n */\n insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx + 1, 0, mw);\n return this;\n }\n\n replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n if (mw.name !== target) this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain[idx] = mw;\n return this;\n }\n\n remove(name: string, opts?: PipelineOptions): this {\n const idx = this.indexOf(name, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 1);\n return this;\n }\n\n list(): readonly string[] {\n return this.chain.map((m) => m.name);\n }\n\n size(): number {\n return this.chain.length;\n }\n\n /** Return a read-only view suitable for passing to plugins. */\n asReadonly(): ReadonlyPipeline<T> {\n // The returned object's methods close over `this`, so it always sees the live chain.\n // `list()` returns a frozen snapshot to prevent external mutation of the chain.\n const self = this;\n return Object.freeze({\n get size() {\n return self.size();\n },\n list() {\n return Object.freeze(self.list());\n },\n run(input: T) {\n return self.run(input);\n },\n });\n }\n\n async run(input: T): Promise<T> {\n let index = -1;\n const chain = this.chain;\n const errorHandler = this.errorHandler;\n\n const dispatch = async (i: number, value: T): Promise<T> => {\n if (i <= index) {\n throw new Error(`Pipeline: next() called multiple times in \"${chain[index]?.name}\"`);\n }\n index = i;\n const mw = chain[i];\n if (!mw) return value;\n try {\n return await mw.handler(value, (v) => dispatch(i + 1, v));\n } catch (err) {\n if (!errorHandler) throw err;\n const policy = await errorHandler({ middleware: mw.name, owner: mw.owner, err });\n if (policy === 'rethrow') throw err;\n // Swallow: continue with the value that was about to flow into this\n // middleware. Subsequent middleware after the crashed one is skipped\n // — error boundary is \"skip the broken layer\", not \"skip the rest\".\n return value;\n }\n };\n\n return dispatch(0, input);\n }\n\n private indexOf(name: string, optional = false): number {\n const idx = this.chain.findIndex((m) => m.name === name);\n if (idx === -1 && !optional) {\n throw new Error(`Pipeline: middleware \"${name}\" not found`);\n }\n return idx;\n }\n\n private ensureUnique(name: string): void {\n if (this.chain.some((m) => m.name === name)) {\n throw new Error(`Pipeline: middleware \"${name}\" already registered`);\n }\n }\n}\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 { Context } from '../core/context.js';\r\nimport type { Usage } from '../types/provider.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.thinking_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; name: 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 * Fired after the user chooses 'always' or 'deny' on a confirmation prompt.\r\n * The TUI can use this to show a brief notification that the decision was\r\n * persisted to the trust file (e.g. \"✓ always allowed popo.txt\" / \"✗ denied popo.txt\").\r\n */\r\n 'trust.persisted': {\r\n tool: string;\r\n pattern: string;\r\n decision: 'always' | 'deny';\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 * Full UTF-8 byte length of the serialized tool result that the model\r\n * actually sees (post-cap, post-scrub). The `output` preview is capped\r\n * at ~400 chars for transport; this number lets UIs surface what the\r\n * model is really paying tokens for. Optional only for legacy emit\r\n * sites that may not yet populate it.\r\n */\r\n outputBytes?: number;\r\n /**\r\n * Estimated token count for the full result body the model sees.\r\n * Computed from `outputBytes` with the standard ~3.5 chars/token\r\n * heuristic. Cheap to show in the TUI; not authoritative — the real\r\n * provider count lives in `provider.response.usage`. */\r\n outputTokens?: number;\r\n /**\r\n * For tools whose output has a clear \"line\" notion (file reads with\r\n * numbered prefixes, grep hits, bash stdout), the agent counts the\r\n * actual lines the model received and forwards it here. Undefined\r\n * for tools without a meaningful line count. */\r\n outputLines?: number;\r\n };\r\n /**\r\n * Fired on every `iteration.completed`. UIs subscribe to render a live\r\n * context-window fill bar per agent (e.g. \"67% ████████░░\"). The\r\n * `load` fraction matches the threshold levels: 0–0.6 green, 0.6–0.75\r\n * yellow, 0.75+ red.\r\n */\r\n 'ctx.pct': {\r\n /** Fraction of maxContext currently in use (0–1+. Can exceed 1 when over budget). */\r\n load: number;\r\n /** Estimated total tokens (system + tools + messages). */\r\n tokens: number;\r\n /** Provider's max context window. */\r\n maxContext: number;\r\n };\r\n 'token.threshold': { used: number; limit: number };\r\n /**\r\n * Fired when the subagent budget hits a soft limit and the coordinator\r\n * is being asked for an extension. The coordinator should call `extend()`\r\n * to grant more budget, or the promise auto-resolves to `deny` after\r\n * `timeoutMs` (default 30s), treating it as a hard stop.\r\n *\r\n * This event lets the CLI/TUI observe budget pressure in real time,\r\n * surface extension requests to users, and give the coordinator a\r\n * hook to implement custom extension policy without coupling to the\r\n * runner/budget classes.\r\n */\r\n 'budget.threshold_reached': {\r\n kind: 'iterations' | 'tool_calls' | 'tokens' | 'cost' | 'timeout' | 'idle_timeout';\r\n used: number;\r\n limit: number;\r\n /**\r\n * Call to grant more of the same budget type. `timeoutMs` extends the\r\n * wall-clock budget; the coordinator's watchdog observes the patched\r\n * limit and re-arms its timer for the new remainder.\r\n */\r\n extend: (\r\n extra: Partial<{\r\n maxIterations: number;\r\n maxToolCalls: number;\r\n maxTokens: number;\r\n maxCostUsd: number;\r\n timeoutMs: number;\r\n }>,\r\n ) => void;\r\n /** Call to deny the extension — subagent will stop. */\r\n deny: () => void;\r\n /** Auto-resolves to deny after timeout. */\r\n timeoutMs: number;\r\n };\r\n 'context.repaired': {\r\n ctx: Context;\r\n changed: boolean;\r\n removedToolUses: string[];\r\n removedToolResults: string[];\r\n removedMessages: number;\r\n };\r\n 'compaction.fired': {\r\n /** Threshold level that triggered compaction (warn / soft / hard). */\r\n level: 'warn' | 'soft' | 'hard';\r\n /** Tokens estimated before compaction ran. */\r\n tokens: number;\r\n /** Fraction of maxContext at the time compaction fired. */\r\n load: number;\r\n /** Provider's max context window in tokens. */\r\n maxContext: number;\r\n /** Full compaction report from the compactor. */\r\n report: { before: number; after: number; reductions: { phase: string; saved: number }[] };\r\n /** Whether aggressive (summary) mode was used. */\r\n aggressive: boolean;\r\n };\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 /**\r\n * Subagent lifecycle events. Emitted by `MultiAgentHost` so the TUI can\r\n * surface what's happening in the fleet without needing director-mode\r\n * (which renders the live FleetPanel). These complement the FleetBus\r\n * (director-only) by giving the TUI a uniform feed for both `/spawn`\r\n * and director-orchestrated work.\r\n */\r\n 'subagent.spawned': {\r\n subagentId: string;\r\n taskId: string;\r\n name?: string;\r\n provider?: string;\r\n model?: string;\r\n description?: string;\r\n /**\r\n * Absolute path to the per-subagent JSONL transcript on disk, when\r\n * one was created. Undefined when the subagent shares the parent\r\n * session writer (in-memory or single-file configurations).\r\n * Surfaced so the TUI (FleetPanel) and `/fleet log` can show the\r\n * user *where* to look without computing it from the run id.\r\n */\r\n transcriptPath?: string;\r\n };\r\n 'subagent.task_started': {\r\n subagentId: string;\r\n taskId: string;\r\n description?: string;\r\n };\r\n /**\r\n * Fired by `MultiAgentHost` when a subagent hits a soft budget limit\r\n * and the coordinator is auto-extending. TUI renders this as a\r\n * status-line notice: \"⚡ agent#name hitting kind limit (used/limit) — extending\".\r\n * After the auto-extend the task either continues or the coordinator\r\n * denies the extension and the task ends with 'budget_exhausted'.\r\n */\r\n 'subagent.budget_warning': {\r\n subagentId: string;\r\n kind: string;\r\n used: number;\r\n limit: number;\r\n };\r\n /**\r\n * Emitted when the coordinator/director actually GRANTS a budget\r\n * extension to a subagent (the resolution of a `budget.threshold_reached`\r\n * negotiation). Distinct from `subagent.budget_warning`, which fires when\r\n * a limit is merely *hit*. UIs use this to render a persistent \"⚡ extended\r\n * ×N\" badge so users can see how often an agent self-extended to stay\r\n * alive. `totalExtensions` is the cumulative count for this subagent across\r\n * all kinds; `newLimit` is the patched value for `kind`.\r\n */\r\n 'subagent.budget_extended': {\r\n subagentId: string;\r\n kind: string;\r\n newLimit: number;\r\n totalExtensions: number;\r\n };\r\n /**\r\n * Per-tool-call event re-emitted from a subagent's own EventBus\r\n * onto the host EventBus, so the TUI / non-director surfaces can\r\n * render \"AGENT#1 ● bash 250ms\" without having to subscribe to\r\n * the director-only FleetBus. Fired AFTER the tool completes\r\n * (paired with `tool.executed`). Includes the subagent id so\r\n * multiple parallel subagents are distinguishable.\r\n */\r\n 'subagent.tool_executed': {\r\n subagentId: string;\r\n taskId?: string;\r\n name: string;\r\n durationMs: number;\r\n ok: boolean;\r\n input?: unknown;\r\n outputBytes?: number;\r\n };\r\n /**\r\n * Periodic progress snapshot emitted by the subagent runner every ~25\r\n * iterations so the user can track what a subagent is doing without\r\n * looking at the FleetPanel. The leader's TUI surfaces this as a\r\n * chat history entry: \"AGENT#2 💬 L25 · 47 tools · $0.023 · doing grep...\"\r\n * Fired on a best-effort basis — slow subagents may skip emissions if\r\n * the 25-iteration window passes while the agent is between tool calls.\r\n */\r\n 'subagent.iteration_summary': {\r\n subagentId: string;\r\n iteration: number;\r\n toolCalls: number;\r\n costUsd: number;\r\n currentTool?: string;\r\n partialText?: string;\r\n };\r\n 'subagent.task_completed': {\r\n subagentId: string;\r\n taskId: string;\r\n status: 'success' | 'failed' | 'timeout' | 'stopped';\r\n iterations: number;\r\n toolCalls: number;\r\n durationMs: number;\r\n /**\r\n * Structured failure envelope when `status !== 'success'`. Carries\r\n * `kind` (one of `SubagentErrorKind`), `message`, `retryable`, and\r\n * optional `backoffMs`. UIs branch on `kind` to render the right\r\n * chip (rate_limit vs auth vs tool_failed). The type is imported\r\n * lazily as a structural object to avoid a coordination → kernel\r\n * cycle in the dependency graph.\r\n */\r\n error?: {\r\n kind: string;\r\n message: string;\r\n retryable: boolean;\r\n backoffMs?: number;\r\n cause?: { name: string; message: string; stack?: string };\r\n };\r\n };\r\n /**\r\n * Fired by the delegate tool when a subagent finishes. The agent's run\r\n * loop listens for this to collect `delegateSummaries` for the RunResult,\r\n * so the CLI/TUI can render flashy completion banners.\r\n */\r\n 'subagent.done': { summary: string; ok: boolean };\r\n /**\r\n * Fired by MultiAgentHost when a subagent's context window load changes.\r\n * The leader agent's ctx.pct is emitted directly on the host EventBus;\r\n * subagent ctx.pct events are forwarded here with subagentId attribution.\r\n * TUI uses this to render live context fill bars per agent.\r\n */\r\n 'subagent.ctx_pct': {\r\n subagentId: string;\r\n load: number;\r\n tokens: number;\r\n maxContext: number;\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 /** Fired by SessionWriter.writeCheckpoint() after the checkpoint event is appended to JSONL. */\r\n 'checkpoint.written': { promptIndex: number; promptPreview: string; ts: string; fileCount: number };\r\n /**\r\n * Fired by SessionWriter.writeInFlightMarker() — the agent loop has\r\n * started a long-running operation. Pairs with `in_flight.ended`\r\n * on clean shutdown. A marker with no end indicates a crash.\r\n * (Idea #1 from IDEAS.md — Stateful Session Recovery.)\r\n */\r\n 'in_flight.started': { context: string; ts: string };\r\n /** Fired by SessionWriter.clearInFlightMarker() — operation completed cleanly. */\r\n 'in_flight.ended': { reason: 'clean' | 'aborted' | 'recovered'; ts: string };\r\n /**\r\n * Fired after a session rewind completes: files are reverted and the session\r\n * history is truncated. The TUI listens to this to update its checkpoint\r\n * list and clear history entries that are now invalid.\r\n */\r\n 'session.rewound': { toPromptIndex: number; revertedFiles: string[]; removedEvents: number };\r\n /**\r\n * Fired by the multi-agent coordinator on FleetBus whenever subagent\r\n * counts change (spawn/stop/complete). The TUI subscribes to render\r\n * live fleet counters without polling.\r\n */\r\n 'coordinator.stats': {\r\n total: number;\r\n running: number;\r\n idle: number;\r\n stopped: number;\r\n inFlight: number;\r\n pending: number;\r\n completed: number;\r\n subagentStatuses: { subagentId: string; taskId: string; status: string; assigned: boolean }[];\r\n };\r\n /**\r\n * Git-worktree lifecycle, emitted by WorktreeManager. AutoPhase allocates one\r\n * worktree per phase so parallelizable phases run isolated, then merges them\r\n * back sequentially. The WebUI/TUI subscribe to render live swim-lanes/DAG.\r\n */\r\n 'worktree.allocated': {\r\n handleId: string;\r\n ownerId: string;\r\n ownerLabel: string;\r\n slug: string;\r\n dir: string;\r\n branch: string;\r\n baseBranch: string;\r\n };\r\n 'worktree.committed': {\r\n handleId: string;\r\n ownerId: string;\r\n branch: string;\r\n committed: boolean;\r\n insertions: number;\r\n deletions: number;\r\n files: number;\r\n sha?: string;\r\n };\r\n 'worktree.merged': {\r\n handleId: string;\r\n ownerId: string;\r\n branch: string;\r\n baseBranch: string;\r\n squash: boolean;\r\n };\r\n 'worktree.conflict': {\r\n handleId: string;\r\n ownerId: string;\r\n branch: string;\r\n conflictFiles: string[];\r\n };\r\n 'worktree.released': { handleId: string; ownerId: string; branch: string; kept: boolean };\r\n 'worktree.failed': { handleId: string; ownerId: string; branch?: string; error: 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 readonly wildcards: Array<{\r\n match: (event: string) => boolean;\r\n fn: (event: string, payload: unknown) => void;\r\n }> = [];\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 /**\r\n * Subscribe to all events, regardless of name. Short-hand for\r\n * `onPattern('*')`. Use for logging, debugging, or forwarding every\r\n * event to another bus (as FleetBus does).\r\n *\r\n * Returns an unsubscribe function.\r\n */\r\n onAny(fn: (event: string, payload: unknown) => void): () => void {\r\n return this.onPattern('*', fn);\r\n }\r\n\r\n /**\r\n * Subscribe to all events whose name matches a glob-style prefix.\r\n * `'tool.*'` matches `tool.started`, `tool.executed`, `tool.progress`, etc.\r\n * `'*'` matches every event.\r\n *\r\n * The handler receives `(eventName, payload)` with the event name as a\r\n * string and the payload as `unknown`. Use for logging, debugging, or\r\n * metrics collection across a family of events.\r\n *\r\n * Returns an unsubscribe function.\r\n */\r\n onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\r\n const match = makePatternMatcher(pattern);\r\n const entry = { match, fn };\r\n this.wildcards.push(entry);\r\n return () => {\r\n const idx = this.wildcards.indexOf(entry);\r\n if (idx >= 0) this.wildcards.splice(idx, 1);\r\n };\r\n }\r\n\r\n /**\r\n * Subscribe to all events whose name matches a RegExp.\r\n * More flexible than `onPattern` — use when you need regex features\r\n * (alternation, character classes, capture groups).\r\n *\r\n * Returns an unsubscribe function.\r\n */\r\n onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\r\n const entry = { match: (e: string) => regex.test(e), fn };\r\n this.wildcards.push(entry);\r\n return () => {\r\n const idx = this.wildcards.indexOf(entry);\r\n if (idx >= 0) this.wildcards.splice(idx, 1);\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) {\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 // Wildcard listeners — snapshot the array first so a listener that\r\n // subscribes another pattern (via onPattern/onRegex) doesn't see\r\n // inconsistent behavior across JS engines. ECMA leaves mid-iteration\r\n // array mutation under-specified; this keeps us engine-portable.\r\n if (this.wildcards.length > 0) {\r\n const name = event as string;\r\n const snapshot = this.wildcards.slice();\r\n for (const { match, fn } of snapshot) {\r\n if (!match(name)) continue;\r\n try {\r\n fn(name, payload);\r\n } catch (err) {\r\n this.logger?.error(`EventBus wildcard listener for \"${name}\" threw`, err);\r\n }\r\n }\r\n }\r\n }\r\n\r\n clear(): void {\r\n this.listeners.clear();\r\n this.wildcards.length = 0;\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 * Does NOT include wildcard listeners.\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 /**\r\n * Number of wildcard listeners currently registered.\r\n */\r\n wildcardCount(): number {\r\n return this.wildcards.length;\r\n }\r\n\r\n /**\r\n * True if anything would receive an emit for `event` — a named listener\r\n * OR a wildcard/regex pattern that matches the event name. Unlike\r\n * `listenerCount`, this DOES account for wildcards, so callers that gate\r\n * behavior on \"is anyone listening?\" (e.g. SubagentBudget deciding whether\r\n * to negotiate a soft limit vs hard-stop) don't misfire when the only\r\n * subscriber is a pattern listener like the FleetBus's `onPattern('*')`.\r\n */\r\n hasListenerFor(event: string): boolean {\r\n if ((this.listeners.get(event as EventName)?.size ?? 0) > 0) return true;\r\n return this.wildcards.some((w) => w.match(event));\r\n }\r\n}\r\n\r\n// ── Scoped EventBus ─────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * A decorator over `EventBus` that records every listener registration\r\n * (`.on`, `.once`, `.onPattern`, `.onRegex`) so that `teardown()` can\r\n * remove all of them at once — preventing the memory leaks that occur\r\n * when dynamic plugins or long-lived TUI/WebUI interfaces forget to\r\n * call `.off()` during session termination.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const bus = new ScopedEventBus();\r\n * bus.on('tool.executed', handler1); // tracked\r\n * bus.on('provider.response', handler2); // tracked\r\n * bus.onPattern('subagent.*', handler3); // tracked\r\n * // ... later, when the plugin or session is torn down:\r\n * bus.teardown(); // removes all three listeners\r\n * ```\r\n *\r\n * Also implements `Disposable` (via `[Symbol.dispose]`) for use with\r\n * the `using` keyword in Node ≥ 22, or can be used manually with\r\n * `bus.teardown()`.\r\n */\r\nexport class ScopedEventBus extends EventBus {\r\n // Track registrations by a unique counter key so that EventBus.once()'s\r\n // internal listener-removal doesn't affect our tracking (once removes the\r\n // fn from EventBus but we still need to call our unsub during teardown).\r\n private readonly registrations = new Map<number, () => void>();\r\n private nextKey = 0;\r\n\r\n /**\r\n * Identical to `EventBus.on` but the listener is tracked so that\r\n * `teardown()` will remove it automatically.\r\n */\r\n override on<E extends EventName>(event: E, fn: Listener<E>): () => void {\r\n const key = this.nextKey++;\r\n const unsub = super.on(event, fn);\r\n this.registrations.set(key, unsub);\r\n return () => {\r\n this.registrations.delete(key);\r\n unsub();\r\n };\r\n }\r\n\r\n /**\r\n * Identical to `EventBus.once` but the listener is tracked so that\r\n * `teardown()` will remove it automatically.\r\n *\r\n * Uses EventBus's public API directly to avoid triggering our own `on()`\r\n * override (which would consume a key slot for the wrapper, then orphan\r\n * our registration entry under a different key).\r\n *\r\n * When the wrapper fires, it cleans up BOTH the underlying EventBus\r\n * listener AND the tracking entry — so `scopedListenerCount` returns to\r\n * its pre-`once()` value without requiring the caller to invoke the\r\n * returned unsubscribe. The returned `unsub` is still safe to call\r\n * after auto-removal (its delete is a no-op and its off() finds\r\n * nothing to remove).\r\n */\r\n override once<E extends EventName>(event: E, fn: Listener<E>): () => void {\r\n const key = this.nextKey++;\r\n const wrapper: Listener<E> = (payload) => {\r\n // Bypass ScopedEventBus.on() — go straight to EventBus.off() so we\r\n // don't recurse and don't consume another key.\r\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\r\n // Drop the tracking entry so scopedListenerCount is honest. Done\r\n // before calling `fn` so a handler that calls scopedListenerCount\r\n // mid-fire sees the post-removal state.\r\n this.registrations.delete(key);\r\n (fn as Listener<E>)(payload);\r\n };\r\n // Use the EventBus prototype directly to register without triggering\r\n // ScopedEventBus.on() which would consume a second key.\r\n EventBus.prototype.on.call(this, event, wrapper as Listener<EventName>);\r\n const unsub = () => {\r\n this.registrations.delete(key);\r\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\r\n };\r\n this.registrations.set(key, unsub);\r\n return unsub;\r\n }\r\n\r\n /**\r\n * Subscribe to all events. Alias for `onPattern('*')` — the listener is\r\n * tracked so that `teardown()` will remove it automatically.\r\n */\r\n override onAny(fn: (event: string, payload: unknown) => void): () => void {\r\n const key = this.nextKey++;\r\n // Call EventBus.onPattern directly so the wrapper-consumption in\r\n // ScopedEventBus.on() doesn't re-enter and create a second registration slot.\r\n const unsub = EventBus.prototype.onPattern.call(this, '*', fn);\r\n this.registrations.set(key, unsub);\r\n return () => {\r\n this.registrations.delete(key);\r\n unsub();\r\n };\r\n }\r\n\r\n /**\r\n * Identical to `EventBus.onPattern` but the listener is tracked so that\r\n * `teardown()` will remove it automatically.\r\n */\r\n override onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\r\n const key = this.nextKey++;\r\n const unsub = super.onPattern(pattern, fn);\r\n this.registrations.set(key, unsub);\r\n return () => {\r\n this.registrations.delete(key);\r\n unsub();\r\n };\r\n }\r\n\r\n /**\r\n * Identical to `EventBus.onRegex` but the listener is tracked so that\r\n * `teardown()` will remove it automatically.\r\n */\r\n override onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\r\n const key = this.nextKey++;\r\n const unsub = super.onRegex(regex, fn);\r\n this.registrations.set(key, unsub);\r\n return () => {\r\n this.registrations.delete(key);\r\n unsub();\r\n };\r\n }\r\n\r\n /**\r\n * Remove every listener that was registered through this scoped bus.\r\n * Idempotent — calling it multiple times is safe.\r\n *\r\n * Also available as `[Symbol.dispose]` for explicit resource management:\r\n * ```ts\r\n * using scope = new ScopedEventBus();\r\n * scope.on('tool.executed', handler);\r\n * // automatically teardown()'d when scope exits\r\n * ```\r\n */\r\n teardown(): void {\r\n for (const unsub of this.registrations.values()) {\r\n try { unsub(); } catch { /* ignore — best effort */ }\r\n }\r\n this.registrations.clear();\r\n this.clear();\r\n }\r\n\r\n /** Alias for `teardown()` — enables `using new ScopedEventBus()` in Node ≥ 22. */\r\n [Symbol.dispose](): void {\r\n this.teardown();\r\n }\r\n\r\n /** Number of tracked registrations. */\r\n get scopedListenerCount(): number {\r\n return this.registrations.size;\r\n }\r\n}\r\n\r\n/**\r\n * Convert a glob-style pattern to a matcher function.\r\n * Only supports `*` at the end of a prefix — `'tool.*'` becomes\r\n * \"starts with tool.\". `'*'` matches everything.\r\n */\r\nfunction makePatternMatcher(pattern: string): (event: string) => boolean {\r\n if (pattern === '*') return () => true;\r\n if (pattern.endsWith('.*')) {\r\n const prefix = pattern.slice(0, -2);\r\n return (e: string) => e.startsWith(`${prefix}.`);\r\n }\r\n // Exact match fallback\r\n return (e: string) => e === pattern;\r\n}\r\n","import type { Compactor } from '../types/compactor.js';\nimport type { ConfigLoader, ConfigStore } from '../types/config.js';\nimport type { ErrorHandler } from '../types/error-handler.js';\nimport type { InputReader } from '../types/input-reader.js';\nimport type { Logger } from '../types/logger.js';\nimport type { MemoryStore } from '../types/memory.js';\nimport type { ModeStore } from '../types/mode.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\nimport type { PathResolver } from '../types/path-resolver.js';\nimport type { PermissionPolicy } from '../types/permission.js';\nimport type { ProviderRunner } from '../types/provider-runner.js';\nimport type { Renderer } from '../types/renderer.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\nimport type { SessionStore } from '../types/session.js';\nimport type { SkillLoader } from '../types/skill.js';\nimport type { SystemPromptBuilder } from '../types/system-prompt.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { WorktreeManager } from '../worktree/worktree-manager.js';\nimport type { Token } from './container.js';\n\nconst t = <T>(name: string): Token<T> => Symbol(name) as Token<T>;\n\nexport const TOKENS = {\n Logger: t<Logger>('Logger'),\n TokenCounter: t<TokenCounter>('TokenCounter'),\n SessionStore: t<SessionStore>('SessionStore'),\n MemoryStore: t<MemoryStore>('MemoryStore'),\n PermissionPolicy: t<PermissionPolicy>('PermissionPolicy'),\n Compactor: t<Compactor>('Compactor'),\n PathResolver: t<PathResolver>('PathResolver'),\n ConfigLoader: t<ConfigLoader>('ConfigLoader'),\n ConfigStore: t<ConfigStore>('ConfigStore'),\n Renderer: t<Renderer>('Renderer'),\n InputReader: t<InputReader>('InputReader'),\n ErrorHandler: t<ErrorHandler>('ErrorHandler'),\n RetryPolicy: t<RetryPolicy>('RetryPolicy'),\n SkillLoader: t<SkillLoader>('SkillLoader'),\n SystemPromptBuilder: t<SystemPromptBuilder>('SystemPromptBuilder'),\n SecretScrubber: t<SecretScrubber>('SecretScrubber'),\n ModelsRegistry: t<ModelsRegistry>('ModelsRegistry'),\n ModeStore: t<ModeStore>('ModeStore'),\n /** Replaces the entire provider call layer — retry, streaming, tracing. */\n ProviderRunner: t<ProviderRunner>('ProviderRunner'),\n /** Optional git-worktree lifecycle manager (per-phase isolation in AutoPhase). */\n WorktreeManager: t<WorktreeManager>('WorktreeManager'),\n} as const;\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"]}
|
|
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"],"names":["t"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n","import { WrongStackError, ERROR_CODES } from '../types/errors.js';\n\n/**\n * Container — dependency injection with explicit bind / override / decorate.\n *\n * Invariants:\n * bind() — throws if token already bound\n * override() — throws if nothing to replace\n * decorate() — stacks; cached value cleared on register\n */\n\nexport type Token<T> = symbol & { readonly __type?: T };\nexport type Factory<T> = (c: Container) => T;\nexport type Decorator<T> = (inner: T, c: Container) => T;\n\ninterface Entry<T = unknown> {\n factory: Factory<T>;\n singleton: boolean;\n decorators: Decorator<T>[];\n cache?: T;\n owner: string;\n}\n\nexport interface BindOptions {\n singleton?: boolean;\n owner?: string;\n}\n\nexport class Container {\n private readonly entries = new Map<symbol, Entry>();\n /**\n * Tokens currently mid-resolve. Tracked so we can detect circular\n * dependencies (A → B → A) and throw a structured error instead of\n * overflowing the call stack with \"Maximum call stack size exceeded\".\n *\n * Not a memoization cache — the per-entry `cache` field is the source\n * of truth for \"have I built this before?\". This set only lives for\n * the duration of a single resolve call.\n */\n private readonly resolving = new Set<symbol>();\n\n bind<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n if (this.entries.has(token)) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" already bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_ALREADY_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? true,\n decorators: [],\n owner: opts.owner ?? 'core',\n });\n }\n\n override<T>(token: Token<T>, factory: Factory<T>, opts: BindOptions = {}): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot override \"${token.description ?? 'unknown'}\" — not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n this.entries.set(token, {\n factory: factory as Factory<unknown>,\n singleton: opts.singleton ?? existing.singleton,\n decorators: existing.decorators,\n owner: opts.owner ?? existing.owner,\n });\n }\n\n decorate<T>(token: Token<T>, decorator: Decorator<T>, owner = 'core'): void {\n const existing = this.entries.get(token);\n if (!existing) {\n throw new WrongStackError({\n message: `Container: cannot decorate \"${token.description ?? 'unknown'}\" — not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n existing.decorators.push(decorator as Decorator<unknown>);\n existing.cache = undefined;\n existing.owner = `${existing.owner}+${owner}`;\n }\n\n resolve<T>(token: Token<T>): T {\n const entry = this.entries.get(token);\n if (!entry) {\n throw new WrongStackError({\n message: `Container: token \"${token.description ?? 'unknown'}\" not bound`,\n code: ERROR_CODES.CONTAINER_TOKEN_NOT_BOUND,\n subsystem: 'container',\n context: { token: token.description },\n });\n }\n if (entry.singleton && entry.cache !== undefined) {\n return entry.cache as T;\n }\n if (this.resolving.has(token)) {\n const cycle = this.describeCycle(token);\n throw new WrongStackError({\n message: `Container: circular dependency detected — ${cycle}`,\n code: ERROR_CODES.CONTAINER_CIRCULAR_DEPENDENCY,\n subsystem: 'container',\n context: { token: token.description, cycle },\n });\n }\n this.resolving.add(token);\n try {\n let value: unknown = entry.factory(this);\n for (const d of entry.decorators) {\n value = d(value, this);\n }\n if (entry.singleton) {\n entry.cache = value;\n }\n return value as T;\n } finally {\n this.resolving.delete(token);\n }\n }\n\n /**\n * Build a human-readable description of the dependency cycle that\n * caused the resolution to re-enter. Lists the tokens in the order\n * they were entered, then appends the re-entered token to close the\n * loop. Falls back to a generic message if the resolving set is\n * somehow empty (shouldn't happen, but defensive).\n */\n private describeCycle(reentry: symbol): string {\n const descs: string[] = [];\n for (const t of this.resolving) {\n descs.push(t.description ?? 'unknown');\n }\n descs.push(reentry.description ?? 'unknown');\n return descs.join(' → ');\n }\n\n has<T>(token: Token<T>): boolean {\n return this.entries.has(token);\n }\n\n ownerOf<T>(token: Token<T>): string | undefined {\n return this.entries.get(token)?.owner;\n }\n\n /**\n * Remove a token's binding (along with any decorators stacked on it).\n * Returns true if the token existed. Use this to withdraw temporary\n * bindings installed by a short-lived run or plugin — without it, the\n * entry persists in the map forever.\n */\n unbind<T>(token: Token<T>): boolean {\n return this.entries.delete(token);\n }\n\n /**\n * Drop every binding. Intended for tests and short-lived CLI invocations\n * that rebuild the container from scratch. Production code should prefer\n * `unbind` on the specific tokens it owns.\n */\n clear(): void {\n this.entries.clear();\n }\n\n list(): Array<{ token: symbol; owner: string }> {\n return Array.from(this.entries.entries()).map(([token, entry]) => ({\n token,\n owner: entry.owner,\n }));\n }\n\n /**\n * Inspect a binding's full shape, including decorator count and whether\n * a singleton value is cached. Returns null if the token is unbound.\n * Decorator and factory function references are not exposed — only counts\n * and metadata, to keep internal state hidden.\n */\n inspect<T>(token: Token<T>): {\n owner: string;\n singleton: boolean;\n decoratorCount: number;\n cached: boolean;\n } | null {\n const entry = this.entries.get(token);\n if (!entry) return null;\n return {\n owner: entry.owner,\n singleton: entry.singleton,\n decoratorCount: entry.decorators.length,\n cached: entry.cache !== undefined,\n };\n }\n}\n","/**\n * Pipeline — Koa-style middleware chain with named middleware\n * and position-aware insertion. Generic over input type T.\n */\n\nexport type NextFn<T> = (value: T) => Promise<T>;\nexport type MiddlewareHandler<T> = (value: T, next: NextFn<T>) => Promise<T>;\n\n/**\n * Called when a middleware crashes (throws or rejects). Used by the\n * Pipeline's error boundary to log the offender without aborting the run.\n *\n * Return `'rethrow'` to propagate the error (default for core middleware),\n * or `'swallow'` to skip past the crashing middleware and continue with the\n * value the previous one produced. Plugin middleware should usually be\n * swallowed so one bad plugin can't kill an agent run.\n */\nexport type PipelineErrorPolicy = 'rethrow' | 'swallow';\n\nexport interface PipelineErrorEvent {\n middleware: string;\n owner?: string;\n err: unknown;\n}\n\nexport type PipelineErrorHandler = (\n ev: PipelineErrorEvent,\n) => PipelineErrorPolicy | Promise<PipelineErrorPolicy>;\n\nexport interface Middleware<T> {\n name: string;\n handler: MiddlewareHandler<T>;\n owner?: string;\n}\n\nexport interface PipelineOptions {\n /** When true and the target middleware is not found, operations silently no-op instead of throwing. */\n optional?: boolean;\n}\n\n/**\n * Read-only view of a pipeline. Returned to consumers (plugins, hooks)\n * so they can inspect but not mutate the chain.\n */\nexport interface ReadonlyPipeline<T> {\n readonly size: number;\n list(): readonly string[];\n run(input: T): Promise<T>;\n}\n\nexport class Pipeline<T> {\n private readonly chain: Middleware<T>[] = [];\n private errorHandler?: PipelineErrorHandler;\n\n /**\n * Install an error boundary. When a middleware throws or rejects, the\n * handler is called and decides whether to swallow (continue with the\n * pre-handler value) or rethrow. Without a handler, errors propagate.\n *\n * Wire one per pipeline at boot — the host CLI typically installs a\n * single boundary that logs to the operational log and emits a\n * `pipeline.error` event for /diag.\n */\n setErrorHandler(handler: PipelineErrorHandler | undefined): this {\n this.errorHandler = handler;\n return this;\n }\n\n use(mw: Middleware<T> | Middleware<unknown>): this {\n this.ensureUnique(mw.name);\n this.chain.push(mw as Middleware<T>);\n return this;\n }\n\n prepend(mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n this.chain.unshift(mw);\n return this;\n }\n\n /**\n * Insert middleware at an explicit index. Out-of-range indices are clamped.\n * Use this when insertBefore/insertAfter are insufficient (e.g. to place\n * a middleware at a known position regardless of named targets).\n */\n insertAt(index: number, mw: Middleware<T>): this {\n this.ensureUnique(mw.name);\n const idx = Math.max(0, Math.min(index, this.chain.length));\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately before the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * before the target's current position — so after insertBefore('B', X)\n * then insertBefore('B', Y), the order is Y → X → B.\n */\n insertBefore(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 0, mw);\n return this;\n }\n\n /**\n * Insert mw immediately after the first occurrence of target.\n * If called multiple times with the same target, each call inserts\n * after the target's current position — so after insertAfter('B', X)\n * then insertAfter('B', Y), the order is B → X → Y.\n */\n insertAfter(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx + 1, 0, mw);\n return this;\n }\n\n replace(target: string, mw: Middleware<T>, opts?: PipelineOptions): this {\n if (mw.name !== target) this.ensureUnique(mw.name);\n const idx = this.indexOf(target, opts?.optional);\n if (idx === -1) return this;\n this.chain[idx] = mw;\n return this;\n }\n\n remove(name: string, opts?: PipelineOptions): this {\n const idx = this.indexOf(name, opts?.optional);\n if (idx === -1) return this;\n this.chain.splice(idx, 1);\n return this;\n }\n\n list(): readonly string[] {\n return this.chain.map((m) => m.name);\n }\n\n size(): number {\n return this.chain.length;\n }\n\n /** Return a read-only view suitable for passing to plugins. */\n asReadonly(): ReadonlyPipeline<T> {\n // The returned object's methods close over `this`, so it always sees the live chain.\n // `list()` returns a frozen snapshot to prevent external mutation of the chain.\n const self = this;\n return Object.freeze({\n get size() {\n return self.size();\n },\n list() {\n return Object.freeze(self.list());\n },\n run(input: T) {\n return self.run(input);\n },\n });\n }\n\n async run(input: T): Promise<T> {\n let index = -1;\n const chain = this.chain;\n const errorHandler = this.errorHandler;\n\n const dispatch = async (i: number, value: T): Promise<T> => {\n if (i <= index) {\n throw new Error(`Pipeline: next() called multiple times in \"${chain[index]?.name}\"`);\n }\n index = i;\n const mw = chain[i];\n if (!mw) return value;\n try {\n return await mw.handler(value, (v) => dispatch(i + 1, v));\n } catch (err) {\n if (!errorHandler) throw err;\n const policy = await errorHandler({ middleware: mw.name, owner: mw.owner, err });\n if (policy === 'rethrow') throw err;\n // Swallow: continue with the value that was about to flow into this\n // middleware. Subsequent middleware after the crashed one is skipped\n // — error boundary is \"skip the broken layer\", not \"skip the rest\".\n return value;\n }\n };\n\n return dispatch(0, input);\n }\n\n private indexOf(name: string, optional = false): number {\n const idx = this.chain.findIndex((m) => m.name === name);\n if (idx === -1 && !optional) {\n throw new Error(`Pipeline: middleware \"${name}\" not found`);\n }\n return idx;\n }\n\n private ensureUnique(name: string): void {\n if (this.chain.some((m) => m.name === name)) {\n throw new Error(`Pipeline: middleware \"${name}\" already registered`);\n }\n }\n}\n","/**\n * EventBus — observe-only typed event bus.\n * Subscribers cannot modify or cancel. Subscriber exceptions are caught.\n */\n\nimport type { BrainDecision, BrainDecisionRequest } from '../coordination/brain.js';\nimport type { Context } from '../core/context.js';\nimport type { Usage } from '../types/provider.js';\nimport type { Tool, ToolProgressEvent } from '../types/tool.js';\n\nexport interface EventMap {\n 'brain.decision_requested': { request: BrainDecisionRequest; at: number };\n 'brain.decision_answered': { request: BrainDecisionRequest; decision: BrainDecision; at: number };\n 'brain.decision_ask_human': {\n request: BrainDecisionRequest;\n decision: BrainDecision;\n at: number;\n };\n 'brain.human_answered': {\n id: string;\n optionId?: string;\n deny?: boolean;\n text?: string;\n at: number;\n };\n 'brain.decision_denied': { request: BrainDecisionRequest; decision: BrainDecision; at: number };\n 'session.started': { id: string };\n 'session.ended': { id: string; usage: Usage };\n 'session.damaged': { sessionId: string; detail: string };\n 'iteration.started': { ctx: Context; index: number };\n 'iteration.completed': { ctx: Context; index: number };\n /**\n * Fired when the agent hits its iteration limit. Listeners (CLI/TUI) can\n * call `grant(extra)` to allow more iterations, or `deny()` to stop.\n * If no listener responds within 30s the run ends with 'max_iterations'.\n */\n 'iteration.limit_reached': {\n currentIterations: number;\n currentLimit: number;\n grant: (extraIterations: number) => void;\n deny: () => void;\n };\n 'provider.response': { ctx: Context; usage: Usage; stopReason: string };\n 'provider.text_delta': { ctx: Context; text: string };\n 'provider.thinking_delta': { ctx: Context; text: string };\n 'provider.tool_use_start': { ctx: Context; id: string; name: string };\n 'provider.tool_use_stop': { ctx: Context; id: string; name: string };\n /**\n * Fired before each retry of a failed provider call. `attempt` is 1-based\n * (the first retry is attempt 1, etc.). `description` is the human-readable\n * one-liner from `ProviderError.describe()` — render this in the CLI/TUI\n * instead of grepping logger output for the raw JSON body.\n */\n 'provider.retry': {\n providerId: string;\n attempt: number;\n delayMs: number;\n status: number;\n description: string;\n };\n /**\n * Fired once when a provider call ultimately fails (retries exhausted, or\n * non-retryable error). Same shape as `provider.retry` minus the delay.\n */\n 'provider.error': {\n providerId: string;\n status: number;\n description: string;\n retryable: boolean;\n };\n 'tool.started': { name: string; id: string; input?: unknown };\n /**\n * Fired for each ToolProgressEvent yielded by `Tool.executeStream`. UIs\n * subscribe to render incremental progress (streaming bash output, file\n * tree counts, etc.) without the tool having to know about the UI.\n */\n 'tool.progress': { name: string; id: string; event: ToolProgressEvent };\n /**\n * Fired when a tool call needs user confirmation and no confirmHandler\n * is registered on the executor. The TUI renders a confirmation dialog\n * from this event. Resolution is driven by calling the resolve function\n * passed in the payload with a decision string ('yes' | 'no' | 'always' | 'deny').\n */\n 'tool.confirm_needed': {\n tool: Tool;\n input: unknown;\n toolUseId: string;\n suggestedPattern: string;\n resolve: (decision: 'yes' | 'no' | 'always' | 'deny') => void;\n };\n /**\n * Fired after the user chooses 'always' or 'deny' on a confirmation prompt.\n * The TUI can use this to show a brief notification that the decision was\n * persisted to the trust file (e.g. \"✓ always allowed popo.txt\" / \"✗ denied popo.txt\").\n */\n 'trust.persisted': {\n tool: string;\n pattern: string;\n decision: 'always' | 'deny';\n };\n /**\n * `output` is a truncated preview of the tool's serialized result text\n * (capped at ~400 chars by the emitter). UIs render this inline in the\n * tool history line without re-fetching from the session log.\n */\n 'tool.executed': {\n /**\n * The tool_use id (e.g. \"toolu_…\") issued by the provider for this call.\n * Pairs with `tool.started.id` so subscribers can correlate start/finish\n * even when the model fires multiple tools in parallel with identical\n * inputs. Optional only for legacy emit sites — new code should always\n * set it.\n */\n id?: string;\n name: string;\n durationMs: number;\n ok: boolean;\n input?: unknown;\n output?: string;\n /**\n * Full UTF-8 byte length of the serialized tool result that the model\n * actually sees (post-cap, post-scrub). The `output` preview is capped\n * at ~400 chars for transport; this number lets UIs surface what the\n * model is really paying tokens for. Optional only for legacy emit\n * sites that may not yet populate it.\n */\n outputBytes?: number;\n /**\n * Estimated token count for the full result body the model sees.\n * Computed from `outputBytes` with the standard ~3.5 chars/token\n * heuristic. Cheap to show in the TUI; not authoritative — the real\n * provider count lives in `provider.response.usage`. */\n outputTokens?: number;\n /**\n * For tools whose output has a clear \"line\" notion (file reads with\n * numbered prefixes, grep hits, bash stdout), the agent counts the\n * actual lines the model received and forwards it here. Undefined\n * for tools without a meaningful line count. */\n outputLines?: number;\n };\n /**\n * Fired on every `iteration.completed`. UIs subscribe to render a live\n * context-window fill bar per agent (e.g. \"67% ████████░░\"). The\n * `load` fraction matches the threshold levels: 0–0.6 green, 0.6–0.75\n * yellow, 0.75+ red.\n */\n 'ctx.pct': {\n /** Fraction of maxContext currently in use (0–1+. Can exceed 1 when over budget). */\n load: number;\n /** Estimated total tokens (system + tools + messages). */\n tokens: number;\n /** Provider's max context window. */\n maxContext: number;\n };\n /** Fired when the active model's resolved context window changes. */\n 'ctx.max_context': { providerId: string; modelId: string; maxContext: number };\n 'token.threshold': { used: number; limit: number };\n /**\n * Fired when the subagent budget hits a soft limit and the coordinator\n * is being asked for an extension. The coordinator should call `extend()`\n * to grant more budget, or the promise auto-resolves to `deny` after\n * `timeoutMs` (default 30s), treating it as a hard stop.\n *\n * This event lets the CLI/TUI observe budget pressure in real time,\n * surface extension requests to users, and give the coordinator a\n * hook to implement custom extension policy without coupling to the\n * runner/budget classes.\n */\n 'budget.threshold_reached': {\n kind: 'iterations' | 'tool_calls' | 'tokens' | 'cost' | 'timeout' | 'idle_timeout';\n used: number;\n limit: number;\n /**\n * Call to grant more of the same budget type. `timeoutMs` extends the\n * wall-clock budget; the coordinator's watchdog observes the patched\n * limit and re-arms its timer for the new remainder.\n */\n extend: (\n extra: Partial<{\n maxIterations: number;\n maxToolCalls: number;\n maxTokens: number;\n maxCostUsd: number;\n timeoutMs: number;\n }>,\n ) => void;\n /** Call to deny the extension — subagent will stop. */\n deny: () => void;\n /** Auto-resolves to deny after timeout. */\n timeoutMs: number;\n };\n 'context.repaired': {\n ctx: Context;\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n };\n 'compaction.fired': {\n /** Threshold level that triggered compaction (warn / soft / hard). */\n level: 'warn' | 'soft' | 'hard';\n /** Tokens estimated before compaction ran. */\n tokens: number;\n /** Fraction of maxContext at the time compaction fired. */\n load: number;\n /** Provider's max context window in tokens. */\n maxContext: number;\n /** Full compaction report from the compactor. */\n report: { before: number; after: number; reductions: { phase: string; saved: number }[] };\n /** Whether aggressive (summary) mode was used. */\n aggressive: boolean;\n };\n /**\n * Fired when the auto-compaction middleware's compactor.compact() call\n * throws. Compaction is best-effort by design so we don't crash the agent\n * loop, but a persistent failure (misconfigured summarizer model, network\n * outage) means the next iteration may hit context overflow. Observability\n * layers / dashboards subscribe to this to surface the silent regression.\n */\n 'compaction.failed': {\n err: Error;\n aggressive: boolean;\n level: 'warn' | 'soft' | 'hard';\n tokens: number;\n maxContext: number;\n load: number;\n fatal: boolean;\n };\n /**\n * Subagent lifecycle events. Emitted by `MultiAgentHost` so the TUI can\n * surface what's happening in the fleet without needing director-mode\n * (which renders the live FleetPanel). These complement the FleetBus\n * (director-only) by giving the TUI a uniform feed for both `/spawn`\n * and director-orchestrated work.\n */\n 'subagent.spawned': {\n subagentId: string;\n taskId: string;\n name?: string;\n provider?: string;\n model?: string;\n description?: string;\n /**\n * Absolute path to the per-subagent JSONL transcript on disk, when\n * one was created. Undefined when the subagent shares the parent\n * session writer (in-memory or single-file configurations).\n * Surfaced so the TUI (FleetPanel) and `/fleet log` can show the\n * user *where* to look without computing it from the run id.\n */\n transcriptPath?: string;\n };\n 'subagent.task_started': {\n subagentId: string;\n taskId: string;\n description?: string;\n };\n /**\n * Fired by `MultiAgentHost` when a subagent hits a soft budget limit\n * and the coordinator is auto-extending. TUI renders this as a\n * status-line notice: \"⚡ agent#name hitting kind limit (used/limit) — extending\".\n * After the auto-extend the task either continues or the coordinator\n * denies the extension and the task ends with 'budget_exhausted'.\n */\n 'subagent.budget_warning': {\n subagentId: string;\n kind: string;\n used: number;\n limit: number;\n };\n /**\n * Emitted when the coordinator/director actually GRANTS a budget\n * extension to a subagent (the resolution of a `budget.threshold_reached`\n * negotiation). Distinct from `subagent.budget_warning`, which fires when\n * a limit is merely *hit*. UIs use this to render a persistent \"⚡ extended\n * ×N\" badge so users can see how often an agent self-extended to stay\n * alive. `totalExtensions` is the cumulative count for this subagent across\n * all kinds; `newLimit` is the patched value for `kind`.\n */\n 'subagent.budget_extended': {\n subagentId: string;\n kind: string;\n newLimit: number;\n totalExtensions: number;\n };\n /**\n * Per-tool-call event re-emitted from a subagent's own EventBus\n * onto the host EventBus, so the TUI / non-director surfaces can\n * render \"AGENT#1 ● bash 250ms\" without having to subscribe to\n * the director-only FleetBus. Fired AFTER the tool completes\n * (paired with `tool.executed`). Includes the subagent id so\n * multiple parallel subagents are distinguishable.\n */\n 'subagent.tool_executed': {\n subagentId: string;\n taskId?: string;\n name: string;\n durationMs: number;\n ok: boolean;\n input?: unknown;\n outputBytes?: number;\n };\n /**\n * Periodic progress snapshot emitted by the subagent runner every ~25\n * iterations so the user can track what a subagent is doing without\n * looking at the FleetPanel. The leader's TUI surfaces this as a\n * chat history entry: \"AGENT#2 💬 L25 · 47 tools · $0.023 · doing grep...\"\n * Fired on a best-effort basis — slow subagents may skip emissions if\n * the 25-iteration window passes while the agent is between tool calls.\n */\n 'subagent.iteration_summary': {\n subagentId: string;\n iteration: number;\n toolCalls: number;\n costUsd: number;\n currentTool?: string;\n partialText?: string;\n };\n 'subagent.task_completed': {\n subagentId: string;\n taskId: string;\n status: 'success' | 'failed' | 'timeout' | 'stopped';\n iterations: number;\n toolCalls: number;\n durationMs: number;\n /**\n * Structured failure envelope when `status !== 'success'`. Carries\n * `kind` (one of `SubagentErrorKind`), `message`, `retryable`, and\n * optional `backoffMs`. UIs branch on `kind` to render the right\n * chip (rate_limit vs auth vs tool_failed). The type is imported\n * lazily as a structural object to avoid a coordination → kernel\n * cycle in the dependency graph.\n */\n error?: {\n kind: string;\n message: string;\n retryable: boolean;\n backoffMs?: number;\n cause?: { name: string; message: string; stack?: string };\n };\n };\n /**\n * Fired by the delegate tool when a subagent finishes. The agent's run\n * loop listens for this to collect `delegateSummaries` for the RunResult,\n * so the CLI/TUI can render flashy completion banners.\n */\n 'subagent.done': { summary: string; ok: boolean };\n /**\n * Fired by MultiAgentHost when a subagent's context window load changes.\n * The leader agent's ctx.pct is emitted directly on the host EventBus;\n * subagent ctx.pct events are forwarded here with subagentId attribution.\n * TUI uses this to render live context fill bars per agent.\n */\n 'subagent.ctx_pct': {\n subagentId: string;\n load: number;\n tokens: number;\n maxContext: number;\n };\n 'mcp.server.connected': { name: string; toolCount: number };\n 'mcp.server.reconnected': { name: string; toolCount: number };\n 'mcp.server.disconnected': { name: string; reason: string };\n 'token.cost_estimate_unavailable': { model: string };\n /** Fired by SessionWriter.writeCheckpoint() after the checkpoint event is appended to JSONL. */\n 'checkpoint.written': {\n promptIndex: number;\n promptPreview: string;\n ts: string;\n fileCount: number;\n };\n /**\n * Fired by SessionWriter.writeInFlightMarker() — the agent loop has\n * started a long-running operation. Pairs with `in_flight.ended`\n * on clean shutdown. A marker with no end indicates a crash.\n * (Idea #1 from IDEAS.md — Stateful Session Recovery.)\n */\n 'in_flight.started': { context: string; ts: string };\n /** Fired by SessionWriter.clearInFlightMarker() — operation completed cleanly. */\n 'in_flight.ended': { reason: 'clean' | 'aborted' | 'recovered'; ts: string };\n /**\n * Fired after a session rewind completes: files are reverted and the session\n * history is truncated. The TUI listens to this to update its checkpoint\n * list and clear history entries that are now invalid.\n */\n 'session.rewound': { toPromptIndex: number; revertedFiles: string[]; removedEvents: number };\n /**\n * Fired by the multi-agent coordinator on FleetBus whenever subagent\n * counts change (spawn/stop/complete). The TUI subscribes to render\n * live fleet counters without polling.\n */\n 'coordinator.stats': {\n total: number;\n running: number;\n idle: number;\n stopped: number;\n inFlight: number;\n pending: number;\n completed: number;\n subagentStatuses: { subagentId: string; taskId: string; status: string; assigned: boolean }[];\n };\n /**\n * Git-worktree lifecycle, emitted by WorktreeManager. AutoPhase allocates one\n * worktree per phase so parallelizable phases run isolated, then merges them\n * back sequentially. The WebUI/TUI subscribe to render live swim-lanes/DAG.\n */\n 'worktree.allocated': {\n handleId: string;\n ownerId: string;\n ownerLabel: string;\n slug: string;\n dir: string;\n branch: string;\n baseBranch: string;\n };\n 'worktree.committed': {\n handleId: string;\n ownerId: string;\n branch: string;\n committed: boolean;\n insertions: number;\n deletions: number;\n files: number;\n sha?: string;\n };\n 'worktree.merged': {\n handleId: string;\n ownerId: string;\n branch: string;\n baseBranch: string;\n squash: boolean;\n };\n 'worktree.conflict': {\n handleId: string;\n ownerId: string;\n branch: string;\n conflictFiles: string[];\n };\n 'worktree.released': { handleId: string; ownerId: string; branch: string; kept: boolean };\n 'worktree.failed': { handleId: string; ownerId: string; branch?: string; error: string };\n error: { err: Error; phase: string };\n}\n\nexport type EventName = keyof EventMap;\nexport type Listener<E extends EventName> = (payload: EventMap[E]) => void;\n\nexport interface EventLogger {\n error(msg: string, ctx?: unknown): void;\n}\n\nexport class EventBus {\n private readonly listeners = new Map<EventName, Set<Listener<EventName>>>();\n private readonly wildcards: Array<{\n match: (event: string) => boolean;\n fn: (event: string, payload: unknown) => void;\n }> = [];\n private logger?: EventLogger;\n\n setLogger(logger: EventLogger): void {\n this.logger = logger;\n }\n\n on<E extends EventName>(event: E, fn: Listener<E>): () => void {\n let set = this.listeners.get(event);\n if (!set) {\n set = new Set();\n this.listeners.set(event, set);\n }\n set.add(fn as Listener<EventName>);\n return () => this.off(event, fn);\n }\n\n off<E extends EventName>(event: E, fn: Listener<E>): void {\n this.listeners.get(event)?.delete(fn as Listener<EventName>);\n }\n\n once<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const wrapper: Listener<E> = (payload) => {\n this.off(event, wrapper as Listener<EventName>);\n (fn as Listener<E>)(payload);\n };\n this.on(event, wrapper as Listener<E>);\n return () => {\n this.off(event, wrapper as Listener<EventName>);\n };\n }\n\n /**\n * Subscribe to all events, regardless of name. Short-hand for\n * `onPattern('*')`. Use for logging, debugging, or forwarding every\n * event to another bus (as FleetBus does).\n *\n * Returns an unsubscribe function.\n */\n onAny(fn: (event: string, payload: unknown) => void): () => void {\n return this.onPattern('*', fn);\n }\n\n /**\n * Subscribe to all events whose name matches a glob-style prefix.\n * `'tool.*'` matches `tool.started`, `tool.executed`, `tool.progress`, etc.\n * `'*'` matches every event.\n *\n * The handler receives `(eventName, payload)` with the event name as a\n * string and the payload as `unknown`. Use for logging, debugging, or\n * metrics collection across a family of events.\n *\n * Returns an unsubscribe function.\n */\n onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\n const match = makePatternMatcher(pattern);\n const entry = { match, fn };\n this.wildcards.push(entry);\n return () => {\n const idx = this.wildcards.indexOf(entry);\n if (idx >= 0) this.wildcards.splice(idx, 1);\n };\n }\n\n /**\n * Subscribe to all events whose name matches a RegExp.\n * More flexible than `onPattern` — use when you need regex features\n * (alternation, character classes, capture groups).\n *\n * Returns an unsubscribe function.\n */\n onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\n const entry = { match: (e: string) => regex.test(e), fn };\n this.wildcards.push(entry);\n return () => {\n const idx = this.wildcards.indexOf(entry);\n if (idx >= 0) this.wildcards.splice(idx, 1);\n };\n }\n\n emit<E extends EventName>(event: E, payload: EventMap[E]): void {\n const set = this.listeners.get(event);\n if (set) {\n for (const fn of set) {\n try {\n (fn as Listener<E>)(payload);\n } catch (err) {\n this.logger?.error(`EventBus listener for \"${event}\" threw`, err);\n }\n }\n }\n // Wildcard listeners — snapshot the array first so a listener that\n // subscribes another pattern (via onPattern/onRegex) doesn't see\n // inconsistent behavior across JS engines. ECMA leaves mid-iteration\n // array mutation under-specified; this keeps us engine-portable.\n if (this.wildcards.length > 0) {\n const name = event as string;\n const snapshot = this.wildcards.slice();\n for (const { match, fn } of snapshot) {\n if (!match(name)) continue;\n try {\n fn(name, payload);\n } catch (err) {\n this.logger?.error(`EventBus wildcard listener for \"${name}\" threw`, err);\n }\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n this.wildcards.length = 0;\n }\n\n /**\n * V2-D: introspection helper. Pass an `event` to count handlers for a\n * single key, or omit to get the total across every event. Used by the\n * leak-detection smoke test to flag handler accumulation across runs.\n * Does NOT include wildcard listeners.\n */\n listenerCount(event?: EventName): number {\n if (event !== undefined) return this.listeners.get(event)?.size ?? 0;\n let total = 0;\n for (const set of this.listeners.values()) total += set.size;\n return total;\n }\n\n /**\n * Number of wildcard listeners currently registered.\n */\n wildcardCount(): number {\n return this.wildcards.length;\n }\n\n /**\n * True if anything would receive an emit for `event` — a named listener\n * OR a wildcard/regex pattern that matches the event name. Unlike\n * `listenerCount`, this DOES account for wildcards, so callers that gate\n * behavior on \"is anyone listening?\" (e.g. SubagentBudget deciding whether\n * to negotiate a soft limit vs hard-stop) don't misfire when the only\n * subscriber is a pattern listener like the FleetBus's `onPattern('*')`.\n */\n hasListenerFor(event: string): boolean {\n if ((this.listeners.get(event as EventName)?.size ?? 0) > 0) return true;\n return this.wildcards.some((w) => w.match(event));\n }\n}\n\n// ── Scoped EventBus ─────────────────────────────────────────────────────────────\n\n/**\n * A decorator over `EventBus` that records every listener registration\n * (`.on`, `.once`, `.onPattern`, `.onRegex`) so that `teardown()` can\n * remove all of them at once — preventing the memory leaks that occur\n * when dynamic plugins or long-lived TUI/WebUI interfaces forget to\n * call `.off()` during session termination.\n *\n * Usage:\n * ```ts\n * const bus = new ScopedEventBus();\n * bus.on('tool.executed', handler1); // tracked\n * bus.on('provider.response', handler2); // tracked\n * bus.onPattern('subagent.*', handler3); // tracked\n * // ... later, when the plugin or session is torn down:\n * bus.teardown(); // removes all three listeners\n * ```\n *\n * Also implements `Disposable` (via `[Symbol.dispose]`) for use with\n * the `using` keyword in Node ≥ 22, or can be used manually with\n * `bus.teardown()`.\n */\nexport class ScopedEventBus extends EventBus {\n // Track registrations by a unique counter key so that EventBus.once()'s\n // internal listener-removal doesn't affect our tracking (once removes the\n // fn from EventBus but we still need to call our unsub during teardown).\n private readonly registrations = new Map<number, () => void>();\n private nextKey = 0;\n\n /**\n * Identical to `EventBus.on` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override on<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const key = this.nextKey++;\n const unsub = super.on(event, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.once` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n *\n * Uses EventBus's public API directly to avoid triggering our own `on()`\n * override (which would consume a key slot for the wrapper, then orphan\n * our registration entry under a different key).\n *\n * When the wrapper fires, it cleans up BOTH the underlying EventBus\n * listener AND the tracking entry — so `scopedListenerCount` returns to\n * its pre-`once()` value without requiring the caller to invoke the\n * returned unsubscribe. The returned `unsub` is still safe to call\n * after auto-removal (its delete is a no-op and its off() finds\n * nothing to remove).\n */\n override once<E extends EventName>(event: E, fn: Listener<E>): () => void {\n const key = this.nextKey++;\n const wrapper: Listener<E> = (payload) => {\n // Bypass ScopedEventBus.on() — go straight to EventBus.off() so we\n // don't recurse and don't consume another key.\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\n // Drop the tracking entry so scopedListenerCount is honest. Done\n // before calling `fn` so a handler that calls scopedListenerCount\n // mid-fire sees the post-removal state.\n this.registrations.delete(key);\n (fn as Listener<E>)(payload);\n };\n // Use the EventBus prototype directly to register without triggering\n // ScopedEventBus.on() which would consume a second key.\n EventBus.prototype.on.call(this, event, wrapper as Listener<EventName>);\n const unsub = () => {\n this.registrations.delete(key);\n EventBus.prototype.off.call(this, event, wrapper as Listener<EventName>);\n };\n this.registrations.set(key, unsub);\n return unsub;\n }\n\n /**\n * Subscribe to all events. Alias for `onPattern('*')` — the listener is\n * tracked so that `teardown()` will remove it automatically.\n */\n override onAny(fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n // Call EventBus.onPattern directly so the wrapper-consumption in\n // ScopedEventBus.on() doesn't re-enter and create a second registration slot.\n const unsub = EventBus.prototype.onPattern.call(this, '*', fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.onPattern` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override onPattern(pattern: string, fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n const unsub = super.onPattern(pattern, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Identical to `EventBus.onRegex` but the listener is tracked so that\n * `teardown()` will remove it automatically.\n */\n override onRegex(regex: RegExp, fn: (event: string, payload: unknown) => void): () => void {\n const key = this.nextKey++;\n const unsub = super.onRegex(regex, fn);\n this.registrations.set(key, unsub);\n return () => {\n this.registrations.delete(key);\n unsub();\n };\n }\n\n /**\n * Remove every listener that was registered through this scoped bus.\n * Idempotent — calling it multiple times is safe.\n *\n * Also available as `[Symbol.dispose]` for explicit resource management:\n * ```ts\n * using scope = new ScopedEventBus();\n * scope.on('tool.executed', handler);\n * // automatically teardown()'d when scope exits\n * ```\n */\n teardown(): void {\n for (const unsub of this.registrations.values()) {\n try {\n unsub();\n } catch {\n /* ignore — best effort */\n }\n }\n this.registrations.clear();\n this.clear();\n }\n\n /** Alias for `teardown()` — enables `using new ScopedEventBus()` in Node ≥ 22. */\n [Symbol.dispose](): void {\n this.teardown();\n }\n\n /** Number of tracked registrations. */\n get scopedListenerCount(): number {\n return this.registrations.size;\n }\n}\n\n/**\n * Convert a glob-style pattern to a matcher function.\n * Only supports `*` at the end of a prefix — `'tool.*'` becomes\n * \"starts with tool.\". `'*'` matches everything.\n */\nfunction makePatternMatcher(pattern: string): (event: string) => boolean {\n if (pattern === '*') return () => true;\n if (pattern.endsWith('.*')) {\n const prefix = pattern.slice(0, -2);\n return (e: string) => e.startsWith(`${prefix}.`);\n }\n // Exact match fallback\n return (e: string) => e === pattern;\n}\n","import type { BrainArbiter } from '../coordination/brain.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ConfigLoader, ConfigStore } from '../types/config.js';\nimport type { ErrorHandler } from '../types/error-handler.js';\nimport type { InputReader } from '../types/input-reader.js';\nimport type { Logger } from '../types/logger.js';\nimport type { MemoryStore } from '../types/memory.js';\nimport type { ModeStore } from '../types/mode.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\nimport type { PathResolver } from '../types/path-resolver.js';\nimport type { PermissionPolicy } from '../types/permission.js';\nimport type { ProviderRunner } from '../types/provider-runner.js';\nimport type { Renderer } from '../types/renderer.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\nimport type { SessionStore } from '../types/session.js';\nimport type { SkillLoader } from '../types/skill.js';\nimport type { SystemPromptBuilder } from '../types/system-prompt.js';\nimport type { TokenCounter } from '../types/token-counter.js';\nimport type { WorktreeManager } from '../worktree/worktree-manager.js';\nimport type { Token } from './container.js';\n\nconst t = <T>(name: string): Token<T> => Symbol(name) as Token<T>;\n\nexport const TOKENS = {\n Logger: t<Logger>('Logger'),\n TokenCounter: t<TokenCounter>('TokenCounter'),\n SessionStore: t<SessionStore>('SessionStore'),\n MemoryStore: t<MemoryStore>('MemoryStore'),\n PermissionPolicy: t<PermissionPolicy>('PermissionPolicy'),\n Compactor: t<Compactor>('Compactor'),\n PathResolver: t<PathResolver>('PathResolver'),\n ConfigLoader: t<ConfigLoader>('ConfigLoader'),\n ConfigStore: t<ConfigStore>('ConfigStore'),\n Renderer: t<Renderer>('Renderer'),\n InputReader: t<InputReader>('InputReader'),\n ErrorHandler: t<ErrorHandler>('ErrorHandler'),\n RetryPolicy: t<RetryPolicy>('RetryPolicy'),\n SkillLoader: t<SkillLoader>('SkillLoader'),\n SystemPromptBuilder: t<SystemPromptBuilder>('SystemPromptBuilder'),\n SecretScrubber: t<SecretScrubber>('SecretScrubber'),\n ModelsRegistry: t<ModelsRegistry>('ModelsRegistry'),\n ModeStore: t<ModeStore>('ModeStore'),\n /** Replaces the entire provider call layer — retry, streaming, tracing. */\n ProviderRunner: t<ProviderRunner>('ProviderRunner'),\n /** Optional git-worktree lifecycle manager (per-phase isolation in AutoPhase). */\n WorktreeManager: t<WorktreeManager>('WorktreeManager'),\n /** Optional global Brain arbiter for policy/decision escalation. */\n BrainArbiter: t<BrainArbiter>('BrainArbiter'),\n} as const;\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"]}
|
package/dist/models/index.js
CHANGED
|
@@ -254,12 +254,12 @@ var DefaultModelsRegistry = class {
|
|
|
254
254
|
*/
|
|
255
255
|
async loadOverlay(opts = {}) {
|
|
256
256
|
if (this.overlayPayload && !opts.force) return this.overlayPayload;
|
|
257
|
-
if (this.overlay) {
|
|
257
|
+
if (hasEntries(this.overlay)) {
|
|
258
258
|
this.overlayPayload = this.overlay;
|
|
259
259
|
return this.overlayPayload;
|
|
260
260
|
}
|
|
261
261
|
const fetched = await this.loadOverlayFromUrl(opts);
|
|
262
|
-
if (fetched) {
|
|
262
|
+
if (hasEntries(fetched)) {
|
|
263
263
|
this.overlayPayload = fetched;
|
|
264
264
|
return fetched;
|
|
265
265
|
}
|
|
@@ -386,6 +386,9 @@ var DefaultModelsRegistry = class {
|
|
|
386
386
|
return path3.resolve(this.cacheFile);
|
|
387
387
|
}
|
|
388
388
|
};
|
|
389
|
+
function hasEntries(payload) {
|
|
390
|
+
return payload !== void 0 && Object.keys(payload).length > 0;
|
|
391
|
+
}
|
|
389
392
|
|
|
390
393
|
// src/types/mode.ts
|
|
391
394
|
var DEFAULT_MODES = [
|