@wrongstack/core 0.272.1 → 0.273.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/{agent-bridge-DFQYEeXf.d.ts → agent-bridge-BZ2enORi.d.ts} +1 -1
  2. package/dist/{agent-subagent-runner-BZa_IEcd.d.ts → agent-subagent-runner-ehb4xGvd.d.ts} +11 -4
  3. package/dist/{brain-etbcbRwV.d.ts → brain-BxN2k2HP.d.ts} +101 -0
  4. package/dist/{config-rRS8yorV.d.ts → config-C8IYxlO8.d.ts} +8 -1
  5. package/dist/coordination/index.d.ts +13 -13
  6. package/dist/coordination/index.js +79 -25
  7. package/dist/coordination/index.js.map +1 -1
  8. package/dist/{default-config-B0cj-Hry.d.ts → default-config-BbX4ojZs.d.ts} +1 -0
  9. package/dist/defaults/index.d.ts +20 -19
  10. package/dist/defaults/index.js +2813 -206
  11. package/dist/defaults/index.js.map +1 -1
  12. package/dist/execution/index.d.ts +10 -10
  13. package/dist/execution/index.js +8 -2
  14. package/dist/execution/index.js.map +1 -1
  15. package/dist/extension/index.d.ts +4 -4
  16. package/dist/{global-mailbox-DJ4EoRr0.d.ts → global-mailbox-C9dsc9Y_.d.ts} +1 -1
  17. package/dist/{goal-preamble-hM8BH7TK.d.ts → goal-preamble-NhflDjYb.d.ts} +6 -6
  18. package/dist/{goal-store-CWlbT0TO.d.ts → goal-store-Cx363x7Z.d.ts} +1 -1
  19. package/dist/hq/index.d.ts +4 -4
  20. package/dist/hq/index.js +1 -0
  21. package/dist/hq/index.js.map +1 -1
  22. package/dist/{index-DWm_PE9L.d.ts → index-B7fHDt0B.d.ts} +12 -4
  23. package/dist/{index-2Lhk5v0o.d.ts → index-BbVprU-9.d.ts} +6 -0
  24. package/dist/index.d.ts +194 -33
  25. package/dist/index.js +3222 -681
  26. package/dist/index.js.map +1 -1
  27. package/dist/infrastructure/index.d.ts +4 -4
  28. package/dist/kernel/index.d.ts +94 -14
  29. package/dist/kernel/index.js.map +1 -1
  30. package/dist/{mcp-servers-BpWHTKlE.d.ts → mcp-servers-B6fSRNC1.d.ts} +1 -1
  31. package/dist/models/index.d.ts +3 -3
  32. package/dist/{models-registry-CXQFUn5t.d.ts → models-registry-4C6Wr91w.d.ts} +1 -1
  33. package/dist/{multi-agent-coordinator-jyimfo7D.d.ts → multi-agent-coordinator-q1skFeNP.d.ts} +1 -1
  34. package/dist/{null-fleet-bus-DOGQcvrY.d.ts → null-fleet-bus-C9rrgQwc.d.ts} +15 -5
  35. package/dist/observability/index.d.ts +1 -1
  36. package/dist/{parallel-eternal-engine-rItJBYp9.d.ts → parallel-eternal-engine-CtXly2Sf.d.ts} +7 -6
  37. package/dist/{path-resolver-DrpF5MGK.d.ts → path-resolver-Bim6G5Jz.d.ts} +2 -2
  38. package/dist/{pipeline-Ckkn3AOA.d.ts → pipeline-CNVKuQDQ.d.ts} +1 -1
  39. package/dist/{plan-templates-BvHw5Znw.d.ts → plan-templates-C4wXMmiM.d.ts} +3 -3
  40. package/dist/{provider-model-resolve-nZqnCeaR.d.ts → provider-model-resolve-DFd3IPpw.d.ts} +1 -1
  41. package/dist/{provider-runner-zVOn1p67.d.ts → provider-runner-BpM0mdBE.d.ts} +1 -1
  42. package/dist/sdd/index.d.ts +1111 -11
  43. package/dist/sdd/index.js +5516 -2949
  44. package/dist/sdd/index.js.map +1 -1
  45. package/dist/security/index.d.ts +1 -1
  46. package/dist/security/index.js +6 -0
  47. package/dist/security/index.js.map +1 -1
  48. package/dist/storage/index.d.ts +8 -8
  49. package/dist/storage/index.js +3 -2
  50. package/dist/storage/index.js.map +1 -1
  51. package/dist/tools/index.d.ts +1 -1
  52. package/dist/tools/index.js.map +1 -1
  53. package/dist/types/index.d.ts +14 -14
  54. package/dist/types/index.js +3 -0
  55. package/dist/types/index.js.map +1 -1
  56. package/dist/utils/index.d.ts +30 -4
  57. package/dist/utils/index.js +110 -1
  58. package/dist/utils/index.js.map +1 -1
  59. package/dist/{index-DqW4o62H.d.ts → worktree-manager-BDuXTaWL.d.ts} +48 -90
  60. package/dist/{wstack-paths-hOpNLmvf.d.ts → wstack-paths-BqkDAkoh.d.ts} +2 -0
  61. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/assert-never.ts","../../src/utils/atomic-write.ts","../../src/utils/child-env.ts","../../src/utils/term.ts","../../src/utils/color.ts","../../src/utils/config-json.ts","../../src/utils/context-evidence.ts","../../src/utils/deep-merge.ts","../../src/utils/diff.ts","../../src/utils/error.ts","../../src/utils/expect-defined.ts","../../src/utils/glob-expand.ts","../../src/utils/glob-match.ts","../../src/utils/ip-guard.ts","../../src/utils/json-repair.ts","../../src/utils/json-schema-validate.ts","../../src/utils/merge-custom-models.ts","../../src/utils/merge-models-payload.ts","../../src/utils/message-invariants.ts","../../src/utils/newline-normalize.ts","../../src/utils/regex-guard.ts","../../src/utils/safe-json.ts","../../src/utils/sleep.ts","../../src/utils/string.ts","../../src/utils/task-format.ts","../../src/utils/todos-format.ts","../../src/utils/tool-subject.ts","../../src/utils/tool-wire-compact.ts","../../src/utils/token-estimate.ts","../../src/utils/tool-output-serializer.ts","../../src/utils/wstack-paths.ts"],"names":["path","stat","resolve","open","fs2","path2","isAbsolute","walk","fsp","isRecord","projectHash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Exhaustiveness check for discriminated union switches.\n * Place in the `default` branch of a switch over a union type\n * to get a compile-time error when a new variant is added.\n *\n * @example\n * switch (block.type) {\n * case 'text': return renderText(block);\n * case 'tool_use': return renderToolUse(block);\n * default: return assertNever(block);\n * }\n */\nexport function assertNever(x: never, message?: string): never {\n const err = new Error(\n message ?? `Unhandled case: ${JSON.stringify(x)}`,\n );\n err.name = 'AssertNeverError';\n throw err;\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOENT means the directory was deleted (e.g. by concurrent cleanup).\n // Recreate it and retry acquiring the lock.\n if (code === 'ENOENT') {\n await fs.mkdir(dir, { recursive: true });\n continue;\n }\n if (code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new Error(`Timed out waiting for file lock: ${targetPath}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","/**\n * Build a sanitized child-process environment.\n *\n * The bash/exec tools and MCP stdio transports execute LLM-generated or\n * configured commands. The parent process carries provider API keys\n * (ANTHROPIC_API_KEY, OPENAI_API_KEY, ...), VCS tokens (GITHUB_TOKEN),\n * and cloud credentials. Forwarding those to a child is an exfiltration\n * vector even with `permission: 'confirm'` — a compromised MCP server\n * or a cleverly composed shell pipeline can leak secrets.\n *\n * Strategy: copy a small, explicit allowlist of variables that real builds\n * need, then copy anything else that does NOT look secret-bearing. This\n * preserves user-friendly behavior (locale, terminal, npm config) while\n * blocking the obvious leak channels. Two value-side guards back up the\n * name-based filter:\n * - any value carrying an embedded URI credential (`scheme://user:pass@host`,\n * e.g. `DATABASE_URL`/`REDIS_URL`/`*_DSN`) is dropped (WS-01);\n * - `NODE_OPTIONS` is forwarded but with module-preload directives\n * (`--require`/`--import`/`--loader`) stripped so a parent-set value can't\n * inject code into node children (WS-02).\n *\n * Override with `WRONGSTACK_CHILD_ENV_PASSTHROUGH=1` to forward the full\n * parent environment unchanged (opt-in for advanced users who understand\n * the risk).\n */\n\nconst ALLOWED_KEYS = new Set<string>([\n 'PATH',\n 'HOME',\n 'USER',\n 'USERNAME',\n 'LOGNAME',\n 'SHELL',\n 'LANG',\n 'LC_ALL',\n 'LC_CTYPE',\n 'TERM',\n 'TZ',\n 'TMPDIR',\n 'TEMP',\n 'TMP',\n 'PWD',\n 'OLDPWD',\n 'COMSPEC',\n 'SYSTEMROOT',\n 'SYSTEMDRIVE',\n 'WINDIR',\n 'PROGRAMFILES',\n 'PROGRAMFILES(X86)',\n 'PROGRAMDATA',\n 'APPDATA',\n 'LOCALAPPDATA',\n 'USERPROFILE',\n 'PUBLIC',\n 'PATHEXT',\n]);\n\n// Substring match against env-var names (case-insensitive). Bias toward\n// false-positives — a missing var is recoverable, an exfiltrated key is not.\n// Only consulted for vars NOT on the curated allowlist; PWD/PASSWD-style\n// false positives there are avoided by checking allowlist first.\nconst SECRET_NAME_PARTS = [\n 'TOKEN',\n 'SECRET',\n 'PASSWORD',\n 'PASSWD',\n 'AUTH',\n 'CRED',\n 'BEARER',\n 'COOKIE',\n 'PRIVATE',\n];\n\nfunction looksSecret(name: string): boolean {\n const upper = name.toUpperCase();\n for (const p of SECRET_NAME_PARTS) {\n if (upper.includes(p)) return true;\n }\n // KEY is tricky — PUBLIC_KEY is fine to forward but most _KEY vars are\n // secrets. Require word boundary so KEYBOARD_LAYOUT etc. are not flagged.\n if (/(?:^|_)KEY(?:$|_|S$)/i.test(upper)) return true;\n if (/API[_-]?KEY/i.test(upper)) return true;\n if (/ACCESS[_-]?KEY/i.test(upper)) return true;\n if (/SESSION[_-]?ID/i.test(upper) === false && /SESSION/i.test(upper)) {\n // SESSION_ID is metadata (we set our own); other SESSION_* often holds\n // session cookies. Be conservative.\n return true;\n }\n return false;\n}\n\n/**\n * Value-side secret detection (WS-01). The name-based `looksSecret` filter\n * misses connection-string variables whose NAME is innocuous but whose VALUE\n * embeds a password — e.g. `DATABASE_URL=postgres://user:pass@host`,\n * `REDIS_URL=redis://:pass@host`, `MONGO_URI`, `AMQP_URL`, `*_DSN`. Forwarding\n * these to a child (bash/exec/MCP server) leaks the embedded credential.\n *\n * Matches a URI userinfo component that contains a password, i.e.\n * `scheme://[user]:<password>@host`. Deliberately precise: a credential-free\n * URL (`https://api.example.com`, `https://user@host` with no password) is NOT\n * matched, so non-secret `*_URL` knobs (registries, endpoints) still forward.\n */\nfunction valueHasEmbeddedCredential(value: string): boolean {\n // scheme:// then optional user, a ':' , a non-empty password, then '@'.\n // Userinfo chars stop at '/', whitespace, ':' (separator) and '@'.\n return /\\b[a-z][a-z0-9+.-]*:\\/\\/[^/\\s:@]*:[^/\\s@]+@/i.test(value);\n}\n\n/**\n * Code-injection directives that turn `NODE_OPTIONS` into an RCE channel by\n * preloading an arbitrary module into every node child process (WS-02).\n */\nconst NODE_OPTIONS_INJECTION_FLAG =\n /^(?:--require|-r|--import|--loader|--experimental-loader)$/;\nconst NODE_OPTIONS_INJECTION_FLAG_EQ =\n /^(?:--require|-r|--import|--loader|--experimental-loader)=/;\n\n/**\n * Strip module-preload directives from a `NODE_OPTIONS` value while preserving\n * benign flags (`--no-warnings`, `--max-old-space-size=…`, etc.). Handles both\n * the `--require=./x.js` and space-separated `--require ./x.js` forms. Returns\n * the sanitized string (possibly empty).\n */\nexport function sanitizeNodeOptions(value: string): string {\n const tokens = value.split(/\\s+/).filter(Boolean);\n const kept: string[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const tok = tokens[i] as string;\n if (NODE_OPTIONS_INJECTION_FLAG_EQ.test(tok)) continue; // --require=./x\n if (NODE_OPTIONS_INJECTION_FLAG.test(tok)) {\n i++; // also drop the following path token (--require ./x)\n continue;\n }\n kept.push(tok);\n }\n return kept.join(' ');\n}\n\nexport interface BuildChildEnvOptions {\n /** Session ID to inject as WRONGSTACK_SESSION_ID. */\n sessionId?: string | undefined;\n /** Additional env vars to merge (takes priority over filtered parent env). */\n extra?: NodeJS.ProcessEnv | undefined;\n}\n\n/**\n * Build a filtered child-process environment suitable for bash, exec, and\n * MCP server subprocesses. Strips API keys, tokens, and other credentials\n * while preserving system/tooling variables.\n */\nexport function buildChildEnv(optsOrSessionId?: BuildChildEnvOptions | string): NodeJS.ProcessEnv {\n const opts: BuildChildEnvOptions =\n typeof optsOrSessionId === 'string'\n ? { sessionId: optsOrSessionId }\n : (optsOrSessionId ?? {});\n\n // WRONGSTACK_CHILD_ENV_PASSTHROUGH may NOT be set via config file.\n // It is a privileged override that opt-outs the entire credential filter\n // and must only be set by the operator's shell environment (real env var,\n // not something a config file injects into process.env). Config-file\n // sources do NOT go through process.env — only the actual shell environment\n // does — so checking Object.prototype.hasOwnProperty.call(process.env, ...)\n // is sufficient to exclude config-driven values.\n const hasOwn = Object.hasOwn(process.env, 'WRONGSTACK_CHILD_ENV_PASSTHROUGH');\n const legacyHasOwn = Object.hasOwn(process.env, 'WRONGSTACK_BASH_ENV_PASSTHROUGH');\n const passthrough = (hasOwn && process.env['WRONGSTACK_CHILD_ENV_PASSTHROUGH'] === '1')\n || (legacyHasOwn && process.env['WRONGSTACK_BASH_ENV_PASSTHROUGH'] === '1');\n if (passthrough && !process.env['CI']) {\n console.warn(\n '[agent] WARNING: WRONGSTACK_*_ENV_PASSTHROUGH=1 is active —\\n' +\n ' all parent env vars (including API keys) forwarded to child processes.\\n' +\n ' Do not use on shared or multi-tenant systems.'\n );\n }\n const out: NodeJS.ProcessEnv = {};\n\n // The CLI entry defaults NODE_ENV=production (so React/Ink resolve their\n // production builds — see cli-main) and marks the injection with this\n // flag. The injected value must NOT reach children: NODE_ENV=production\n // makes `pnpm install` skip devDependencies and flips test-runner\n // behavior. Strip both vars whenever the flag says wrongstack set them —\n // a NODE_ENV genuinely exported by the operator's shell (flag absent)\n // is forwarded unchanged. Applies in passthrough mode too: passthrough\n // means \"the operator's real environment\", which this value is not.\n const nodeEnvDefaulted = process.env['WRONGSTACK_NODE_ENV_DEFAULTED'] === '1';\n\n for (const [k, v] of Object.entries(process.env)) {\n if (v === undefined) continue;\n if (nodeEnvDefaulted && (k === 'NODE_ENV' || k === 'WRONGSTACK_NODE_ENV_DEFAULTED')) continue;\n if (passthrough) {\n out[k] = v;\n continue;\n }\n const upper = k.toUpperCase();\n // 0. Strip any value with an embedded URI credential (user:pass@host),\n // regardless of the variable name (WS-01). Applied before the allowlist\n // so even a \"system\" name carrying a connection string is caught.\n if (valueHasEmbeddedCredential(v)) continue;\n // 1. Forward names on the explicit allowlist — these are well-known\n // non-secret system variables (PATH, HOME, LANG, ...).\n if (ALLOWED_KEYS.has(upper)) {\n out[k] = v;\n continue;\n }\n // 2. Strip anything that looks like a secret.\n if (looksSecret(upper)) continue;\n // NODE_OPTIONS is forwarded (builds rely on flags like --no-warnings) but\n // module-preload directives (--require/--import/--loader) are stripped —\n // they would let a parent-set NODE_OPTIONS inject code into every node\n // child (WS-02 defense-in-depth).\n if (upper === 'NODE_OPTIONS') {\n const sanitized = sanitizeNodeOptions(v);\n if (sanitized) out[k] = sanitized;\n continue;\n }\n // 3. Forward tooling-prefixed vars that builds commonly need, unless\n // they already failed the secret check above.\n if (\n upper.startsWith('NODE_') ||\n upper.startsWith('NPM_') ||\n upper.startsWith('PNPM_') ||\n upper.startsWith('YARN_') ||\n upper.startsWith('GIT_') ||\n upper.startsWith('CI') ||\n upper.startsWith('XDG_') ||\n // Our own non-secret knobs (WRONGSTACK_HOME, WRONGSTACK_SESSION_ID, …).\n // Secrets never live in WRONGSTACK_* env vars (they're in the encrypted\n // vault). Forwarding keeps child wstack processes — e.g. ones spawned\n // by the test suite — inside the same redirected global root.\n upper.startsWith('WRONGSTACK_') ||\n upper === 'EDITOR' ||\n upper === 'VISUAL' ||\n upper === 'PAGER'\n ) {\n out[k] = v;\n }\n }\n\n // Merge explicit extras AFTER filtering. Callers MUST treat `opts.extra`\n // as a small, user-authored allowlist (e.g. MCP server tokens, LSP env\n // overrides from config). Do NOT pass `process.env` or any object derived\n // from it — that would defeat the parent-env scrub above. The secret\n // filter is intentionally skipped here so legitimate secret-bearing\n // tokens the user explicitly configured can still reach the child.\n if (opts.extra) {\n Object.assign(out, opts.extra);\n }\n\n if (opts.sessionId) out['WRONGSTACK_SESSION_ID'] = opts.sessionId;\n return out;\n}\n","/**\n * TTY detection helpers — the single source of truth for \"is this process\n * running against a real terminal?\". Replaces ad-hoc `process.stdin.isTTY`\n * / `process.stdout.isTTY` checks scattered across the codebase so that:\n *\n * 1. test code can mock a single module instead of stubbing `isTTY` on\n * every ReadStream/WriteStream the test happens to touch;\n * 2. a future TTY-detection source (an env var override, a Windows\n * ConPTY workaround, …) lands in one place;\n * 3. `isInteractive()` encodes the rule the project already used inline\n * (\"both streams are TTYs AND we're not running under CI\") in one\n * testable helper instead of the same 3-condition check in two\n * different files.\n *\n * Scope: detection only. Raw-mode control (`setRawMode`), resize\n * subscriptions, and write-injection belong to a future, larger TTY\n * abstraction; this module is the smallest pull that gives us a\n * testable seam and dedups 20+ call sites.\n */\n\nconst hasStdout = (): boolean => typeof process !== 'undefined' && !!process.stdout;\nconst hasStdin = (): boolean => typeof process !== 'undefined' && !!process.stdin;\n\n/** True when `process.stdout` is attached to a terminal (not a pipe/file). */\nexport function isStdoutTTY(): boolean {\n return hasStdout() && Boolean(process.stdout.isTTY);\n}\n\n/** True when `process.stdin` is attached to a terminal (not a pipe/file). */\nexport function isStdinTTY(): boolean {\n return hasStdin() && Boolean(process.stdin.isTTY);\n}\n\n/**\n * True when the current process is an interactive session: both stdin and\n * stdout are TTYs. Callers that also need a \"not a single-shot invocation\"\n * or \"not under CI\" check should layer that on top — keeping this helper\n * minimal preserves the original inline checks it replaces.\n */\nexport function isInteractive(): boolean {\n return isStdinTTY() && isStdoutTTY();\n}\n\n/** Current terminal size in characters, with a 24×80 fallback for non-TTYs. */\nexport function getTermSize(): { rows: number; cols: number } {\n if (!hasStdout()) return { rows: 24, cols: 80 };\n return {\n rows: process.stdout.rows ?? 24,\n cols: process.stdout.columns ?? 80,\n };\n}\n\n/**\n * Subscribe to terminal resize events. `cb` is called with the new size each\n * time the underlying stream emits `resize`. Returns a cleanup function the\n * caller MUST call on dispose to remove the listener — leaving a stale\n * `resize` listener on a disposed component leaks the closure (and the\n * component itself, transitively) until the process exits.\n *\n * The stream argument defaults to `process.stdout`. Pass an explicit\n * `NodeJS.WriteStream` when the caller already owns one (e.g. a status line\n * that targets an injected `out` for testability). For non-TTY streams no\n * listener is registered and the returned cleanup is a no-op.\n */\nexport function onResize(\n cb: (size: { rows: number; cols: number }) => void,\n stream: NodeJS.WriteStream = process.stdout,\n): () => void {\n if (!stream || typeof stream.on !== 'function') return () => {};\n const handler = (): void => {\n cb({\n rows: stream.rows ?? 24,\n cols: stream.columns ?? 80,\n });\n };\n stream.on('resize', handler);\n return () => {\n stream.off('resize', handler);\n };\n}\n\n/**\n * Toggle raw mode on a TTY stdin stream. Returns `true` when the toggle was\n * applied, `false` when the stream is null, not a TTY, or doesn't expose\n * `setRawMode` (pipes, file descriptors, Windows ConPTY edge cases). Callers\n * that need to restore the previous mode should snapshot `input.isRaw`\n * BEFORE the call and pass the value to a second call to flip back.\n *\n * Use this helper to drop the now-redundant\n * `if (input.isTTY) input.setRawMode(...)` ceremony at every call site.\n */\nexport function setRawMode(input: NodeJS.ReadStream, mode: boolean): boolean {\n if (input?.isTTY !== true) return false;\n if (typeof input.setRawMode !== 'function') return false;\n input.setRawMode(mode);\n return true;\n}\n\n/**\n * Bracket installed by the interactive input reader while a `readline`\n * prompt is on screen. Out-of-band terminal writes — logger WARN/INFO\n * lines, async activity from the Telegram bridge, etc. — go to the same\n * physical terminal as the half-typed prompt but readline has no idea they\n * happened, so it never repaints. The result is the classic corruption the\n * user sees: every async line strands the in-progress draft as a fresh\n * scrollback row (sometimes with its cursor underline).\n *\n * The guard closes that gap. `suspend()` wipes the draft row so the message\n * prints clean; `resume()` repaints the prompt + draft (cursor preserved).\n * When no prompt is active the guard is `null` and writes pass straight\n * through — so agent-turn output (spinner, renderer) is untouched.\n */\nexport interface OutputLineGuard {\n /** Clear the current input row right before an out-of-band write. */\n suspend(): void;\n /** Repaint the prompt + in-progress draft right after the write. */\n resume(): void;\n}\n\nlet activeOutputGuard: OutputLineGuard | null = null;\n\n/**\n * Register (or clear, with `null`) the guard that brackets out-of-band\n * writes. Installed by {@link writeOut}/{@link writeErr} consumers — in\n * practice the CLI's readline input reader — only while a prompt is live.\n * Idempotent; the most recent caller wins.\n */\nexport function setOutputLineGuard(guard: OutputLineGuard | null): void {\n activeOutputGuard = guard;\n}\n\n/**\n * Stream-agnostic write primitive. Returns `false` when the stream is\n * missing or doesn't expose `write` so callers can degrade silently under\n * hostile host environments (closed pipe, mock injects `null`, test\n * replaces the stream with a stub).\n *\n * When an {@link OutputLineGuard} is installed (a readline prompt is on\n * screen) the write is bracketed by `suspend()`/`resume()` so the user's\n * half-typed input survives the interruption instead of being stranded in\n * scrollback. The guard's own redraw uses raw stream writes — never\n * `writeOut`/`writeErr` — so there is no re-entrancy here.\n *\n * **Not exported in the public API.** Exposed only inside `term.ts` for\n * `writeOut` / `writeErr` to share a single implementation. If a caller\n * needs to write to an arbitrary stream, they should call `writeOut` (or\n * `writeErr`) with an explicit `stream` argument — the named functions\n * are the public surface so the \"this is the standard error stream\"\n * intent stays visible at every call site.\n */\nfunction writeTo(\n s: string,\n stream: NodeJS.WriteStream | undefined,\n): boolean {\n if (!stream || typeof stream.write !== 'function') return false;\n const guard = activeOutputGuard;\n if (!guard) {\n stream.write(s);\n return true;\n }\n // A prompt is live — wipe the draft row, emit the message, repaint.\n guard.suspend();\n stream.write(s);\n guard.resume();\n return true;\n}\n\n/**\n * Write `s` to `stream` (defaults to `process.stdout`). Returns `false`\n * when the stream is missing or doesn't expose `write` so callers can\n * degrade silently under hostile host environments (closed pipe, mock\n * injects `null`, test replaces the stream with a stub).\n *\n * Why a helper:\n * 1. **Single seam for output capture in tests** — stub `writeOut` once\n * and assert on what the rest of the codebase intended to print,\n * without spying on `process.stdout.write` (which is brittle and\n * leaks across parallel test files).\n * 2. **Stream swap without grep** — routing the CLI's output to a\n * logger or `out.log` becomes a one-line change at process boot.\n * 3. **Defensive default** — closes the \"what if `process.stdout` is\n * `null`\" gap that currently exists at ~50 call sites that just\n * call `process.stdout.write(s)` and crash on certain Windows\n * redirect invocations.\n *\n * Call-site migration is staged: this commit introduces the helper, a\n * follow-up commit replaces the 50+ `process.stdout.write(...)` sites\n * with `writeOut(...)`. Until that migration lands, both forms coexist\n * and `writeOut` is the preferred form for new code.\n */\nexport function writeOut(\n s: string,\n stream: NodeJS.WriteStream = process.stdout,\n): boolean {\n return writeTo(s, stream);\n}\n\n/**\n * Symmetric partner of `writeOut` for the standard error stream. Same shape,\n * same defensive contract, same single-seam-for-tests story — just defaults to\n * `process.stderr` instead of `process.stdout`.\n *\n * Use this in code paths that emit error/diagnostic/warning text. Keeping\n * these two helpers split (rather than a single `writeTo(s, stream)`) means\n * the call site reads as a clear intent signal: \"I am writing an error\" vs.\n * \"I am writing a result\" — which matters for callers that decide between\n * stdout/stderr routing (e.g. `--quiet` flags, log-level filtering,\n * structured-log rewriters that fork on stream).\n *\n * Stderr writes from the core logger (see `infrastructure/logger.ts`) and from\n * the TUI guard (see `tui/run-tui.ts`) used to call `process.stderr.write`\n * directly. Routing them through this helper lets tests stub the stream at\n * one boundary and lets future logging middleware (e.g. a JSON-line rewriter)\n * swap the destination for the entire process in one place.\n */\nexport function writeErr(\n s: string,\n stream: NodeJS.WriteStream = process.stderr,\n): boolean {\n return writeTo(s, stream);\n}\n","import { isStdoutTTY } from './term.js';\n\nconst isColorTty = (): boolean => {\n if (envFlag(process.env.NO_COLOR)) return false;\n if (envFlag(process.env.FORCE_COLOR)) return true;\n return isStdoutTTY();\n};\n\nfunction envFlag(value: string | undefined): boolean {\n if (value === undefined) return false;\n if (value.trim() === '') return false;\n return !/^(0|false|no|off)$/i.test(value.trim());\n}\n\nconst COLOR = isColorTty();\n\nconst wrap =\n (open: string, close: string) =>\n (s: string): string =>\n COLOR ? `\\x1b[${open}m${s}\\x1b[${close}m` : s;\n\nexport const color = {\n reset: wrap('0', '0'),\n bold: wrap('1', '22'),\n dim: wrap('2', '22'),\n italic: wrap('3', '23'),\n underline: wrap('4', '24'),\n red: wrap('31', '39'),\n green: wrap('32', '39'),\n yellow: wrap('33', '39'),\n blue: wrap('34', '39'),\n magenta: wrap('35', '39'),\n cyan: wrap('36', '39'),\n gray: wrap('90', '39'),\n amber: wrap('38;5;214', '39'),\n pink: wrap('38;5;205', '39'),\n bgRed: wrap('41', '49'),\n bgGreen: wrap('42', '49'),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*[A-Za-z]/g, '');\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from './atomic-write.js';\n\nexport type JsonObject = Record<string, unknown>;\nexport type JsonPathSegment = string | number;\nexport type JsonPath = readonly JsonPathSegment[];\n\nexport async function readJsonObjectFile(filePath: string): Promise<JsonObject> {\n try {\n const parsed = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return isJsonObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nexport async function jsonObjectFileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeJsonObjectFile(filePath: string, value: JsonObject): Promise<void> {\n await atomicWrite(filePath, JSON.stringify(value, null, 2), { mode: 0o600 });\n}\n\nexport async function updateJsonObjectFile(\n filePath: string,\n mutator: (config: JsonObject) => void | JsonObject | Promise<void | JsonObject>,\n): Promise<JsonObject> {\n const config = await readJsonObjectFile(filePath);\n const maybeNext = await mutator(config);\n const next = maybeNext && isJsonObject(maybeNext) ? maybeNext : config;\n await writeJsonObjectFile(filePath, next);\n return next;\n}\n\nexport function getJsonPath(root: unknown, path: JsonPath): unknown {\n let current = root;\n for (const segment of path) {\n if (typeof segment === 'number') {\n if (!Array.isArray(current)) return undefined;\n current = current[segment];\n continue;\n }\n if (!isJsonObject(current)) return undefined;\n current = current[segment];\n }\n return current;\n}\n\nexport function setJsonPath(root: JsonObject, path: JsonPath, value: unknown): JsonObject {\n if (path.length === 0) {\n if (!isJsonObject(value)) throw new Error('Root config value must be an object');\n return value;\n }\n const parent = ensureJsonParent(root, path);\n const leaf = lastPathSegment(path);\n if (typeof leaf === 'number') {\n if (!Array.isArray(parent)) throw new Error(`Cannot set numeric segment ${leaf} on non-array parent`);\n parent[leaf] = value;\n } else {\n if (!isJsonObject(parent)) throw new Error(`Cannot set property ${leaf} on non-object parent`);\n parent[leaf] = value;\n }\n return root;\n}\n\nexport function removeJsonPath(root: JsonObject, path: JsonPath): boolean {\n if (path.length === 0) return false;\n const parent = getJsonPath(root, path.slice(0, -1));\n const leaf = lastPathSegment(path);\n if (typeof leaf === 'number') {\n if (!Array.isArray(parent) || leaf < 0 || leaf >= parent.length) return false;\n parent.splice(leaf, 1);\n return true;\n }\n if (!isJsonObject(parent) || !(leaf in parent)) return false;\n delete parent[leaf];\n return true;\n}\n\nexport async function setJsonPathInFile(filePath: string, path: JsonPath, value: unknown): Promise<JsonObject> {\n return updateJsonObjectFile(filePath, (config) => setJsonPath(config, path, value));\n}\n\nexport async function removeJsonPathInFile(filePath: string, path: JsonPath): Promise<JsonObject> {\n return updateJsonObjectFile(filePath, (config) => {\n removeJsonPath(config, path);\n });\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction lastPathSegment(path: JsonPath): JsonPathSegment {\n const segment = path[path.length - 1];\n if (segment === undefined) throw new Error('Invalid empty JSON path');\n return segment;\n}\n\nfunction ensureJsonParent(root: JsonObject, path: JsonPath): JsonObject | unknown[] {\n let current: JsonObject | unknown[] = root;\n for (let i = 0; i < path.length - 1; i += 1) {\n const segment = path[i];\n const nextSegment = path[i + 1];\n if (segment === undefined) throw new Error('Invalid empty JSON path segment');\n const nextContainer = typeof nextSegment === 'number' ? [] : {};\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current)) throw new Error(`Cannot traverse numeric segment ${segment} on non-array parent`);\n if (!isJsonObject(current[segment]) && !Array.isArray(current[segment])) current[segment] = nextContainer;\n current = current[segment] as JsonObject | unknown[];\n } else {\n if (!isJsonObject(current)) throw new Error(`Cannot traverse property ${segment} on non-object parent`);\n if (!isJsonObject(current[segment]) && !Array.isArray(current[segment])) current[segment] = nextContainer;\n current = current[segment] as JsonObject | unknown[];\n }\n }\n return current;\n}\n","import * as path from 'node:path';\nimport type { Context } from '../core/context.js';\nimport type {\n ContextEvidenceState,\n ToolOutputMetadata,\n} from '../types/context-evidence.js';\n\nconst MAX_TOOL_CALLS = 80;\nconst MAX_FACTS = 40;\nconst MAX_ERRORS = 20;\nconst MAX_DIGEST_CHARS = 4_000;\n/** Cap for the per-iteration reference scan — see markAssistantReferencedEvidence. */\nconst RECENT_TOOL_CALL_SCAN_LIMIT = 20;\n/** Cap content fed to file/symbol regex extractors (first N chars). */\nconst EXTRACT_CONTENT_CAP_CHARS = 10_000;\n/** Only scan the last N lines for error patterns — errors surface at the bottom. */\nconst EXTRACT_ERROR_TAIL_LINES = 200;\n\nconst WRITE_TOOLS = new Set(['edit', 'write', 'replace', 'patch']);\nconst READ_TOOLS = new Set(['read', 'grep', 'glob', 'ls', 'tree']);\n\nexport function createContextEvidenceState(): ContextEvidenceState {\n return {\n sessionGoals: [],\n implicitFacts: [],\n activeErrors: [],\n toolCalls: [],\n fileGraph: {},\n repeatedReads: [],\n updatedAt: Date.now(),\n };\n}\n\nexport interface RecordToolOutputEvidenceInput {\n toolUseId: string;\n toolName: string;\n input: unknown;\n content: string;\n ok: boolean;\n outputBytes?: number | undefined;\n outputTokens?: number | undefined;\n outputLines?: number | undefined;\n}\n\nexport function recordUserIntentEvidence(ctx: Context, text: string): void {\n const intent = normalizeWhitespace(text).slice(0, 700);\n if (!intent) return;\n const state = ensureEvidence(ctx);\n state.currentIntent = { text: intent, updatedAt: Date.now() };\n if (state.sessionGoals.length === 0 || isGoalish(intent)) {\n pushUniqueBounded(state.sessionGoals, intent, 8);\n }\n state.updatedAt = Date.now();\n}\n\nexport function recordToolOutputEvidence(\n ctx: Context,\n input: RecordToolOutputEvidenceInput,\n): ToolOutputMetadata {\n const state = ensureEvidence(ctx);\n // Cap content for regex extraction. File paths and symbol declarations\n // appear near the top of tool output (import blocks, function definitions),\n // so the first 10KB captures them. Without this cap, matchAll() runs over\n // the full output — e.g. a 50KB file read triggers ~100KB of regex scanning\n // across two patterns in extractSymbols plus the extractFiles pass.\n const scanContent = input.content.length > EXTRACT_CONTENT_CAP_CHARS\n ? input.content.slice(0, EXTRACT_CONTENT_CAP_CHARS)\n : input.content;\n const files = extractFiles(ctx, input.toolName, input.input, scanContent);\n const symbols = extractSymbols(scanContent, input.input);\n const commands = extractCommands(input.toolName, input.input);\n const errors = extractErrors(input.content);\n const summary = summarizeToolOutput(input.toolName, input.input, input.content, {\n files,\n symbols,\n errors,\n ok: input.ok,\n });\n\n const metadata: ToolOutputMetadata = {\n toolUseId: input.toolUseId,\n toolName: input.toolName,\n ok: input.ok,\n inputSummary: summarizeInput(input.input),\n summary,\n files,\n symbols,\n commands,\n errors,\n status: 'seen',\n referenceCount: 0,\n seenAt: Date.now(),\n outputBytes: input.outputBytes,\n outputTokens: input.outputTokens,\n outputLines: input.outputLines,\n };\n\n state.toolCalls.push(metadata);\n if (state.toolCalls.length > MAX_TOOL_CALLS) {\n state.toolCalls.splice(0, state.toolCalls.length - MAX_TOOL_CALLS);\n }\n\n updateFileGraph(state, metadata);\n updateRepeatedReadSignals(state, metadata);\n if (errors.length > 0) {\n for (const err of errors) pushUniqueBounded(state.activeErrors, err, MAX_ERRORS);\n }\n const fact = implicitFactFor(metadata);\n if (fact) pushUniqueBounded(state.implicitFacts, fact, MAX_FACTS);\n state.updatedAt = Date.now();\n return metadata;\n}\n\nexport function markAssistantReferencedEvidence(ctx: Context, text: string): void {\n const state = ensureEvidence(ctx);\n const haystack = text.toLowerCase();\n if (!haystack.trim()) return;\n\n // Only scan the most recent tool calls. The assistant almost always\n // references the files/symbols it just worked on — older entries are\n // rarely re-referenced. Scanning the full list (up to 80 entries) means\n // worst case: 80 × (files + symbols) includes() calls per iteration,\n // each O(responseText.length), which degrades as the conversation grows.\n // The last 20 captures the realistic reference window at ¼ the cost.\n const recent = state.toolCalls.length > RECENT_TOOL_CALL_SCAN_LIMIT\n ? state.toolCalls.slice(-RECENT_TOOL_CALL_SCAN_LIMIT)\n : state.toolCalls;\n for (const tool of recent) {\n if (!metadataReferencedByText(tool, haystack)) continue;\n tool.status = 'referenced';\n tool.referenceCount++;\n tool.referencedAt = Date.now();\n for (const file of tool.files) {\n const node = state.fileGraph[file];\n if (node) node.referenced = true;\n }\n }\n state.updatedAt = Date.now();\n}\n\nexport function buildContextEvidenceDigest(ctx: Context): string {\n const state = ensureEvidence(ctx);\n const lines: string[] = [];\n\n if (state.currentIntent?.text) {\n lines.push(`intent: ${state.currentIntent.text}`);\n }\n\n const goals = state.sessionGoals.slice(-3);\n if (goals.length > 0) {\n lines.push('session_goals:');\n for (const goal of goals) lines.push(`- ${goal}`);\n }\n\n const activeErrors = state.activeErrors.slice(-5);\n if (activeErrors.length > 0) {\n lines.push('active_errors:');\n for (const err of activeErrors) lines.push(`- ${err}`);\n }\n\n const files = Object.values(state.fileGraph)\n .sort((a, b) => (b.writes - a.writes) || (b.reads - a.reads) || a.path.localeCompare(b.path))\n .slice(0, 12);\n if (files.length > 0) {\n lines.push('dependency_graph:');\n for (const file of files) {\n const actions = [\n file.reads > 0 ? `read ${file.reads}x` : '',\n file.writes > 0 ? `write ${file.writes}x` : '',\n ].filter(Boolean).join(', ');\n const refs = file.referenced ? '; referenced by assistant' : '';\n const via = file.lastToolUseId ? `; last via ${file.lastToolUseId}` : '';\n lines.push(`- ${file.path} (${actions || 'seen'}${refs}${via})`);\n }\n }\n\n const referenced = state.toolCalls\n .filter((tool) => tool.status === 'referenced')\n .slice(-10);\n const recentSeen = state.toolCalls\n .filter((tool) => tool.status === 'seen')\n .slice(-5);\n const trail = [...referenced, ...recentSeen];\n if (trail.length > 0) {\n lines.push('tool_trail:');\n for (const tool of trail) {\n const size = tool.outputTokens ? `; ~${tool.outputTokens} tokens` : '';\n const filesText = tool.files.length > 0 ? `; files=${tool.files.slice(0, 4).join(', ')}` : '';\n const symbolsText = tool.symbols.length > 0 ? `; symbols=${tool.symbols.slice(0, 4).join(', ')}` : '';\n lines.push(\n `- ${tool.toolUseId} ${tool.toolName} ${tool.status}: ${tool.summary}${filesText}${symbolsText}${size}`,\n );\n }\n }\n\n const facts = state.implicitFacts.slice(-8);\n if (facts.length > 0) {\n lines.push('implicit_facts:');\n for (const fact of facts) lines.push(`- ${fact}`);\n }\n\n const digest = lines.join('\\n');\n if (digest.length <= MAX_DIGEST_CHARS) return digest;\n return `${digest.slice(0, MAX_DIGEST_CHARS)}... [+${digest.length - MAX_DIGEST_CHARS} chars]`;\n}\n\nexport function repeatedReadPressure(ctx: Context): number {\n return ensureEvidence(ctx).repeatedReads.reduce((max, item) => Math.max(max, item.count), 0);\n}\n\nfunction ensureEvidence(ctx: Context): ContextEvidenceState {\n if (!ctx.contextEvidence) {\n (ctx as never as { contextEvidence: ContextEvidenceState }).contextEvidence =\n createContextEvidenceState();\n }\n return ctx.contextEvidence;\n}\n\nfunction isGoalish(text: string): boolean {\n return /\\b(goal|objective|task|need|want|implement|fix|improve|refactor|add|remove|hedef|amac|istiyorum|gerekiyor|iyilestir|duzelt|ekle|kaldir)\\b/i.test(text);\n}\n\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\nfunction pushUniqueBounded(list: string[], value: string, max: number): void {\n const normalized = normalizeWhitespace(value);\n if (!normalized) return;\n const existing = list.findIndex((item) => item.toLowerCase() === normalized.toLowerCase());\n if (existing >= 0) list.splice(existing, 1);\n list.push(normalized);\n if (list.length > max) list.splice(0, list.length - max);\n}\n\nfunction extractFiles(\n ctx: Context,\n toolName: string,\n input: unknown,\n content: string,\n): string[] {\n const out = new Set<string>();\n for (const value of inputPathValues(input)) addPath(ctx, out, value);\n\n if (toolName === 'grep' || toolName === 'glob' || toolName === 'bash') {\n const re = /(?:(?:[A-Za-z]:)?[./\\\\]?[\\w@.-]+(?:[\\\\/][\\w@(). -]+)+\\.[A-Za-z0-9]{1,12})/g;\n for (const match of content.matchAll(re)) addPath(ctx, out, match[0]);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction inputPathValues(input: unknown): string[] {\n const values: string[] = [];\n const visit = (value: unknown, key?: string): void => {\n if (typeof value === 'string') {\n if (key && /^(path|file|files|fromFile|toFile|dir|cwd)$/i.test(key)) values.push(value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) visit(item, key);\n return;\n }\n if (!value || typeof value !== 'object') return;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) visit(v, k);\n };\n visit(input);\n return values;\n}\n\nfunction addPath(ctx: Context, out: Set<string>, raw: string): void {\n const clean = raw.trim().replace(/^[\"'`]+|[\"'`),;:]+$/g, '');\n if (!clean || clean.length > 260) return;\n let normalized = clean.replace(/\\\\/g, '/');\n try {\n const abs = path.isAbsolute(clean) ? path.resolve(clean) : null;\n if (abs) {\n const rel = path.relative(ctx.projectRoot, abs);\n if (!rel.startsWith('..') && !path.isAbsolute(rel)) {\n normalized = rel.replace(/\\\\/g, '/');\n }\n }\n } catch {\n // Keep the best-effort normalized string.\n }\n if (normalized.length > 0) out.add(normalized);\n}\n\nfunction extractSymbols(content: string, input: unknown): string[] {\n const out = new Set<string>();\n const patterns = [\n /\\b(?:function|class|interface|type|enum|const|let|var|def|fn|struct)\\s+([A-Za-z_$][\\w$]*)/g,\n /\\b(?:export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/g,\n ];\n for (const re of patterns) {\n for (const match of content.matchAll(re)) {\n if (match[1]) out.add(match[1]);\n if (out.size >= 30) break;\n }\n }\n\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n if (typeof pattern === 'string' && /^[A-Za-z_$][\\w$]*$/.test(pattern)) {\n out.add(pattern);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction extractCommands(toolName: string, input: unknown): string[] {\n if (toolName !== 'bash' && toolName !== 'exec' && toolName !== 'shell') return [];\n if (!input || typeof input !== 'object') return [];\n const command = (input as Record<string, unknown>)['command'];\n if (typeof command !== 'string') return [];\n return [command.slice(0, 220)];\n}\n\nfunction extractErrors(content: string): string[] {\n const allLines = content.split(/\\r?\\n/);\n // Only scan the last N lines — errors and stack traces surface at the\n // bottom of tool output. Scanning all lines means one regex test per line,\n // so a 2000-line file read costs 2000 regex evaluations for no gain since\n // the interesting errors are always at the tail.\n const lines = allLines.length > EXTRACT_ERROR_TAIL_LINES\n ? allLines.slice(-EXTRACT_ERROR_TAIL_LINES)\n : allLines;\n const errors: string[] = [];\n for (const line of lines) {\n if (!/\\b(error|exception|failed|failure|fatal|panic|timeout|denied|enoent|eacces|eperm|typeerror|syntaxerror)\\b/i.test(line)) continue;\n errors.push(normalizeWhitespace(line).slice(0, 260));\n if (errors.length >= 5) break;\n }\n return errors;\n}\n\nfunction summarizeInput(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n const parts: string[] = [];\n for (const key of ['path', 'file', 'pattern', 'glob', 'command']) {\n const value = obj[key];\n if (typeof value === 'string') parts.push(`${key}=${value.slice(0, 160)}`);\n }\n return parts.length > 0 ? parts.join(', ') : undefined;\n}\n\nfunction summarizeToolOutput(\n toolName: string,\n input: unknown,\n content: string,\n opts: { files: string[]; symbols: string[]; errors: string[]; ok: boolean },\n): string {\n if (!opts.ok && opts.errors.length > 0) return opts.errors[0] ?? `${toolName} failed`;\n if (toolName === 'read' && opts.files[0]) return `read ${opts.files[0]}`;\n if (toolName === 'grep') {\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n return `searched ${typeof pattern === 'string' ? pattern : 'pattern'} (${opts.files.length} file hint(s))`;\n }\n if ((toolName === 'edit' || toolName === 'write') && opts.files[0]) {\n return `${toolName === 'write' ? 'wrote' : 'edited'} ${opts.files[0]}`;\n }\n const firstLine = normalizeWhitespace(content.split(/\\r?\\n/).find((line) => line.trim()) ?? '');\n return firstLine ? firstLine.slice(0, 220) : `${toolName} returned no text`;\n}\n\nfunction updateFileGraph(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n const writes = WRITE_TOOLS.has(metadata.toolName) ? 1 : 0;\n const reads = writes === 0 && (READ_TOOLS.has(metadata.toolName) || metadata.files.length > 0)\n ? 1\n : 0;\n for (const file of metadata.files) {\n const existing = state.fileGraph[file] ?? {\n path: file,\n reads: 0,\n writes: 0,\n tools: [],\n referenced: false,\n };\n existing.reads += reads;\n existing.writes += writes;\n existing.lastToolUseId = metadata.toolUseId;\n pushUniqueBounded(existing.tools, `${metadata.toolName}#${metadata.toolUseId}`, 8);\n state.fileGraph[file] = existing;\n }\n}\n\nfunction updateRepeatedReadSignals(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n if (metadata.toolName !== 'read' || metadata.files.length === 0) {\n state.lastReadPath = undefined;\n return;\n }\n const file = metadata.files[0] as string;\n if (state.lastReadPath === file) {\n const existing = state.repeatedReads.find((item) => item.file === file);\n if (existing) {\n existing.count++;\n existing.lastToolUseId = metadata.toolUseId;\n } else {\n state.repeatedReads.push({ file, count: 2, lastToolUseId: metadata.toolUseId });\n }\n if (state.repeatedReads.length > 10) state.repeatedReads.shift();\n }\n state.lastReadPath = file;\n}\n\nfunction implicitFactFor(metadata: ToolOutputMetadata): string | undefined {\n if (metadata.errors.length > 0) return `${metadata.toolName}#${metadata.toolUseId} exposed error: ${metadata.errors[0]}`;\n if (metadata.toolName === 'read' && metadata.files[0]) {\n const size = metadata.outputLines ? ` (${metadata.outputLines} line(s) returned)` : '';\n return `read ${metadata.files[0]}${size}`;\n }\n if ((metadata.toolName === 'edit' || metadata.toolName === 'write') && metadata.files[0]) {\n return `${metadata.toolName} changed ${metadata.files[0]}`;\n }\n if (metadata.status === 'referenced') return `${metadata.toolName}#${metadata.toolUseId} was referenced`;\n return undefined;\n}\n\nfunction metadataReferencedByText(metadata: ToolOutputMetadata, haystack: string): boolean {\n for (const file of metadata.files) {\n const f = file.toLowerCase();\n const base = path.basename(file).toLowerCase();\n if (f && haystack.includes(f)) return true;\n if (base && haystack.includes(base)) return true;\n }\n for (const symbol of metadata.symbols) {\n if (symbol.length >= 3 && haystack.includes(symbol.toLowerCase())) return true;\n }\n for (const err of metadata.errors) {\n const head = err.slice(0, 80).toLowerCase();\n if (head.length >= 12 && haystack.includes(head)) return true;\n }\n return false;\n}\n","/**\n * Deep merge utility — safely merges nested objects with configurable\n * conflict resolution, array merging, and prototype-pollution guarding.\n *\n * Used by:\n * - config-loader (config layer merging with primitive-array concatenation)\n * - secret-vault (config patching)\n * - json-path (json_merge tool with prefer-base / prefer-patch semantics)\n *\n * @module utils/deep-merge\n */\n\n// ---------------------------------------------------------------------------\n// Prototype-pollution guard — shared set of forbidden __proto__ keys\n// ---------------------------------------------------------------------------\n\nexport const FORBIDDEN_PROTO_KEYS = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** True when every element is a primitive or null (no nested objects/arrays). */\nexport function isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || (typeof v !== 'object' && typeof v !== 'function'));\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface DeepMergeOptions {\n /**\n * Which side wins on collision for scalars and arrays.\n *\n * - `'prefer-patch'` (default): patch value replaces base value.\n * - `'prefer-base'`: base value is kept, patch value is ignored.\n */\n conflictResolution?: 'prefer-base' | 'prefer-patch';\n\n /**\n * How to handle array values.\n *\n * - `'replace'` (default): patch array replaces base array entirely.\n * - `'concat-primitives'`: when both values are primitive arrays,\n * they are concatenated and deduped (via Set). Non-primitive\n * arrays still replace the base wholesale.\n */\n arrayMode?: 'replace' | 'concat-primitives';\n\n /**\n * Skip prototype-pollution keys (`__proto__`, `constructor`, etc.).\n * Enabled by default. Only disable when you control both inputs\n * and the keyset (e.g. when merging trusted JSON schemas).\n */\n protectProto?: boolean;\n\n /**\n * Optional callback fired when a non-primitive (object) array is\n * replaced wholesale (only relevant with `arrayMode: 'concat-primitives'`).\n * Receives the key name, existing array length, and patch array length.\n * Used by config-loader for debug logging.\n */\n onNonPrimitiveArrayReplace?: (\n key: string,\n existingLen: number,\n patchLen: number,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively merge `patch` into `base`, returning a new object.\n *\n * - Nested plain objects are merged recursively.\n * - Arrays are handled per `options.arrayMode`.\n * - Scalar collisions are resolved per `options.conflictResolution`.\n * - `null` and non-object values in `patch` replace the base value\n * (unless `conflictResolution` is `'prefer-base'`).\n * - Keys in `base` that are absent from `patch` are preserved.\n * - `FORBIDDEN_PROTO_KEYS` are skipped in the patch (unless\n * `options.protectProto` is set to `false`).\n *\n * The function is generic over `T extends Record<string, unknown>` for\n * callers that pass typed config objects, but the runtime signature\n * also accepts `unknown` inputs (used by the json-path plugin).\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T,\n patch: Record<string, unknown>,\n options?: DeepMergeOptions,\n): T;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options?: DeepMergeOptions,\n): unknown;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options: DeepMergeOptions = {},\n): unknown {\n const {\n conflictResolution = 'prefer-patch',\n arrayMode = 'replace',\n protectProto = true,\n onNonPrimitiveArrayReplace,\n } = options;\n\n // Non-object / null handling — delegate to conflict resolution.\n if (typeof base !== 'object' || base === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n if (typeof patch !== 'object' || patch === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Arrays — handled *before* the object merge so array-of-objects\n // aren't accidentally treated as plain records.\n if (Array.isArray(base) && Array.isArray(patch)) {\n if (\n arrayMode === 'concat-primitives' &&\n isPrimitiveArray(base) &&\n isPrimitiveArray(patch)\n ) {\n return [...new Set([...base, ...patch])];\n }\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // If only one side is an array, treat as scalar collision.\n if (Array.isArray(base) || Array.isArray(patch)) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Plain object merge.\n const baseObj = base as Record<string, unknown>;\n const patchObj = patch as Record<string, unknown>;\n const out: Record<string, unknown> = { ...baseObj };\n\n for (const [k, v] of Object.entries(patchObj)) {\n if (protectProto && FORBIDDEN_PROTO_KEYS.has(k)) continue;\n\n const existing = out[k];\n if (\n v !== null &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n existing !== null &&\n typeof existing === 'object' &&\n !Array.isArray(existing)\n ) {\n // Recursive merge for nested plain objects.\n out[k] = deepMerge(existing, v, options);\n } else if (Array.isArray(v) && Array.isArray(existing)) {\n // Delegate to top-level array handling so arrayMode\n // (e.g. 'concat-primitives') applies to nested arrays too.\n // Fire debug hook when a non-primitive array replaces an existing\n // array (for non-primitive arrays, concat-primitives is a no-op and\n // the result is always a wholesale replacement).\n if (onNonPrimitiveArrayReplace && !isPrimitiveArray(v)) {\n onNonPrimitiveArrayReplace(k, existing.length, v.length);\n }\n out[k] = deepMerge(existing, v, options);\n } else if (v !== undefined) {\n // Fire debug hook when a non-primitive (object) array replaces an\n // existing value in concat-primitives mode.\n if (\n onNonPrimitiveArrayReplace &&\n Array.isArray(v) &&\n !isPrimitiveArray(v)\n ) {\n const existingLen = Array.isArray(existing) ? existing.length : 0;\n onNonPrimitiveArrayReplace(k, existingLen, v.length);\n }\n out[k] = v;\n }\n // When v === undefined, leave the existing value untouched\n // (this matches config-loader's behaviour: undefined in patch\n // means \"don't change this key\").\n }\n\n return out;\n}\n","/**\n * Myers diff with unified-format output. No external dependencies.\n * Operates on arrays of lines (newline-terminated or stripped).\n */\n\ninterface Edit {\n op: 'equal' | 'insert' | 'delete';\n a: number;\n b: number;\n line: string;\n}\n\nfunction myersDiff(a: string[], b: string[]): Edit[] {\n const N = a.length;\n const M = b.length;\n const max = N + M;\n if (max === 0) return [];\n\n const v = new Map<number, number>();\n v.set(1, 0);\n const trace: Map<number, number>[] = [];\n\n for (let d = 0; d <= max; d++) {\n const snapshot = new Map(v);\n trace.push(snapshot);\n for (let k = -d; k <= d; k += 2) {\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let x: number;\n if (k === -d || (k !== d && left < right)) {\n x = right;\n } else {\n x = left + 1;\n }\n let y = x - k;\n while (x < N && y < M && a[x] === b[y]) {\n x++;\n y++;\n }\n v.set(k, x);\n if (x >= N && y >= M) {\n return backtrack(trace, a, b, N, M, d);\n }\n }\n }\n return [];\n}\n\nfunction backtrack(\n trace: Map<number, number>[],\n a: string[],\n b: string[],\n N: number,\n M: number,\n finalD: number,\n): Edit[] {\n const edits: Edit[] = [];\n let x = N;\n let y = M;\n for (let d = finalD; d > 0; d--) {\n const v = trace[d];\n if (!v) break;\n const k = x - y;\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let prevK: number;\n if (k === -d || (k !== d && left < right)) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = v.get(prevK) ?? 0;\n const prevY = prevX - prevK;\n while (x > prevX && y > prevY) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n if (d > 0) {\n if (x === prevX) {\n edits.push({ op: 'insert', a: x, b: y - 1, line: b[y - 1] ?? '' });\n } else {\n edits.push({ op: 'delete', a: x - 1, b: y, line: a[x - 1] ?? '' });\n }\n x = prevX;\n y = prevY;\n }\n }\n while (x > 0 && y > 0) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n return edits.reverse();\n}\n\nexport interface UnifiedDiffOptions {\n context?: number | undefined;\n fromFile?: string | undefined;\n toFile?: string | undefined;\n}\n\nexport function unifiedDiff(\n oldText: string,\n newText: string,\n opts: UnifiedDiffOptions = {},\n): string {\n const context = opts.context ?? 3;\n const a = oldText.split('\\n');\n const b = newText.split('\\n');\n // Handle trailing newline: split adds an empty string we don't want to diff\n if (a[a.length - 1] === '') a.pop();\n if (b[b.length - 1] === '') b.pop();\n const edits = myersDiff(a, b);\n if (edits.every((e) => e.op === 'equal')) return '';\n\n const hunks: { aStart: number; bStart: number; lines: string[] }[] = [];\n let i = 0;\n while (i < edits.length) {\n while (i < edits.length && edits[i]?.op === 'equal') i++;\n if (i >= edits.length) break;\n const hunkStart = Math.max(0, i - context);\n const lines: string[] = [];\n let aStart = (edits[hunkStart]?.a ?? 0) + 1;\n let bStart = (edits[hunkStart]?.b ?? 0) + 1;\n let aCount = 0;\n let bCount = 0;\n let cursor = hunkStart;\n let trailing = 0;\n while (cursor < edits.length) {\n const e = edits[cursor];\n if (!e) break;\n if (e.op === 'equal') {\n trailing++;\n if (trailing > context * 2) break;\n } else {\n trailing = 0;\n }\n if (e.op === 'equal') {\n lines.push(` ${e.line}`);\n aCount++;\n bCount++;\n } else if (e.op === 'delete') {\n lines.push(`-${e.line}`);\n aCount++;\n } else {\n lines.push(`+${e.line}`);\n bCount++;\n }\n cursor++;\n }\n // Trim trailing context lines beyond `context`\n while (lines.length > 0 && lines[lines.length - 1]?.startsWith(' ') && trailing > context) {\n lines.pop();\n aCount--;\n bCount--;\n trailing--;\n }\n if (aCount === 0) aStart = 0;\n if (bCount === 0) bStart = 0;\n hunks.push({ aStart, bStart, lines });\n i = cursor;\n }\n if (hunks.length === 0) return '';\n\n let out = '';\n out += `--- ${opts.fromFile ?? 'a'}\\n`;\n out += `+++ ${opts.toFile ?? 'b'}\\n`;\n for (const h of hunks) {\n let aCount = 0;\n let bCount = 0;\n for (const l of h.lines) {\n if (l.startsWith(' ')) {\n aCount++;\n bCount++;\n } else if (l.startsWith('-')) aCount++;\n else if (l.startsWith('+')) bCount++;\n }\n out += `@@ -${h.aStart},${aCount} +${h.bStart},${bCount} @@\\n`;\n out += `${h.lines.join('\\n')}\\n`;\n }\n return out;\n}\n","/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","/** Assert a value is neither null nor undefined. Throws if it is.\n * Useful after optional chaining and indexed access when the\n * control flow guarantees the value exists but TypeScript can't\n * prove it (e.g. after a check on a related field). */\nexport function expectDefined<T>(value: T | null | undefined, label?: string): T {\n if (value === null || value === undefined) {\n const err = new Error(label ? `Expected ${label} to be defined` : 'Expected value to be defined');\n err.name = 'ExpectDefinedError';\n throw err;\n }\n return value;\n}\n","import { expectDefined } from './expect-defined.js';\n/**\n * Glob pattern → concrete file path expansion.\n *\n * Supports: *, **, ?, [...]\n * Does NOT support brace expansion {a,b}.\n *\n * Returns the input as-is if it contains no glob metacharacters.\n * On Windows, both / and \\ are accepted as path separators.\n */\n\nimport * as fsp from 'node:fs/promises';\nimport { isAbsolute, resolve } from 'node:path';\nconst GLOB_CHARS = new Set(['*', '?', '[']);\nconst IS_WINDOWS = process.platform === 'win32';\nconst SEP = IS_WINDOWS ? '\\\\' : '/';\n\nfunction isGlob(p: string): boolean {\n for (const c of p) {\n if (GLOB_CHARS.has(c)) return true;\n }\n return false;\n}\n\nfunction globToRegex(pat: string): RegExp {\n let i = 0;\n let re = '^';\n while (i < pat.length) {\n const c = expectDefined(pat[i]);\n if (c === '*') {\n if (pat[i + 1] === '*') {\n re += '.*';\n i += 2;\n if (pat[i] === '/') i++;\n } else {\n re += '[^/\\\\\\\\]*';\n i++;\n }\n } else if (c === '?') {\n re += '[^/\\\\\\\\]';\n i++;\n } else if (c === '[') {\n let cls = '[';\n i++;\n if (pat[i] === '!' || pat[i] === '^') {\n cls += '^';\n i++;\n }\n while (i < pat.length && pat[i] !== ']') {\n const ch = pat[i] ?? '';\n if (ch === '\\\\') cls += '\\\\\\\\';\n else if (ch === ']' || ch === '^') cls += `\\\\${ch}`;\n else cls += ch;\n i++;\n }\n cls += ']';\n re += cls;\n i++;\n } else {\n re += c.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\n i++;\n }\n }\n return new RegExp(re + '$');\n}\n\nfunction baseDir(pat: string): string {\n let i = pat.length - 1;\n while (i >= 0 && !GLOB_CHARS.has(expectDefined(pat[i])) && pat[i] !== SEP && pat[i] !== '/') i--;\n const cut = i >= 0 ? pat.lastIndexOf(SEP, i) : pat.lastIndexOf('/', i);\n return cut < 0 ? '.' : pat.slice(0, cut);\n}\n\n/**\n * Resolve `pattern` to the set of concrete file paths it matches.\n * Literal paths (no glob chars) are returned as-is.\n *\n * @example\n * await expandGlob('src/**\\/*.ts') // → ['src/a.ts', 'src/b/c.ts', ...]\n * await expandGlob('foo.txt') // → ['foo.txt']\n */\nexport async function expandGlob(pattern: string): Promise<string[]> {\n if (!isGlob(pattern)) return [pattern];\n\n const results = new Set<string>();\n const abs = isAbsolute(pattern);\n const base = abs ? baseDir(pattern) : baseDir(pattern);\n const relPat = base === '.' ? pattern : pattern.slice(base.length + 1);\n\n async function walk(dir: string, pat: string): Promise<void> {\n let entries: string[];\n try {\n entries = await fsp.readdir(dir);\n } catch {\n return;\n }\n\n const firstGlob = pat.search(/[*?[[]/);\n\n if (firstGlob < 0) {\n const re = globToRegex(pat);\n for (const e of entries) {\n if (re.test(e)) {\n const full = `${dir}${SEP}${e}`;\n results.add(abs ? resolve(full) : full);\n }\n }\n return;\n }\n\n const before = pat.slice(0, firstGlob);\n const rest = pat.slice(firstGlob);\n\n if (before.endsWith('**')) {\n // Match at current dir then recurse into subdirs\n await walk(dir, rest);\n for (const e of entries) {\n const full = `${dir}${SEP}${e}`;\n try {\n const stat = await fsp.stat(full);\n if (stat.isDirectory()) await walk(full, rest);\n } catch {\n /* skip inaccessible */\n }\n }\n } else if (before === '') {\n // Pattern starts with a glob char — match files in current dir only\n const re = globToRegex(rest);\n for (const e of entries) {\n if (re.test(e)) {\n const full = `${dir}${SEP}${e}`;\n results.add(abs ? resolve(full) : full);\n }\n }\n } else {\n // Literal segment(s) before the glob — descend into matching subdir\n const seg = before.replace(/[*?[\\]]/g, '').replace(/\\/$/, '');\n if (entries.includes(seg)) {\n const full = `${dir}${SEP}${seg}`;\n try {\n const stat = await fsp.stat(full);\n if (stat.isDirectory()) await walk(full, rest);\n } catch {\n /* skip */\n }\n }\n }\n }\n\n await walk(base === '.' ? '.' : base, relPat);\n return [...results];\n}\n","import { expectDefined } from './expect-defined.js';\r\n/**\r\n * Minimal glob matcher for trust patterns.\r\n * Supports: *, **, ?, character classes [abc], [a-z], negation [!...] or [^...].\r\n *\r\n * Compiled regexes are cached so repeated calls with the same pattern\r\n * avoid recompilation overhead.\r\n */\r\n\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\r\n}\r\n\r\n// Module-level cache to avoid recompiling the same pattern on every call.\r\n// LRU-ish eviction keeps unbounded growth in check for long-running processes.\r\nconst COMPILED_GLOB_CACHE = new Map<string, RegExp>();\r\nconst CACHE_MAX_SIZE = 2000;\r\n\r\n// Matches nothing — `[^\\s\\S]` can never be satisfied. Used as the cached\r\n// result for patterns that fail to compile (e.g. an over-long auto-trusted\r\n// command) so one bad trust entry degrades to \"no match\" instead of throwing.\r\nconst NEVER_MATCH = /[^\\s\\S]/;\r\n\r\nfunction getCachedGlob(pattern: string): RegExp {\r\n const cached = COMPILED_GLOB_CACHE.get(pattern);\r\n if (cached) return cached;\r\n if (COMPILED_GLOB_CACHE.size >= CACHE_MAX_SIZE) {\r\n // Evict oldest 25% when at capacity\r\n const keys = [...COMPILED_GLOB_CACHE.keys()];\r\n for (let i = 0; i < Math.floor(CACHE_MAX_SIZE / 4); i++) {\r\n COMPILED_GLOB_CACHE.delete(expectDefined(keys[i]));\r\n }\r\n }\r\n let re: RegExp;\r\n try {\r\n re = compileGlob(pattern);\r\n } catch {\r\n // A pathological trust pattern (over MAX_GLOB_PATTERN_LEN — e.g. a long\r\n // one-liner auto-trusted in YOLO/Auto mode) must NOT throw out of every\r\n // subsequent permission check and break unrelated commands like `true`\r\n // or `ls` (#20). Cache a never-matching regex so the bad entry is inert.\r\n re = NEVER_MATCH;\r\n }\r\n COMPILED_GLOB_CACHE.set(pattern, re);\r\n return re;\r\n}\r\n\r\n// Cap glob pattern length to prevent excessively long compiled regexes.\r\nconst MAX_GLOB_PATTERN_LEN = 1024;\r\n\r\nexport function compileGlob(pattern: string): RegExp {\r\n if (pattern.length > MAX_GLOB_PATTERN_LEN) {\r\n throw new Error(`Glob pattern exceeds ${MAX_GLOB_PATTERN_LEN} characters`);\r\n }\r\n let i = 0;\r\n let re = '^';\r\n while (i < pattern.length) {\r\n const c = pattern[i];\r\n if (c === '*') {\r\n if (pattern[i + 1] === '*') {\r\n // ** matches any number of chars including /\r\n re += '.*';\r\n i += 2;\r\n // Skip trailing slash so '**/x' matches 'x'\r\n if (pattern[i] === '/') i++;\r\n } else {\r\n // single * matches any chars except /\r\n re += '[^/]*';\r\n i++;\r\n }\r\n } else if (c === '?') {\r\n re += '[^/]';\r\n i++;\r\n } else if (c === '[') {\r\n let cls = '[';\r\n i++;\r\n if (pattern[i] === '!' || pattern[i] === '^') {\r\n cls += '^';\r\n i++;\r\n }\r\n while (i < pattern.length && pattern[i] !== ']') {\r\n const ch = pattern[i] ?? '';\r\n // Inside a regex class, only `]`, `\\`, and `^`/`-` at boundaries need\r\n // escaping. We've already consumed the leading `^`; the rest are\r\n // literal. Escape `\\` defensively and pass the rest through verbatim\r\n // so ranges like `a-z` continue to work.\r\n if (ch === '\\\\') {\r\n cls += '\\\\\\\\';\r\n } else if (ch === ']' || ch === '^') {\r\n cls += `\\\\${ch}`;\r\n } else {\r\n cls += ch;\r\n }\r\n i++;\r\n }\r\n cls += ']';\r\n re += cls;\r\n i++; // skip closing ]\r\n } else {\r\n re += escapeRegex(c ?? '');\r\n i++;\r\n }\r\n }\r\n re += '$';\r\n return new RegExp(re);\r\n}\r\n\r\nexport function matchGlob(pattern: string, input: string): boolean {\r\n return getCachedGlob(pattern).test(input);\r\n}\r\n\r\nexport function matchAny(patterns: string[], input: string): boolean {\r\n return patterns.some((p) => matchGlob(p, input));\r\n}\r\n","/**\n * Shared IP-address guards for SSRF protection.\n *\n * Exported so `fetch.ts` (tools), `web-search/index.ts` (plugins), and any\n * other package that needs to validate IPs can all consume the same logic.\n * Any future additions (e.g. extra CIDR blocks) need only be made here.\n */\n\nimport * as dns from 'node:dns/promises';\nimport * as net from 'node:net';\n\n/**\n * True if `addr` is in a private / loopback / link-local / reserved / CGNAT /\n * multicast range. `net.isIP` is called by the caller first so `addr` is\n * guaranteed to be a canonical dotted-quad at this point.\n */\nexport function isPrivateIPv4(addr: string): boolean {\n const parts = addr.split('.').map((p) => Number.parseInt(p, 10));\n if (parts.length !== 4 || parts.some((n) => Number.isNaN(n) || n < 0 || n > 255)) {\n return true; // defensive: malformed → block\n }\n const [a, b, c] = parts as [number, number, number, number];\n if (a === 0) return true; // 0.0.0.0/8 \"this host\"\n if (a === 10) return true; // 10.0.0.0/8 private\n if (a === 127) return true; // 127.0.0.0/8 loopback\n if (a === 169 && b === 254) return true; // 169.254.0.0/16 link-local + AWS/GCE/Azure IMDS\n if (a === 172 && b >= 16 && b <= 31) return true; // 172.16.0.0/12 private\n if (a === 192 && b === 168) return true; // 192.168.0.0/16 private\n if (a === 192 && b === 0 && c === 0) return true; // 192.0.0.0/24 reserved\n if (a === 100 && b >= 64 && b <= 127) return true; // 100.64.0.0/10 CGNAT\n if (a >= 224) return true; // 224.0.0.0/4 multicast + 240.0.0.0/4 reserved\n return false;\n}\n\n/**\n * True if `raw` (an IPv6 literal, already lowercased) is loopback / unique-local /\n * link-local / unspecified / IPv4-mapped-private.\n */\nexport function isPrivateIPv6(raw: string): boolean {\n const lower = raw.toLowerCase();\n if (lower === '::' || lower === '::1') return true; // loopback / unspecified\n\n // Expand to 8-group canonical form so range checks don't have to handle every\n // shorthand notation. Returns null on malformed input — we conservatively\n // block in that case rather than leaking.\n const groups = expandIPv6(lower);\n if (!groups) return true;\n\n // IPv4-mapped: ::ffff:0:0/96 → groups[0..5] all 0, groups[6..7] hold the\n // embedded IPv4 as two 16-bit words. Node URL normalises the dotted form to\n // this representation (e.g. ::ffff:127.0.0.1 → ::ffff:7f00:1).\n if (\n groups[0] === 0 &&\n groups[1] === 0 &&\n groups[2] === 0 &&\n groups[3] === 0 &&\n groups[4] === 0 &&\n groups[5] === 0xffff\n ) {\n const a = (groups[6] ?? 0) >> 8;\n const b = (groups[6] ?? 0) & 0xff;\n const c = (groups[7] ?? 0) >> 8;\n const d = (groups[7] ?? 0) & 0xff;\n return isPrivateIPv4(`${a}.${b}.${c}.${d}`);\n }\n\n const high = groups[0] ?? 0;\n if ((high & 0xfe00) === 0xfc00) return true; // fc00::/7 unique local (fc..fd)\n if ((high & 0xffc0) === 0xfe80) return true; // fe80::/10 link-local\n if ((high & 0xff00) === 0xff00) return true; // ff00::/8 multicast\n return false;\n}\n\n/**\n * Expand an IPv6 string into exactly 8 16-bit numbers. Handles `::` compression.\n * Returns null on malformed input — caller should treat that as \"block\".\n */\nexport function expandIPv6(addr: string): number[] | null {\n const parts = addr.split('::');\n if (parts.length > 2) return null;\n\n const parseGroups = (s: string): number[] | null => {\n if (s === '') return [];\n const out: number[] = [];\n for (const g of s.split(':')) {\n if (g.length === 0 || g.length > 4) return null;\n const n = Number.parseInt(g, 16);\n if (Number.isNaN(n) || n < 0 || n > 0xffff) return null;\n out.push(n);\n }\n return out;\n };\n\n if (parts.length === 1) {\n const groups = parseGroups(parts[0] ?? '');\n if (groups?.length !== 8) return null;\n return groups;\n }\n\n const head = parseGroups(parts[0] ?? '');\n const tail = parseGroups(parts[1] ?? '');\n if (!head || !tail) return null;\n const fill = 8 - head.length - tail.length;\n if (fill < 0) return null;\n return [...head, ...new Array<number>(fill).fill(0), ...tail];\n}\n\n/**\n * Convenience: throw if `hostname` resolves to a private / loopback IP.\n * Use as a pre-flight check before opening a socket.\n *\n * ⚠️ This is not sufficient alone — connections must also use a pinned\n * dispatcher (so the OS re-uses the already-resolved address) or the same\n * check must be applied after every redirect hop. See `guardedLookup` in\n * `fetch.ts` for the connection-level enforcement.\n */\nexport async function assertNotPrivateHost(hostname: string): Promise<void> {\n const host =\n hostname.startsWith('[') && hostname.endsWith(']') ? hostname.slice(1, -1) : hostname;\n\n if (host === 'localhost' || host.endsWith('.localhost')) {\n throw new Error('fetch: blocked localhost target');\n }\n\n const ipVersion = net.isIP(host);\n if (ipVersion === 4) {\n if (isPrivateIPv4(host)) {\n throw new Error(`fetch: blocked private/loopback address \"${host}\"`);\n }\n } else if (ipVersion === 6) {\n if (isPrivateIPv6(host)) {\n throw new Error(`fetch: blocked private/loopback address \"${host}\"`);\n }\n } else {\n // Hostname — resolve and reject if ANY record is private.\n try {\n const records = await dns.lookup(host, { all: true });\n for (const r of records) {\n // dns.lookup family: 4 = IPv4, 6 = IPv6\n const bad = r.family === 4 ? isPrivateIPv4(r.address) : isPrivateIPv6(r.address);\n if (bad) {\n throw new Error(`fetch: resolved to private address ${r.address}`);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('fetch:')) throw err;\n // DNS failure — let fetch handle it rather than doubling the error.\n }\n }\n}\n","import { expectDefined } from './expect-defined.js';\n\n/**\n * Attempt to close an incomplete JSON object string by auto-closing braces\n * and completing any unclosed double-quoted string values.\n *\n * Strategy:\n * 1. Compute origOpen from the ORIGINAL input (how many braces are unclosed).\n * 2. Add that many closing braces. If result is now valid JSON → return it.\n * 3. If still invalid: trim trailing whitespace, strip trailing backslash.\n * 4. Walk backwards to detect an unclosed string value.\n * - Quote followed by `:` → key-name, skip\n * - Quote followed by `,` `}` or end-of-string → toggle in/out of string\n * 5. If we end INSIDE a string (unclosed opening `\"`), append `\"` + origOpen `}`.\n *\n * Known limitations:\n * - Strings whose content ends with a `\"` character cannot be repaired\n * (algorithm can't distinguish content-`\"` from string-terminator `\"`).\n * - Input ending in bare `:` (incomplete value expression) can't be meaningfully repaired.\n * - Bare `{` returns unchanged.\n * - If origOpen=0 (braces balanced) but string is unclosed, repair is skipped\n * (the input would be valid JSON per JSON.parse, so it's returned as-is).\n */\nexport function completePartialObject(s: string): string {\n if (!s.trim().startsWith('{')) return s;\n if (tryParse(s).ok) return s;\n return repairTruncated(s);\n}\n\nfunction repairTruncated(s: string): string {\n // Single forward scan capturing the structural state at the truncation point:\n // the open-container stack, whether we are inside a string, a dangling escape,\n // and where the last significant (non-trailing-whitespace) character sits.\n const stack: ('{' | '[')[] = [];\n let inString = false;\n let escaped = false;\n let sawKey = false; // have we seen any string (i.e. real content) yet?\n let prevSig = ''; // last significant char seen outside of a string\n let contentEnd = 0; // index just past the last significant char\n // Count unbalanced `{` accumulated *inside* the currently-open string value,\n // so a truncation mid-string like `\"a{` can be balanced before closing it.\n let stringBraceDepth = 0;\n\n for (let i = 0; i < s.length; i++) {\n const ch = expectDefined(s[i]);\n if (inString) {\n contentEnd = i + 1;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n prevSig = '\"';\n stringBraceDepth = 0;\n continue;\n }\n if (ch === '{') stringBraceDepth++;\n else if (ch === '}' && stringBraceDepth > 0) stringBraceDepth--;\n continue;\n }\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') continue;\n contentEnd = i + 1;\n if (ch === '\"') {\n inString = true;\n sawKey = true;\n stringBraceDepth = 0;\n prevSig = '\"';\n } else if (ch === '{' || ch === '[') {\n stack.push(ch);\n prevSig = ch;\n } else if (ch === '}' || ch === ']') {\n stack.pop();\n prevSig = ch;\n } else {\n prevSig = ch;\n }\n }\n\n // A lone open brace (or anything with no key/content) can't be meaningfully\n // completed — return it untouched.\n if (!sawKey && !inString) return s;\n\n // Drop trailing whitespace that sits outside any string.\n let result = s.slice(0, contentEnd);\n\n if (inString) {\n // A dangling lone backslash can't begin a valid escape — drop it.\n if (escaped) {\n result = result.slice(0, -1);\n } else if (endsWithInvalidEscape(result)) {\n // A trailing invalid escape (e.g. `\\}`) can't be completed into valid\n // JSON — strip the backslash and its bogus escapee.\n result = result.slice(0, -2);\n }\n // Balance braces opened inside the truncated string before closing it.\n if (stringBraceDepth > 0) result += '}'.repeat(stringBraceDepth);\n result += '\"';\n } else if (prevSig === ':') {\n // A key with no value (e.g. `{\"k\":`) — complete it to null.\n result += 'null';\n }\n\n // Close any still-open containers in reverse order.\n for (let k = stack.length - 1; k >= 0; k--) {\n result += stack[k] === '{' ? '}' : ']';\n }\n\n // Last resort: an empty value sitting before an existing close (`{\"k\":}`)\n // leaves invalid JSON — fill it with null.\n if (!tryParse(result).ok) {\n const patched = result.replace(/:(\\s*)([}\\]])/g, ':null$2');\n if (tryParse(patched).ok) result = patched;\n }\n\n return result;\n}\n\nconst VALID_ESCAPE = new Set(['\"', '\\\\', '/', 'b', 'f', 'n', 'r', 't', 'u']);\n\n/** True when `str` ends with a backslash escape that JSON does not allow. */\nfunction endsWithInvalidEscape(str: string): boolean {\n const last = str[str.length - 1];\n if (str[str.length - 2] !== '\\\\' || last === undefined) return false;\n if (VALID_ESCAPE.has(last)) return false;\n // The backslash must itself be unescaped (odd run of backslashes before it).\n let backslashes = 0;\n for (let k = str.length - 2; k >= 0 && str[k] === '\\\\'; k--) backslashes++;\n return backslashes % 2 === 1;\n}\n\nfunction tryParse(s: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(s) };\n } catch {\n return { ok: false };\n }\n}\n","/**\n * Minimal JSON Schema validator — covers the subset needed for plugin\n * configSchema validation and tool inputSchema sanity checks. Intentionally\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\n * authors can mix in non-standard extensions without breaking validation.\n *\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\n * conditional schemas, format validation, or anything else exotic, it should\n * bring its own ajv-based validator and call this only for the cheap path.\n */\nimport type { JSONSchema } from '../types/tool.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n errors: ValidationError[];\n}\n\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\n const errors: ValidationError[] = [];\n walk(value, schema, '', errors);\n return { ok: errors.length === 0, errors };\n}\n\nfunction walk(value: unknown, schema: JSONSchema, path: string, errors: ValidationError[]): void {\n if (schema.enum !== undefined) {\n if (!schema.enum.some((e) => deepEqual(e, value))) {\n errors.push({\n path: path || '<root>',\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n });\n return;\n }\n }\n\n if (typeof schema.type === 'string') {\n if (!checkType(value, schema.type)) {\n errors.push({\n path: path || '<root>',\n message: `expected ${schema.type}, got ${describeType(value)}`,\n });\n return;\n }\n }\n\n if (schema.type === 'object' && isPlainObject(value)) {\n const obj = value as Record<string, unknown>;\n for (const req of schema.required ?? []) {\n if (!(req in obj)) {\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\n }\n }\n if (schema.properties) {\n for (const [key, subSchema] of Object.entries(schema.properties)) {\n if (key in obj) {\n walk(obj[key], subSchema, joinPath(path, key), errors);\n }\n }\n }\n }\n\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n for (let i = 0; i < value.length; i++) {\n walk(value[i], schema.items as JSONSchema, `${path}[${i}]`, errors);\n }\n }\n}\n\nfunction checkType(value: unknown, type: string): boolean {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !Number.isNaN(value);\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'null':\n return value === null;\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isPlainObject(value);\n default:\n return true;\n }\n}\n\nfunction isPlainObject(v: unknown): boolean {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nfunction joinPath(parent: string, key: string): string {\n if (!parent) return key;\n return `${parent}.${key}`;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) return false;\n return ak.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","import type { CustomModelDefinition } from '../types/config.js';\n\n/**\n * Merge per-provider `customModels` into top-level `configModels`.\n *\n * Keys present in `configModels` always win over `providerCustomModels`\n * when the same model id appears in both places. This lets the user\n * override provider-attached definitions from the top-level config.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeCustomModelDefs(\n providerCustomModels: Record<string, CustomModelDefinition> | undefined,\n configModels: Record<string, CustomModelDefinition> | undefined,\n): Record<string, CustomModelDefinition> | undefined {\n const out: Record<string, CustomModelDefinition> = {};\n\n // Layer 1: provider-level definitions (weaker).\n if (providerCustomModels) {\n for (const [id, def] of Object.entries(providerCustomModels)) {\n out[id] = { ...def };\n }\n }\n\n // Layer 2: top-level definitions (stronger).\n if (configModels) {\n for (const [id, def] of Object.entries(configModels)) {\n out[id] = { ...def }; // top-level overwrites provider-level\n }\n }\n\n if (Object.keys(out).length === 0) return undefined;\n return out;\n}\n","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import { expectDefined } from './expect-defined.js';\nimport type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = expectDefined(messages[i]);\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","export type NewlineStyle = 'lf' | 'crlf' | 'cr';\n\nexport function detectNewlineStyle(text: string): NewlineStyle {\n let lf = 0;\n let crlf = 0;\n let cr = 0;\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (c === 0x0d) {\n if (text.charCodeAt(i + 1) === 0x0a) {\n crlf++;\n i++;\n } else {\n cr++;\n }\n } else if (c === 0x0a) {\n lf++;\n }\n }\n if (crlf > lf && crlf > cr) return 'crlf';\n if (cr > lf && cr > crlf) return 'cr';\n return 'lf';\n}\n\nexport function toStyle(text: string, style: NewlineStyle): string {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (style === 'lf') return normalized;\n if (style === 'crlf') return normalized.replace(/\\n/g, '\\r\\n');\n return normalized.replace(/\\n/g, '\\r');\n}\n\nexport function normalizeToLf(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import { toErrorMessage } from './error.js';\n\nexport interface SafeParseResult<T> {\n ok: boolean;\n value?: T | undefined;\n error?: string | undefined;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: toErrorMessage(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: toErrorMessage(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: escape literal control characters that appear *inside* string\n // values. Models frequently emit raw newlines/tabs inside a code payload\n // (e.g. edit's old_string/new_string) instead of the required \\n / \\t, which\n // makes JSON.parse throw. This is the single most common malformed-args case.\n out = escapeControlCharsInStrings(out);\n\n // Stage 4: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\n/**\n * Walk the string tracking whether we are inside a JSON string literal and\n * replace raw control characters (U+0000–U+001F) that appear inside strings\n * with their valid JSON escape sequences. Characters outside strings are left\n * untouched (insignificant whitespace stays as-is). Already-escaped sequences\n * are not double-escaped because we only act on *literal* control bytes.\n */\nfunction escapeControlCharsInStrings(s: string): string {\n let inString = false;\n let out = '';\n for (let i = 0; i < s.length; i++) {\n const c = s.charAt(i);\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n out += c;\n continue;\n }\n const code = c.charCodeAt(0);\n if (inString && code < 0x20) {\n switch (c) {\n case '\\n':\n out += '\\\\n';\n break;\n case '\\r':\n out += '\\\\r';\n break;\n case '\\t':\n out += '\\\\t';\n break;\n case '\\b':\n out += '\\\\b';\n break;\n case '\\f':\n out += '\\\\f';\n break;\n default:\n out += `\\\\u${code.toString(16).padStart(4, '0')}`;\n }\n continue;\n }\n out += c;\n }\n return out;\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s.charAt(i);\n if (c === '\"' && (i === 0 || s.charAt(i - 1) !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s.charAt(i + 1) === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s.charAt(i) !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","/** Resolve a promise after `ms` milliseconds. Prefer this over raw\n * `setTimeout` wrappers so all delay sites use a single implementation\n * and an abortable variant can be introduced without a codebase-wide hunt. */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * String utilities shared across the WrongStack codebase.\n */\n\n/**\n * Truncate a string to at most `max` characters, appending an ellipsis if it\n * was longer. Returns the original string unchanged when it fits.\n */\nexport function truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n","import type {\n TaskPriority,\n TaskStatus,\n TaskType,\n TaskProgress as TaskGraphProgress,\n} from '../types/task-graph.js';\nimport { color } from './color.js';\n\n// Re-export graph types for convenience\nexport type { TaskStatus, TaskPriority, TaskType };\n\n// ---------------------------------------------------------------------------\n// Session-level task item — mirrors TaskNode but with string timestamps\n// for JSON serialization and a flat-list structure (no graph edges).\n// ---------------------------------------------------------------------------\n\nexport interface TaskItem {\n id: string;\n title: string;\n description?: string | undefined;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n /** IDs of tasks this one depends on. */\n dependsOn?: string[] | undefined;\n /** Agent/subagent name assigned to this task. */\n assignee?: string | undefined;\n estimateHours?: number | undefined;\n tags?: string[] | undefined;\n createdAt: string;\n updatedAt: string;\n}\n\n// ---------------------------------------------------------------------------\n// Progress (re-export computeTaskItemProgress adapted for TaskItem[])\n// ---------------------------------------------------------------------------\n\nexport function computeTaskItemProgress(tasks: TaskItem[]): TaskGraphProgress {\n let completed = 0;\n let pending = 0;\n let inProgress = 0;\n let blocked = 0;\n let failed = 0;\n let review = 0;\n let estimatedHours = 0;\n const actualHours = 0;\n for (const t of tasks) {\n switch (t.status) {\n case 'completed':\n completed++;\n break;\n case 'pending':\n pending++;\n break;\n case 'in_progress':\n inProgress++;\n break;\n case 'blocked':\n blocked++;\n break;\n case 'failed':\n failed++;\n break;\n case 'review':\n review++;\n break;\n }\n estimatedHours += t.estimateHours ?? 0;\n }\n return {\n total: tasks.length,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: tasks.length > 0 ? Math.round((completed / tasks.length) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Icons\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICON: Record<TaskStatus, string> = {\n pending: '○',\n in_progress: '◐',\n blocked: '⊘',\n failed: '✗',\n review: '◑',\n completed: '●',\n};\n\nconst PRIORITY_ICON: Record<TaskPriority, string> = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '🟢',\n};\n\nconst TYPE_ICON: Record<TaskType, string> = {\n feature: '⚡',\n bugfix: '🐛',\n refactor: '♻️',\n docs: '📝',\n test: '🧪',\n chore: '🔧',\n};\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nexport function formatTaskProgress(tasks: TaskItem[]): string {\n const p = computeTaskItemProgress(tasks);\n if (p.total === 0) return 'No tasks.';\n const barWidth = 24;\n const filled = Math.round((p.percentComplete / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n return [\n `${color.bold('Tasks')} [${bar}] ${p.percentComplete}%`,\n ` ${color.green('●')} ${p.completed} done │ ${color.yellow('◐')} ${p.inProgress} active │ ${color.dim('○')} ${p.pending} pending │ ⊘ ${p.blocked} blocked │ ✗ ${p.failed} failed`,\n p.estimatedHours > 0\n ? ` ${color.dim(`est. ${p.estimatedHours}h`)}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nexport function formatTaskList(tasks: TaskItem[]): string {\n if (tasks.length === 0) return 'No tasks.';\n\n // Group by status\n const order: TaskStatus[] = ['in_progress', 'blocked', 'review', 'pending', 'failed', 'completed'];\n const groups = new Map<TaskStatus, TaskItem[]>();\n for (const t of tasks) {\n const list = groups.get(t.status) ?? [];\n list.push(t);\n groups.set(t.status, list);\n }\n\n const lines: string[] = [];\n lines.push(color.dim(`Tasks (${tasks.length} total):`));\n\n for (const status of order) {\n const group = groups.get(status);\n if (!group || group.length === 0) continue;\n const icon = STATUS_ICON[status];\n lines.push(` ${icon} ${status.toUpperCase()} (${group.length})`);\n for (const t of group) {\n const prio = PRIORITY_ICON[t.priority];\n const type = TYPE_ICON[t.type];\n const deps =\n t.dependsOn && t.dependsOn.length > 0\n ? ` ${color.dim('←')} ${color.dim(t.dependsOn.map((d) => d.slice(0, 8)).join(', '))}`\n : '';\n const who = t.assignee ? ` ${color.dim(`@${t.assignee}`)}` : '';\n const hrs = t.estimateHours ? ` ${color.dim(`${t.estimateHours}h`)}` : '';\n lines.push(` ${type} ${prio} ${t.title}${deps}${who}${hrs}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { TodoItem } from '../core/context.js';\nimport { color } from './color.js';\n\n/**\n * Canonical text rendering of the live todo list, shared by the CLI's\n * `/todos` slash command and the TUI's auto-echo (which prints the same\n * snapshot to chat history each time the `todo` tool mutates the list).\n *\n * Layout: a header line with the `done/total done` count, then one row\n * per item — `[ ]` pending, `[~]` in-progress, `[x]` completed. In-\n * progress rows prefer `activeForm` (\"Building the project\") over the\n * imperative `content` (\"Build the project\") when present.\n *\n * Returned as a single newline-joined string so callers can hand it\n * straight to a history dispatcher or stdout.\n */\nexport function formatTodosList(todos: TodoItem[]): string {\n if (todos.length === 0) return 'No todos.';\n const lines: string[] = [];\n const done = todos.filter((t) => t.status === 'completed').length;\n lines.push(color.dim(`Todos (${done}/${todos.length} done):`));\n todos.forEach((t, i) => {\n const mark =\n t.status === 'completed'\n ? color.green('[x]')\n : t.status === 'in_progress'\n ? color.yellow('[~]')\n : color.dim('[ ]');\n const text = t.status === 'in_progress' && t.activeForm ? t.activeForm : t.content;\n const label = t.status === 'completed' ? color.dim(text) : text;\n lines.push(` ${color.dim(String(i + 1).padStart(2))}. ${mark} ${label}`);\n });\n return lines.join('\\n');\n}\n","const GLOB_METACHARACTERS = /[*?[\\]]/g;\n\nexport function escapeGlobSubject(value: string): string {\n return value.replace(GLOB_METACHARACTERS, (char) => `\\\\${char}`);\n}\n\nexport function normalizePathSubject(value: string): string {\n return escapeGlobSubject(value.replace(/\\\\/g, '/'));\n}\n\nexport function isPathSubjectKey(subjectKey: string): boolean {\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\n}\n\nexport function subjectForToolInput(\n toolName: string,\n input: unknown,\n subjectKey?: string,\n): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n\n if (subjectKey) {\n const value = obj[subjectKey];\n if (typeof value === 'string') {\n return isPathSubjectKey(subjectKey) ? normalizePathSubject(value) : escapeGlobSubject(value);\n }\n }\n\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlobSubject(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePathSubject(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlobSubject(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlobSubject(obj.name);\n }\n return undefined;\n}\n","import type { JSONSchema } from '../types/tool.js';\n\nexport interface ToolWireDefinitionLike {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}\n\nexport interface CompactToolDefinitionForWireOptions {\n /** Top-level tool description budget. */\n descriptionMaxChars?: number | undefined;\n /** Per-JSON-Schema `description` annotation budget. */\n schemaDescriptionMaxChars?: number | undefined;\n}\n\nexport interface CompactWireToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nconst TOOL_DESCRIPTION_MAX_CHARS = 640;\nconst SCHEMA_DESCRIPTION_MAX_CHARS = 180;\n\nconst compactCache = new WeakMap<object, CompactWireToolDefinition>();\n\n/**\n * Return the provider-wire version of a tool definition.\n *\n * Tool schemas remain structurally intact: validation keywords, property\n * names, required fields, enum values, and nested shapes are preserved. The\n * only reduction is on human prose annotations (`description`), which are the\n * largest repeated cost in provider tool declarations.\n */\nexport function compactToolDefinitionForWire(\n tool: ToolWireDefinitionLike,\n opts: CompactToolDefinitionForWireOptions = {},\n): CompactWireToolDefinition {\n const useDefaultOptions =\n opts.descriptionMaxChars === undefined && opts.schemaDescriptionMaxChars === undefined;\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n const cached = compactCache.get(tool);\n if (cached) return cached;\n }\n\n const compact: CompactWireToolDefinition = {\n name: tool.name,\n description: compactDescription(\n tool.description ?? '',\n opts.descriptionMaxChars ?? TOOL_DESCRIPTION_MAX_CHARS,\n ),\n inputSchema: compactSchemaDescriptions(\n tool.inputSchema,\n opts.schemaDescriptionMaxChars ?? SCHEMA_DESCRIPTION_MAX_CHARS,\n ),\n };\n\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n compactCache.set(tool, compact);\n }\n return compact;\n}\n\nexport function compactSchemaDescriptions(\n schema: unknown,\n maxDescriptionChars = SCHEMA_DESCRIPTION_MAX_CHARS,\n): Record<string, unknown> {\n const compact = compactSchemaNode(schema, maxDescriptionChars);\n return isRecord(compact) ? compact : { type: 'object', properties: {} };\n}\n\nfunction compactSchemaNode(node: unknown, maxDescriptionChars: number): unknown {\n if (Array.isArray(node)) {\n return node.map((item) => compactSchemaNode(item, maxDescriptionChars));\n }\n if (!isRecord(node)) return node;\n\n const out: JSONSchema = {};\n for (const [key, value] of Object.entries(node)) {\n if (key === 'description' && typeof value === 'string') {\n out[key] = compactDescription(value, maxDescriptionChars);\n } else {\n out[key] = compactSchemaNode(value, maxDescriptionChars);\n }\n }\n return out;\n}\n\nfunction compactDescription(text: string, maxChars: number): string {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxChars) return normalized;\n if (maxChars <= 20) return normalized.slice(0, maxChars);\n\n const hardLimit = maxChars - 12;\n const boundary = findSemanticBoundary(normalized, hardLimit);\n const head = normalized.slice(0, boundary > 0 ? boundary : hardLimit).trimEnd();\n return `${head} ...`;\n}\n\nfunction findSemanticBoundary(text: string, limit: number): number {\n const punctuation = Math.max(\n text.lastIndexOf('. ', limit),\n text.lastIndexOf('; ', limit),\n text.lastIndexOf(': ', limit),\n );\n if (punctuation >= Math.floor(limit * 0.45)) return punctuation + 1;\n\n const comma = text.lastIndexOf(', ', limit);\n if (comma >= Math.floor(limit * 0.6)) return comma + 1;\n\n const space = text.lastIndexOf(' ', limit);\n return space >= Math.floor(limit * 0.6) ? space : limit;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { Message } from '../types/messages.js';\nimport { compactToolDefinitionForWire } from './tool-wire-compact.js';\n\n/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n *\n * ## Calibration\n *\n * `estimateRequestTokens` uses a fixed 3.5 chars/token heuristic — a\n * conservative overestimate that prevents underestimation but reduces\n * accuracy. After each API call, call `recordActualUsage()` with the\n * real `usage.input` from the provider response. The module maintains a\n * rolling average of `actual / estimated` ratio (EWM, α=0.3) and\n * applies it to subsequent calls via `estimateRequestTokensCalibrated`.\n *\n * Calibration is per-module (shared across all callers), which is\n * sufficient: the chars/token ratio is a property of the tokenizer,\n * not the model. Uncalibrated calls (before any samples, or when\n * `recordActualUsage` is not called) fall back to the uncalibrated\n * estimate so nothing breaks.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/** Calibration state: actual/estimated ratio via exponential weighted moving average. */\ninterface CalState {\n ratio: number; // current calibration multiplier (actual / estimated)\n count: number; // number of samples recorded\n prevEst: number; // estimated tokens from the most recent estimateRequestTokens call\n}\n\n/** EWM α — higher = faster adaptation, more volatile. */\nconst CAL_ALPHA = 0.3;\n\n/**\n * Calibration is keyed so that, in a multi-agent / model-switching process,\n * each (provider, model) tokenizer gets its own ratio instead of all of them\n * collapsing onto one shared number. Callers that don't pass a key use the\n * shared `__global__` bucket — that preserves the original single-session\n * behavior and keeps all existing call sites working unchanged.\n */\nconst CALIBRATION_GLOBAL_KEY = '__global__';\nconst _cals = new Map<string, CalState>();\n\nfunction calState(key: string): CalState {\n let state = _cals.get(key);\n if (!state) {\n state = { ratio: 1.0, count: 0, prevEst: 0 };\n _cals.set(key, state);\n }\n return state;\n}\n\nconst MIN_SAMPLES_FOR_CALIBRATION = 3;\n\n/**\n * Fallback chars/token ratios per model family for providers that don't return\n * usage data. Used when `recordActualUsage` receives zero/negative tokens and\n * we have enough samples to trust the fallback. Keys are lowercase prefixes.\n */\nconst MODEL_FAMILY_RATIO: Record<string, number> = {\n // Anthropic: ~3.8-4.0 chars/token depending on model\n claude: 3.8,\n // OpenAI: ~4.0 chars/token\n 'gpt-4': 4.0,\n 'gpt-3.5': 4.0,\n // Google: ~3.5 chars/token\n gemini: 3.5,\n // DeepSeek: ~3.5 chars/token\n deepseek: 3.5,\n};\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n/** Insertion-order queue for O(1) LRU eviction: shift from front on overcapacity. */\nconst _estimateCacheOrder: string[] = [];\n\nconst ESTIMATE_CACHE_MAX_SIZE = 50_000;\n\nfunction getCachedEstimate(key: string, compute: (key: string) => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest half — O(1) per eviction (array shift + Map.delete) instead\n // of O(n) iteration over all 50 000 keys in the Map.\n while (ESTIMATE_CACHE.size > Math.floor(ESTIMATE_CACHE_MAX_SIZE / 2)) {\n const oldest = _estimateCacheOrder.shift();\n if (oldest !== undefined) ESTIMATE_CACHE.delete(oldest);\n }\n }\n const estimate = compute(key);\n ESTIMATE_CACHE.set(key, estimate);\n _estimateCacheOrder.push(key);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n // JSON.stringify is called once to form the cache key; RoughTokenEstimate\n // is deferred only on cache miss (compute callback), not wrapped unnecessarily.\n return getCachedEstimate(JSON.stringify(input), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n return getCachedEstimate(JSON.stringify(content), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}\n\n/**\n * Compute and cache the token estimate for a single message. This is the\n * canonical per-message estimator — called once by ConversationState on\n * append/replace so the O(n·m) content-block walk happens at mutation time,\n * not on every context-pressure check.\n */\nexport function computeMessageTokens(msg: Message): number {\n if (typeof msg.content === 'string') return estimateTextTokens(msg.content);\n let total = 0;\n for (const b of msg.content) {\n if (b.type === 'text') total += estimateTextTokens(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n else total += RoughTokenEstimate(JSON.stringify(b));\n }\n return total;\n}\n\n/**\n * Estimate tokens for an array of messages (text + tool I/O), using the shared\n * 3.5 chars/token basis. This is the single canonical message-array estimator —\n * compactors, the context_manager tool, and the `/context` display all route\n * through it so the number a user sees matches the number compaction decides on.\n *\n * When a message carries a pre-computed `_estTokens` field (set by\n * ConversationState on append/replace), it is used directly instead of\n * re-walking the content blocks — turning the O(n·m) scan into an O(n)\n * sum for fully-cached arrays.\n */\nexport function estimateMessageTokens(messages: readonly Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m._estTokens === 'number' && m._estTokens > 0) {\n total += m._estTokens;\n continue;\n }\n total += computeMessageTokens(m);\n }\n return total;\n}\n\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}): number {\n // Fast path: pre-computed by ToolRegistry at registration time.\n const cached = (tool as { _estDefTokens?: number | undefined })._estDefTokens;\n if (typeof cached === 'number' && cached > 0) return cached;\n\n const compact = compactToolDefinitionForWire(tool);\n return (\n RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(compact.description) +\n RoughTokenEstimate(JSON.stringify(compact.inputSchema))\n );\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n // Fast path: pre-computed per-message token estimate (set by\n // ConversationState on append/replace). Skips the O(m) content-block\n // walk entirely for cached messages.\n const cached = (m as { _estTokens?: number | undefined })._estTokens;\n if (typeof cached === 'number' && cached > 0) {\n messagesTokens += cached;\n continue;\n }\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string | undefined }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (\n typeof b === 'object' &&\n b !== null &&\n (b as { type?: string | undefined }).type === 'text'\n ) {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n const total = messagesTokens + systemTokens + toolsTokens;\n\n // Record the raw estimate for calibration: the next recordActualUsage()\n // call will pair this against the actual API usage so the rolling ratio\n // stays in sync with the real chars/token ratio of the content.\n calState(calibrationKey).prevEst = total;\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total,\n };\n}\n\n/**\n * Record the actual API input token count after a provider call so\n * `estimateRequestTokensCalibrated` can self-correct on subsequent calls.\n *\n * Prefer passing `estimatedInputTokens` explicitly (the calibrated pre-flight\n * estimate from the middleware) — this avoids race conditions when other code\n * also calls `estimateRequestTokens` between the pre-flight and this call\n * (e.g. audit logging in agent.ts).\n *\n * When `estimatedInputTokens` is omitted, falls back to the keyed bucket's\n * `prevEst` for backward compatibility with callers that don't have the\n * pre-flight value. `calibrationKey` selects the per-(provider,model) bucket\n * (defaults to the shared global bucket).\n */\nexport function recordActualUsage(\n actualInputTokens: number,\n estimatedInputTokens?: number,\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): void {\n if (actualInputTokens <= 0) return;\n const cal = calState(calibrationKey);\n const est = estimatedInputTokens ?? cal.prevEst;\n if (est <= 0) return;\n\n const sampleRatio = actualInputTokens / est;\n if (cal.count === 0) {\n cal.ratio = sampleRatio;\n } else {\n // EWM: new = α * sample + (1-α) * old → α=0.3 = fast initial converge\n cal.ratio = CAL_ALPHA * sampleRatio + (1 - CAL_ALPHA) * cal.ratio;\n }\n // Sanity bound: keep the rolling ratio within [0.5, 1.5] so a sequence\n // of bad samples can't blow up the calibration for everyone.\n cal.ratio = Math.min(1.5, Math.max(0.5, cal.ratio));\n cal.count++;\n}\n\n/**\n * Returns the current calibration state for a bucket. Exposed for debugging\n * and tests — not needed by normal callers.\n */\nexport function getCalibrationState(calibrationKey: string = CALIBRATION_GLOBAL_KEY): {\n ratio: number;\n count: number;\n calibrated: boolean;\n} {\n const cal = calState(calibrationKey);\n return {\n ratio: cal.ratio,\n count: cal.count,\n calibrated: cal.count >= MIN_SAMPLES_FOR_CALIBRATION,\n };\n}\n\n/**\n * Like `estimateRequestTokens` but applies the rolling calibration factor\n * so context pressure readings converge on reality within a few iterations.\n *\n * Before any `recordActualUsage` samples are collected, returns the same\n * result as `estimateRequestTokens` (ratio = 1.0, no distortion).\n * After `MIN_SAMPLES_FOR_CALIBRATION` samples, applies the calibrated\n * multiplier capped to the range [0.5, 1.5] as a sanity bound.\n */\nexport function estimateRequestTokensCalibrated(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n const result = estimateRequestTokens(messages, systemPrompt, tools, calibrationKey);\n const cal = calState(calibrationKey);\n\n if (cal.count >= MIN_SAMPLES_FOR_CALIBRATION) {\n const safeRatio = Math.min(1.5, Math.max(0.5, cal.ratio));\n return {\n messages: Math.round(result.messages * safeRatio),\n systemPrompt: Math.round(result.systemPrompt * safeRatio),\n tools: Math.round(result.tools * safeRatio),\n total: Math.round(result.total * safeRatio),\n };\n }\n\n // No calibration samples yet — fall back to model-family ratio if available,\n // otherwise use the uncalibrated estimate (ratio = 1.0).\n const fallbackRatio = getModelFamilyRatio(calibrationKey);\n if (fallbackRatio !== null) {\n return {\n messages: Math.round(result.messages * fallbackRatio),\n systemPrompt: Math.round(result.systemPrompt * fallbackRatio),\n tools: Math.round(result.tools * fallbackRatio),\n total: Math.round(result.total * fallbackRatio),\n };\n }\n\n return result;\n}\n\n/** Look up the fallback chars/token ratio for a calibration key (e.g. \"provider/model\"). */\nfunction getModelFamilyRatio(calibrationKey: string): number | null {\n const lower = calibrationKey.toLowerCase();\n for (const [family, ratio] of Object.entries(MODEL_FAMILY_RATIO)) {\n if (lower.includes(family)) return ratio / 3.5; // MODEL_FAMILY_RATIO is chars/token, we need multiplier\n }\n return null;\n}\n\n/**\n * Resets calibration state. Primarily for tests that run in the same\n * process and need a clean slate between suites. With no argument it clears\n * every bucket (including the global one); pass a key to reset just that bucket.\n */\nexport function resetCalibration(calibrationKey?: string): void {\n if (calibrationKey === undefined) {\n _cals.clear();\n return;\n }\n _cals.delete(calibrationKey);\n}\n","/**\n * Tool output serialization utilities.\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\n */\n\nexport interface ToolOutputSerializerOptions {\n perIterationOutputCapBytes?: number | undefined;\n estimator?: ((text: string) => number) | undefined;\n}\n\nexport interface ToolOutputSerializeContext {\n toolName?: string | undefined;\n input?: unknown;\n}\n\ntype RecordValue = Record<string, unknown>;\n\nconst DEFAULT_LIST_LIMIT = 500;\nconst LOG_ENTRY_LIMIT = 200;\nconst INLINE_LIMIT = 240;\nconst GREP_FILE_LIMIT = 80;\nconst GREP_MATCHES_PER_FILE = 3;\nconst DIFF_INLINE_LINE_LIMIT = 260;\nconst DIFF_HUNK_LIMIT = 8;\nconst DIFF_HUNK_CONTEXT = 14;\n\n// Pre-compiled regex — used in parseGrepContentLine() for every grep match line.\n// Compiling once at module load avoids repeated RegExp construction overhead.\nconst GREP_LINE_RE = /^(.+?):(\\d+):(.*)$/;\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown, context: ToolOutputSerializeContext = {}): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') {\n if (Array.isArray(value)) return value.map((item) => serialize(item)).join('\\n');\n if (context.toolName) {\n const compact = renderToolObject(context.toolName, value as RecordValue, context.input);\n if (compact !== undefined) return compact;\n return renderGenericToolObject(context.toolName, value as RecordValue);\n }\n if ('text' in (value as Record<string, unknown>)) {\n const t = (value as Record<string, unknown>).text;\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\n if (remainingBudget <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const textBytes = Buffer.byteLength(text, 'utf8');\n if (textBytes <= remainingBudget) {\n return { text, newBudget: remainingBudget - textBytes };\n }\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\n const markerBytes = Buffer.byteLength(marker, 'utf8');\n const available = remainingBudget - markerBytes;\n if (available <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const half = Math.floor(available / 2);\n const first = text.slice(0, half);\n const second = text.slice(text.length - half);\n return { text: `${first}${marker}${second}`, newBudget: 0 };\n }\n\n return { serialize, enforceCap, capBytes };\n}\n\nfunction renderToolObject(toolName: string, obj: RecordValue, input: unknown): string | undefined {\n if (toolName === 'read' && typeof obj['text'] === 'string') {\n return joinSections([\n renderHeader(\n `read: ${stringFromInput(input, 'path') ?? stringField(obj, 'path') ?? '<unknown>'}`,\n {\n offset: numberFromInput(input, 'offset'),\n limit: numberFromInput(input, 'limit'),\n total_lines: obj['total_lines'],\n encoding: obj['encoding'],\n truncated: obj['truncated'],\n cached: obj['cached'],\n note: obj['note'],\n },\n ),\n obj['text'],\n ]);\n }\n\n if (toolName === 'grep' && Array.isArray(obj['matches'])) {\n const matches = stringArrayField(obj, 'matches');\n return joinSections([\n renderHeader(`grep: ${stringFromInput(input, 'pattern') ?? '<pattern>'}`, {\n path: stringFromInput(input, 'path'),\n glob: stringFromInput(input, 'glob'),\n mode: stringFromInput(input, 'output_mode'),\n count: obj['count'],\n shown: matches.length,\n truncated: obj['truncated'],\n used: obj['used'],\n }),\n renderGrepMatches(matches, stringFromInput(input, 'output_mode')),\n ]);\n }\n\n if (toolName === 'patch' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader('patch', {\n applied: obj['applied'],\n rejected: obj['rejected'],\n files: files.length,\n dry_run: obj['dry_run'],\n }),\n typeof obj['message'] === 'string' ? `message:\\n${obj['message']}` : undefined,\n files.length > 0 ? `files:\\n${renderStringList(files)}` : undefined,\n ]);\n }\n\n if (toolName === 'glob' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader(\n `${toolName}: ${stringFromInput(input, 'pattern') ?? stringFromInput(input, 'files') ?? stringFromInput(input, 'path') ?? ''}`.trim(),\n {\n path: stringFromInput(input, 'path'),\n files: files.length,\n truncated: obj['truncated'],\n },\n ),\n renderStringList(files, '(no files)'),\n ]);\n }\n\n if (toolName === 'tree' && typeof obj['tree'] === 'string') {\n return joinSections([\n renderHeader(\n `tree: ${stringField(obj, 'path') ?? stringFromInput(input, 'path') ?? '<cwd>'}`,\n {\n total_files: obj['total_files'],\n total_dirs: obj['total_dirs'],\n truncated: obj['truncated'],\n },\n ),\n obj['tree'],\n ]);\n }\n\n if (toolName === 'fetch' && typeof obj['content'] === 'string') {\n return joinSections([\n renderHeader(\n `fetch: ${stringField(obj, 'url') ?? stringFromInput(input, 'url') ?? '<url>'}`,\n {\n status: obj['status'],\n content_type: obj['content_type'],\n },\n ),\n obj['content'],\n ]);\n }\n\n if (toolName === 'replace' && Array.isArray(obj['results'])) {\n const results = obj['results'].filter(isRecord);\n const sections: Array<string | undefined> = [\n renderHeader('replace', {\n files_modified: obj['files_modified'],\n total_replacements: obj['total_replacements'],\n dry_run: obj['dry_run'],\n }),\n ];\n for (const r of results.slice(0, DEFAULT_LIST_LIMIT)) {\n sections.push(\n joinSections([\n renderHeader(`file: ${stringField(r, 'path') ?? '<unknown>'}`, {\n replacements: r['replacements'],\n }),\n typeof r['diff'] === 'string' ? r['diff'] : undefined,\n ]),\n );\n }\n if (results.length > DEFAULT_LIST_LIMIT) {\n sections.push(`[serializer omitted ${results.length - DEFAULT_LIST_LIMIT} result item(s)]`);\n }\n return joinSections(sections);\n }\n\n if (typeof obj['diff'] === 'string') {\n const diff = obj['diff'];\n return joinSections([\n renderHeader(toolName, {\n path: obj['path'],\n replacements: obj['replacements'],\n bytes_written: obj['bytes_written'],\n created: obj['created'],\n note: obj['note'],\n files: Array.isArray(obj['files']) ? obj['files'].length : undefined,\n truncated: obj['truncated'],\n mode: obj['mode'],\n }),\n compactDiff(diff),\n ]);\n }\n\n if (toolName === 'test' && typeof obj['output'] === 'string') {\n return renderTestOutput(obj, input);\n }\n\n if (\n (toolName === 'typecheck' || toolName === 'lint' || toolName === 'format') &&\n typeof obj['output'] === 'string'\n ) {\n return renderVerifierOutput(toolName, obj, input);\n }\n\n if (hasCommandOutputShape(obj)) {\n return renderCommandOutput(toolName, obj, input);\n }\n\n if (toolName === 'json' && typeof obj['formatted'] === 'string') {\n return joinSections([\n renderHeader('json', {\n type: obj['type'],\n keys: Array.isArray(obj['keys']) ? obj['keys'].length : undefined,\n query: stringFromInput(input, 'query'),\n error: obj['error'],\n }),\n obj['formatted'],\n ]);\n }\n\n if (toolName === 'logs' && Array.isArray(obj['entries'])) {\n const entries = obj['entries'].filter(isRecord);\n const lines = entries.slice(0, LOG_ENTRY_LIMIT).map((entry) => {\n const ts = stringField(entry, 'timestamp') ?? '';\n const level = stringField(entry, 'level') ?? 'info';\n const message = stringField(entry, 'message') ?? '';\n const source = stringField(entry, 'source');\n return [ts, level, source, message].filter(Boolean).join(' ');\n });\n if (entries.length > LOG_ENTRY_LIMIT) {\n lines.push(`[serializer omitted ${entries.length - LOG_ENTRY_LIMIT} log entry item(s)]`);\n }\n return joinSections([\n renderHeader(`logs: ${stringField(obj, 'source') ?? '<source>'}`, {\n total: obj['total'],\n shown: Math.min(entries.length, LOG_ENTRY_LIMIT),\n truncated: obj['truncated'],\n stream_mode: obj['stream_mode'],\n }),\n lines.length > 0 ? lines.join('\\n') : '(no log entries)',\n ]);\n }\n\n if (toolName === 'audit' && Array.isArray(obj['vulnerabilities'])) {\n const vulns = obj['vulnerabilities'].filter(isRecord);\n const lines = vulns.slice(0, DEFAULT_LIST_LIMIT).map((v) => {\n const severity = stringField(v, 'severity') ?? 'unknown';\n const pkg = stringField(v, 'package') ?? '<package>';\n const title = stringField(v, 'title') ?? '';\n const url = stringField(v, 'url');\n return [severity, pkg, title, url].filter(Boolean).join(' | ');\n });\n if (vulns.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${vulns.length - DEFAULT_LIST_LIMIT} vulnerability item(s)]`);\n }\n return joinSections([\n renderHeader('audit', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n summary: obj['summary'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n if (toolName === 'outdated' && Array.isArray(obj['packages'])) {\n const packages = obj['packages'].filter(isRecord);\n const lines = packages\n .slice(0, DEFAULT_LIST_LIMIT)\n .map((p) =>\n [\n stringField(p, 'name') ?? '<package>',\n `current=${stringField(p, 'current') ?? 'unknown'}`,\n `wanted=${stringField(p, 'wanted') ?? 'unknown'}`,\n `latest=${stringField(p, 'latest') ?? 'unknown'}`,\n stringField(p, 'type'),\n ]\n .filter(Boolean)\n .join(' | '),\n );\n if (packages.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${packages.length - DEFAULT_LIST_LIMIT} package item(s)]`);\n }\n return joinSections([\n renderHeader('outdated', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n return undefined;\n}\n\nfunction renderTestOutput(obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const failed = numberField(obj, 'failed') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const header = renderHeader(`test: ${stringField(obj, 'runner') ?? 'runner'}`, {\n exit_code: obj['exit_code'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n grep: stringFromInput(input, 'grep'),\n });\n\n if (exitCode === 0 && failed === 0) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n `status=passed`,\n `tests_run=${obj['tests_run'] ?? 0}`,\n `passed=${obj['passed'] ?? 0}`,\n `failed=${obj['failed'] ?? 0}`,\n `duration_ms=${obj['duration_ms'] ?? 0}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no runner output)')}`,\n ]);\n}\n\nfunction renderVerifierOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const errors = numberField(obj, 'errors') ?? 0;\n const warnings = numberField(obj, 'warnings') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const changed = numberField(obj, 'files_changed') ?? 0;\n const header = renderHeader(toolName, {\n exit_code: obj['exit_code'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n fixer: obj['fixer'],\n linter: obj['linter'],\n project: obj['project'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n cwd: stringFromInput(input, 'cwd'),\n });\n\n if (exitCode === 0 && errors === 0 && (toolName !== 'format' || changed === 0)) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=passed',\n `errors=${errors}`,\n `warnings=${warnings}`,\n toolName === 'format' ? `files_changed=${changed}` : undefined,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n if (exitCode === 0 && toolName === 'format') {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=changed',\n `files_changed=${changed}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no verifier output)')}`,\n ]);\n}\n\nfunction renderGrepMatches(matches: string[], mode: string | undefined): string {\n if (matches.length === 0) return '(no matches)';\n if (mode === 'files_with_matches') return renderStringList(matches, '(no files)');\n if (mode === 'count') return renderStringList(matches, '(no counts)');\n\n const groups = new Map<string, string[]>();\n const passthrough: string[] = [];\n for (const match of matches) {\n const parsed = parseGrepContentLine(match);\n if (!parsed) {\n passthrough.push(match);\n continue;\n }\n const list = groups.get(parsed.file) ?? [];\n list.push(`${parsed.line}:${parsed.text}`);\n groups.set(parsed.file, list);\n }\n\n if (groups.size === 0) return renderStringList(matches, '(no matches)');\n\n const sections: string[] = [];\n let fileIndex = 0;\n for (const [file, lines] of groups) {\n fileIndex++;\n if (fileIndex > GREP_FILE_LIMIT) break;\n const shown = lines.slice(0, GREP_MATCHES_PER_FILE);\n sections.push(\n `${file} (${lines.length} match(es), showing ${shown.length})\\n${shown.join('\\n')}`,\n );\n }\n if (groups.size > GREP_FILE_LIMIT) {\n sections.push(`[serializer omitted ${groups.size - GREP_FILE_LIMIT} file group(s)]`);\n }\n if (passthrough.length > 0) {\n sections.push(`ungrouped:\\n${renderStringList(passthrough, '', 50)}`);\n }\n return sections.join('\\n');\n}\n\nfunction parseGrepContentLine(\n line: string,\n): { file: string; line: string; text: string } | undefined {\n const match = GREP_LINE_RE.exec(line);\n if (!match?.[1] || !match[2]) return undefined;\n return { file: match[1], line: match[2], text: match[3] ?? '' };\n}\n\nfunction compactDiff(diff: string): string {\n const lines = diff.split(/\\r?\\n/);\n if (lines.length <= DIFF_INLINE_LINE_LIMIT) return diff;\n\n const fileCount = Math.max(\n new Set(\n lines\n .map(\n (line) => /^diff --git\\s+a\\/(.+?)\\s+b\\//.exec(line)?.[1] ?? /^---\\s+(.+)/.exec(line)?.[1],\n )\n .filter(Boolean),\n ).size,\n 0,\n );\n const hunks = lines.filter((line) => line.startsWith('@@')).length;\n const added = lines.filter((line) => line.startsWith('+') && !line.startsWith('+++')).length;\n const removed = lines.filter((line) => line.startsWith('-') && !line.startsWith('---')).length;\n\n // Collect [start, end] intervals as we scan lines sequentially.\n // Intervals are naturally ordered by line index — no sort needed.\n const intervals: Array<[number, number]> = [];\n let hunkCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (line.startsWith('diff --git') || line.startsWith('--- ') || line.startsWith('+++ ')) {\n intervals.push([i, i]);\n continue;\n }\n if (!line.startsWith('@@')) continue;\n if (hunkCount >= DIFF_HUNK_LIMIT) continue;\n hunkCount++;\n intervals.push([i, Math.min(lines.length - 1, i + DIFF_HUNK_CONTEXT)]);\n }\n\n if (intervals.length === 0) {\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n added,\n removed,\n lines: lines.length,\n }),\n lines.slice(0, DIFF_INLINE_LINE_LIMIT).join('\\n'),\n `[serializer omitted ${Math.max(0, lines.length - DIFF_INLINE_LINE_LIMIT)} diff line(s)]`,\n ]);\n }\n\n // Merge overlapping / adjacent intervals in a single O(n) pass.\n // Intervals are already in ascending order from the sequential scan.\n const merged: Array<[number, number]> = [intervals[0]!];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1]!;\n const current = intervals[i]!;\n if (current[0] <= last[1] + 1) {\n last[1] = Math.max(last[1], current[1]);\n } else {\n merged.push(current);\n }\n }\n\n // Build excerpt from merged intervals — O(n), no sort.\n const excerpt: string[] = [];\n let prevLine = -1;\n for (const [start, end] of merged) {\n if (start > prevLine + 1) {\n const omitted = prevLine === -1 ? start : start - prevLine - 1;\n excerpt.push(`[serializer omitted ${omitted} diff line(s)]`);\n }\n for (let j = start; j <= end; j++) {\n excerpt.push(lines[j] ?? '');\n }\n prevLine = end;\n }\n\n const trailing = lines.length - prevLine - 1;\n if (trailing > 0) excerpt.push(`[serializer omitted ${trailing} trailing diff line(s)]`);\n\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n shown_hunks: Math.min(hunks, DIFF_HUNK_LIMIT),\n added,\n removed,\n lines: lines.length,\n }),\n excerpt.join('\\n'),\n ]);\n}\n\nfunction compactFailureOutput(output: string): string {\n const lines = output.split(/\\r?\\n/);\n if (lines.length <= 260) return output.trimEnd();\n\n const selected = new Set<number>();\n const marker =\n /\\b(fail|failed|failure|error|exception|assertionerror|expected|received|actual|timeout|stack)\\b/i;\n let markerHits = 0;\n for (let i = 0; i < lines.length; i++) {\n if (!marker.test(lines[i] ?? '')) continue;\n markerHits++;\n for (let j = Math.max(0, i - 4); j <= Math.min(lines.length - 1, i + 10); j++) {\n selected.add(j);\n }\n }\n\n if (markerHits === 0) {\n return lines.slice(-220).join('\\n').trimEnd();\n }\n\n const ordered = [...selected].sort((a, b) => a - b);\n const out: string[] = [];\n let previous = -1;\n for (const index of ordered) {\n if (index > previous + 1) {\n const omitted = previous === -1 ? index : index - previous - 1;\n out.push(`[serializer omitted ${omitted} line(s)]`);\n }\n out.push(lines[index] ?? '');\n previous = index;\n }\n return out.join('\\n').trimEnd();\n}\n\nfunction extractSpoolNote(output: string): string | undefined {\n return output\n .split(/\\r?\\n/)\n .find((line) => line.startsWith('[output truncated') && line.includes('full'));\n}\n\nfunction hasCommandOutputShape(obj: RecordValue): boolean {\n return (\n typeof obj['stdout'] === 'string' ||\n typeof obj['stderr'] === 'string' ||\n typeof obj['output'] === 'string' ||\n typeof obj['exitCode'] === 'number' ||\n typeof obj['exit_code'] === 'number'\n );\n}\n\nfunction renderCommandOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const command = stringField(obj, 'command') ?? stringFromInput(input, 'command');\n const args = stringArrayField(obj, 'args');\n const commandLine = command ? [command, ...args].join(' ') : undefined;\n const output = stringField(obj, 'output');\n const stdout = stringField(obj, 'stdout');\n const stderr = stringField(obj, 'stderr');\n return joinSections([\n renderHeader(commandLine ? `${toolName}: ${commandLine}` : toolName, {\n exit_code: obj['exit_code'] ?? obj['exitCode'],\n timed_out: obj['timed_out'],\n pid: obj['pid'],\n allowed: obj['allowed'],\n truncated: obj['truncated'],\n runner: obj['runner'],\n linter: obj['linter'],\n fixer: obj['fixer'],\n project: obj['project'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n }),\n stringField(obj, 'error') ? `error:\\n${stringField(obj, 'error')}` : undefined,\n output ? `output:\\n${output}` : undefined,\n stdout ? `stdout:\\n${stdout}` : undefined,\n stderr ? `stderr:\\n${stderr}` : undefined,\n ]);\n}\n\nfunction renderGenericToolObject(toolName: string, obj: RecordValue): string {\n const scalars: RecordValue = {};\n const blocks: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n if (isScalar(value)) {\n const inline = String(value);\n if (inline.length <= INLINE_LIMIT && !inline.includes('\\n')) {\n scalars[key] = value;\n } else {\n blocks.push(`${key}:\\n${inline}`);\n }\n continue;\n }\n if (Array.isArray(value)) {\n if (value.every((item) => typeof item === 'string')) {\n blocks.push(`${key}:\\n${renderStringList(value as string[])}`);\n } else {\n blocks.push(`${key}:\\n${renderUnknownList(value)}`);\n }\n continue;\n }\n blocks.push(`${key}: ${clipInline(oneLineJson(value))}`);\n }\n return joinSections([renderHeader(toolName, scalars), ...blocks]);\n}\n\nfunction renderHeader(label: string, fields: RecordValue): string {\n const parts = Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${clipInline(formatInlineValue(value))}`);\n return parts.length > 0 ? `${label} (${parts.join(' ')})` : label;\n}\n\nfunction renderStringList(items: string[], empty = '', limit = DEFAULT_LIST_LIMIT): string {\n if (items.length === 0) return empty;\n const shown = items.slice(0, limit);\n const omitted = items.length - shown.length;\n return [\n ...shown,\n ...(omitted > 0\n ? [`[serializer omitted ${omitted} item(s); narrow the request for more]`]\n : []),\n ].join('\\n');\n}\n\nfunction renderUnknownList(items: unknown[], limit = DEFAULT_LIST_LIMIT): string {\n const shown = items.slice(0, limit).map((item) => clipInline(oneLineJson(item), 1_000));\n const omitted = items.length - shown.length;\n if (omitted > 0)\n shown.push(`[serializer omitted ${omitted} item(s); narrow the request for more]`);\n return shown.join('\\n');\n}\n\nfunction joinSections(sections: Array<string | undefined>): string {\n return sections\n .map((section) => (typeof section === 'string' ? section.trimEnd() : undefined))\n .filter((section): section is string => !!section)\n .join('\\n');\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(formatInlineValue).join(',')}]`;\n if (isScalar(value)) return String(value);\n return oneLineJson(value);\n}\n\nfunction clipInline(value: string, max = INLINE_LIMIT): string {\n const compact = value.replace(/\\s+/g, ' ').trim();\n return compact.length <= max\n ? compact\n : `${compact.slice(0, max - 15)}...(${compact.length} chars)`;\n}\n\nfunction oneLineJson(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction stringField(obj: RecordValue, key: string): string | undefined {\n const value = obj[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberField(obj: RecordValue, key: string): number | undefined {\n const value = obj[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction stringArrayField(obj: RecordValue, key: string): string[] {\n const value = obj[key];\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction stringFromInput(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberFromInput(input: unknown, key: string): number | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction inputListSummary(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) return value.filter((item) => typeof item === 'string').join(',');\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is RecordValue {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean | null {\n return value === null || ['string', 'number', 'boolean'].includes(typeof value);\n}\n\n/**\n * Render a tool result body for inclusion in the `tool.executed` event.\n * Tool outputs can be large (file dumps, command output); UIs only want a\n * preview line, so cap at ~400 chars with an ellipsis marker.\n */\nexport function truncateForEvent(content: string, max = 400): string {\n if (!content) return '';\n return content.length <= max ? content : `${content.slice(0, max - 1)}…`;\n}\n\n/**\n * Derive size signals (bytes / tokens / lines) for the chip rendered beside\n * each tool result. Computed once over the FULL `content` BEFORE the\n * 400-char event preview is taken.\n *\n * - bytes: UTF-8 byte length (multi-byte aware).\n * - tokens: standard ~3.5 chars/token heuristic.\n * - lines: read prefixes lines with `<n>→`; for shell/grep/logs we fall\n * back to a newline count. Undefined for tools without a line notion.\n */\nconst READ_LINE_PREFIX_RE = /^\\s*\\d+→/gm;\n\nexport function sizeSignals(\n toolName: string | undefined,\n content: string,\n): { outputBytes: number; outputTokens: number; outputLines: number | undefined } {\n if (!content || content.length === 0) {\n return { outputBytes: 0, outputTokens: 0, outputLines: undefined };\n }\n const outputBytes = Buffer.byteLength(content, 'utf8');\n const outputTokens = Math.max(1, Math.round(outputBytes / 3.5));\n let outputLines: number | undefined;\n if (toolName === 'read') {\n READ_LINE_PREFIX_RE.lastIndex = 0;\n let count = 0;\n while (READ_LINE_PREFIX_RE.exec(content) !== null) count++;\n if (count > 0) outputLines = count;\n } else if (\n toolName === 'bash' ||\n toolName === 'shell' ||\n toolName === 'grep' ||\n toolName === 'logs'\n ) {\n let nl = 0;\n for (let i = 0; i < content.length; i++) if (content.charCodeAt(i) === 10) nl++;\n outputLines = nl + (content.endsWith('\\n') ? 0 : 1);\n }\n return { outputBytes, outputTokens, outputLines };\n}\n","import { createHash } from 'node:crypto';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Path layout. All developer-level state lives in ~/.wrongstack/.\n * Per-project state is keyed by sha256(absoluteProjectRoot).slice(0,12)\n * under ~/.wrongstack/projects/<hash>/.\n *\n * The ONLY thing inside the project tree is the optional\n * .wrongstack/AGENTS.md (committed) and .wrongstack/skills/ (committed).\n */\n\nexport interface WstackPaths {\n /** ~/.wrongstack — global root. */\n globalRoot: string;\n /**\n * ~/.wrongstack — directory for user-global stateful config files\n * (mode.json, theme.json, …). Currently an alias for `globalRoot`;\n * separate name lets us split out per-OS XDG_CONFIG_HOME later\n * without rewriting callers.\n */\n configDir: string;\n /** ~/.wrongstack/config.json */\n globalConfig: string;\n /** ~/.wrongstack/.key — 32 random bytes, mode 0600, AES-GCM key for the secret vault. */\n secretsKey: string;\n /** ~/.wrongstack/memory.md — user-global memory. */\n globalMemory: string;\n /** ~/.wrongstack/skills — user-global skills. */\n globalSkills: string;\n /** ~/.wrongstack/prompts — user-global prompt library. */\n globalPrompts: string;\n /** ~/.wrongstack/cache — fetched data (models.dev, etc.). */\n cacheDir: string;\n /** ~/.wrongstack/cache/models.dev.json */\n modelsCache: string;\n /** ~/.wrongstack/cache/models-overlay.json — cached curated overlay. */\n modelsOverlayCache: string;\n /**\n * Per-project codebase symbol index (SQLite). Lives under the global project\n * dir — NOT inside the repo — so it never clutters the working tree or needs\n * gitignoring. `~/.wrongstack/projects/<hash>/codebase-index`.\n */\n projectCodebaseIndex: string;\n /** ~/.wrongstack/history — REPL line history. */\n historyFile: string;\n /** ~/.wrongstack/logs/wrongstack.log */\n logFile: string;\n /** ~/.wrongstack/projects/<hash> */\n projectDir: string;\n /** ~/.wrongstack/projects/<hash>/memory.md */\n projectMemory: string;\n /** ~/.wrongstack/projects/<hash>/sessions */\n projectSessions: string;\n /** ~/.wrongstack/projects/<hash>/trust.json */\n projectTrust: string;\n /** ~/.wrongstack/projects/<hash>/meta.json */\n projectMeta: string;\n /** ~/.wrongstack/projects/<hash>/config.local.json — optional override */\n projectLocalConfig: string;\n /** <project>/.wrongstack/config.json — per-project settings (safe fields only).\n * This lives inside the project root so it can be gitignored or shared. */\n inProjectConfig: string;\n /** <project>/.wrongstack/AGENTS.md — committed project memory. */\n inProjectAgentsFile: string;\n /** <project>/.wrongstack/skills — committed project skills. */\n inProjectSkills: string;\n /** <project>/.wrongstack/worktrees — git worktrees for per-phase isolation (gitignored). */\n inProjectWorktrees: string;\n /** Stable hash for the project root. */\n projectHash: string;\n /** Human-readable project slug: `wrongstack-a1b2c3` instead of `3024e5e6fa58`. */\n projectSlug: string;\n /** ~/.wrongstack/projects/<hash>/goal.json — goal persistence */\n projectGoal: string;\n /** ~/.wrongstack/projects/<hash>/specs — SDD spec files */\n projectSpecs: string;\n /** ~/.wrongstack/projects/<hash>/task-graphs — SDD task graphs */\n projectTaskGraphs: string;\n /** ~/.wrongstack/projects/<hash>/sdd-session.json — SDD session state */\n projectSddSession: string;\n /** ~/.wrongstack/projects/<hash>/plan.json — plan persistence */\n projectPlan: string;\n /** ~/.wrongstack/projects/<hash>/autophase — AutoPhase phase-graph JSON files */\n projectAutophase: string;\n /** ~/.wrongstack/sync.json — CloudSync configuration */\n syncConfig: string;\n /** Function to get the status.json path for a project given its hash. */\n projectStatus: (projectHash: string) => string;\n}\n\nexport function projectHash(absRoot: string): string {\n return createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 12);\n}\n\n/**\n * Human-readable project directory name: slugified folder name + short hash\n * suffix for uniqueness. e.g. `wrongstack-a1b2c3` instead of `3024e5e6fa58`.\n */\nexport function projectSlug(absRoot: string): string {\n const base = slugify(path.basename(absRoot));\n const hash = createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\n/** Turn a folder name into a filesystem-safe lowercase slug. */\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n // Collapse any run of non-alphanumeric chars into a single hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40) || 'project'\n );\n}\n\nexport interface WstackPathOptions {\n userHome?: string | undefined;\n projectRoot: string;\n /** Override the global root (e.g. for tests). Default: `${userHome}/.wrongstack`. */\n globalRoot?: string | undefined;\n}\n\n/**\n * The global `~/.wrongstack` root, honoring the `WRONGSTACK_HOME` env\n * override. The override exists so tests (and sandboxed runs) can redirect\n * ALL global state — config, secrets, logs, projects/, mailboxes — away from\n * the real user home. Before it existed, `pnpm test` booted runtimes against\n * the real `~/.wrongstack`: it read the user's real config.json (starting a\n * second live Telegram poller), appended to the real wrongstack.log, and left\n * ~20k orphaned fixture dirs under projects/.\n *\n * Every code path that wants the global dir must come through here (or\n * through `resolveWstackPaths`) instead of `path.join(os.homedir(), '.wrongstack')`.\n */\nexport function wstackGlobalRoot(): string {\n const fromEnv = process.env['WRONGSTACK_HOME'];\n if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv);\n return path.join(os.homedir(), '.wrongstack');\n}\n\nexport function resolveWstackPaths(opts: WstackPathOptions): WstackPaths {\n // Precedence: explicit globalRoot > explicit userHome (callers/tests that\n // pass one expect paths under it) > WRONGSTACK_HOME env > real home dir.\n const globalRoot =\n opts.globalRoot ?? (opts.userHome ? path.join(opts.userHome, '.wrongstack') : wstackGlobalRoot());\n const hash = projectHash(opts.projectRoot);\n const slug = projectSlug(opts.projectRoot);\n const projectDir = path.join(globalRoot, 'projects', slug);\n return {\n globalRoot,\n configDir: globalRoot,\n globalConfig: path.join(globalRoot, 'config.json'),\n secretsKey: path.join(globalRoot, '.key'),\n globalMemory: path.join(globalRoot, 'memory.md'),\n globalSkills: path.join(globalRoot, 'skills'),\n globalPrompts: path.join(globalRoot, 'prompts'),\n cacheDir: path.join(globalRoot, 'cache'),\n modelsCache: path.join(globalRoot, 'cache', 'models.dev.json'),\n modelsOverlayCache: path.join(globalRoot, 'cache', 'models-overlay.json'),\n historyFile: path.join(globalRoot, 'history'),\n logFile: path.join(globalRoot, 'logs', 'wrongstack.log'),\n projectDir,\n projectCodebaseIndex: path.join(projectDir, 'codebase-index'),\n projectMemory: path.join(projectDir, 'memory.md'),\n projectSessions: path.join(projectDir, 'sessions'),\n projectTrust: path.join(projectDir, 'trust.json'),\n projectMeta: path.join(projectDir, 'meta.json'),\n projectLocalConfig: path.join(projectDir, 'config.local.json'),\n inProjectConfig: path.join(opts.projectRoot, '.wrongstack', 'config.json'),\n inProjectAgentsFile: path.join(opts.projectRoot, '.wrongstack', 'AGENTS.md'),\n inProjectSkills: path.join(opts.projectRoot, '.wrongstack', 'skills'),\n inProjectWorktrees: path.join(opts.projectRoot, '.wrongstack', 'worktrees'),\n projectHash: hash,\n projectSlug: slug,\n projectGoal: path.join(projectDir, 'goal.json'),\n projectSpecs: path.join(projectDir, 'specs'),\n projectTaskGraphs: path.join(projectDir, 'task-graphs'),\n projectSddSession: path.join(projectDir, 'sdd-session.json'),\n projectPlan: path.join(projectDir, 'plan.json'),\n projectAutophase: path.join(projectDir, 'autophase'),\n syncConfig: path.join(globalRoot, 'sync.json'),\n projectStatus: (projectHash: string) => path.join(globalRoot, 'projects', projectHash, 'status.json'),\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/assert-never.ts","../../src/utils/atomic-write.ts","../../src/utils/child-env.ts","../../src/utils/term.ts","../../src/utils/color.ts","../../src/utils/config-json.ts","../../src/utils/context-evidence.ts","../../src/utils/deep-merge.ts","../../src/utils/diff.ts","../../src/utils/error.ts","../../src/utils/expect-defined.ts","../../src/utils/glob-expand.ts","../../src/utils/glob-match.ts","../../src/utils/ip-guard.ts","../../src/utils/json-repair.ts","../../src/utils/json-schema-validate.ts","../../src/utils/merge-custom-models.ts","../../src/utils/merge-models-payload.ts","../../src/utils/message-invariants.ts","../../src/utils/newline-normalize.ts","../../src/utils/regex-guard.ts","../../src/utils/safe-json.ts","../../src/utils/sleep.ts","../../src/utils/string.ts","../../src/utils/task-format.ts","../../src/utils/todos-format.ts","../../src/utils/tool-subject.ts","../../src/utils/tool-wire-compact.ts","../../src/utils/token-estimate.ts","../../src/utils/tool-output-serializer.ts","../../src/utils/tool-description-mode.ts","../../src/utils/wstack-paths.ts"],"names":["path","stat","resolve","open","fs2","path2","isAbsolute","walk","fsp","isRecord","projectHash"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Exhaustiveness check for discriminated union switches.\n * Place in the `default` branch of a switch over a union type\n * to get a compile-time error when a new variant is added.\n *\n * @example\n * switch (block.type) {\n * case 'text': return renderText(block);\n * case 'tool_use': return renderToolUse(block);\n * default: return assertNever(block);\n * }\n */\nexport function assertNever(x: never, message?: string): never {\n const err = new Error(\n message ?? `Unhandled case: ${JSON.stringify(x)}`,\n );\n err.name = 'AssertNeverError';\n throw err;\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number | undefined;\n encoding?: BufferEncoding | undefined;\n}\n\nexport interface FileLockOptions {\n timeoutMs?: number | undefined;\n staleMs?: number | undefined;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\nexport async function withFileLock<T>(\n targetPath: string,\n fn: () => Promise<T>,\n opts: FileLockOptions = {},\n): Promise<T> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const lockPath = path.join(dir, `.${path.basename(targetPath)}.lock`);\n const timeoutMs = opts.timeoutMs ?? 5_000;\n const staleMs = opts.staleMs ?? 30_000;\n const started = Date.now();\n let handle: fs.FileHandle | undefined;\n\n for (;;) {\n try {\n handle = await fs.open(lockPath, 'wx');\n await handle.writeFile(`${process.pid}:${Date.now()}`);\n break;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOENT means the directory was deleted (e.g. by concurrent cleanup).\n // Recreate it and retry acquiring the lock.\n if (code === 'ENOENT') {\n await fs.mkdir(dir, { recursive: true });\n continue;\n }\n if (code !== 'EEXIST') throw err;\n try {\n const stat = await fs.stat(lockPath);\n if (Date.now() - stat.mtimeMs > staleMs) {\n await fs.unlink(lockPath);\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() - started >= timeoutMs) {\n throw new Error(`Timed out waiting for file lock: ${targetPath}`);\n }\n await new Promise((resolve) => setTimeout(resolve, 25));\n }\n }\n\n try {\n return await fn();\n } finally {\n try {\n await handle?.close();\n } catch {\n // ignore\n }\n try {\n await fs.unlink(lockPath);\n } catch {\n // ignore\n }\n }\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","/**\n * Build a sanitized child-process environment.\n *\n * The bash/exec tools and MCP stdio transports execute LLM-generated or\n * configured commands. The parent process carries provider API keys\n * (ANTHROPIC_API_KEY, OPENAI_API_KEY, ...), VCS tokens (GITHUB_TOKEN),\n * and cloud credentials. Forwarding those to a child is an exfiltration\n * vector even with `permission: 'confirm'` — a compromised MCP server\n * or a cleverly composed shell pipeline can leak secrets.\n *\n * Strategy: copy a small, explicit allowlist of variables that real builds\n * need, then copy anything else that does NOT look secret-bearing. This\n * preserves user-friendly behavior (locale, terminal, npm config) while\n * blocking the obvious leak channels. Two value-side guards back up the\n * name-based filter:\n * - any value carrying an embedded URI credential (`scheme://user:pass@host`,\n * e.g. `DATABASE_URL`/`REDIS_URL`/`*_DSN`) is dropped (WS-01);\n * - `NODE_OPTIONS` is forwarded but with module-preload directives\n * (`--require`/`--import`/`--loader`) stripped so a parent-set value can't\n * inject code into node children (WS-02).\n *\n * Override with `WRONGSTACK_CHILD_ENV_PASSTHROUGH=1` to forward the full\n * parent environment unchanged (opt-in for advanced users who understand\n * the risk).\n */\n\nconst ALLOWED_KEYS = new Set<string>([\n 'PATH',\n 'HOME',\n 'USER',\n 'USERNAME',\n 'LOGNAME',\n 'SHELL',\n 'LANG',\n 'LC_ALL',\n 'LC_CTYPE',\n 'TERM',\n 'TZ',\n 'TMPDIR',\n 'TEMP',\n 'TMP',\n 'PWD',\n 'OLDPWD',\n 'COMSPEC',\n 'SYSTEMROOT',\n 'SYSTEMDRIVE',\n 'WINDIR',\n 'PROGRAMFILES',\n 'PROGRAMFILES(X86)',\n 'PROGRAMDATA',\n 'APPDATA',\n 'LOCALAPPDATA',\n 'USERPROFILE',\n 'PUBLIC',\n 'PATHEXT',\n]);\n\n// Substring match against env-var names (case-insensitive). Bias toward\n// false-positives — a missing var is recoverable, an exfiltrated key is not.\n// Only consulted for vars NOT on the curated allowlist; PWD/PASSWD-style\n// false positives there are avoided by checking allowlist first.\nconst SECRET_NAME_PARTS = [\n 'TOKEN',\n 'SECRET',\n 'PASSWORD',\n 'PASSWD',\n 'AUTH',\n 'CRED',\n 'BEARER',\n 'COOKIE',\n 'PRIVATE',\n];\n\nfunction looksSecret(name: string): boolean {\n const upper = name.toUpperCase();\n for (const p of SECRET_NAME_PARTS) {\n if (upper.includes(p)) return true;\n }\n // KEY is tricky — PUBLIC_KEY is fine to forward but most _KEY vars are\n // secrets. Require word boundary so KEYBOARD_LAYOUT etc. are not flagged.\n if (/(?:^|_)KEY(?:$|_|S$)/i.test(upper)) return true;\n if (/API[_-]?KEY/i.test(upper)) return true;\n if (/ACCESS[_-]?KEY/i.test(upper)) return true;\n if (/SESSION[_-]?ID/i.test(upper) === false && /SESSION/i.test(upper)) {\n // SESSION_ID is metadata (we set our own); other SESSION_* often holds\n // session cookies. Be conservative.\n return true;\n }\n return false;\n}\n\n/**\n * Value-side secret detection (WS-01). The name-based `looksSecret` filter\n * misses connection-string variables whose NAME is innocuous but whose VALUE\n * embeds a password — e.g. `DATABASE_URL=postgres://user:pass@host`,\n * `REDIS_URL=redis://:pass@host`, `MONGO_URI`, `AMQP_URL`, `*_DSN`. Forwarding\n * these to a child (bash/exec/MCP server) leaks the embedded credential.\n *\n * Matches a URI userinfo component that contains a password, i.e.\n * `scheme://[user]:<password>@host`. Deliberately precise: a credential-free\n * URL (`https://api.example.com`, `https://user@host` with no password) is NOT\n * matched, so non-secret `*_URL` knobs (registries, endpoints) still forward.\n */\nfunction valueHasEmbeddedCredential(value: string): boolean {\n // scheme:// then optional user, a ':' , a non-empty password, then '@'.\n // Userinfo chars stop at '/', whitespace, ':' (separator) and '@'.\n return /\\b[a-z][a-z0-9+.-]*:\\/\\/[^/\\s:@]*:[^/\\s@]+@/i.test(value);\n}\n\n/**\n * Code-injection directives that turn `NODE_OPTIONS` into an RCE channel by\n * preloading an arbitrary module into every node child process (WS-02).\n */\nconst NODE_OPTIONS_INJECTION_FLAG =\n /^(?:--require|-r|--import|--loader|--experimental-loader)$/;\nconst NODE_OPTIONS_INJECTION_FLAG_EQ =\n /^(?:--require|-r|--import|--loader|--experimental-loader)=/;\n\n/**\n * Strip module-preload directives from a `NODE_OPTIONS` value while preserving\n * benign flags (`--no-warnings`, `--max-old-space-size=…`, etc.). Handles both\n * the `--require=./x.js` and space-separated `--require ./x.js` forms. Returns\n * the sanitized string (possibly empty).\n */\nexport function sanitizeNodeOptions(value: string): string {\n const tokens = value.split(/\\s+/).filter(Boolean);\n const kept: string[] = [];\n for (let i = 0; i < tokens.length; i++) {\n const tok = tokens[i] as string;\n if (NODE_OPTIONS_INJECTION_FLAG_EQ.test(tok)) continue; // --require=./x\n if (NODE_OPTIONS_INJECTION_FLAG.test(tok)) {\n i++; // also drop the following path token (--require ./x)\n continue;\n }\n kept.push(tok);\n }\n return kept.join(' ');\n}\n\nexport interface BuildChildEnvOptions {\n /** Session ID to inject as WRONGSTACK_SESSION_ID. */\n sessionId?: string | undefined;\n /** Additional env vars to merge (takes priority over filtered parent env). */\n extra?: NodeJS.ProcessEnv | undefined;\n}\n\n/**\n * Build a filtered child-process environment suitable for bash, exec, and\n * MCP server subprocesses. Strips API keys, tokens, and other credentials\n * while preserving system/tooling variables.\n */\nexport function buildChildEnv(optsOrSessionId?: BuildChildEnvOptions | string): NodeJS.ProcessEnv {\n const opts: BuildChildEnvOptions =\n typeof optsOrSessionId === 'string'\n ? { sessionId: optsOrSessionId }\n : (optsOrSessionId ?? {});\n\n // WRONGSTACK_CHILD_ENV_PASSTHROUGH may NOT be set via config file.\n // It is a privileged override that opt-outs the entire credential filter\n // and must only be set by the operator's shell environment (real env var,\n // not something a config file injects into process.env). Config-file\n // sources do NOT go through process.env — only the actual shell environment\n // does — so checking Object.prototype.hasOwnProperty.call(process.env, ...)\n // is sufficient to exclude config-driven values.\n const hasOwn = Object.hasOwn(process.env, 'WRONGSTACK_CHILD_ENV_PASSTHROUGH');\n const legacyHasOwn = Object.hasOwn(process.env, 'WRONGSTACK_BASH_ENV_PASSTHROUGH');\n const passthrough = (hasOwn && process.env['WRONGSTACK_CHILD_ENV_PASSTHROUGH'] === '1')\n || (legacyHasOwn && process.env['WRONGSTACK_BASH_ENV_PASSTHROUGH'] === '1');\n if (passthrough && !process.env['CI']) {\n console.warn(\n '[agent] WARNING: WRONGSTACK_*_ENV_PASSTHROUGH=1 is active —\\n' +\n ' all parent env vars (including API keys) forwarded to child processes.\\n' +\n ' Do not use on shared or multi-tenant systems.'\n );\n }\n const out: NodeJS.ProcessEnv = {};\n\n // The CLI entry defaults NODE_ENV=production (so React/Ink resolve their\n // production builds — see cli-main) and marks the injection with this\n // flag. The injected value must NOT reach children: NODE_ENV=production\n // makes `pnpm install` skip devDependencies and flips test-runner\n // behavior. Strip both vars whenever the flag says wrongstack set them —\n // a NODE_ENV genuinely exported by the operator's shell (flag absent)\n // is forwarded unchanged. Applies in passthrough mode too: passthrough\n // means \"the operator's real environment\", which this value is not.\n const nodeEnvDefaulted = process.env['WRONGSTACK_NODE_ENV_DEFAULTED'] === '1';\n\n for (const [k, v] of Object.entries(process.env)) {\n if (v === undefined) continue;\n if (nodeEnvDefaulted && (k === 'NODE_ENV' || k === 'WRONGSTACK_NODE_ENV_DEFAULTED')) continue;\n if (passthrough) {\n out[k] = v;\n continue;\n }\n const upper = k.toUpperCase();\n // 0. Strip any value with an embedded URI credential (user:pass@host),\n // regardless of the variable name (WS-01). Applied before the allowlist\n // so even a \"system\" name carrying a connection string is caught.\n if (valueHasEmbeddedCredential(v)) continue;\n // 1. Forward names on the explicit allowlist — these are well-known\n // non-secret system variables (PATH, HOME, LANG, ...).\n if (ALLOWED_KEYS.has(upper)) {\n out[k] = v;\n continue;\n }\n // 2. Strip anything that looks like a secret.\n if (looksSecret(upper)) continue;\n // NODE_OPTIONS is forwarded (builds rely on flags like --no-warnings) but\n // module-preload directives (--require/--import/--loader) are stripped —\n // they would let a parent-set NODE_OPTIONS inject code into every node\n // child (WS-02 defense-in-depth).\n if (upper === 'NODE_OPTIONS') {\n const sanitized = sanitizeNodeOptions(v);\n if (sanitized) out[k] = sanitized;\n continue;\n }\n // 3. Forward tooling-prefixed vars that builds commonly need, unless\n // they already failed the secret check above.\n if (\n upper.startsWith('NODE_') ||\n upper.startsWith('NPM_') ||\n upper.startsWith('PNPM_') ||\n upper.startsWith('YARN_') ||\n upper.startsWith('GIT_') ||\n upper.startsWith('CI') ||\n upper.startsWith('XDG_') ||\n // Our own non-secret knobs (WRONGSTACK_HOME, WRONGSTACK_SESSION_ID, …).\n // Secrets never live in WRONGSTACK_* env vars (they're in the encrypted\n // vault). Forwarding keeps child wstack processes — e.g. ones spawned\n // by the test suite — inside the same redirected global root.\n upper.startsWith('WRONGSTACK_') ||\n upper === 'EDITOR' ||\n upper === 'VISUAL' ||\n upper === 'PAGER'\n ) {\n out[k] = v;\n }\n }\n\n // Merge explicit extras AFTER filtering. Callers MUST treat `opts.extra`\n // as a small, user-authored allowlist (e.g. MCP server tokens, LSP env\n // overrides from config). Do NOT pass `process.env` or any object derived\n // from it — that would defeat the parent-env scrub above. The secret\n // filter is intentionally skipped here so legitimate secret-bearing\n // tokens the user explicitly configured can still reach the child.\n if (opts.extra) {\n Object.assign(out, opts.extra);\n }\n\n if (opts.sessionId) out['WRONGSTACK_SESSION_ID'] = opts.sessionId;\n return out;\n}\n","/**\n * TTY detection helpers — the single source of truth for \"is this process\n * running against a real terminal?\". Replaces ad-hoc `process.stdin.isTTY`\n * / `process.stdout.isTTY` checks scattered across the codebase so that:\n *\n * 1. test code can mock a single module instead of stubbing `isTTY` on\n * every ReadStream/WriteStream the test happens to touch;\n * 2. a future TTY-detection source (an env var override, a Windows\n * ConPTY workaround, …) lands in one place;\n * 3. `isInteractive()` encodes the rule the project already used inline\n * (\"both streams are TTYs AND we're not running under CI\") in one\n * testable helper instead of the same 3-condition check in two\n * different files.\n *\n * Scope: detection only. Raw-mode control (`setRawMode`), resize\n * subscriptions, and write-injection belong to a future, larger TTY\n * abstraction; this module is the smallest pull that gives us a\n * testable seam and dedups 20+ call sites.\n */\n\nconst hasStdout = (): boolean => typeof process !== 'undefined' && !!process.stdout;\nconst hasStdin = (): boolean => typeof process !== 'undefined' && !!process.stdin;\n\n/** True when `process.stdout` is attached to a terminal (not a pipe/file). */\nexport function isStdoutTTY(): boolean {\n return hasStdout() && Boolean(process.stdout.isTTY);\n}\n\n/** True when `process.stdin` is attached to a terminal (not a pipe/file). */\nexport function isStdinTTY(): boolean {\n return hasStdin() && Boolean(process.stdin.isTTY);\n}\n\n/**\n * True when the current process is an interactive session: both stdin and\n * stdout are TTYs. Callers that also need a \"not a single-shot invocation\"\n * or \"not under CI\" check should layer that on top — keeping this helper\n * minimal preserves the original inline checks it replaces.\n */\nexport function isInteractive(): boolean {\n return isStdinTTY() && isStdoutTTY();\n}\n\n/** Current terminal size in characters, with a 24×80 fallback for non-TTYs. */\nexport function getTermSize(): { rows: number; cols: number } {\n if (!hasStdout()) return { rows: 24, cols: 80 };\n return {\n rows: process.stdout.rows ?? 24,\n cols: process.stdout.columns ?? 80,\n };\n}\n\n/**\n * Subscribe to terminal resize events. `cb` is called with the new size each\n * time the underlying stream emits `resize`. Returns a cleanup function the\n * caller MUST call on dispose to remove the listener — leaving a stale\n * `resize` listener on a disposed component leaks the closure (and the\n * component itself, transitively) until the process exits.\n *\n * The stream argument defaults to `process.stdout`. Pass an explicit\n * `NodeJS.WriteStream` when the caller already owns one (e.g. a status line\n * that targets an injected `out` for testability). For non-TTY streams no\n * listener is registered and the returned cleanup is a no-op.\n */\nexport function onResize(\n cb: (size: { rows: number; cols: number }) => void,\n stream: NodeJS.WriteStream = process.stdout,\n): () => void {\n if (!stream || typeof stream.on !== 'function') return () => {};\n const handler = (): void => {\n cb({\n rows: stream.rows ?? 24,\n cols: stream.columns ?? 80,\n });\n };\n stream.on('resize', handler);\n return () => {\n stream.off('resize', handler);\n };\n}\n\n/**\n * Toggle raw mode on a TTY stdin stream. Returns `true` when the toggle was\n * applied, `false` when the stream is null, not a TTY, or doesn't expose\n * `setRawMode` (pipes, file descriptors, Windows ConPTY edge cases). Callers\n * that need to restore the previous mode should snapshot `input.isRaw`\n * BEFORE the call and pass the value to a second call to flip back.\n *\n * Use this helper to drop the now-redundant\n * `if (input.isTTY) input.setRawMode(...)` ceremony at every call site.\n */\nexport function setRawMode(input: NodeJS.ReadStream, mode: boolean): boolean {\n if (input?.isTTY !== true) return false;\n if (typeof input.setRawMode !== 'function') return false;\n input.setRawMode(mode);\n return true;\n}\n\n/**\n * Bracket installed by the interactive input reader while a `readline`\n * prompt is on screen. Out-of-band terminal writes — logger WARN/INFO\n * lines, async activity from the Telegram bridge, etc. — go to the same\n * physical terminal as the half-typed prompt but readline has no idea they\n * happened, so it never repaints. The result is the classic corruption the\n * user sees: every async line strands the in-progress draft as a fresh\n * scrollback row (sometimes with its cursor underline).\n *\n * The guard closes that gap. `suspend()` wipes the draft row so the message\n * prints clean; `resume()` repaints the prompt + draft (cursor preserved).\n * When no prompt is active the guard is `null` and writes pass straight\n * through — so agent-turn output (spinner, renderer) is untouched.\n */\nexport interface OutputLineGuard {\n /** Clear the current input row right before an out-of-band write. */\n suspend(): void;\n /** Repaint the prompt + in-progress draft right after the write. */\n resume(): void;\n}\n\nlet activeOutputGuard: OutputLineGuard | null = null;\n\n/**\n * Register (or clear, with `null`) the guard that brackets out-of-band\n * writes. Installed by {@link writeOut}/{@link writeErr} consumers — in\n * practice the CLI's readline input reader — only while a prompt is live.\n * Idempotent; the most recent caller wins.\n */\nexport function setOutputLineGuard(guard: OutputLineGuard | null): void {\n activeOutputGuard = guard;\n}\n\n/**\n * Stream-agnostic write primitive. Returns `false` when the stream is\n * missing or doesn't expose `write` so callers can degrade silently under\n * hostile host environments (closed pipe, mock injects `null`, test\n * replaces the stream with a stub).\n *\n * When an {@link OutputLineGuard} is installed (a readline prompt is on\n * screen) the write is bracketed by `suspend()`/`resume()` so the user's\n * half-typed input survives the interruption instead of being stranded in\n * scrollback. The guard's own redraw uses raw stream writes — never\n * `writeOut`/`writeErr` — so there is no re-entrancy here.\n *\n * **Not exported in the public API.** Exposed only inside `term.ts` for\n * `writeOut` / `writeErr` to share a single implementation. If a caller\n * needs to write to an arbitrary stream, they should call `writeOut` (or\n * `writeErr`) with an explicit `stream` argument — the named functions\n * are the public surface so the \"this is the standard error stream\"\n * intent stays visible at every call site.\n */\nfunction writeTo(\n s: string,\n stream: NodeJS.WriteStream | undefined,\n): boolean {\n if (!stream || typeof stream.write !== 'function') return false;\n const guard = activeOutputGuard;\n if (!guard) {\n stream.write(s);\n return true;\n }\n // A prompt is live — wipe the draft row, emit the message, repaint.\n guard.suspend();\n stream.write(s);\n guard.resume();\n return true;\n}\n\n/**\n * Write `s` to `stream` (defaults to `process.stdout`). Returns `false`\n * when the stream is missing or doesn't expose `write` so callers can\n * degrade silently under hostile host environments (closed pipe, mock\n * injects `null`, test replaces the stream with a stub).\n *\n * Why a helper:\n * 1. **Single seam for output capture in tests** — stub `writeOut` once\n * and assert on what the rest of the codebase intended to print,\n * without spying on `process.stdout.write` (which is brittle and\n * leaks across parallel test files).\n * 2. **Stream swap without grep** — routing the CLI's output to a\n * logger or `out.log` becomes a one-line change at process boot.\n * 3. **Defensive default** — closes the \"what if `process.stdout` is\n * `null`\" gap that currently exists at ~50 call sites that just\n * call `process.stdout.write(s)` and crash on certain Windows\n * redirect invocations.\n *\n * Call-site migration is staged: this commit introduces the helper, a\n * follow-up commit replaces the 50+ `process.stdout.write(...)` sites\n * with `writeOut(...)`. Until that migration lands, both forms coexist\n * and `writeOut` is the preferred form for new code.\n */\nexport function writeOut(\n s: string,\n stream: NodeJS.WriteStream = process.stdout,\n): boolean {\n return writeTo(s, stream);\n}\n\n/**\n * Symmetric partner of `writeOut` for the standard error stream. Same shape,\n * same defensive contract, same single-seam-for-tests story — just defaults to\n * `process.stderr` instead of `process.stdout`.\n *\n * Use this in code paths that emit error/diagnostic/warning text. Keeping\n * these two helpers split (rather than a single `writeTo(s, stream)`) means\n * the call site reads as a clear intent signal: \"I am writing an error\" vs.\n * \"I am writing a result\" — which matters for callers that decide between\n * stdout/stderr routing (e.g. `--quiet` flags, log-level filtering,\n * structured-log rewriters that fork on stream).\n *\n * Stderr writes from the core logger (see `infrastructure/logger.ts`) and from\n * the TUI guard (see `tui/run-tui.ts`) used to call `process.stderr.write`\n * directly. Routing them through this helper lets tests stub the stream at\n * one boundary and lets future logging middleware (e.g. a JSON-line rewriter)\n * swap the destination for the entire process in one place.\n */\nexport function writeErr(\n s: string,\n stream: NodeJS.WriteStream = process.stderr,\n): boolean {\n return writeTo(s, stream);\n}\n","import { isStdoutTTY } from './term.js';\n\nconst isColorTty = (): boolean => {\n if (envFlag(process.env.NO_COLOR)) return false;\n if (envFlag(process.env.FORCE_COLOR)) return true;\n return isStdoutTTY();\n};\n\nfunction envFlag(value: string | undefined): boolean {\n if (value === undefined) return false;\n if (value.trim() === '') return false;\n return !/^(0|false|no|off)$/i.test(value.trim());\n}\n\nconst COLOR = isColorTty();\n\nconst wrap =\n (open: string, close: string) =>\n (s: string): string =>\n COLOR ? `\\x1b[${open}m${s}\\x1b[${close}m` : s;\n\nexport const color = {\n reset: wrap('0', '0'),\n bold: wrap('1', '22'),\n dim: wrap('2', '22'),\n italic: wrap('3', '23'),\n underline: wrap('4', '24'),\n red: wrap('31', '39'),\n green: wrap('32', '39'),\n yellow: wrap('33', '39'),\n blue: wrap('34', '39'),\n magenta: wrap('35', '39'),\n cyan: wrap('36', '39'),\n gray: wrap('90', '39'),\n amber: wrap('38;5;214', '39'),\n pink: wrap('38;5;205', '39'),\n bgRed: wrap('41', '49'),\n bgGreen: wrap('42', '49'),\n};\n\nexport function stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*[A-Za-z]/g, '');\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from './atomic-write.js';\n\nexport type JsonObject = Record<string, unknown>;\nexport type JsonPathSegment = string | number;\nexport type JsonPath = readonly JsonPathSegment[];\n\nexport async function readJsonObjectFile(filePath: string): Promise<JsonObject> {\n try {\n const parsed = JSON.parse(await fs.readFile(filePath, 'utf8')) as unknown;\n return isJsonObject(parsed) ? parsed : {};\n } catch {\n return {};\n }\n}\n\nexport async function jsonObjectFileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function writeJsonObjectFile(filePath: string, value: JsonObject): Promise<void> {\n await atomicWrite(filePath, JSON.stringify(value, null, 2), { mode: 0o600 });\n}\n\nexport async function updateJsonObjectFile(\n filePath: string,\n mutator: (config: JsonObject) => void | JsonObject | Promise<void | JsonObject>,\n): Promise<JsonObject> {\n const config = await readJsonObjectFile(filePath);\n const maybeNext = await mutator(config);\n const next = maybeNext && isJsonObject(maybeNext) ? maybeNext : config;\n await writeJsonObjectFile(filePath, next);\n return next;\n}\n\nexport function getJsonPath(root: unknown, path: JsonPath): unknown {\n let current = root;\n for (const segment of path) {\n if (typeof segment === 'number') {\n if (!Array.isArray(current)) return undefined;\n current = current[segment];\n continue;\n }\n if (!isJsonObject(current)) return undefined;\n current = current[segment];\n }\n return current;\n}\n\nexport function setJsonPath(root: JsonObject, path: JsonPath, value: unknown): JsonObject {\n if (path.length === 0) {\n if (!isJsonObject(value)) throw new Error('Root config value must be an object');\n return value;\n }\n const parent = ensureJsonParent(root, path);\n const leaf = lastPathSegment(path);\n if (typeof leaf === 'number') {\n if (!Array.isArray(parent)) throw new Error(`Cannot set numeric segment ${leaf} on non-array parent`);\n parent[leaf] = value;\n } else {\n if (!isJsonObject(parent)) throw new Error(`Cannot set property ${leaf} on non-object parent`);\n parent[leaf] = value;\n }\n return root;\n}\n\nexport function removeJsonPath(root: JsonObject, path: JsonPath): boolean {\n if (path.length === 0) return false;\n const parent = getJsonPath(root, path.slice(0, -1));\n const leaf = lastPathSegment(path);\n if (typeof leaf === 'number') {\n if (!Array.isArray(parent) || leaf < 0 || leaf >= parent.length) return false;\n parent.splice(leaf, 1);\n return true;\n }\n if (!isJsonObject(parent) || !(leaf in parent)) return false;\n delete parent[leaf];\n return true;\n}\n\nexport async function setJsonPathInFile(filePath: string, path: JsonPath, value: unknown): Promise<JsonObject> {\n return updateJsonObjectFile(filePath, (config) => setJsonPath(config, path, value));\n}\n\nexport async function removeJsonPathInFile(filePath: string, path: JsonPath): Promise<JsonObject> {\n return updateJsonObjectFile(filePath, (config) => {\n removeJsonPath(config, path);\n });\n}\n\nexport function isJsonObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction lastPathSegment(path: JsonPath): JsonPathSegment {\n const segment = path[path.length - 1];\n if (segment === undefined) throw new Error('Invalid empty JSON path');\n return segment;\n}\n\nfunction ensureJsonParent(root: JsonObject, path: JsonPath): JsonObject | unknown[] {\n let current: JsonObject | unknown[] = root;\n for (let i = 0; i < path.length - 1; i += 1) {\n const segment = path[i];\n const nextSegment = path[i + 1];\n if (segment === undefined) throw new Error('Invalid empty JSON path segment');\n const nextContainer = typeof nextSegment === 'number' ? [] : {};\n\n if (typeof segment === 'number') {\n if (!Array.isArray(current)) throw new Error(`Cannot traverse numeric segment ${segment} on non-array parent`);\n if (!isJsonObject(current[segment]) && !Array.isArray(current[segment])) current[segment] = nextContainer;\n current = current[segment] as JsonObject | unknown[];\n } else {\n if (!isJsonObject(current)) throw new Error(`Cannot traverse property ${segment} on non-object parent`);\n if (!isJsonObject(current[segment]) && !Array.isArray(current[segment])) current[segment] = nextContainer;\n current = current[segment] as JsonObject | unknown[];\n }\n }\n return current;\n}\n","import * as path from 'node:path';\nimport type { Context } from '../core/context.js';\nimport type {\n ContextEvidenceState,\n ToolOutputMetadata,\n} from '../types/context-evidence.js';\n\nconst MAX_TOOL_CALLS = 80;\nconst MAX_FACTS = 40;\nconst MAX_ERRORS = 20;\nconst MAX_DIGEST_CHARS = 4_000;\n/** Cap for the per-iteration reference scan — see markAssistantReferencedEvidence. */\nconst RECENT_TOOL_CALL_SCAN_LIMIT = 20;\n/** Cap content fed to file/symbol regex extractors (first N chars). */\nconst EXTRACT_CONTENT_CAP_CHARS = 10_000;\n/** Only scan the last N lines for error patterns — errors surface at the bottom. */\nconst EXTRACT_ERROR_TAIL_LINES = 200;\n\nconst WRITE_TOOLS = new Set(['edit', 'write', 'replace', 'patch']);\nconst READ_TOOLS = new Set(['read', 'grep', 'glob', 'ls', 'tree']);\n\nexport function createContextEvidenceState(): ContextEvidenceState {\n return {\n sessionGoals: [],\n implicitFacts: [],\n activeErrors: [],\n toolCalls: [],\n fileGraph: {},\n repeatedReads: [],\n updatedAt: Date.now(),\n };\n}\n\nexport interface RecordToolOutputEvidenceInput {\n toolUseId: string;\n toolName: string;\n input: unknown;\n content: string;\n ok: boolean;\n outputBytes?: number | undefined;\n outputTokens?: number | undefined;\n outputLines?: number | undefined;\n}\n\nexport function recordUserIntentEvidence(ctx: Context, text: string): void {\n const intent = normalizeWhitespace(text).slice(0, 700);\n if (!intent) return;\n const state = ensureEvidence(ctx);\n state.currentIntent = { text: intent, updatedAt: Date.now() };\n if (state.sessionGoals.length === 0 || isGoalish(intent)) {\n pushUniqueBounded(state.sessionGoals, intent, 8);\n }\n state.updatedAt = Date.now();\n}\n\nexport function recordToolOutputEvidence(\n ctx: Context,\n input: RecordToolOutputEvidenceInput,\n): ToolOutputMetadata {\n const state = ensureEvidence(ctx);\n // Cap content for regex extraction. File paths and symbol declarations\n // appear near the top of tool output (import blocks, function definitions),\n // so the first 10KB captures them. Without this cap, matchAll() runs over\n // the full output — e.g. a 50KB file read triggers ~100KB of regex scanning\n // across two patterns in extractSymbols plus the extractFiles pass.\n const scanContent = input.content.length > EXTRACT_CONTENT_CAP_CHARS\n ? input.content.slice(0, EXTRACT_CONTENT_CAP_CHARS)\n : input.content;\n const files = extractFiles(ctx, input.toolName, input.input, scanContent);\n const symbols = extractSymbols(scanContent, input.input);\n const commands = extractCommands(input.toolName, input.input);\n const errors = extractErrors(input.content);\n const summary = summarizeToolOutput(input.toolName, input.input, input.content, {\n files,\n symbols,\n errors,\n ok: input.ok,\n });\n\n const metadata: ToolOutputMetadata = {\n toolUseId: input.toolUseId,\n toolName: input.toolName,\n ok: input.ok,\n inputSummary: summarizeInput(input.input),\n summary,\n files,\n symbols,\n commands,\n errors,\n status: 'seen',\n referenceCount: 0,\n seenAt: Date.now(),\n outputBytes: input.outputBytes,\n outputTokens: input.outputTokens,\n outputLines: input.outputLines,\n };\n\n state.toolCalls.push(metadata);\n if (state.toolCalls.length > MAX_TOOL_CALLS) {\n state.toolCalls.splice(0, state.toolCalls.length - MAX_TOOL_CALLS);\n }\n\n updateFileGraph(state, metadata);\n updateRepeatedReadSignals(state, metadata);\n if (errors.length > 0) {\n for (const err of errors) pushUniqueBounded(state.activeErrors, err, MAX_ERRORS);\n }\n const fact = implicitFactFor(metadata);\n if (fact) pushUniqueBounded(state.implicitFacts, fact, MAX_FACTS);\n state.updatedAt = Date.now();\n return metadata;\n}\n\nexport function markAssistantReferencedEvidence(ctx: Context, text: string): void {\n const state = ensureEvidence(ctx);\n const haystack = text.toLowerCase();\n if (!haystack.trim()) return;\n\n // Only scan the most recent tool calls. The assistant almost always\n // references the files/symbols it just worked on — older entries are\n // rarely re-referenced. Scanning the full list (up to 80 entries) means\n // worst case: 80 × (files + symbols) includes() calls per iteration,\n // each O(responseText.length), which degrades as the conversation grows.\n // The last 20 captures the realistic reference window at ¼ the cost.\n const recent = state.toolCalls.length > RECENT_TOOL_CALL_SCAN_LIMIT\n ? state.toolCalls.slice(-RECENT_TOOL_CALL_SCAN_LIMIT)\n : state.toolCalls;\n for (const tool of recent) {\n if (!metadataReferencedByText(tool, haystack)) continue;\n tool.status = 'referenced';\n tool.referenceCount++;\n tool.referencedAt = Date.now();\n for (const file of tool.files) {\n const node = state.fileGraph[file];\n if (node) node.referenced = true;\n }\n }\n state.updatedAt = Date.now();\n}\n\nexport function buildContextEvidenceDigest(ctx: Context): string {\n const state = ensureEvidence(ctx);\n const lines: string[] = [];\n\n if (state.currentIntent?.text) {\n lines.push(`intent: ${state.currentIntent.text}`);\n }\n\n const goals = state.sessionGoals.slice(-3);\n if (goals.length > 0) {\n lines.push('session_goals:');\n for (const goal of goals) lines.push(`- ${goal}`);\n }\n\n const activeErrors = state.activeErrors.slice(-5);\n if (activeErrors.length > 0) {\n lines.push('active_errors:');\n for (const err of activeErrors) lines.push(`- ${err}`);\n }\n\n const files = Object.values(state.fileGraph)\n .sort((a, b) => (b.writes - a.writes) || (b.reads - a.reads) || a.path.localeCompare(b.path))\n .slice(0, 12);\n if (files.length > 0) {\n lines.push('dependency_graph:');\n for (const file of files) {\n const actions = [\n file.reads > 0 ? `read ${file.reads}x` : '',\n file.writes > 0 ? `write ${file.writes}x` : '',\n ].filter(Boolean).join(', ');\n const refs = file.referenced ? '; referenced by assistant' : '';\n const via = file.lastToolUseId ? `; last via ${file.lastToolUseId}` : '';\n lines.push(`- ${file.path} (${actions || 'seen'}${refs}${via})`);\n }\n }\n\n const referenced = state.toolCalls\n .filter((tool) => tool.status === 'referenced')\n .slice(-10);\n const recentSeen = state.toolCalls\n .filter((tool) => tool.status === 'seen')\n .slice(-5);\n const trail = [...referenced, ...recentSeen];\n if (trail.length > 0) {\n lines.push('tool_trail:');\n for (const tool of trail) {\n const size = tool.outputTokens ? `; ~${tool.outputTokens} tokens` : '';\n const filesText = tool.files.length > 0 ? `; files=${tool.files.slice(0, 4).join(', ')}` : '';\n const symbolsText = tool.symbols.length > 0 ? `; symbols=${tool.symbols.slice(0, 4).join(', ')}` : '';\n lines.push(\n `- ${tool.toolUseId} ${tool.toolName} ${tool.status}: ${tool.summary}${filesText}${symbolsText}${size}`,\n );\n }\n }\n\n const facts = state.implicitFacts.slice(-8);\n if (facts.length > 0) {\n lines.push('implicit_facts:');\n for (const fact of facts) lines.push(`- ${fact}`);\n }\n\n const digest = lines.join('\\n');\n if (digest.length <= MAX_DIGEST_CHARS) return digest;\n return `${digest.slice(0, MAX_DIGEST_CHARS)}... [+${digest.length - MAX_DIGEST_CHARS} chars]`;\n}\n\nexport function repeatedReadPressure(ctx: Context): number {\n return ensureEvidence(ctx).repeatedReads.reduce((max, item) => Math.max(max, item.count), 0);\n}\n\nfunction ensureEvidence(ctx: Context): ContextEvidenceState {\n if (!ctx.contextEvidence) {\n (ctx as never as { contextEvidence: ContextEvidenceState }).contextEvidence =\n createContextEvidenceState();\n }\n return ctx.contextEvidence;\n}\n\nfunction isGoalish(text: string): boolean {\n return /\\b(goal|objective|task|need|want|implement|fix|improve|refactor|add|remove|hedef|amac|istiyorum|gerekiyor|iyilestir|duzelt|ekle|kaldir)\\b/i.test(text);\n}\n\nfunction normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\nfunction pushUniqueBounded(list: string[], value: string, max: number): void {\n const normalized = normalizeWhitespace(value);\n if (!normalized) return;\n const existing = list.findIndex((item) => item.toLowerCase() === normalized.toLowerCase());\n if (existing >= 0) list.splice(existing, 1);\n list.push(normalized);\n if (list.length > max) list.splice(0, list.length - max);\n}\n\nfunction extractFiles(\n ctx: Context,\n toolName: string,\n input: unknown,\n content: string,\n): string[] {\n const out = new Set<string>();\n for (const value of inputPathValues(input)) addPath(ctx, out, value);\n\n if (toolName === 'grep' || toolName === 'glob' || toolName === 'bash') {\n const re = /(?:(?:[A-Za-z]:)?[./\\\\]?[\\w@.-]+(?:[\\\\/][\\w@(). -]+)+\\.[A-Za-z0-9]{1,12})/g;\n for (const match of content.matchAll(re)) addPath(ctx, out, match[0]);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction inputPathValues(input: unknown): string[] {\n const values: string[] = [];\n const visit = (value: unknown, key?: string): void => {\n if (typeof value === 'string') {\n if (key && /^(path|file|files|fromFile|toFile|dir|cwd)$/i.test(key)) values.push(value);\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) visit(item, key);\n return;\n }\n if (!value || typeof value !== 'object') return;\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) visit(v, k);\n };\n visit(input);\n return values;\n}\n\nfunction addPath(ctx: Context, out: Set<string>, raw: string): void {\n const clean = raw.trim().replace(/^[\"'`]+|[\"'`),;:]+$/g, '');\n if (!clean || clean.length > 260) return;\n let normalized = clean.replace(/\\\\/g, '/');\n try {\n const abs = path.isAbsolute(clean) ? path.resolve(clean) : null;\n if (abs) {\n const rel = path.relative(ctx.projectRoot, abs);\n if (!rel.startsWith('..') && !path.isAbsolute(rel)) {\n normalized = rel.replace(/\\\\/g, '/');\n }\n }\n } catch {\n // Keep the best-effort normalized string.\n }\n if (normalized.length > 0) out.add(normalized);\n}\n\nfunction extractSymbols(content: string, input: unknown): string[] {\n const out = new Set<string>();\n const patterns = [\n /\\b(?:function|class|interface|type|enum|const|let|var|def|fn|struct)\\s+([A-Za-z_$][\\w$]*)/g,\n /\\b(?:export\\s+)?(?:async\\s+)?function\\s+([A-Za-z_$][\\w$]*)/g,\n ];\n for (const re of patterns) {\n for (const match of content.matchAll(re)) {\n if (match[1]) out.add(match[1]);\n if (out.size >= 30) break;\n }\n }\n\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n if (typeof pattern === 'string' && /^[A-Za-z_$][\\w$]*$/.test(pattern)) {\n out.add(pattern);\n }\n\n return [...out].slice(0, 30);\n}\n\nfunction extractCommands(toolName: string, input: unknown): string[] {\n if (toolName !== 'bash' && toolName !== 'exec' && toolName !== 'shell') return [];\n if (!input || typeof input !== 'object') return [];\n const command = (input as Record<string, unknown>)['command'];\n if (typeof command !== 'string') return [];\n return [command.slice(0, 220)];\n}\n\nfunction extractErrors(content: string): string[] {\n const allLines = content.split(/\\r?\\n/);\n // Only scan the last N lines — errors and stack traces surface at the\n // bottom of tool output. Scanning all lines means one regex test per line,\n // so a 2000-line file read costs 2000 regex evaluations for no gain since\n // the interesting errors are always at the tail.\n const lines = allLines.length > EXTRACT_ERROR_TAIL_LINES\n ? allLines.slice(-EXTRACT_ERROR_TAIL_LINES)\n : allLines;\n const errors: string[] = [];\n for (const line of lines) {\n if (!/\\b(error|exception|failed|failure|fatal|panic|timeout|denied|enoent|eacces|eperm|typeerror|syntaxerror)\\b/i.test(line)) continue;\n errors.push(normalizeWhitespace(line).slice(0, 260));\n if (errors.length >= 5) break;\n }\n return errors;\n}\n\nfunction summarizeInput(input: unknown): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n const parts: string[] = [];\n for (const key of ['path', 'file', 'pattern', 'glob', 'command']) {\n const value = obj[key];\n if (typeof value === 'string') parts.push(`${key}=${value.slice(0, 160)}`);\n }\n return parts.length > 0 ? parts.join(', ') : undefined;\n}\n\nfunction summarizeToolOutput(\n toolName: string,\n input: unknown,\n content: string,\n opts: { files: string[]; symbols: string[]; errors: string[]; ok: boolean },\n): string {\n if (!opts.ok && opts.errors.length > 0) return opts.errors[0] ?? `${toolName} failed`;\n if (toolName === 'read' && opts.files[0]) return `read ${opts.files[0]}`;\n if (toolName === 'grep') {\n const pattern = input && typeof input === 'object'\n ? (input as Record<string, unknown>)['pattern']\n : undefined;\n return `searched ${typeof pattern === 'string' ? pattern : 'pattern'} (${opts.files.length} file hint(s))`;\n }\n if ((toolName === 'edit' || toolName === 'write') && opts.files[0]) {\n return `${toolName === 'write' ? 'wrote' : 'edited'} ${opts.files[0]}`;\n }\n const firstLine = normalizeWhitespace(content.split(/\\r?\\n/).find((line) => line.trim()) ?? '');\n return firstLine ? firstLine.slice(0, 220) : `${toolName} returned no text`;\n}\n\nfunction updateFileGraph(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n const writes = WRITE_TOOLS.has(metadata.toolName) ? 1 : 0;\n const reads = writes === 0 && (READ_TOOLS.has(metadata.toolName) || metadata.files.length > 0)\n ? 1\n : 0;\n for (const file of metadata.files) {\n const existing = state.fileGraph[file] ?? {\n path: file,\n reads: 0,\n writes: 0,\n tools: [],\n referenced: false,\n };\n existing.reads += reads;\n existing.writes += writes;\n existing.lastToolUseId = metadata.toolUseId;\n pushUniqueBounded(existing.tools, `${metadata.toolName}#${metadata.toolUseId}`, 8);\n state.fileGraph[file] = existing;\n }\n}\n\nfunction updateRepeatedReadSignals(state: ContextEvidenceState, metadata: ToolOutputMetadata): void {\n if (metadata.toolName !== 'read' || metadata.files.length === 0) {\n state.lastReadPath = undefined;\n return;\n }\n const file = metadata.files[0] as string;\n if (state.lastReadPath === file) {\n const existing = state.repeatedReads.find((item) => item.file === file);\n if (existing) {\n existing.count++;\n existing.lastToolUseId = metadata.toolUseId;\n } else {\n state.repeatedReads.push({ file, count: 2, lastToolUseId: metadata.toolUseId });\n }\n if (state.repeatedReads.length > 10) state.repeatedReads.shift();\n }\n state.lastReadPath = file;\n}\n\nfunction implicitFactFor(metadata: ToolOutputMetadata): string | undefined {\n if (metadata.errors.length > 0) return `${metadata.toolName}#${metadata.toolUseId} exposed error: ${metadata.errors[0]}`;\n if (metadata.toolName === 'read' && metadata.files[0]) {\n const size = metadata.outputLines ? ` (${metadata.outputLines} line(s) returned)` : '';\n return `read ${metadata.files[0]}${size}`;\n }\n if ((metadata.toolName === 'edit' || metadata.toolName === 'write') && metadata.files[0]) {\n return `${metadata.toolName} changed ${metadata.files[0]}`;\n }\n if (metadata.status === 'referenced') return `${metadata.toolName}#${metadata.toolUseId} was referenced`;\n return undefined;\n}\n\nfunction metadataReferencedByText(metadata: ToolOutputMetadata, haystack: string): boolean {\n for (const file of metadata.files) {\n const f = file.toLowerCase();\n const base = path.basename(file).toLowerCase();\n if (f && haystack.includes(f)) return true;\n if (base && haystack.includes(base)) return true;\n }\n for (const symbol of metadata.symbols) {\n if (symbol.length >= 3 && haystack.includes(symbol.toLowerCase())) return true;\n }\n for (const err of metadata.errors) {\n const head = err.slice(0, 80).toLowerCase();\n if (head.length >= 12 && haystack.includes(head)) return true;\n }\n return false;\n}\n","/**\n * Deep merge utility — safely merges nested objects with configurable\n * conflict resolution, array merging, and prototype-pollution guarding.\n *\n * Used by:\n * - config-loader (config layer merging with primitive-array concatenation)\n * - secret-vault (config patching)\n * - json-path (json_merge tool with prefer-base / prefer-patch semantics)\n *\n * @module utils/deep-merge\n */\n\n// ---------------------------------------------------------------------------\n// Prototype-pollution guard — shared set of forbidden __proto__ keys\n// ---------------------------------------------------------------------------\n\nexport const FORBIDDEN_PROTO_KEYS = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n]);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** True when every element is a primitive or null (no nested objects/arrays). */\nexport function isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || (typeof v !== 'object' && typeof v !== 'function'));\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface DeepMergeOptions {\n /**\n * Which side wins on collision for scalars and arrays.\n *\n * - `'prefer-patch'` (default): patch value replaces base value.\n * - `'prefer-base'`: base value is kept, patch value is ignored.\n */\n conflictResolution?: 'prefer-base' | 'prefer-patch';\n\n /**\n * How to handle array values.\n *\n * - `'replace'` (default): patch array replaces base array entirely.\n * - `'concat-primitives'`: when both values are primitive arrays,\n * they are concatenated and deduped (via Set). Non-primitive\n * arrays still replace the base wholesale.\n */\n arrayMode?: 'replace' | 'concat-primitives';\n\n /**\n * Skip prototype-pollution keys (`__proto__`, `constructor`, etc.).\n * Enabled by default. Only disable when you control both inputs\n * and the keyset (e.g. when merging trusted JSON schemas).\n */\n protectProto?: boolean;\n\n /**\n * Optional callback fired when a non-primitive (object) array is\n * replaced wholesale (only relevant with `arrayMode: 'concat-primitives'`).\n * Receives the key name, existing array length, and patch array length.\n * Used by config-loader for debug logging.\n */\n onNonPrimitiveArrayReplace?: (\n key: string,\n existingLen: number,\n patchLen: number,\n ) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\n/**\n * Recursively merge `patch` into `base`, returning a new object.\n *\n * - Nested plain objects are merged recursively.\n * - Arrays are handled per `options.arrayMode`.\n * - Scalar collisions are resolved per `options.conflictResolution`.\n * - `null` and non-object values in `patch` replace the base value\n * (unless `conflictResolution` is `'prefer-base'`).\n * - Keys in `base` that are absent from `patch` are preserved.\n * - `FORBIDDEN_PROTO_KEYS` are skipped in the patch (unless\n * `options.protectProto` is set to `false`).\n *\n * The function is generic over `T extends Record<string, unknown>` for\n * callers that pass typed config objects, but the runtime signature\n * also accepts `unknown` inputs (used by the json-path plugin).\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T,\n patch: Record<string, unknown>,\n options?: DeepMergeOptions,\n): T;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options?: DeepMergeOptions,\n): unknown;\n\nexport function deepMerge(\n base: unknown,\n patch: unknown,\n options: DeepMergeOptions = {},\n): unknown {\n const {\n conflictResolution = 'prefer-patch',\n arrayMode = 'replace',\n protectProto = true,\n onNonPrimitiveArrayReplace,\n } = options;\n\n // Non-object / null handling — delegate to conflict resolution.\n if (typeof base !== 'object' || base === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n if (typeof patch !== 'object' || patch === null) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Arrays — handled *before* the object merge so array-of-objects\n // aren't accidentally treated as plain records.\n if (Array.isArray(base) && Array.isArray(patch)) {\n if (\n arrayMode === 'concat-primitives' &&\n isPrimitiveArray(base) &&\n isPrimitiveArray(patch)\n ) {\n return [...new Set([...base, ...patch])];\n }\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // If only one side is an array, treat as scalar collision.\n if (Array.isArray(base) || Array.isArray(patch)) {\n return conflictResolution === 'prefer-patch' ? patch : base;\n }\n\n // Plain object merge.\n const baseObj = base as Record<string, unknown>;\n const patchObj = patch as Record<string, unknown>;\n const out: Record<string, unknown> = { ...baseObj };\n\n for (const [k, v] of Object.entries(patchObj)) {\n if (protectProto && FORBIDDEN_PROTO_KEYS.has(k)) continue;\n\n const existing = out[k];\n if (\n v !== null &&\n typeof v === 'object' &&\n !Array.isArray(v) &&\n existing !== null &&\n typeof existing === 'object' &&\n !Array.isArray(existing)\n ) {\n // Recursive merge for nested plain objects.\n out[k] = deepMerge(existing, v, options);\n } else if (Array.isArray(v) && Array.isArray(existing)) {\n // Delegate to top-level array handling so arrayMode\n // (e.g. 'concat-primitives') applies to nested arrays too.\n // Fire debug hook when a non-primitive array replaces an existing\n // array (for non-primitive arrays, concat-primitives is a no-op and\n // the result is always a wholesale replacement).\n if (onNonPrimitiveArrayReplace && !isPrimitiveArray(v)) {\n onNonPrimitiveArrayReplace(k, existing.length, v.length);\n }\n out[k] = deepMerge(existing, v, options);\n } else if (v !== undefined) {\n // Fire debug hook when a non-primitive (object) array replaces an\n // existing value in concat-primitives mode.\n if (\n onNonPrimitiveArrayReplace &&\n Array.isArray(v) &&\n !isPrimitiveArray(v)\n ) {\n const existingLen = Array.isArray(existing) ? existing.length : 0;\n onNonPrimitiveArrayReplace(k, existingLen, v.length);\n }\n out[k] = v;\n }\n // When v === undefined, leave the existing value untouched\n // (this matches config-loader's behaviour: undefined in patch\n // means \"don't change this key\").\n }\n\n return out;\n}\n","/**\n * Myers diff with unified-format output. No external dependencies.\n * Operates on arrays of lines (newline-terminated or stripped).\n */\n\ninterface Edit {\n op: 'equal' | 'insert' | 'delete';\n a: number;\n b: number;\n line: string;\n}\n\nfunction myersDiff(a: string[], b: string[]): Edit[] {\n const N = a.length;\n const M = b.length;\n const max = N + M;\n if (max === 0) return [];\n\n const v = new Map<number, number>();\n v.set(1, 0);\n const trace: Map<number, number>[] = [];\n\n for (let d = 0; d <= max; d++) {\n const snapshot = new Map(v);\n trace.push(snapshot);\n for (let k = -d; k <= d; k += 2) {\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let x: number;\n if (k === -d || (k !== d && left < right)) {\n x = right;\n } else {\n x = left + 1;\n }\n let y = x - k;\n while (x < N && y < M && a[x] === b[y]) {\n x++;\n y++;\n }\n v.set(k, x);\n if (x >= N && y >= M) {\n return backtrack(trace, a, b, N, M, d);\n }\n }\n }\n return [];\n}\n\nfunction backtrack(\n trace: Map<number, number>[],\n a: string[],\n b: string[],\n N: number,\n M: number,\n finalD: number,\n): Edit[] {\n const edits: Edit[] = [];\n let x = N;\n let y = M;\n for (let d = finalD; d > 0; d--) {\n const v = trace[d];\n if (!v) break;\n const k = x - y;\n const left = v.get(k - 1) ?? -1;\n const right = v.get(k + 1) ?? -1;\n let prevK: number;\n if (k === -d || (k !== d && left < right)) {\n prevK = k + 1;\n } else {\n prevK = k - 1;\n }\n const prevX = v.get(prevK) ?? 0;\n const prevY = prevX - prevK;\n while (x > prevX && y > prevY) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n if (d > 0) {\n if (x === prevX) {\n edits.push({ op: 'insert', a: x, b: y - 1, line: b[y - 1] ?? '' });\n } else {\n edits.push({ op: 'delete', a: x - 1, b: y, line: a[x - 1] ?? '' });\n }\n x = prevX;\n y = prevY;\n }\n }\n while (x > 0 && y > 0) {\n edits.push({ op: 'equal', a: x - 1, b: y - 1, line: a[x - 1] ?? '' });\n x--;\n y--;\n }\n return edits.reverse();\n}\n\nexport interface UnifiedDiffOptions {\n context?: number | undefined;\n fromFile?: string | undefined;\n toFile?: string | undefined;\n}\n\nexport function unifiedDiff(\n oldText: string,\n newText: string,\n opts: UnifiedDiffOptions = {},\n): string {\n const context = opts.context ?? 3;\n const a = oldText.split('\\n');\n const b = newText.split('\\n');\n // Handle trailing newline: split adds an empty string we don't want to diff\n if (a[a.length - 1] === '') a.pop();\n if (b[b.length - 1] === '') b.pop();\n const edits = myersDiff(a, b);\n if (edits.every((e) => e.op === 'equal')) return '';\n\n const hunks: { aStart: number; bStart: number; lines: string[] }[] = [];\n let i = 0;\n while (i < edits.length) {\n while (i < edits.length && edits[i]?.op === 'equal') i++;\n if (i >= edits.length) break;\n const hunkStart = Math.max(0, i - context);\n const lines: string[] = [];\n let aStart = (edits[hunkStart]?.a ?? 0) + 1;\n let bStart = (edits[hunkStart]?.b ?? 0) + 1;\n let aCount = 0;\n let bCount = 0;\n let cursor = hunkStart;\n let trailing = 0;\n while (cursor < edits.length) {\n const e = edits[cursor];\n if (!e) break;\n if (e.op === 'equal') {\n trailing++;\n if (trailing > context * 2) break;\n } else {\n trailing = 0;\n }\n if (e.op === 'equal') {\n lines.push(` ${e.line}`);\n aCount++;\n bCount++;\n } else if (e.op === 'delete') {\n lines.push(`-${e.line}`);\n aCount++;\n } else {\n lines.push(`+${e.line}`);\n bCount++;\n }\n cursor++;\n }\n // Trim trailing context lines beyond `context`\n while (lines.length > 0 && lines[lines.length - 1]?.startsWith(' ') && trailing > context) {\n lines.pop();\n aCount--;\n bCount--;\n trailing--;\n }\n if (aCount === 0) aStart = 0;\n if (bCount === 0) bStart = 0;\n hunks.push({ aStart, bStart, lines });\n i = cursor;\n }\n if (hunks.length === 0) return '';\n\n let out = '';\n out += `--- ${opts.fromFile ?? 'a'}\\n`;\n out += `+++ ${opts.toFile ?? 'b'}\\n`;\n for (const h of hunks) {\n let aCount = 0;\n let bCount = 0;\n for (const l of h.lines) {\n if (l.startsWith(' ')) {\n aCount++;\n bCount++;\n } else if (l.startsWith('-')) aCount++;\n else if (l.startsWith('+')) bCount++;\n }\n out += `@@ -${h.aStart},${aCount} +${h.bStart},${bCount} @@\\n`;\n out += `${h.lines.join('\\n')}\\n`;\n }\n return out;\n}\n","/**\n * Converts an unknown error value to a human-readable string.\n * Used in 40+ files across the codebase to normalize error messaging.\n */\nexport function toErrorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","/** Assert a value is neither null nor undefined. Throws if it is.\n * Useful after optional chaining and indexed access when the\n * control flow guarantees the value exists but TypeScript can't\n * prove it (e.g. after a check on a related field). */\nexport function expectDefined<T>(value: T | null | undefined, label?: string): T {\n if (value === null || value === undefined) {\n const err = new Error(label ? `Expected ${label} to be defined` : 'Expected value to be defined');\n err.name = 'ExpectDefinedError';\n throw err;\n }\n return value;\n}\n","import { expectDefined } from './expect-defined.js';\n/**\n * Glob pattern → concrete file path expansion.\n *\n * Supports: *, **, ?, [...]\n * Does NOT support brace expansion {a,b}.\n *\n * Returns the input as-is if it contains no glob metacharacters.\n * On Windows, both / and \\ are accepted as path separators.\n */\n\nimport * as fsp from 'node:fs/promises';\nimport { isAbsolute, resolve } from 'node:path';\nconst GLOB_CHARS = new Set(['*', '?', '[']);\nconst IS_WINDOWS = process.platform === 'win32';\nconst SEP = IS_WINDOWS ? '\\\\' : '/';\n\nfunction isGlob(p: string): boolean {\n for (const c of p) {\n if (GLOB_CHARS.has(c)) return true;\n }\n return false;\n}\n\nfunction globToRegex(pat: string): RegExp {\n let i = 0;\n let re = '^';\n while (i < pat.length) {\n const c = expectDefined(pat[i]);\n if (c === '*') {\n if (pat[i + 1] === '*') {\n re += '.*';\n i += 2;\n if (pat[i] === '/') i++;\n } else {\n re += '[^/\\\\\\\\]*';\n i++;\n }\n } else if (c === '?') {\n re += '[^/\\\\\\\\]';\n i++;\n } else if (c === '[') {\n let cls = '[';\n i++;\n if (pat[i] === '!' || pat[i] === '^') {\n cls += '^';\n i++;\n }\n while (i < pat.length && pat[i] !== ']') {\n const ch = pat[i] ?? '';\n if (ch === '\\\\') cls += '\\\\\\\\';\n else if (ch === ']' || ch === '^') cls += `\\\\${ch}`;\n else cls += ch;\n i++;\n }\n cls += ']';\n re += cls;\n i++;\n } else {\n re += c.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\n i++;\n }\n }\n return new RegExp(re + '$');\n}\n\nfunction baseDir(pat: string): string {\n let i = pat.length - 1;\n while (i >= 0 && !GLOB_CHARS.has(expectDefined(pat[i])) && pat[i] !== SEP && pat[i] !== '/') i--;\n const cut = i >= 0 ? pat.lastIndexOf(SEP, i) : pat.lastIndexOf('/', i);\n return cut < 0 ? '.' : pat.slice(0, cut);\n}\n\n/**\n * Resolve `pattern` to the set of concrete file paths it matches.\n * Literal paths (no glob chars) are returned as-is.\n *\n * @example\n * await expandGlob('src/**\\/*.ts') // → ['src/a.ts', 'src/b/c.ts', ...]\n * await expandGlob('foo.txt') // → ['foo.txt']\n */\nexport async function expandGlob(pattern: string): Promise<string[]> {\n if (!isGlob(pattern)) return [pattern];\n\n const results = new Set<string>();\n const abs = isAbsolute(pattern);\n const base = abs ? baseDir(pattern) : baseDir(pattern);\n const relPat = base === '.' ? pattern : pattern.slice(base.length + 1);\n\n async function walk(dir: string, pat: string): Promise<void> {\n let entries: string[];\n try {\n entries = await fsp.readdir(dir);\n } catch {\n return;\n }\n\n const firstGlob = pat.search(/[*?[[]/);\n\n if (firstGlob < 0) {\n const re = globToRegex(pat);\n for (const e of entries) {\n if (re.test(e)) {\n const full = `${dir}${SEP}${e}`;\n results.add(abs ? resolve(full) : full);\n }\n }\n return;\n }\n\n const before = pat.slice(0, firstGlob);\n const rest = pat.slice(firstGlob);\n\n if (before.endsWith('**')) {\n // Match at current dir then recurse into subdirs\n await walk(dir, rest);\n for (const e of entries) {\n const full = `${dir}${SEP}${e}`;\n try {\n const stat = await fsp.stat(full);\n if (stat.isDirectory()) await walk(full, rest);\n } catch {\n /* skip inaccessible */\n }\n }\n } else if (before === '') {\n // Pattern starts with a glob char — match files in current dir only\n const re = globToRegex(rest);\n for (const e of entries) {\n if (re.test(e)) {\n const full = `${dir}${SEP}${e}`;\n results.add(abs ? resolve(full) : full);\n }\n }\n } else {\n // Literal segment(s) before the glob — descend into matching subdir\n const seg = before.replace(/[*?[\\]]/g, '').replace(/\\/$/, '');\n if (entries.includes(seg)) {\n const full = `${dir}${SEP}${seg}`;\n try {\n const stat = await fsp.stat(full);\n if (stat.isDirectory()) await walk(full, rest);\n } catch {\n /* skip */\n }\n }\n }\n }\n\n await walk(base === '.' ? '.' : base, relPat);\n return [...results];\n}\n","import { expectDefined } from './expect-defined.js';\r\n/**\r\n * Minimal glob matcher for trust patterns.\r\n * Supports: *, **, ?, character classes [abc], [a-z], negation [!...] or [^...].\r\n *\r\n * Compiled regexes are cached so repeated calls with the same pattern\r\n * avoid recompilation overhead.\r\n */\r\n\r\nfunction escapeRegex(s: string): string {\r\n return s.replace(/[.+^${}()|\\\\]/g, '\\\\$&');\r\n}\r\n\r\n// Module-level cache to avoid recompiling the same pattern on every call.\r\n// LRU-ish eviction keeps unbounded growth in check for long-running processes.\r\nconst COMPILED_GLOB_CACHE = new Map<string, RegExp>();\r\nconst CACHE_MAX_SIZE = 2000;\r\n\r\n// Matches nothing — `[^\\s\\S]` can never be satisfied. Used as the cached\r\n// result for patterns that fail to compile (e.g. an over-long auto-trusted\r\n// command) so one bad trust entry degrades to \"no match\" instead of throwing.\r\nconst NEVER_MATCH = /[^\\s\\S]/;\r\n\r\nfunction getCachedGlob(pattern: string): RegExp {\r\n const cached = COMPILED_GLOB_CACHE.get(pattern);\r\n if (cached) return cached;\r\n if (COMPILED_GLOB_CACHE.size >= CACHE_MAX_SIZE) {\r\n // Evict oldest 25% when at capacity\r\n const keys = [...COMPILED_GLOB_CACHE.keys()];\r\n for (let i = 0; i < Math.floor(CACHE_MAX_SIZE / 4); i++) {\r\n COMPILED_GLOB_CACHE.delete(expectDefined(keys[i]));\r\n }\r\n }\r\n let re: RegExp;\r\n try {\r\n re = compileGlob(pattern);\r\n } catch {\r\n // A pathological trust pattern (over MAX_GLOB_PATTERN_LEN — e.g. a long\r\n // one-liner auto-trusted in YOLO/Auto mode) must NOT throw out of every\r\n // subsequent permission check and break unrelated commands like `true`\r\n // or `ls` (#20). Cache a never-matching regex so the bad entry is inert.\r\n re = NEVER_MATCH;\r\n }\r\n COMPILED_GLOB_CACHE.set(pattern, re);\r\n return re;\r\n}\r\n\r\n// Cap glob pattern length to prevent excessively long compiled regexes.\r\nconst MAX_GLOB_PATTERN_LEN = 1024;\r\n\r\nexport function compileGlob(pattern: string): RegExp {\r\n if (pattern.length > MAX_GLOB_PATTERN_LEN) {\r\n throw new Error(`Glob pattern exceeds ${MAX_GLOB_PATTERN_LEN} characters`);\r\n }\r\n let i = 0;\r\n let re = '^';\r\n while (i < pattern.length) {\r\n const c = pattern[i];\r\n if (c === '*') {\r\n if (pattern[i + 1] === '*') {\r\n // ** matches any number of chars including /\r\n re += '.*';\r\n i += 2;\r\n // Skip trailing slash so '**/x' matches 'x'\r\n if (pattern[i] === '/') i++;\r\n } else {\r\n // single * matches any chars except /\r\n re += '[^/]*';\r\n i++;\r\n }\r\n } else if (c === '?') {\r\n re += '[^/]';\r\n i++;\r\n } else if (c === '[') {\r\n let cls = '[';\r\n i++;\r\n if (pattern[i] === '!' || pattern[i] === '^') {\r\n cls += '^';\r\n i++;\r\n }\r\n while (i < pattern.length && pattern[i] !== ']') {\r\n const ch = pattern[i] ?? '';\r\n // Inside a regex class, only `]`, `\\`, and `^`/`-` at boundaries need\r\n // escaping. We've already consumed the leading `^`; the rest are\r\n // literal. Escape `\\` defensively and pass the rest through verbatim\r\n // so ranges like `a-z` continue to work.\r\n if (ch === '\\\\') {\r\n cls += '\\\\\\\\';\r\n } else if (ch === ']' || ch === '^') {\r\n cls += `\\\\${ch}`;\r\n } else {\r\n cls += ch;\r\n }\r\n i++;\r\n }\r\n cls += ']';\r\n re += cls;\r\n i++; // skip closing ]\r\n } else {\r\n re += escapeRegex(c ?? '');\r\n i++;\r\n }\r\n }\r\n re += '$';\r\n return new RegExp(re);\r\n}\r\n\r\nexport function matchGlob(pattern: string, input: string): boolean {\r\n return getCachedGlob(pattern).test(input);\r\n}\r\n\r\nexport function matchAny(patterns: string[], input: string): boolean {\r\n return patterns.some((p) => matchGlob(p, input));\r\n}\r\n","/**\n * Shared IP-address guards for SSRF protection.\n *\n * Exported so `fetch.ts` (tools), `web-search/index.ts` (plugins), and any\n * other package that needs to validate IPs can all consume the same logic.\n * Any future additions (e.g. extra CIDR blocks) need only be made here.\n */\n\nimport * as dns from 'node:dns/promises';\nimport * as net from 'node:net';\n\n/**\n * True if `addr` is in a private / loopback / link-local / reserved / CGNAT /\n * multicast range. `net.isIP` is called by the caller first so `addr` is\n * guaranteed to be a canonical dotted-quad at this point.\n */\nexport function isPrivateIPv4(addr: string): boolean {\n const parts = addr.split('.').map((p) => Number.parseInt(p, 10));\n if (parts.length !== 4 || parts.some((n) => Number.isNaN(n) || n < 0 || n > 255)) {\n return true; // defensive: malformed → block\n }\n const [a, b, c] = parts as [number, number, number, number];\n if (a === 0) return true; // 0.0.0.0/8 \"this host\"\n if (a === 10) return true; // 10.0.0.0/8 private\n if (a === 127) return true; // 127.0.0.0/8 loopback\n if (a === 169 && b === 254) return true; // 169.254.0.0/16 link-local + AWS/GCE/Azure IMDS\n if (a === 172 && b >= 16 && b <= 31) return true; // 172.16.0.0/12 private\n if (a === 192 && b === 168) return true; // 192.168.0.0/16 private\n if (a === 192 && b === 0 && c === 0) return true; // 192.0.0.0/24 reserved\n if (a === 100 && b >= 64 && b <= 127) return true; // 100.64.0.0/10 CGNAT\n if (a >= 224) return true; // 224.0.0.0/4 multicast + 240.0.0.0/4 reserved\n return false;\n}\n\n/**\n * True if `raw` (an IPv6 literal, already lowercased) is loopback / unique-local /\n * link-local / unspecified / IPv4-mapped-private.\n */\nexport function isPrivateIPv6(raw: string): boolean {\n const lower = raw.toLowerCase();\n if (lower === '::' || lower === '::1') return true; // loopback / unspecified\n\n // Expand to 8-group canonical form so range checks don't have to handle every\n // shorthand notation. Returns null on malformed input — we conservatively\n // block in that case rather than leaking.\n const groups = expandIPv6(lower);\n if (!groups) return true;\n\n // IPv4-mapped: ::ffff:0:0/96 → groups[0..5] all 0, groups[6..7] hold the\n // embedded IPv4 as two 16-bit words. Node URL normalises the dotted form to\n // this representation (e.g. ::ffff:127.0.0.1 → ::ffff:7f00:1).\n if (\n groups[0] === 0 &&\n groups[1] === 0 &&\n groups[2] === 0 &&\n groups[3] === 0 &&\n groups[4] === 0 &&\n groups[5] === 0xffff\n ) {\n const a = (groups[6] ?? 0) >> 8;\n const b = (groups[6] ?? 0) & 0xff;\n const c = (groups[7] ?? 0) >> 8;\n const d = (groups[7] ?? 0) & 0xff;\n return isPrivateIPv4(`${a}.${b}.${c}.${d}`);\n }\n\n const high = groups[0] ?? 0;\n if ((high & 0xfe00) === 0xfc00) return true; // fc00::/7 unique local (fc..fd)\n if ((high & 0xffc0) === 0xfe80) return true; // fe80::/10 link-local\n if ((high & 0xff00) === 0xff00) return true; // ff00::/8 multicast\n return false;\n}\n\n/**\n * Expand an IPv6 string into exactly 8 16-bit numbers. Handles `::` compression.\n * Returns null on malformed input — caller should treat that as \"block\".\n */\nexport function expandIPv6(addr: string): number[] | null {\n const parts = addr.split('::');\n if (parts.length > 2) return null;\n\n const parseGroups = (s: string): number[] | null => {\n if (s === '') return [];\n const out: number[] = [];\n for (const g of s.split(':')) {\n if (g.length === 0 || g.length > 4) return null;\n const n = Number.parseInt(g, 16);\n if (Number.isNaN(n) || n < 0 || n > 0xffff) return null;\n out.push(n);\n }\n return out;\n };\n\n if (parts.length === 1) {\n const groups = parseGroups(parts[0] ?? '');\n if (groups?.length !== 8) return null;\n return groups;\n }\n\n const head = parseGroups(parts[0] ?? '');\n const tail = parseGroups(parts[1] ?? '');\n if (!head || !tail) return null;\n const fill = 8 - head.length - tail.length;\n if (fill < 0) return null;\n return [...head, ...new Array<number>(fill).fill(0), ...tail];\n}\n\n/**\n * Convenience: throw if `hostname` resolves to a private / loopback IP.\n * Use as a pre-flight check before opening a socket.\n *\n * ⚠️ This is not sufficient alone — connections must also use a pinned\n * dispatcher (so the OS re-uses the already-resolved address) or the same\n * check must be applied after every redirect hop. See `guardedLookup` in\n * `fetch.ts` for the connection-level enforcement.\n */\nexport async function assertNotPrivateHost(hostname: string): Promise<void> {\n const host =\n hostname.startsWith('[') && hostname.endsWith(']') ? hostname.slice(1, -1) : hostname;\n\n if (host === 'localhost' || host.endsWith('.localhost')) {\n throw new Error('fetch: blocked localhost target');\n }\n\n const ipVersion = net.isIP(host);\n if (ipVersion === 4) {\n if (isPrivateIPv4(host)) {\n throw new Error(`fetch: blocked private/loopback address \"${host}\"`);\n }\n } else if (ipVersion === 6) {\n if (isPrivateIPv6(host)) {\n throw new Error(`fetch: blocked private/loopback address \"${host}\"`);\n }\n } else {\n // Hostname — resolve and reject if ANY record is private.\n try {\n const records = await dns.lookup(host, { all: true });\n for (const r of records) {\n // dns.lookup family: 4 = IPv4, 6 = IPv6\n const bad = r.family === 4 ? isPrivateIPv4(r.address) : isPrivateIPv6(r.address);\n if (bad) {\n throw new Error(`fetch: resolved to private address ${r.address}`);\n }\n }\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('fetch:')) throw err;\n // DNS failure — let fetch handle it rather than doubling the error.\n }\n }\n}\n","import { expectDefined } from './expect-defined.js';\n\n/**\n * Attempt to close an incomplete JSON object string by auto-closing braces\n * and completing any unclosed double-quoted string values.\n *\n * Strategy:\n * 1. Compute origOpen from the ORIGINAL input (how many braces are unclosed).\n * 2. Add that many closing braces. If result is now valid JSON → return it.\n * 3. If still invalid: trim trailing whitespace, strip trailing backslash.\n * 4. Walk backwards to detect an unclosed string value.\n * - Quote followed by `:` → key-name, skip\n * - Quote followed by `,` `}` or end-of-string → toggle in/out of string\n * 5. If we end INSIDE a string (unclosed opening `\"`), append `\"` + origOpen `}`.\n *\n * Known limitations:\n * - Strings whose content ends with a `\"` character cannot be repaired\n * (algorithm can't distinguish content-`\"` from string-terminator `\"`).\n * - Input ending in bare `:` (incomplete value expression) can't be meaningfully repaired.\n * - Bare `{` returns unchanged.\n * - If origOpen=0 (braces balanced) but string is unclosed, repair is skipped\n * (the input would be valid JSON per JSON.parse, so it's returned as-is).\n */\nexport function completePartialObject(s: string): string {\n if (!s.trim().startsWith('{')) return s;\n if (tryParse(s).ok) return s;\n return repairTruncated(s);\n}\n\nfunction repairTruncated(s: string): string {\n // Single forward scan capturing the structural state at the truncation point:\n // the open-container stack, whether we are inside a string, a dangling escape,\n // and where the last significant (non-trailing-whitespace) character sits.\n const stack: ('{' | '[')[] = [];\n let inString = false;\n let escaped = false;\n let sawKey = false; // have we seen any string (i.e. real content) yet?\n let prevSig = ''; // last significant char seen outside of a string\n let contentEnd = 0; // index just past the last significant char\n // Count unbalanced `{` accumulated *inside* the currently-open string value,\n // so a truncation mid-string like `\"a{` can be balanced before closing it.\n let stringBraceDepth = 0;\n\n for (let i = 0; i < s.length; i++) {\n const ch = expectDefined(s[i]);\n if (inString) {\n contentEnd = i + 1;\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === '\\\\') {\n escaped = true;\n continue;\n }\n if (ch === '\"') {\n inString = false;\n prevSig = '\"';\n stringBraceDepth = 0;\n continue;\n }\n if (ch === '{') stringBraceDepth++;\n else if (ch === '}' && stringBraceDepth > 0) stringBraceDepth--;\n continue;\n }\n if (ch === ' ' || ch === '\\t' || ch === '\\n' || ch === '\\r') continue;\n contentEnd = i + 1;\n if (ch === '\"') {\n inString = true;\n sawKey = true;\n stringBraceDepth = 0;\n prevSig = '\"';\n } else if (ch === '{' || ch === '[') {\n stack.push(ch);\n prevSig = ch;\n } else if (ch === '}' || ch === ']') {\n stack.pop();\n prevSig = ch;\n } else {\n prevSig = ch;\n }\n }\n\n // A lone open brace (or anything with no key/content) can't be meaningfully\n // completed — return it untouched.\n if (!sawKey && !inString) return s;\n\n // Drop trailing whitespace that sits outside any string.\n let result = s.slice(0, contentEnd);\n\n if (inString) {\n // A dangling lone backslash can't begin a valid escape — drop it.\n if (escaped) {\n result = result.slice(0, -1);\n } else if (endsWithInvalidEscape(result)) {\n // A trailing invalid escape (e.g. `\\}`) can't be completed into valid\n // JSON — strip the backslash and its bogus escapee.\n result = result.slice(0, -2);\n }\n // Balance braces opened inside the truncated string before closing it.\n if (stringBraceDepth > 0) result += '}'.repeat(stringBraceDepth);\n result += '\"';\n } else if (prevSig === ':') {\n // A key with no value (e.g. `{\"k\":`) — complete it to null.\n result += 'null';\n }\n\n // Close any still-open containers in reverse order.\n for (let k = stack.length - 1; k >= 0; k--) {\n result += stack[k] === '{' ? '}' : ']';\n }\n\n // Last resort: an empty value sitting before an existing close (`{\"k\":}`)\n // leaves invalid JSON — fill it with null.\n if (!tryParse(result).ok) {\n const patched = result.replace(/:(\\s*)([}\\]])/g, ':null$2');\n if (tryParse(patched).ok) result = patched;\n }\n\n return result;\n}\n\nconst VALID_ESCAPE = new Set(['\"', '\\\\', '/', 'b', 'f', 'n', 'r', 't', 'u']);\n\n/** True when `str` ends with a backslash escape that JSON does not allow. */\nfunction endsWithInvalidEscape(str: string): boolean {\n const last = str[str.length - 1];\n if (str[str.length - 2] !== '\\\\' || last === undefined) return false;\n if (VALID_ESCAPE.has(last)) return false;\n // The backslash must itself be unescaped (odd run of backslashes before it).\n let backslashes = 0;\n for (let k = str.length - 2; k >= 0 && str[k] === '\\\\'; k--) backslashes++;\n return backslashes % 2 === 1;\n}\n\nfunction tryParse(s: string): { ok: true; value: unknown } | { ok: false } {\n try {\n return { ok: true, value: JSON.parse(s) };\n } catch {\n return { ok: false };\n }\n}\n","/**\n * Minimal JSON Schema validator — covers the subset needed for plugin\n * configSchema validation and tool inputSchema sanity checks. Intentionally\n * small (~80 lines, zero deps) and tolerant: unknown keywords are ignored so\n * authors can mix in non-standard extensions without breaking validation.\n *\n * NOT for full JSON Schema 2020-12 conformance. If a plugin needs $ref,\n * conditional schemas, format validation, or anything else exotic, it should\n * bring its own ajv-based validator and call this only for the cheap path.\n */\nimport type { JSONSchema } from '../types/tool.js';\n\nexport interface ValidationError {\n path: string;\n message: string;\n}\n\nexport interface ValidationResult {\n ok: boolean;\n errors: ValidationError[];\n}\n\nexport function validateAgainstSchema(value: unknown, schema: JSONSchema): ValidationResult {\n const errors: ValidationError[] = [];\n walk(value, schema, '', errors);\n return { ok: errors.length === 0, errors };\n}\n\nfunction walk(value: unknown, schema: JSONSchema, path: string, errors: ValidationError[]): void {\n if (schema.enum !== undefined) {\n if (!schema.enum.some((e) => deepEqual(e, value))) {\n errors.push({\n path: path || '<root>',\n message: `expected one of ${JSON.stringify(schema.enum)}, got ${JSON.stringify(value)}`,\n });\n return;\n }\n }\n\n if (typeof schema.type === 'string') {\n if (!checkType(value, schema.type)) {\n errors.push({\n path: path || '<root>',\n message: `expected ${schema.type}, got ${describeType(value)}`,\n });\n return;\n }\n }\n\n if (schema.type === 'object' && isPlainObject(value)) {\n const obj = value as Record<string, unknown>;\n for (const req of schema.required ?? []) {\n if (!(req in obj)) {\n errors.push({ path: joinPath(path, req), message: 'required property missing' });\n }\n }\n if (schema.properties) {\n for (const [key, subSchema] of Object.entries(schema.properties)) {\n if (key in obj) {\n walk(obj[key], subSchema, joinPath(path, key), errors);\n }\n }\n }\n }\n\n if (schema.type === 'array' && Array.isArray(value) && schema.items) {\n for (let i = 0; i < value.length; i++) {\n walk(value[i], schema.items as JSONSchema, `${path}[${i}]`, errors);\n }\n }\n}\n\nfunction checkType(value: unknown, type: string): boolean {\n switch (type) {\n case 'string':\n return typeof value === 'string';\n case 'number':\n return typeof value === 'number' && !Number.isNaN(value);\n case 'integer':\n return typeof value === 'number' && Number.isInteger(value);\n case 'boolean':\n return typeof value === 'boolean';\n case 'null':\n return value === null;\n case 'array':\n return Array.isArray(value);\n case 'object':\n return isPlainObject(value);\n default:\n return true;\n }\n}\n\nfunction isPlainObject(v: unknown): boolean {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nfunction joinPath(parent: string, key: string): string {\n if (!parent) return key;\n return `${parent}.${key}`;\n}\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (typeof a !== typeof b) return false;\n if (a === null || b === null) return a === b;\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((v, i) => deepEqual(v, b[i]));\n }\n if (typeof a === 'object' && typeof b === 'object') {\n const ak = Object.keys(a as object);\n const bk = Object.keys(b as object);\n if (ak.length !== bk.length) return false;\n return ak.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n );\n }\n return false;\n}\n","import type { CustomModelDefinition } from '../types/config.js';\n\n/**\n * Merge per-provider `customModels` into top-level `configModels`.\n *\n * Keys present in `configModels` always win over `providerCustomModels`\n * when the same model id appears in both places. This lets the user\n * override provider-attached definitions from the top-level config.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeCustomModelDefs(\n providerCustomModels: Record<string, CustomModelDefinition> | undefined,\n configModels: Record<string, CustomModelDefinition> | undefined,\n): Record<string, CustomModelDefinition> | undefined {\n const out: Record<string, CustomModelDefinition> = {};\n\n // Layer 1: provider-level definitions (weaker).\n if (providerCustomModels) {\n for (const [id, def] of Object.entries(providerCustomModels)) {\n out[id] = { ...def };\n }\n }\n\n // Layer 2: top-level definitions (stronger).\n if (configModels) {\n for (const [id, def] of Object.entries(configModels)) {\n out[id] = { ...def }; // top-level overwrites provider-level\n }\n }\n\n if (Object.keys(out).length === 0) return undefined;\n return out;\n}\n","import type {\n ModelsDevModel,\n ModelsDevProvider,\n ModelsDevPayload,\n} from '../types/models-registry.js';\n\n/**\n * Deep-merge a curated `overlay` payload on top of a `base` payload (both in\n * the models.dev `api.json` shape). The overlay always wins: it can add\n * providers/models the base lacks and override fields the base gets wrong.\n *\n * Precedence rules:\n * - Provider present in both → scalar fields (`name`, `npm`, `api`, `env`,\n * `doc`) come from the overlay when set; `models` maps merge by model id.\n * - Provider only in the overlay → added wholesale.\n * - Model present in both → overlay model fields override base model fields\n * (`{ ...base, ...overlay }`), with the nested `limit` / `cost` /\n * `modalities` objects merged one level deeper so an overlay can fix just\n * `limit.context` without restating the rest of the model.\n * - Model only in the overlay → added.\n *\n * Pure: never mutates its inputs.\n */\nexport function mergeModelsPayload(\n base: ModelsDevPayload,\n overlay: ModelsDevPayload,\n): ModelsDevPayload {\n const out: ModelsDevPayload = {};\n for (const [id, provider] of Object.entries(base)) {\n out[id] = cloneProvider(provider);\n }\n for (const [id, ovProvider] of Object.entries(overlay)) {\n const existing = out[id];\n out[id] = existing ? mergeProvider(existing, ovProvider) : cloneProvider(ovProvider);\n }\n return out;\n}\n\nfunction mergeProvider(base: ModelsDevProvider, overlay: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(base.models ?? {})) {\n models[mid] = { ...m };\n }\n for (const [mid, ovModel] of Object.entries(overlay.models ?? {})) {\n const existing = models[mid];\n models[mid] = existing ? mergeModel(existing, ovModel) : { ...ovModel };\n }\n return {\n ...base,\n // Overlay scalar fields win when explicitly provided; otherwise keep base.\n ...stripUndefined({\n id: overlay.id,\n name: overlay.name,\n npm: overlay.npm,\n api: overlay.api,\n env: overlay.env,\n doc: overlay.doc,\n }),\n models,\n };\n}\n\nfunction mergeModel(base: ModelsDevModel, overlay: ModelsDevModel): ModelsDevModel {\n const merged: ModelsDevModel = { ...base, ...overlay };\n // One level deeper for the structured fields so a partial overlay (e.g. only\n // `limit.context`) doesn't blow away the base's other sub-fields.\n if (base.limit || overlay.limit) {\n merged.limit = { ...base.limit, ...overlay.limit };\n }\n if (base.cost || overlay.cost) {\n merged.cost = { ...base.cost, ...overlay.cost };\n }\n if (base.modalities || overlay.modalities) {\n merged.modalities = { ...base.modalities, ...overlay.modalities };\n }\n return merged;\n}\n\nfunction cloneProvider(p: ModelsDevProvider): ModelsDevProvider {\n const models: Record<string, ModelsDevModel> = {};\n for (const [mid, m] of Object.entries(p.models ?? {})) {\n models[mid] = { ...m };\n }\n return { ...p, models };\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber base fields. */\nfunction stripUndefined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n const out: Partial<T> = {};\n for (const [k, v] of Object.entries(obj)) {\n if (v !== undefined) out[k as keyof T] = v as T[keyof T];\n }\n return out;\n}\n","import { expectDefined } from './expect-defined.js';\nimport type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = expectDefined(messages[i]);\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (msg?.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","export type NewlineStyle = 'lf' | 'crlf' | 'cr';\n\nexport function detectNewlineStyle(text: string): NewlineStyle {\n let lf = 0;\n let crlf = 0;\n let cr = 0;\n for (let i = 0; i < text.length; i++) {\n const c = text.charCodeAt(i);\n if (c === 0x0d) {\n if (text.charCodeAt(i + 1) === 0x0a) {\n crlf++;\n i++;\n } else {\n cr++;\n }\n } else if (c === 0x0a) {\n lf++;\n }\n }\n if (crlf > lf && crlf > cr) return 'crlf';\n if (cr > lf && cr > crlf) return 'cr';\n return 'lf';\n}\n\nexport function toStyle(text: string, style: NewlineStyle): string {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n if (style === 'lf') return normalized;\n if (style === 'crlf') return normalized.replace(/\\n/g, '\\r\\n');\n return normalized.replace(/\\n/g, '\\r');\n}\n\nexport function normalizeToLf(text: string): string {\n return text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import { toErrorMessage } from './error.js';\n\nexport interface SafeParseResult<T> {\n ok: boolean;\n value?: T | undefined;\n error?: string | undefined;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: toErrorMessage(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: toErrorMessage(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: escape literal control characters that appear *inside* string\n // values. Models frequently emit raw newlines/tabs inside a code payload\n // (e.g. edit's old_string/new_string) instead of the required \\n / \\t, which\n // makes JSON.parse throw. This is the single most common malformed-args case.\n out = escapeControlCharsInStrings(out);\n\n // Stage 4: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\n/**\n * Walk the string tracking whether we are inside a JSON string literal and\n * replace raw control characters (U+0000–U+001F) that appear inside strings\n * with their valid JSON escape sequences. Characters outside strings are left\n * untouched (insignificant whitespace stays as-is). Already-escaped sequences\n * are not double-escaped because we only act on *literal* control bytes.\n */\nfunction escapeControlCharsInStrings(s: string): string {\n let inString = false;\n let out = '';\n for (let i = 0; i < s.length; i++) {\n const c = s.charAt(i);\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n out += c;\n continue;\n }\n const code = c.charCodeAt(0);\n if (inString && code < 0x20) {\n switch (c) {\n case '\\n':\n out += '\\\\n';\n break;\n case '\\r':\n out += '\\\\r';\n break;\n case '\\t':\n out += '\\\\t';\n break;\n case '\\b':\n out += '\\\\b';\n break;\n case '\\f':\n out += '\\\\f';\n break;\n default:\n out += `\\\\u${code.toString(16).padStart(4, '0')}`;\n }\n continue;\n }\n out += c;\n }\n return out;\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s.charAt(i);\n if (c === '\"' && (i === 0 || s.charAt(i - 1) !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s.charAt(i + 1) === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s.charAt(i) !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","/** Resolve a promise after `ms` milliseconds. Prefer this over raw\n * `setTimeout` wrappers so all delay sites use a single implementation\n * and an abortable variant can be introduced without a codebase-wide hunt. */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","/**\n * String utilities shared across the WrongStack codebase.\n */\n\n/**\n * Truncate a string to at most `max` characters, appending an ellipsis if it\n * was longer. Returns the original string unchanged when it fits.\n */\nexport function truncate(s: string, max: number): string {\n return s.length <= max ? s : `${s.slice(0, max - 1)}…`;\n}\n","import type {\n TaskPriority,\n TaskStatus,\n TaskType,\n TaskProgress as TaskGraphProgress,\n} from '../types/task-graph.js';\nimport { color } from './color.js';\n\n// Re-export graph types for convenience\nexport type { TaskStatus, TaskPriority, TaskType };\n\n// ---------------------------------------------------------------------------\n// Session-level task item — mirrors TaskNode but with string timestamps\n// for JSON serialization and a flat-list structure (no graph edges).\n// ---------------------------------------------------------------------------\n\nexport interface TaskItem {\n id: string;\n title: string;\n description?: string | undefined;\n type: TaskType;\n priority: TaskPriority;\n status: TaskStatus;\n /** IDs of tasks this one depends on. */\n dependsOn?: string[] | undefined;\n /** Agent/subagent name assigned to this task. */\n assignee?: string | undefined;\n estimateHours?: number | undefined;\n tags?: string[] | undefined;\n createdAt: string;\n updatedAt: string;\n}\n\n// ---------------------------------------------------------------------------\n// Progress (re-export computeTaskItemProgress adapted for TaskItem[])\n// ---------------------------------------------------------------------------\n\nexport function computeTaskItemProgress(tasks: TaskItem[]): TaskGraphProgress {\n let completed = 0;\n let pending = 0;\n let inProgress = 0;\n let blocked = 0;\n let failed = 0;\n let review = 0;\n let estimatedHours = 0;\n const actualHours = 0;\n for (const t of tasks) {\n switch (t.status) {\n case 'completed':\n completed++;\n break;\n case 'pending':\n pending++;\n break;\n case 'in_progress':\n inProgress++;\n break;\n case 'blocked':\n blocked++;\n break;\n case 'failed':\n failed++;\n break;\n case 'review':\n review++;\n break;\n }\n estimatedHours += t.estimateHours ?? 0;\n }\n return {\n total: tasks.length,\n pending,\n inProgress,\n blocked,\n failed,\n review,\n completed,\n percentComplete: tasks.length > 0 ? Math.round((completed / tasks.length) * 100) : 0,\n estimatedHours,\n actualHours,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Icons\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICON: Record<TaskStatus, string> = {\n pending: '○',\n in_progress: '◐',\n blocked: '⊘',\n failed: '✗',\n review: '◑',\n completed: '●',\n};\n\nconst PRIORITY_ICON: Record<TaskPriority, string> = {\n critical: '🔴',\n high: '🟠',\n medium: '🟡',\n low: '🟢',\n};\n\nconst TYPE_ICON: Record<TaskType, string> = {\n feature: '⚡',\n bugfix: '🐛',\n refactor: '♻️',\n docs: '📝',\n test: '🧪',\n chore: '🔧',\n};\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nexport function formatTaskProgress(tasks: TaskItem[]): string {\n const p = computeTaskItemProgress(tasks);\n if (p.total === 0) return 'No tasks.';\n const barWidth = 24;\n const filled = Math.round((p.percentComplete / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = '█'.repeat(filled) + '░'.repeat(empty);\n return [\n `${color.bold('Tasks')} [${bar}] ${p.percentComplete}%`,\n ` ${color.green('●')} ${p.completed} done │ ${color.yellow('◐')} ${p.inProgress} active │ ${color.dim('○')} ${p.pending} pending │ ⊘ ${p.blocked} blocked │ ✗ ${p.failed} failed`,\n p.estimatedHours > 0\n ? ` ${color.dim(`est. ${p.estimatedHours}h`)}`\n : '',\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nexport function formatTaskList(tasks: TaskItem[]): string {\n if (tasks.length === 0) return 'No tasks.';\n\n // Group by status\n const order: TaskStatus[] = ['in_progress', 'blocked', 'review', 'pending', 'failed', 'completed'];\n const groups = new Map<TaskStatus, TaskItem[]>();\n for (const t of tasks) {\n const list = groups.get(t.status) ?? [];\n list.push(t);\n groups.set(t.status, list);\n }\n\n const lines: string[] = [];\n lines.push(color.dim(`Tasks (${tasks.length} total):`));\n\n for (const status of order) {\n const group = groups.get(status);\n if (!group || group.length === 0) continue;\n const icon = STATUS_ICON[status];\n lines.push(` ${icon} ${status.toUpperCase()} (${group.length})`);\n for (const t of group) {\n const prio = PRIORITY_ICON[t.priority];\n const type = TYPE_ICON[t.type];\n const deps =\n t.dependsOn && t.dependsOn.length > 0\n ? ` ${color.dim('←')} ${color.dim(t.dependsOn.map((d) => d.slice(0, 8)).join(', '))}`\n : '';\n const who = t.assignee ? ` ${color.dim(`@${t.assignee}`)}` : '';\n const hrs = t.estimateHours ? ` ${color.dim(`${t.estimateHours}h`)}` : '';\n lines.push(` ${type} ${prio} ${t.title}${deps}${who}${hrs}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { TodoItem } from '../core/context.js';\nimport { color } from './color.js';\n\n/**\n * Canonical text rendering of the live todo list, shared by the CLI's\n * `/todos` slash command and the TUI's auto-echo (which prints the same\n * snapshot to chat history each time the `todo` tool mutates the list).\n *\n * Layout: a header line with the `done/total done` count, then one row\n * per item — `[ ]` pending, `[~]` in-progress, `[x]` completed. In-\n * progress rows prefer `activeForm` (\"Building the project\") over the\n * imperative `content` (\"Build the project\") when present.\n *\n * Returned as a single newline-joined string so callers can hand it\n * straight to a history dispatcher or stdout.\n */\nexport function formatTodosList(todos: TodoItem[]): string {\n if (todos.length === 0) return 'No todos.';\n const lines: string[] = [];\n const done = todos.filter((t) => t.status === 'completed').length;\n lines.push(color.dim(`Todos (${done}/${todos.length} done):`));\n todos.forEach((t, i) => {\n const mark =\n t.status === 'completed'\n ? color.green('[x]')\n : t.status === 'in_progress'\n ? color.yellow('[~]')\n : color.dim('[ ]');\n const text = t.status === 'in_progress' && t.activeForm ? t.activeForm : t.content;\n const label = t.status === 'completed' ? color.dim(text) : text;\n lines.push(` ${color.dim(String(i + 1).padStart(2))}. ${mark} ${label}`);\n });\n return lines.join('\\n');\n}\n","const GLOB_METACHARACTERS = /[*?[\\]]/g;\n\nexport function escapeGlobSubject(value: string): string {\n return value.replace(GLOB_METACHARACTERS, (char) => `\\\\${char}`);\n}\n\nexport function normalizePathSubject(value: string): string {\n return escapeGlobSubject(value.replace(/\\\\/g, '/'));\n}\n\nexport function isPathSubjectKey(subjectKey: string): boolean {\n return subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\n}\n\nexport function subjectForToolInput(\n toolName: string,\n input: unknown,\n subjectKey?: string,\n): string | undefined {\n if (!input || typeof input !== 'object') return undefined;\n const obj = input as Record<string, unknown>;\n\n if (subjectKey) {\n const value = obj[subjectKey];\n if (typeof value === 'string') {\n return isPathSubjectKey(subjectKey) ? normalizePathSubject(value) : escapeGlobSubject(value);\n }\n }\n\n if (toolName === 'bash' && typeof obj.command === 'string') {\n return escapeGlobSubject(obj.command);\n }\n if (typeof obj.path === 'string') {\n return normalizePathSubject(obj.path);\n }\n if (typeof obj.url === 'string') {\n return escapeGlobSubject(obj.url);\n }\n if (typeof obj.name === 'string') {\n return escapeGlobSubject(obj.name);\n }\n return undefined;\n}\n","import type { JSONSchema } from '../types/tool.js';\n\nexport interface ToolWireDefinitionLike {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}\n\nexport interface CompactToolDefinitionForWireOptions {\n /** Top-level tool description budget. */\n descriptionMaxChars?: number | undefined;\n /** Per-JSON-Schema `description` annotation budget. */\n schemaDescriptionMaxChars?: number | undefined;\n}\n\nexport interface CompactWireToolDefinition {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\nconst TOOL_DESCRIPTION_MAX_CHARS = 640;\nconst SCHEMA_DESCRIPTION_MAX_CHARS = 180;\n\nconst compactCache = new WeakMap<object, CompactWireToolDefinition>();\n\n/**\n * Return the provider-wire version of a tool definition.\n *\n * Tool schemas remain structurally intact: validation keywords, property\n * names, required fields, enum values, and nested shapes are preserved. The\n * only reduction is on human prose annotations (`description`), which are the\n * largest repeated cost in provider tool declarations.\n */\nexport function compactToolDefinitionForWire(\n tool: ToolWireDefinitionLike,\n opts: CompactToolDefinitionForWireOptions = {},\n): CompactWireToolDefinition {\n const useDefaultOptions =\n opts.descriptionMaxChars === undefined && opts.schemaDescriptionMaxChars === undefined;\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n const cached = compactCache.get(tool);\n if (cached) return cached;\n }\n\n const compact: CompactWireToolDefinition = {\n name: tool.name,\n description: compactDescription(\n tool.description ?? '',\n opts.descriptionMaxChars ?? TOOL_DESCRIPTION_MAX_CHARS,\n ),\n inputSchema: compactSchemaDescriptions(\n tool.inputSchema,\n opts.schemaDescriptionMaxChars ?? SCHEMA_DESCRIPTION_MAX_CHARS,\n ),\n };\n\n if (useDefaultOptions && typeof tool === 'object' && tool !== null) {\n compactCache.set(tool, compact);\n }\n return compact;\n}\n\nexport function compactSchemaDescriptions(\n schema: unknown,\n maxDescriptionChars = SCHEMA_DESCRIPTION_MAX_CHARS,\n): Record<string, unknown> {\n const compact = compactSchemaNode(schema, maxDescriptionChars);\n return isRecord(compact) ? compact : { type: 'object', properties: {} };\n}\n\nfunction compactSchemaNode(node: unknown, maxDescriptionChars: number): unknown {\n if (Array.isArray(node)) {\n return node.map((item) => compactSchemaNode(item, maxDescriptionChars));\n }\n if (!isRecord(node)) return node;\n\n const out: JSONSchema = {};\n for (const [key, value] of Object.entries(node)) {\n if (key === 'description' && typeof value === 'string') {\n out[key] = compactDescription(value, maxDescriptionChars);\n } else {\n out[key] = compactSchemaNode(value, maxDescriptionChars);\n }\n }\n return out;\n}\n\nfunction compactDescription(text: string, maxChars: number): string {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (normalized.length <= maxChars) return normalized;\n if (maxChars <= 20) return normalized.slice(0, maxChars);\n\n const hardLimit = maxChars - 12;\n const boundary = findSemanticBoundary(normalized, hardLimit);\n const head = normalized.slice(0, boundary > 0 ? boundary : hardLimit).trimEnd();\n return `${head} ...`;\n}\n\nfunction findSemanticBoundary(text: string, limit: number): number {\n const punctuation = Math.max(\n text.lastIndexOf('. ', limit),\n text.lastIndexOf('; ', limit),\n text.lastIndexOf(': ', limit),\n );\n if (punctuation >= Math.floor(limit * 0.45)) return punctuation + 1;\n\n const comma = text.lastIndexOf(', ', limit);\n if (comma >= Math.floor(limit * 0.6)) return comma + 1;\n\n const space = text.lastIndexOf(' ', limit);\n return space >= Math.floor(limit * 0.6) ? space : limit;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n","import type { Message } from '../types/messages.js';\nimport { compactToolDefinitionForWire } from './tool-wire-compact.js';\n\n/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n *\n * ## Calibration\n *\n * `estimateRequestTokens` uses a fixed 3.5 chars/token heuristic — a\n * conservative overestimate that prevents underestimation but reduces\n * accuracy. After each API call, call `recordActualUsage()` with the\n * real `usage.input` from the provider response. The module maintains a\n * rolling average of `actual / estimated` ratio (EWM, α=0.3) and\n * applies it to subsequent calls via `estimateRequestTokensCalibrated`.\n *\n * Calibration is per-module (shared across all callers), which is\n * sufficient: the chars/token ratio is a property of the tokenizer,\n * not the model. Uncalibrated calls (before any samples, or when\n * `recordActualUsage` is not called) fall back to the uncalibrated\n * estimate so nothing breaks.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/** Calibration state: actual/estimated ratio via exponential weighted moving average. */\ninterface CalState {\n ratio: number; // current calibration multiplier (actual / estimated)\n count: number; // number of samples recorded\n prevEst: number; // estimated tokens from the most recent estimateRequestTokens call\n}\n\n/** EWM α — higher = faster adaptation, more volatile. */\nconst CAL_ALPHA = 0.3;\n\n/**\n * Calibration is keyed so that, in a multi-agent / model-switching process,\n * each (provider, model) tokenizer gets its own ratio instead of all of them\n * collapsing onto one shared number. Callers that don't pass a key use the\n * shared `__global__` bucket — that preserves the original single-session\n * behavior and keeps all existing call sites working unchanged.\n */\nconst CALIBRATION_GLOBAL_KEY = '__global__';\nconst _cals = new Map<string, CalState>();\n\nfunction calState(key: string): CalState {\n let state = _cals.get(key);\n if (!state) {\n state = { ratio: 1.0, count: 0, prevEst: 0 };\n _cals.set(key, state);\n }\n return state;\n}\n\nconst MIN_SAMPLES_FOR_CALIBRATION = 3;\n\n/**\n * Fallback chars/token ratios per model family for providers that don't return\n * usage data. Used when `recordActualUsage` receives zero/negative tokens and\n * we have enough samples to trust the fallback. Keys are lowercase prefixes.\n */\nconst MODEL_FAMILY_RATIO: Record<string, number> = {\n // Anthropic: ~3.8-4.0 chars/token depending on model\n claude: 3.8,\n // OpenAI: ~4.0 chars/token\n 'gpt-4': 4.0,\n 'gpt-3.5': 4.0,\n // Google: ~3.5 chars/token\n gemini: 3.5,\n // DeepSeek: ~3.5 chars/token\n deepseek: 3.5,\n};\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n/** Insertion-order queue for O(1) LRU eviction: shift from front on overcapacity. */\nconst _estimateCacheOrder: string[] = [];\n\nconst ESTIMATE_CACHE_MAX_SIZE = 50_000;\n\nfunction getCachedEstimate(key: string, compute: (key: string) => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest half — O(1) per eviction (array shift + Map.delete) instead\n // of O(n) iteration over all 50 000 keys in the Map.\n while (ESTIMATE_CACHE.size > Math.floor(ESTIMATE_CACHE_MAX_SIZE / 2)) {\n const oldest = _estimateCacheOrder.shift();\n if (oldest !== undefined) ESTIMATE_CACHE.delete(oldest);\n }\n }\n const estimate = compute(key);\n ESTIMATE_CACHE.set(key, estimate);\n _estimateCacheOrder.push(key);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n // JSON.stringify is called once to form the cache key; RoughTokenEstimate\n // is deferred only on cache miss (compute callback), not wrapped unnecessarily.\n return getCachedEstimate(JSON.stringify(input), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n return getCachedEstimate(JSON.stringify(content), (key) => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}\n\n/**\n * Compute and cache the token estimate for a single message. This is the\n * canonical per-message estimator — called once by ConversationState on\n * append/replace so the O(n·m) content-block walk happens at mutation time,\n * not on every context-pressure check.\n */\nexport function computeMessageTokens(msg: Message): number {\n if (typeof msg.content === 'string') return estimateTextTokens(msg.content);\n let total = 0;\n for (const b of msg.content) {\n if (b.type === 'text') total += estimateTextTokens(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n else total += RoughTokenEstimate(JSON.stringify(b));\n }\n return total;\n}\n\n/**\n * Estimate tokens for an array of messages (text + tool I/O), using the shared\n * 3.5 chars/token basis. This is the single canonical message-array estimator —\n * compactors, the context_manager tool, and the `/context` display all route\n * through it so the number a user sees matches the number compaction decides on.\n *\n * When a message carries a pre-computed `_estTokens` field (set by\n * ConversationState on append/replace), it is used directly instead of\n * re-walking the content blocks — turning the O(n·m) scan into an O(n)\n * sum for fully-cached arrays.\n */\nexport function estimateMessageTokens(messages: readonly Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m._estTokens === 'number' && m._estTokens > 0) {\n total += m._estTokens;\n continue;\n }\n total += computeMessageTokens(m);\n }\n return total;\n}\n\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: {\n name: string;\n description?: string | undefined;\n inputSchema: unknown;\n}): number {\n // Fast path: pre-computed by ToolRegistry at registration time.\n const cached = (tool as { _estDefTokens?: number | undefined })._estDefTokens;\n if (typeof cached === 'number' && cached > 0) return cached;\n\n const compact = compactToolDefinitionForWire(tool);\n return (\n RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(compact.description) +\n RoughTokenEstimate(JSON.stringify(compact.inputSchema))\n );\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n // Fast path: pre-computed per-message token estimate (set by\n // ConversationState on append/replace). Skips the O(m) content-block\n // walk entirely for cached messages.\n const cached = (m as { _estTokens?: number | undefined })._estTokens;\n if (typeof cached === 'number' && cached > 0) {\n messagesTokens += cached;\n continue;\n }\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string | undefined }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (\n typeof b === 'object' &&\n b !== null &&\n (b as { type?: string | undefined }).type === 'text'\n ) {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n const total = messagesTokens + systemTokens + toolsTokens;\n\n // Record the raw estimate for calibration: the next recordActualUsage()\n // call will pair this against the actual API usage so the rolling ratio\n // stays in sync with the real chars/token ratio of the content.\n calState(calibrationKey).prevEst = total;\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total,\n };\n}\n\n/**\n * Record the actual API input token count after a provider call so\n * `estimateRequestTokensCalibrated` can self-correct on subsequent calls.\n *\n * Prefer passing `estimatedInputTokens` explicitly (the calibrated pre-flight\n * estimate from the middleware) — this avoids race conditions when other code\n * also calls `estimateRequestTokens` between the pre-flight and this call\n * (e.g. audit logging in agent.ts).\n *\n * When `estimatedInputTokens` is omitted, falls back to the keyed bucket's\n * `prevEst` for backward compatibility with callers that don't have the\n * pre-flight value. `calibrationKey` selects the per-(provider,model) bucket\n * (defaults to the shared global bucket).\n */\nexport function recordActualUsage(\n actualInputTokens: number,\n estimatedInputTokens?: number,\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): void {\n if (actualInputTokens <= 0) return;\n const cal = calState(calibrationKey);\n const est = estimatedInputTokens ?? cal.prevEst;\n if (est <= 0) return;\n\n const sampleRatio = actualInputTokens / est;\n if (cal.count === 0) {\n cal.ratio = sampleRatio;\n } else {\n // EWM: new = α * sample + (1-α) * old → α=0.3 = fast initial converge\n cal.ratio = CAL_ALPHA * sampleRatio + (1 - CAL_ALPHA) * cal.ratio;\n }\n // Sanity bound: keep the rolling ratio within [0.5, 1.5] so a sequence\n // of bad samples can't blow up the calibration for everyone.\n cal.ratio = Math.min(1.5, Math.max(0.5, cal.ratio));\n cal.count++;\n}\n\n/**\n * Returns the current calibration state for a bucket. Exposed for debugging\n * and tests — not needed by normal callers.\n */\nexport function getCalibrationState(calibrationKey: string = CALIBRATION_GLOBAL_KEY): {\n ratio: number;\n count: number;\n calibrated: boolean;\n} {\n const cal = calState(calibrationKey);\n return {\n ratio: cal.ratio,\n count: cal.count,\n calibrated: cal.count >= MIN_SAMPLES_FOR_CALIBRATION,\n };\n}\n\n/**\n * Like `estimateRequestTokens` but applies the rolling calibration factor\n * so context pressure readings converge on reality within a few iterations.\n *\n * Before any `recordActualUsage` samples are collected, returns the same\n * result as `estimateRequestTokens` (ratio = 1.0, no distortion).\n * After `MIN_SAMPLES_FOR_CALIBRATION` samples, applies the calibrated\n * multiplier capped to the range [0.5, 1.5] as a sanity bound.\n */\nexport function estimateRequestTokensCalibrated(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string | undefined; inputSchema: unknown }[],\n calibrationKey: string = CALIBRATION_GLOBAL_KEY,\n): RequestTokenBreakdown {\n const result = estimateRequestTokens(messages, systemPrompt, tools, calibrationKey);\n const cal = calState(calibrationKey);\n\n if (cal.count >= MIN_SAMPLES_FOR_CALIBRATION) {\n const safeRatio = Math.min(1.5, Math.max(0.5, cal.ratio));\n return {\n messages: Math.round(result.messages * safeRatio),\n systemPrompt: Math.round(result.systemPrompt * safeRatio),\n tools: Math.round(result.tools * safeRatio),\n total: Math.round(result.total * safeRatio),\n };\n }\n\n // No calibration samples yet — fall back to model-family ratio if available,\n // otherwise use the uncalibrated estimate (ratio = 1.0).\n const fallbackRatio = getModelFamilyRatio(calibrationKey);\n if (fallbackRatio !== null) {\n return {\n messages: Math.round(result.messages * fallbackRatio),\n systemPrompt: Math.round(result.systemPrompt * fallbackRatio),\n tools: Math.round(result.tools * fallbackRatio),\n total: Math.round(result.total * fallbackRatio),\n };\n }\n\n return result;\n}\n\n/** Look up the fallback chars/token ratio for a calibration key (e.g. \"provider/model\"). */\nfunction getModelFamilyRatio(calibrationKey: string): number | null {\n const lower = calibrationKey.toLowerCase();\n for (const [family, ratio] of Object.entries(MODEL_FAMILY_RATIO)) {\n if (lower.includes(family)) return ratio / 3.5; // MODEL_FAMILY_RATIO is chars/token, we need multiplier\n }\n return null;\n}\n\n/**\n * Resets calibration state. Primarily for tests that run in the same\n * process and need a clean slate between suites. With no argument it clears\n * every bucket (including the global one); pass a key to reset just that bucket.\n */\nexport function resetCalibration(calibrationKey?: string): void {\n if (calibrationKey === undefined) {\n _cals.clear();\n return;\n }\n _cals.delete(calibrationKey);\n}\n","/**\n * Tool output serialization utilities.\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\n */\n\nexport interface ToolOutputSerializerOptions {\n perIterationOutputCapBytes?: number | undefined;\n estimator?: ((text: string) => number) | undefined;\n}\n\nexport interface ToolOutputSerializeContext {\n toolName?: string | undefined;\n input?: unknown;\n}\n\ntype RecordValue = Record<string, unknown>;\n\nconst DEFAULT_LIST_LIMIT = 500;\nconst LOG_ENTRY_LIMIT = 200;\nconst INLINE_LIMIT = 240;\nconst GREP_FILE_LIMIT = 80;\nconst GREP_MATCHES_PER_FILE = 3;\nconst DIFF_INLINE_LINE_LIMIT = 260;\nconst DIFF_HUNK_LIMIT = 8;\nconst DIFF_HUNK_CONTEXT = 14;\n\n// Pre-compiled regex — used in parseGrepContentLine() for every grep match line.\n// Compiling once at module load avoids repeated RegExp construction overhead.\nconst GREP_LINE_RE = /^(.+?):(\\d+):(.*)$/;\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown, context: ToolOutputSerializeContext = {}): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') {\n if (Array.isArray(value)) return value.map((item) => serialize(item)).join('\\n');\n if (context.toolName) {\n const compact = renderToolObject(context.toolName, value as RecordValue, context.input);\n if (compact !== undefined) return compact;\n return renderGenericToolObject(context.toolName, value as RecordValue);\n }\n if ('text' in (value as Record<string, unknown>)) {\n const t = (value as Record<string, unknown>).text;\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\n if (remainingBudget <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const textBytes = Buffer.byteLength(text, 'utf8');\n if (textBytes <= remainingBudget) {\n return { text, newBudget: remainingBudget - textBytes };\n }\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\n const markerBytes = Buffer.byteLength(marker, 'utf8');\n const available = remainingBudget - markerBytes;\n if (available <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const half = Math.floor(available / 2);\n const first = text.slice(0, half);\n const second = text.slice(text.length - half);\n return { text: `${first}${marker}${second}`, newBudget: 0 };\n }\n\n return { serialize, enforceCap, capBytes };\n}\n\nfunction renderToolObject(toolName: string, obj: RecordValue, input: unknown): string | undefined {\n if (toolName === 'read' && typeof obj['text'] === 'string') {\n return joinSections([\n renderHeader(\n `read: ${stringFromInput(input, 'path') ?? stringField(obj, 'path') ?? '<unknown>'}`,\n {\n offset: numberFromInput(input, 'offset'),\n limit: numberFromInput(input, 'limit'),\n total_lines: obj['total_lines'],\n encoding: obj['encoding'],\n truncated: obj['truncated'],\n cached: obj['cached'],\n note: obj['note'],\n },\n ),\n obj['text'],\n ]);\n }\n\n if (toolName === 'grep' && Array.isArray(obj['matches'])) {\n const matches = stringArrayField(obj, 'matches');\n return joinSections([\n renderHeader(`grep: ${stringFromInput(input, 'pattern') ?? '<pattern>'}`, {\n path: stringFromInput(input, 'path'),\n glob: stringFromInput(input, 'glob'),\n mode: stringFromInput(input, 'output_mode'),\n count: obj['count'],\n shown: matches.length,\n truncated: obj['truncated'],\n used: obj['used'],\n }),\n renderGrepMatches(matches, stringFromInput(input, 'output_mode')),\n ]);\n }\n\n if (toolName === 'patch' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader('patch', {\n applied: obj['applied'],\n rejected: obj['rejected'],\n files: files.length,\n dry_run: obj['dry_run'],\n }),\n typeof obj['message'] === 'string' ? `message:\\n${obj['message']}` : undefined,\n files.length > 0 ? `files:\\n${renderStringList(files)}` : undefined,\n ]);\n }\n\n if (toolName === 'glob' && Array.isArray(obj['files'])) {\n const files = stringArrayField(obj, 'files');\n return joinSections([\n renderHeader(\n `${toolName}: ${stringFromInput(input, 'pattern') ?? stringFromInput(input, 'files') ?? stringFromInput(input, 'path') ?? ''}`.trim(),\n {\n path: stringFromInput(input, 'path'),\n files: files.length,\n truncated: obj['truncated'],\n },\n ),\n renderStringList(files, '(no files)'),\n ]);\n }\n\n if (toolName === 'tree' && typeof obj['tree'] === 'string') {\n return joinSections([\n renderHeader(\n `tree: ${stringField(obj, 'path') ?? stringFromInput(input, 'path') ?? '<cwd>'}`,\n {\n total_files: obj['total_files'],\n total_dirs: obj['total_dirs'],\n truncated: obj['truncated'],\n },\n ),\n obj['tree'],\n ]);\n }\n\n if (toolName === 'fetch' && typeof obj['content'] === 'string') {\n return joinSections([\n renderHeader(\n `fetch: ${stringField(obj, 'url') ?? stringFromInput(input, 'url') ?? '<url>'}`,\n {\n status: obj['status'],\n content_type: obj['content_type'],\n },\n ),\n obj['content'],\n ]);\n }\n\n if (toolName === 'replace' && Array.isArray(obj['results'])) {\n const results = obj['results'].filter(isRecord);\n const sections: Array<string | undefined> = [\n renderHeader('replace', {\n files_modified: obj['files_modified'],\n total_replacements: obj['total_replacements'],\n dry_run: obj['dry_run'],\n }),\n ];\n for (const r of results.slice(0, DEFAULT_LIST_LIMIT)) {\n sections.push(\n joinSections([\n renderHeader(`file: ${stringField(r, 'path') ?? '<unknown>'}`, {\n replacements: r['replacements'],\n }),\n typeof r['diff'] === 'string' ? r['diff'] : undefined,\n ]),\n );\n }\n if (results.length > DEFAULT_LIST_LIMIT) {\n sections.push(`[serializer omitted ${results.length - DEFAULT_LIST_LIMIT} result item(s)]`);\n }\n return joinSections(sections);\n }\n\n if (typeof obj['diff'] === 'string') {\n const diff = obj['diff'];\n return joinSections([\n renderHeader(toolName, {\n path: obj['path'],\n replacements: obj['replacements'],\n bytes_written: obj['bytes_written'],\n created: obj['created'],\n note: obj['note'],\n files: Array.isArray(obj['files']) ? obj['files'].length : undefined,\n truncated: obj['truncated'],\n mode: obj['mode'],\n }),\n compactDiff(diff),\n ]);\n }\n\n if (toolName === 'test' && typeof obj['output'] === 'string') {\n return renderTestOutput(obj, input);\n }\n\n if (\n (toolName === 'typecheck' || toolName === 'lint' || toolName === 'format') &&\n typeof obj['output'] === 'string'\n ) {\n return renderVerifierOutput(toolName, obj, input);\n }\n\n if (hasCommandOutputShape(obj)) {\n return renderCommandOutput(toolName, obj, input);\n }\n\n if (toolName === 'json' && typeof obj['formatted'] === 'string') {\n return joinSections([\n renderHeader('json', {\n type: obj['type'],\n keys: Array.isArray(obj['keys']) ? obj['keys'].length : undefined,\n query: stringFromInput(input, 'query'),\n error: obj['error'],\n }),\n obj['formatted'],\n ]);\n }\n\n if (toolName === 'logs' && Array.isArray(obj['entries'])) {\n const entries = obj['entries'].filter(isRecord);\n const lines = entries.slice(0, LOG_ENTRY_LIMIT).map((entry) => {\n const ts = stringField(entry, 'timestamp') ?? '';\n const level = stringField(entry, 'level') ?? 'info';\n const message = stringField(entry, 'message') ?? '';\n const source = stringField(entry, 'source');\n return [ts, level, source, message].filter(Boolean).join(' ');\n });\n if (entries.length > LOG_ENTRY_LIMIT) {\n lines.push(`[serializer omitted ${entries.length - LOG_ENTRY_LIMIT} log entry item(s)]`);\n }\n return joinSections([\n renderHeader(`logs: ${stringField(obj, 'source') ?? '<source>'}`, {\n total: obj['total'],\n shown: Math.min(entries.length, LOG_ENTRY_LIMIT),\n truncated: obj['truncated'],\n stream_mode: obj['stream_mode'],\n }),\n lines.length > 0 ? lines.join('\\n') : '(no log entries)',\n ]);\n }\n\n if (toolName === 'audit' && Array.isArray(obj['vulnerabilities'])) {\n const vulns = obj['vulnerabilities'].filter(isRecord);\n const lines = vulns.slice(0, DEFAULT_LIST_LIMIT).map((v) => {\n const severity = stringField(v, 'severity') ?? 'unknown';\n const pkg = stringField(v, 'package') ?? '<package>';\n const title = stringField(v, 'title') ?? '';\n const url = stringField(v, 'url');\n return [severity, pkg, title, url].filter(Boolean).join(' | ');\n });\n if (vulns.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${vulns.length - DEFAULT_LIST_LIMIT} vulnerability item(s)]`);\n }\n return joinSections([\n renderHeader('audit', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n summary: obj['summary'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n if (toolName === 'outdated' && Array.isArray(obj['packages'])) {\n const packages = obj['packages'].filter(isRecord);\n const lines = packages\n .slice(0, DEFAULT_LIST_LIMIT)\n .map((p) =>\n [\n stringField(p, 'name') ?? '<package>',\n `current=${stringField(p, 'current') ?? 'unknown'}`,\n `wanted=${stringField(p, 'wanted') ?? 'unknown'}`,\n `latest=${stringField(p, 'latest') ?? 'unknown'}`,\n stringField(p, 'type'),\n ]\n .filter(Boolean)\n .join(' | '),\n );\n if (packages.length > DEFAULT_LIST_LIMIT) {\n lines.push(`[serializer omitted ${packages.length - DEFAULT_LIST_LIMIT} package item(s)]`);\n }\n return joinSections([\n renderHeader('outdated', {\n exit_code: obj['exit_code'],\n total: obj['total'],\n truncated: obj['truncated'],\n }),\n lines.length > 0 ? lines.join('\\n') : stringField(obj, 'output'),\n ]);\n }\n\n return undefined;\n}\n\nfunction renderTestOutput(obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const failed = numberField(obj, 'failed') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const header = renderHeader(`test: ${stringField(obj, 'runner') ?? 'runner'}`, {\n exit_code: obj['exit_code'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n grep: stringFromInput(input, 'grep'),\n });\n\n if (exitCode === 0 && failed === 0) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n `status=passed`,\n `tests_run=${obj['tests_run'] ?? 0}`,\n `passed=${obj['passed'] ?? 0}`,\n `failed=${obj['failed'] ?? 0}`,\n `duration_ms=${obj['duration_ms'] ?? 0}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no runner output)')}`,\n ]);\n}\n\nfunction renderVerifierOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const exitCode = numberField(obj, 'exit_code') ?? 0;\n const errors = numberField(obj, 'errors') ?? 0;\n const warnings = numberField(obj, 'warnings') ?? 0;\n const output = stringField(obj, 'output') ?? '';\n const changed = numberField(obj, 'files_changed') ?? 0;\n const header = renderHeader(toolName, {\n exit_code: obj['exit_code'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n fixer: obj['fixer'],\n linter: obj['linter'],\n project: obj['project'],\n truncated: obj['truncated'],\n files: inputListSummary(input, 'files'),\n cwd: stringFromInput(input, 'cwd'),\n });\n\n if (exitCode === 0 && errors === 0 && (toolName !== 'format' || changed === 0)) {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=passed',\n `errors=${errors}`,\n `warnings=${warnings}`,\n toolName === 'format' ? `files_changed=${changed}` : undefined,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n if (exitCode === 0 && toolName === 'format') {\n return joinSections([\n header,\n joinSections([\n 'report:',\n 'status=changed',\n `files_changed=${changed}`,\n extractSpoolNote(output),\n ]),\n ]);\n }\n\n return joinSections([\n header,\n `error_context:\\n${compactFailureOutput(output || '(no verifier output)')}`,\n ]);\n}\n\nfunction renderGrepMatches(matches: string[], mode: string | undefined): string {\n if (matches.length === 0) return '(no matches)';\n if (mode === 'files_with_matches') return renderStringList(matches, '(no files)');\n if (mode === 'count') return renderStringList(matches, '(no counts)');\n\n const groups = new Map<string, string[]>();\n const passthrough: string[] = [];\n for (const match of matches) {\n const parsed = parseGrepContentLine(match);\n if (!parsed) {\n passthrough.push(match);\n continue;\n }\n const list = groups.get(parsed.file) ?? [];\n list.push(`${parsed.line}:${parsed.text}`);\n groups.set(parsed.file, list);\n }\n\n if (groups.size === 0) return renderStringList(matches, '(no matches)');\n\n const sections: string[] = [];\n let fileIndex = 0;\n for (const [file, lines] of groups) {\n fileIndex++;\n if (fileIndex > GREP_FILE_LIMIT) break;\n const shown = lines.slice(0, GREP_MATCHES_PER_FILE);\n sections.push(\n `${file} (${lines.length} match(es), showing ${shown.length})\\n${shown.join('\\n')}`,\n );\n }\n if (groups.size > GREP_FILE_LIMIT) {\n sections.push(`[serializer omitted ${groups.size - GREP_FILE_LIMIT} file group(s)]`);\n }\n if (passthrough.length > 0) {\n sections.push(`ungrouped:\\n${renderStringList(passthrough, '', 50)}`);\n }\n return sections.join('\\n');\n}\n\nfunction parseGrepContentLine(\n line: string,\n): { file: string; line: string; text: string } | undefined {\n const match = GREP_LINE_RE.exec(line);\n if (!match?.[1] || !match[2]) return undefined;\n return { file: match[1], line: match[2], text: match[3] ?? '' };\n}\n\nfunction compactDiff(diff: string): string {\n const lines = diff.split(/\\r?\\n/);\n if (lines.length <= DIFF_INLINE_LINE_LIMIT) return diff;\n\n const fileCount = Math.max(\n new Set(\n lines\n .map(\n (line) => /^diff --git\\s+a\\/(.+?)\\s+b\\//.exec(line)?.[1] ?? /^---\\s+(.+)/.exec(line)?.[1],\n )\n .filter(Boolean),\n ).size,\n 0,\n );\n const hunks = lines.filter((line) => line.startsWith('@@')).length;\n const added = lines.filter((line) => line.startsWith('+') && !line.startsWith('+++')).length;\n const removed = lines.filter((line) => line.startsWith('-') && !line.startsWith('---')).length;\n\n // Collect [start, end] intervals as we scan lines sequentially.\n // Intervals are naturally ordered by line index — no sort needed.\n const intervals: Array<[number, number]> = [];\n let hunkCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (line.startsWith('diff --git') || line.startsWith('--- ') || line.startsWith('+++ ')) {\n intervals.push([i, i]);\n continue;\n }\n if (!line.startsWith('@@')) continue;\n if (hunkCount >= DIFF_HUNK_LIMIT) continue;\n hunkCount++;\n intervals.push([i, Math.min(lines.length - 1, i + DIFF_HUNK_CONTEXT)]);\n }\n\n if (intervals.length === 0) {\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n added,\n removed,\n lines: lines.length,\n }),\n lines.slice(0, DIFF_INLINE_LINE_LIMIT).join('\\n'),\n `[serializer omitted ${Math.max(0, lines.length - DIFF_INLINE_LINE_LIMIT)} diff line(s)]`,\n ]);\n }\n\n // Merge overlapping / adjacent intervals in a single O(n) pass.\n // Intervals are already in ascending order from the sequential scan.\n const merged: Array<[number, number]> = [intervals[0]!];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1]!;\n const current = intervals[i]!;\n if (current[0] <= last[1] + 1) {\n last[1] = Math.max(last[1], current[1]);\n } else {\n merged.push(current);\n }\n }\n\n // Build excerpt from merged intervals — O(n), no sort.\n const excerpt: string[] = [];\n let prevLine = -1;\n for (const [start, end] of merged) {\n if (start > prevLine + 1) {\n const omitted = prevLine === -1 ? start : start - prevLine - 1;\n excerpt.push(`[serializer omitted ${omitted} diff line(s)]`);\n }\n for (let j = start; j <= end; j++) {\n excerpt.push(lines[j] ?? '');\n }\n prevLine = end;\n }\n\n const trailing = lines.length - prevLine - 1;\n if (trailing > 0) excerpt.push(`[serializer omitted ${trailing} trailing diff line(s)]`);\n\n return joinSections([\n renderHeader('diff_summary', {\n files: fileCount,\n hunks,\n shown_hunks: Math.min(hunks, DIFF_HUNK_LIMIT),\n added,\n removed,\n lines: lines.length,\n }),\n excerpt.join('\\n'),\n ]);\n}\n\nfunction compactFailureOutput(output: string): string {\n const lines = output.split(/\\r?\\n/);\n if (lines.length <= 260) return output.trimEnd();\n\n const selected = new Set<number>();\n const marker =\n /\\b(fail|failed|failure|error|exception|assertionerror|expected|received|actual|timeout|stack)\\b/i;\n let markerHits = 0;\n for (let i = 0; i < lines.length; i++) {\n if (!marker.test(lines[i] ?? '')) continue;\n markerHits++;\n for (let j = Math.max(0, i - 4); j <= Math.min(lines.length - 1, i + 10); j++) {\n selected.add(j);\n }\n }\n\n if (markerHits === 0) {\n return lines.slice(-220).join('\\n').trimEnd();\n }\n\n const ordered = [...selected].sort((a, b) => a - b);\n const out: string[] = [];\n let previous = -1;\n for (const index of ordered) {\n if (index > previous + 1) {\n const omitted = previous === -1 ? index : index - previous - 1;\n out.push(`[serializer omitted ${omitted} line(s)]`);\n }\n out.push(lines[index] ?? '');\n previous = index;\n }\n return out.join('\\n').trimEnd();\n}\n\nfunction extractSpoolNote(output: string): string | undefined {\n return output\n .split(/\\r?\\n/)\n .find((line) => line.startsWith('[output truncated') && line.includes('full'));\n}\n\nfunction hasCommandOutputShape(obj: RecordValue): boolean {\n return (\n typeof obj['stdout'] === 'string' ||\n typeof obj['stderr'] === 'string' ||\n typeof obj['output'] === 'string' ||\n typeof obj['exitCode'] === 'number' ||\n typeof obj['exit_code'] === 'number'\n );\n}\n\nfunction renderCommandOutput(toolName: string, obj: RecordValue, input: unknown): string {\n const command = stringField(obj, 'command') ?? stringFromInput(input, 'command');\n const args = stringArrayField(obj, 'args');\n const commandLine = command ? [command, ...args].join(' ') : undefined;\n const output = stringField(obj, 'output');\n const stdout = stringField(obj, 'stdout');\n const stderr = stringField(obj, 'stderr');\n return joinSections([\n renderHeader(commandLine ? `${toolName}: ${commandLine}` : toolName, {\n exit_code: obj['exit_code'] ?? obj['exitCode'],\n timed_out: obj['timed_out'],\n pid: obj['pid'],\n allowed: obj['allowed'],\n truncated: obj['truncated'],\n runner: obj['runner'],\n linter: obj['linter'],\n fixer: obj['fixer'],\n project: obj['project'],\n tests_run: obj['tests_run'],\n passed: obj['passed'],\n failed: obj['failed'],\n duration_ms: obj['duration_ms'],\n errors: obj['errors'],\n warnings: obj['warnings'],\n files_checked: obj['files_checked'],\n files_changed: obj['files_changed'],\n fix_applied: obj['fix_applied'],\n }),\n stringField(obj, 'error') ? `error:\\n${stringField(obj, 'error')}` : undefined,\n output ? `output:\\n${output}` : undefined,\n stdout ? `stdout:\\n${stdout}` : undefined,\n stderr ? `stderr:\\n${stderr}` : undefined,\n ]);\n}\n\nfunction renderGenericToolObject(toolName: string, obj: RecordValue): string {\n const scalars: RecordValue = {};\n const blocks: string[] = [];\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined) continue;\n if (isScalar(value)) {\n const inline = String(value);\n if (inline.length <= INLINE_LIMIT && !inline.includes('\\n')) {\n scalars[key] = value;\n } else {\n blocks.push(`${key}:\\n${inline}`);\n }\n continue;\n }\n if (Array.isArray(value)) {\n if (value.every((item) => typeof item === 'string')) {\n blocks.push(`${key}:\\n${renderStringList(value as string[])}`);\n } else {\n blocks.push(`${key}:\\n${renderUnknownList(value)}`);\n }\n continue;\n }\n blocks.push(`${key}: ${clipInline(oneLineJson(value))}`);\n }\n return joinSections([renderHeader(toolName, scalars), ...blocks]);\n}\n\nfunction renderHeader(label: string, fields: RecordValue): string {\n const parts = Object.entries(fields)\n .filter(([, value]) => value !== undefined && value !== null && value !== '')\n .map(([key, value]) => `${key}=${clipInline(formatInlineValue(value))}`);\n return parts.length > 0 ? `${label} (${parts.join(' ')})` : label;\n}\n\nfunction renderStringList(items: string[], empty = '', limit = DEFAULT_LIST_LIMIT): string {\n if (items.length === 0) return empty;\n const shown = items.slice(0, limit);\n const omitted = items.length - shown.length;\n return [\n ...shown,\n ...(omitted > 0\n ? [`[serializer omitted ${omitted} item(s); narrow the request for more]`]\n : []),\n ].join('\\n');\n}\n\nfunction renderUnknownList(items: unknown[], limit = DEFAULT_LIST_LIMIT): string {\n const shown = items.slice(0, limit).map((item) => clipInline(oneLineJson(item), 1_000));\n const omitted = items.length - shown.length;\n if (omitted > 0)\n shown.push(`[serializer omitted ${omitted} item(s); narrow the request for more]`);\n return shown.join('\\n');\n}\n\nfunction joinSections(sections: Array<string | undefined>): string {\n return sections\n .map((section) => (typeof section === 'string' ? section.trimEnd() : undefined))\n .filter((section): section is string => !!section)\n .join('\\n');\n}\n\nfunction formatInlineValue(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(formatInlineValue).join(',')}]`;\n if (isScalar(value)) return String(value);\n return oneLineJson(value);\n}\n\nfunction clipInline(value: string, max = INLINE_LIMIT): string {\n const compact = value.replace(/\\s+/g, ' ').trim();\n return compact.length <= max\n ? compact\n : `${compact.slice(0, max - 15)}...(${compact.length} chars)`;\n}\n\nfunction oneLineJson(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\nfunction stringField(obj: RecordValue, key: string): string | undefined {\n const value = obj[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberField(obj: RecordValue, key: string): number | undefined {\n const value = obj[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction stringArrayField(obj: RecordValue, key: string): string[] {\n const value = obj[key];\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : [];\n}\n\nfunction stringFromInput(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction numberFromInput(input: unknown, key: string): number | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n return typeof value === 'number' ? value : undefined;\n}\n\nfunction inputListSummary(input: unknown, key: string): string | undefined {\n if (!isRecord(input)) return undefined;\n const value = input[key];\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) return value.filter((item) => typeof item === 'string').join(',');\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is RecordValue {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction isScalar(value: unknown): value is string | number | boolean | null {\n return value === null || ['string', 'number', 'boolean'].includes(typeof value);\n}\n\n/**\n * Render a tool result body for inclusion in the `tool.executed` event.\n * Tool outputs can be large (file dumps, command output); UIs only want a\n * preview line, so cap at ~400 chars with an ellipsis marker.\n */\nexport function truncateForEvent(content: string, max = 400): string {\n if (!content) return '';\n return content.length <= max ? content : `${content.slice(0, max - 1)}…`;\n}\n\n/**\n * Derive size signals (bytes / tokens / lines) for the chip rendered beside\n * each tool result. Computed once over the FULL `content` BEFORE the\n * 400-char event preview is taken.\n *\n * - bytes: UTF-8 byte length (multi-byte aware).\n * - tokens: standard ~3.5 chars/token heuristic.\n * - lines: read prefixes lines with `<n>→`; for shell/grep/logs we fall\n * back to a newline count. Undefined for tools without a line notion.\n */\nconst READ_LINE_PREFIX_RE = /^\\s*\\d+→/gm;\n\nexport function sizeSignals(\n toolName: string | undefined,\n content: string,\n): { outputBytes: number; outputTokens: number; outputLines: number | undefined } {\n if (!content || content.length === 0) {\n return { outputBytes: 0, outputTokens: 0, outputLines: undefined };\n }\n const outputBytes = Buffer.byteLength(content, 'utf8');\n const outputTokens = Math.max(1, Math.round(outputBytes / 3.5));\n let outputLines: number | undefined;\n if (toolName === 'read') {\n READ_LINE_PREFIX_RE.lastIndex = 0;\n let count = 0;\n while (READ_LINE_PREFIX_RE.exec(content) !== null) count++;\n if (count > 0) outputLines = count;\n } else if (\n toolName === 'bash' ||\n toolName === 'shell' ||\n toolName === 'grep' ||\n toolName === 'logs'\n ) {\n let nl = 0;\n for (let i = 0; i < content.length; i++) if (content.charCodeAt(i) === 10) nl++;\n outputLines = nl + (content.endsWith('\\n') ? 0 : 1);\n }\n return { outputBytes, outputTokens, outputLines };\n}\n","import type { ToolDescriptionMode, ToolDescriptionModeConfig } from '../types/config.js';\nimport type { Tool } from '../types/tool.js';\n\nexport const DEFAULT_TOOL_DESCRIPTION_MODE: ToolDescriptionMode = 'extend';\n\nconst ORIGINAL_TOOL_DESCRIPTION = Symbol.for('wrongstack.tool.originalDescription');\n\ninterface OriginalToolDescription {\n description: string;\n usageHint?: string | undefined;\n}\n\ntype ToolWithOriginalDescription = Tool & {\n [ORIGINAL_TOOL_DESCRIPTION]?: OriginalToolDescription | undefined;\n};\n\nexport interface ToolDescriptionRegistryLike {\n get(name: string): Tool | undefined;\n list(): Tool[];\n wrap?(name: string, wrapper: (tool: Tool) => Tool, owner?: string): void;\n setDescriptionMode?(name: string, mode: ToolDescriptionMode): boolean;\n applyDescriptionModes?(\n modes?: ToolDescriptionModeConfig,\n ): { applied: number; missing: string[] };\n getDescriptionMode?(name: string): ToolDescriptionMode;\n}\n\nexport function normalizeToolDescriptionMode(value: unknown): ToolDescriptionMode | undefined {\n if (typeof value !== 'string') return undefined;\n const raw = value.trim().toLowerCase();\n if (raw === 'extend' || raw === 'extended' || raw === 'full') return 'extend';\n if (raw === 'simple' || raw === 'short' || raw === 'brief') return 'simple';\n return undefined;\n}\n\nexport function resolveToolDescriptionMode(\n modes: ToolDescriptionModeConfig | undefined,\n toolName: string,\n): ToolDescriptionMode {\n return normalizeToolDescriptionMode(modes?.[toolName]) ?? DEFAULT_TOOL_DESCRIPTION_MODE;\n}\n\nexport function simplifyToolDescription(\n text: string,\n opts: { maxSentences?: number | undefined; maxChars?: number | undefined } = {},\n): string {\n const maxSentences = Math.max(1, opts.maxSentences ?? 2);\n const maxChars = Math.max(40, opts.maxChars ?? 180);\n const normalized = text\n .replace(/\\r\\n?/g, '\\n')\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n if (normalized.length <= maxChars) return normalized;\n\n const sentences = normalized.match(/[^.!?]+[.!?]+(?=\\s|$)|[^.!?]+$/g) ?? [normalized];\n const selected: string[] = [];\n for (const sentence of sentences) {\n selected.push(sentence.trim());\n const candidate = selected.join(' ');\n if (selected.length >= maxSentences || candidate.length >= maxChars) break;\n }\n\n const summary = selected.join(' ').trim() || normalized;\n if (summary.length <= maxChars) return summary;\n\n const hardLimit = maxChars - 4;\n const boundary = findWordBoundary(summary, hardLimit);\n return `${summary.slice(0, boundary > 0 ? boundary : hardLimit).trimEnd()} ...`;\n}\n\nexport function applyToolDescriptionModeToTool(\n tool: Tool,\n mode: ToolDescriptionMode,\n): Tool {\n const existingOriginal = getOriginalDescription(tool);\n if (mode === 'extend' && !existingOriginal) return tool;\n\n const original = existingOriginal ?? {\n description: tool.description,\n usageHint: tool.usageHint,\n };\n\n const next =\n mode === 'simple'\n ? withDescription(tool, {\n description: simplifyToolDescription(original.description),\n usageHint:\n original.usageHint === undefined\n ? undefined\n : simplifyToolDescription(original.usageHint),\n })\n : withDescription(tool, original);\n\n return attachOriginalDescription(next, original);\n}\n\nexport function setToolDescriptionMode(\n registry: ToolDescriptionRegistryLike,\n name: string,\n mode: ToolDescriptionMode,\n): boolean {\n if (typeof registry.setDescriptionMode === 'function') {\n return registry.setDescriptionMode(name, mode);\n }\n if (!registry.get(name) || typeof registry.wrap !== 'function') return false;\n registry.wrap(\n name,\n (tool) => applyToolDescriptionModeToTool(tool, mode),\n 'tool-description-mode',\n );\n return true;\n}\n\nexport function getToolDescriptionMode(\n registry: ToolDescriptionRegistryLike,\n name: string,\n): ToolDescriptionMode {\n return registry.getDescriptionMode?.(name) ?? DEFAULT_TOOL_DESCRIPTION_MODE;\n}\n\nexport function applyToolDescriptionModes(\n registry: ToolDescriptionRegistryLike,\n modes?: ToolDescriptionModeConfig,\n): { applied: number; missing: string[] } {\n if (typeof registry.applyDescriptionModes === 'function') {\n return registry.applyDescriptionModes(modes);\n }\n\n const entries = Object.entries(modes ?? {});\n const missing: string[] = [];\n let applied = 0;\n for (const [name, rawMode] of entries) {\n const mode = normalizeToolDescriptionMode(rawMode);\n if (!mode) continue;\n if (setToolDescriptionMode(registry, name, mode)) applied++;\n else missing.push(name);\n }\n return { applied, missing };\n}\n\nfunction getOriginalDescription(tool: Tool): OriginalToolDescription | undefined {\n return (tool as ToolWithOriginalDescription)[ORIGINAL_TOOL_DESCRIPTION];\n}\n\nfunction attachOriginalDescription(tool: Tool, original: OriginalToolDescription): Tool {\n Object.defineProperty(tool, ORIGINAL_TOOL_DESCRIPTION, {\n configurable: true,\n enumerable: false,\n value: original,\n writable: true,\n });\n return tool;\n}\n\nfunction withDescription(tool: Tool, next: OriginalToolDescription): Tool {\n const copy: Tool = {\n ...tool,\n description: next.description,\n usageHint: next.usageHint,\n };\n if (next.usageHint === undefined) {\n delete (copy as { usageHint?: string | undefined }).usageHint;\n }\n return copy;\n}\n\nfunction findWordBoundary(text: string, limit: number): number {\n const semantic = Math.max(\n text.lastIndexOf('. ', limit),\n text.lastIndexOf('; ', limit),\n text.lastIndexOf(', ', limit),\n );\n if (semantic > 40) return semantic + 1;\n const space = text.lastIndexOf(' ', limit);\n return space > 40 ? space : limit;\n}\n","import { createHash } from 'node:crypto';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\n/**\n * Path layout. All developer-level state lives in ~/.wrongstack/.\n * Per-project state is keyed by sha256(absoluteProjectRoot).slice(0,12)\n * under ~/.wrongstack/projects/<hash>/.\n *\n * The ONLY thing inside the project tree is the optional\n * .wrongstack/AGENTS.md (committed) and .wrongstack/skills/ (committed).\n */\n\nexport interface WstackPaths {\n /** ~/.wrongstack — global root. */\n globalRoot: string;\n /**\n * ~/.wrongstack — directory for user-global stateful config files\n * (mode.json, theme.json, …). Currently an alias for `globalRoot`;\n * separate name lets us split out per-OS XDG_CONFIG_HOME later\n * without rewriting callers.\n */\n configDir: string;\n /** ~/.wrongstack/config.json */\n globalConfig: string;\n /** ~/.wrongstack/.key — 32 random bytes, mode 0600, AES-GCM key for the secret vault. */\n secretsKey: string;\n /** ~/.wrongstack/memory.md — user-global memory. */\n globalMemory: string;\n /** ~/.wrongstack/skills — user-global skills. */\n globalSkills: string;\n /** ~/.wrongstack/prompts — user-global prompt library. */\n globalPrompts: string;\n /** ~/.wrongstack/cache — fetched data (models.dev, etc.). */\n cacheDir: string;\n /** ~/.wrongstack/cache/models.dev.json */\n modelsCache: string;\n /** ~/.wrongstack/cache/models-overlay.json — cached curated overlay. */\n modelsOverlayCache: string;\n /**\n * Per-project codebase symbol index (SQLite). Lives under the global project\n * dir — NOT inside the repo — so it never clutters the working tree or needs\n * gitignoring. `~/.wrongstack/projects/<hash>/codebase-index`.\n */\n projectCodebaseIndex: string;\n /** ~/.wrongstack/history — REPL line history. */\n historyFile: string;\n /** ~/.wrongstack/logs/wrongstack.log */\n logFile: string;\n /** ~/.wrongstack/projects/<hash> */\n projectDir: string;\n /** ~/.wrongstack/projects/<hash>/memory.md */\n projectMemory: string;\n /** ~/.wrongstack/projects/<hash>/sessions */\n projectSessions: string;\n /** ~/.wrongstack/projects/<hash>/trust.json */\n projectTrust: string;\n /** ~/.wrongstack/projects/<hash>/meta.json */\n projectMeta: string;\n /** ~/.wrongstack/projects/<hash>/config.local.json — optional override */\n projectLocalConfig: string;\n /** <project>/.wrongstack/config.json — per-project settings (safe fields only).\n * This lives inside the project root so it can be gitignored or shared. */\n inProjectConfig: string;\n /** <project>/.wrongstack/AGENTS.md — committed project memory. */\n inProjectAgentsFile: string;\n /** <project>/.wrongstack/skills — committed project skills. */\n inProjectSkills: string;\n /** <project>/.wrongstack/worktrees — git worktrees for per-phase isolation (gitignored). */\n inProjectWorktrees: string;\n /** Stable hash for the project root. */\n projectHash: string;\n /** Human-readable project slug: `wrongstack-a1b2c3` instead of `3024e5e6fa58`. */\n projectSlug: string;\n /** ~/.wrongstack/projects/<hash>/goal.json — goal persistence */\n projectGoal: string;\n /** ~/.wrongstack/projects/<hash>/specs — SDD spec files */\n projectSpecs: string;\n /** ~/.wrongstack/projects/<hash>/task-graphs — SDD task graphs */\n projectTaskGraphs: string;\n /** ~/.wrongstack/projects/<hash>/sdd-session.json — SDD session state */\n projectSddSession: string;\n /** ~/.wrongstack/projects/<hash>/plan.json — plan persistence */\n projectPlan: string;\n /** ~/.wrongstack/projects/<hash>/autophase — AutoPhase phase-graph JSON files */\n projectAutophase: string;\n /** ~/.wrongstack/projects/<hash>/sdd-boards — live SDD board snapshots + JSONL event logs */\n projectSddBoards: string;\n /** ~/.wrongstack/sync.json — CloudSync configuration */\n syncConfig: string;\n /** Function to get the status.json path for a project given its hash. */\n projectStatus: (projectHash: string) => string;\n}\n\nexport function projectHash(absRoot: string): string {\n return createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 12);\n}\n\n/**\n * Human-readable project directory name: slugified folder name + short hash\n * suffix for uniqueness. e.g. `wrongstack-a1b2c3` instead of `3024e5e6fa58`.\n */\nexport function projectSlug(absRoot: string): string {\n const base = slugify(path.basename(absRoot));\n const hash = createHash('sha256').update(path.resolve(absRoot)).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\n/** Turn a folder name into a filesystem-safe lowercase slug. */\nfunction slugify(name: string): string {\n return (\n name\n .toLowerCase()\n // Collapse any run of non-alphanumeric chars into a single hyphen.\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40) || 'project'\n );\n}\n\nexport interface WstackPathOptions {\n userHome?: string | undefined;\n projectRoot: string;\n /** Override the global root (e.g. for tests). Default: `${userHome}/.wrongstack`. */\n globalRoot?: string | undefined;\n}\n\n/**\n * The global `~/.wrongstack` root, honoring the `WRONGSTACK_HOME` env\n * override. The override exists so tests (and sandboxed runs) can redirect\n * ALL global state — config, secrets, logs, projects/, mailboxes — away from\n * the real user home. Before it existed, `pnpm test` booted runtimes against\n * the real `~/.wrongstack`: it read the user's real config.json (starting a\n * second live Telegram poller), appended to the real wrongstack.log, and left\n * ~20k orphaned fixture dirs under projects/.\n *\n * Every code path that wants the global dir must come through here (or\n * through `resolveWstackPaths`) instead of `path.join(os.homedir(), '.wrongstack')`.\n */\nexport function wstackGlobalRoot(): string {\n const fromEnv = process.env['WRONGSTACK_HOME'];\n if (fromEnv && fromEnv.trim().length > 0) return path.resolve(fromEnv);\n return path.join(os.homedir(), '.wrongstack');\n}\n\nexport function resolveWstackPaths(opts: WstackPathOptions): WstackPaths {\n // Precedence: explicit globalRoot > explicit userHome (callers/tests that\n // pass one expect paths under it) > WRONGSTACK_HOME env > real home dir.\n const globalRoot =\n opts.globalRoot ?? (opts.userHome ? path.join(opts.userHome, '.wrongstack') : wstackGlobalRoot());\n const hash = projectHash(opts.projectRoot);\n const slug = projectSlug(opts.projectRoot);\n const projectDir = path.join(globalRoot, 'projects', slug);\n return {\n globalRoot,\n configDir: globalRoot,\n globalConfig: path.join(globalRoot, 'config.json'),\n secretsKey: path.join(globalRoot, '.key'),\n globalMemory: path.join(globalRoot, 'memory.md'),\n globalSkills: path.join(globalRoot, 'skills'),\n globalPrompts: path.join(globalRoot, 'prompts'),\n cacheDir: path.join(globalRoot, 'cache'),\n modelsCache: path.join(globalRoot, 'cache', 'models.dev.json'),\n modelsOverlayCache: path.join(globalRoot, 'cache', 'models-overlay.json'),\n historyFile: path.join(globalRoot, 'history'),\n logFile: path.join(globalRoot, 'logs', 'wrongstack.log'),\n projectDir,\n projectCodebaseIndex: path.join(projectDir, 'codebase-index'),\n projectMemory: path.join(projectDir, 'memory.md'),\n projectSessions: path.join(projectDir, 'sessions'),\n projectTrust: path.join(projectDir, 'trust.json'),\n projectMeta: path.join(projectDir, 'meta.json'),\n projectLocalConfig: path.join(projectDir, 'config.local.json'),\n inProjectConfig: path.join(opts.projectRoot, '.wrongstack', 'config.json'),\n inProjectAgentsFile: path.join(opts.projectRoot, '.wrongstack', 'AGENTS.md'),\n inProjectSkills: path.join(opts.projectRoot, '.wrongstack', 'skills'),\n inProjectWorktrees: path.join(opts.projectRoot, '.wrongstack', 'worktrees'),\n projectHash: hash,\n projectSlug: slug,\n projectGoal: path.join(projectDir, 'goal.json'),\n projectSpecs: path.join(projectDir, 'specs'),\n projectTaskGraphs: path.join(projectDir, 'task-graphs'),\n projectSddSession: path.join(projectDir, 'sdd-session.json'),\n projectPlan: path.join(projectDir, 'plan.json'),\n projectAutophase: path.join(projectDir, 'autophase'),\n projectSddBoards: path.join(projectDir, 'sdd-boards'),\n syncConfig: path.join(globalRoot, 'sync.json'),\n projectStatus: (projectHash: string) => path.join(globalRoot, 'projects', projectHash, 'status.json'),\n };\n}\n"]}