pi-blackhole 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -0
- package/dist/index.js +11660 -0
- package/dist/index.js.map +1 -0
- package/example-config.json +1 -1
- package/index.ts +37 -63
- package/package.json +21 -9
- package/src/commands/cleanup.ts +279 -240
- package/src/commands/memory.ts +236 -184
- package/src/commands/pi-vcc.ts +202 -152
- package/src/commands/vcc-recall.ts +126 -95
- package/src/core/brief.ts +167 -33
- package/src/core/build-sections.ts +8 -2
- package/src/core/config-env.ts +117 -0
- package/src/core/content.ts +31 -7
- package/src/core/drill-down.ts +41 -11
- package/src/core/filter-noise.ts +9 -3
- package/src/core/format-recall.ts +15 -6
- package/src/core/format.ts +14 -4
- package/src/core/lineage.ts +9 -3
- package/src/core/load-messages.ts +24 -5
- package/src/core/normalize.ts +38 -14
- package/src/core/recall-scope.ts +11 -3
- package/src/core/render-entries.ts +22 -6
- package/src/core/sanitize.ts +5 -1
- package/src/core/search-entries.ts +111 -19
- package/src/core/settings.ts +1 -3
- package/src/core/summarize.ts +42 -21
- package/src/core/unified-config.ts +549 -411
- package/src/extract/commits.ts +4 -2
- package/src/extract/files.ts +10 -5
- package/src/extract/goals.ts +7 -2
- package/src/hooks/before-compact.ts +210 -88
- package/src/om/agents/dropper/agent.ts +380 -265
- package/src/om/agents/dropper/coverage.ts +102 -82
- package/src/om/agents/observer/agent.ts +242 -206
- package/src/om/agents/reflector/agent.ts +212 -153
- package/src/om/cleanup.ts +239 -218
- package/src/om/clipboard.ts +59 -51
- package/src/om/compaction-trigger.ts +448 -333
- package/src/om/config.ts +13 -6
- package/src/om/configure-overlay.ts +518 -355
- package/src/om/consolidation.ts +1460 -953
- package/src/om/cooldown.ts +75 -65
- package/src/om/debug-log.ts +86 -68
- package/src/om/ids.ts +1 -1
- package/src/om/ledger/fold.ts +89 -78
- package/src/om/ledger/progress.ts +181 -153
- package/src/om/ledger/projection.ts +248 -185
- package/src/om/ledger/recall.ts +247 -196
- package/src/om/ledger/render-summary.ts +79 -50
- package/src/om/ledger/types.ts +146 -117
- package/src/om/model-budget.ts +23 -13
- package/src/om/pending.ts +243 -179
- package/src/om/provider-stream.ts +52 -7
- package/src/om/retryable-error.ts +12 -16
- package/src/om/reverse-recall.ts +97 -91
- package/src/om/runtime.ts +474 -375
- package/src/om/serialize.ts +190 -166
- package/src/om/status-overlay.ts +246 -195
- package/src/om/tokens.ts +28 -21
- package/src/pi-base/blackhole-settings.ts +437 -0
- package/src/pi-base/config-manager.ts +440 -0
- package/src/pi-base/config.ts +469 -0
- package/src/pi-base/env.ts +43 -0
- package/src/pi-base/paths.ts +47 -0
- package/src/pi-base/settings/body.ts +1648 -0
- package/src/pi-base/settings/fields/action.ts +43 -0
- package/src/pi-base/settings/fields/boolean.ts +47 -0
- package/src/pi-base/settings/fields/custom.ts +72 -0
- package/src/pi-base/settings/fields/enum.ts +310 -0
- package/src/pi-base/settings/fields/index.ts +46 -0
- package/src/pi-base/settings/fields/model.ts +452 -0
- package/src/pi-base/settings/fields/string.ts +527 -0
- package/src/pi-base/settings/fields/text.ts +115 -0
- package/src/pi-base/settings/frame.ts +197 -0
- package/src/pi-base/settings/index.ts +77 -0
- package/src/pi-base/settings/inline-edit.ts +313 -0
- package/src/pi-base/settings/modal.ts +152 -0
- package/src/pi-base/settings/types.ts +500 -0
- package/src/pi-base/settings/validate-field.ts +113 -0
- package/src/pi-base/shell.ts +117 -0
- package/src/pi-base/types.ts +6 -0
- package/src/pi-base/ui.ts +32 -0
- package/src/tools/recall.ts +347 -225
- package/src/types.ts +20 -3
- package/tsup.config.ts +23 -0
- package/vitest.config.ts +15 -15
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/pi-base/paths.ts","../src/pi-base/config.ts","../src/core/config-env.ts","../src/core/unified-config.ts","../src/core/settings.ts","../src/core/tool-args.ts","../src/core/content.ts","../src/core/sanitize.ts","../src/core/normalize.ts","../src/core/filter-noise.ts","../src/core/skill-collapse.ts","../src/extract/goals.ts","../src/extract/files.ts","../src/extract/preferences.ts","../src/extract/commits.ts","../src/core/brief.ts","../src/core/build-sections.ts","../src/core/format.ts","../src/core/summarize.ts","../src/om/ledger/types.ts","../src/om/tokens.ts","../src/om/ledger/progress.ts","../src/om/debug-log.ts","../src/om/ledger/fold.ts","../src/om/ledger/render-summary.ts","../src/om/ledger/projection.ts","../src/om/ledger/recall.ts","../src/hooks/before-compact.ts","../src/om/pending.ts","../src/om/cleanup.ts","../src/commands/cleanup.ts","../src/pi-base/settings/validate-field.ts","../src/pi-base/settings/fields/action.ts","../src/pi-base/settings/fields/boolean.ts","../src/pi-base/settings/fields/custom.ts","../src/pi-base/settings/frame.ts","../src/pi-base/settings/fields/enum.ts","../src/pi-base/settings/inline-edit.ts","../src/pi-base/settings/fields/model.ts","../src/pi-base/settings/fields/string.ts","../src/pi-base/settings/fields/text.ts","../src/pi-base/settings/fields/index.ts","../src/pi-base/settings/body.ts","../src/pi-base/settings/modal.ts","../src/pi-base/config-manager.ts","../src/pi-base/blackhole-settings.ts","../src/commands/pi-vcc.ts","../src/om/clipboard.ts","../src/commands/memory.ts","../src/core/render-entries.ts","../src/core/load-messages.ts","../src/core/search-entries.ts","../src/core/format-recall.ts","../src/core/lineage.ts","../src/core/recall-scope.ts","../src/om/reverse-recall.ts","../src/commands/vcc-recall.ts","../src/om/provider-stream.ts","../src/om/model-budget.ts","../src/om/agents/dropper/prompts.ts","../src/om/agents/dropper/coverage.ts","../src/om/agents/dropper/agent.ts","../src/om/ids.ts","../src/om/agents/observer/prompts.ts","../src/om/serialize.ts","../src/om/agents/observer/agent.ts","../src/om/agents/reflector/prompts.ts","../src/om/agents/reflector/agent.ts","../src/om/retryable-error.ts","../src/om/consolidation.ts","../src/om/compaction-trigger.ts","../src/core/drill-down.ts","../src/tools/recall.ts","../src/om/config.ts","../src/om/cooldown.ts","../src/om/runtime.ts","../index.ts"],"names":["config","getAgentDir","originalGetAgentDir","join","readFileSync","projectResult","projectRaw","merged","dirname","mkdirSync","writeFileSync","estimateMessageTokens","existsSync","statSync","entryIndexById","boundaryIndex","isSourceEntry","unlinkSync","renameSync","PENDING_DIR","PENDING_SUFFIX","STALE_SUFFIX","readdirSync","firstLine","pendingPath","stalePath","matchesKey","visibleWidth","wrapTextWithAnsi","idx","truncateToWidth","decodeKittyPrintable","SelectList","getSelectListTheme","previousValue","text","display","buffer","state","options","row","title","existing","resolve","pageMatch","page","rendered","rawMessages","base","output","streamSimple","pad","Type","joinOrEmpty","agentLoop","entries","isStaleExtensionContextError","dbg","DEFAULT_RECENT","PAGE_SIZE","MEMORY_ID_PATTERN","DEFAULTS","CONFIG_DIR"],"mappings":"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","file":"index.js","sourcesContent":["import { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nlet lastEnvVal: string | undefined = undefined;\nlet cachedPiAgentDir: string | null = null;\n\n/**\n * Get the root directory for pi-agent data.\n * Optimized with in-memory memoization that detects environmental updates.\n */\nexport function getPiAgentDir(): string {\n const currentEnvVal = process.env.PI_CODING_AGENT_DIR;\n if (cachedPiAgentDir !== null && currentEnvVal === lastEnvVal) {\n return cachedPiAgentDir;\n }\n lastEnvVal = currentEnvVal;\n cachedPiAgentDir = currentEnvVal?.trim() || getAgentDir();\n return cachedPiAgentDir;\n}\n\n/**\n * Shorten a working directory path by replacing the user's home directory\n * prefix with `~`. Returns the path unchanged if not under $HOME.\n *\n * @param cwd The current working directory to shorten\n * @param home Optional home directory override (defaults to `$HOME`)\n */\nexport function shortCwd(cwd: string, home?: string): string {\n const h = (home ?? process.env.HOME ?? process.env.USERPROFILE ?? \"\").replace(\n /[\\\\/]+$/,\n \"\",\n );\n if (!h) return cwd;\n if (cwd === h) return \"~\";\n const sep = h.includes(\"\\\\\") ? \"\\\\\" : \"/\";\n if (cwd.startsWith(h + sep)) {\n return `~${cwd.slice(h.length)}`;\n }\n return cwd;\n}\n\n/**\n * Shorten a working directory path by replacing the user's home directory\n * prefix with `~`. Returns the path unchanged if not under $HOME.\n *\n * @param cwd The current working directory to shorten\n * @param home Optional home directory override (defaults to `$HOME`)\n */\n","/**\n * config.ts — Unified configuration API for pi extensions.\n *\n * Named-file config (one file per package):\n * ~/.pi/agent/extensions/<package>-config.json (global)\n * <cwd>/.pi/<package>-config.json (project-local)\n *\n * Resolution order: defaults ← global file ← project-local file.\n *\n * Test safety: writeConfig / deleteConfig refuse to operate when vitest\n * is detected AND no explicit `configDir` is provided. Pass `configDir`\n * in tests (e.g. a temp dir) to disable the gate.\n */\n\nimport {\n mkdirSync,\n readFileSync,\n rmSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { getPiAgentDir } from \"./paths.js\";\n\ninterface CacheHit {\n mtime: number;\n size: number;\n data: unknown;\n}\n\nconst _configCache = new Map<string, CacheHit>();\nconst CACHE_LIMIT = 128;\n\nfunction cacheSet(key: string, value: CacheHit): void {\n _configCache.delete(key);\n _configCache.set(key, value);\n if (_configCache.size > CACHE_LIMIT) {\n const firstKey = _configCache.keys().next().value;\n if (firstKey !== undefined) {\n _configCache.delete(firstKey);\n }\n }\n}\n\n// ── Path helpers ──────────────────────────────────────────────────────\n\n/**\n * Canonical config directory: ~/.pi/agent/extensions/\n */\nexport function getExtensionsDir(): string {\n return join(getPiAgentDir(), \"extensions\");\n}\n\nfunction resolveConfigDir(configDir: string | undefined): string {\n return configDir ?? getExtensionsDir();\n}\n\n/** Check if a directory path points to a real user home (not a test temp). */\nfunction isRealDir(dir: string): boolean {\n return !dir.startsWith(\"/tmp\") && !dir.startsWith(\"/var/folders\");\n}\n\n/**\n * Guard writes/deletes against the real user config directory in tests.\n * Returns true if the operation should proceed.\n */\nfunction guardRealDir(\n filename: string,\n configDir: string | undefined,\n operation: \"write\" | \"delete\",\n): boolean {\n // Explicit configDir — caller's responsibility\n if (configDir !== undefined) return true;\n // Not in vitest — real pi process, allowed\n if (process.env.VITEST !== \"true\") return true;\n\n const dir = resolveConfigDir(configDir);\n if (isRealDir(dir)) {\n console.warn(\n `[pi-base] Blocked ${operation} of \"${filename}\" — running in vitest ` +\n `without explicit configDir, and the target directory (${dir}) ` +\n `looks like a real user home. ` +\n `Pass an explicit configDir parameter to enable ${operation}s in tests.`,\n );\n return false;\n }\n return true;\n}\n\n// ── Read ──────────────────────────────────────────────────────────────\n\n/**\n * Read a named config file. Returns parsed object or null.\n * Optimized with in-memory caching and mtime validation to bypass redundant filesystem checks.\n *\n * @param filename e.g. \"pi-window-title-config.json\"\n * @param configDir Directory to read from. Defaults to getExtensionsDir().\n */\nexport function readConfig<T>(filename: string, configDir?: string): T | null {\n const path = join(resolveConfigDir(configDir), filename);\n try {\n // Utilize { throwIfNoEntry: false } to avoid expensive exceptions when configuration files are missing\n const stats = statSync(path, { throwIfNoEntry: false });\n if (!stats) {\n _configCache.delete(path);\n return null;\n }\n\n const hit = _configCache.get(path);\n if (hit && hit.mtime === stats.mtimeMs && hit.size === stats.size) {\n // Refresh LRU order on hit\n _configCache.delete(path);\n _configCache.set(path, hit);\n return structuredClone(hit.data) as T;\n }\n\n const raw = readFileSync(path, \"utf-8\");\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n cacheSet(path, { data: null, mtime: stats.mtimeMs, size: stats.size });\n return null;\n }\n const parsed = JSON.parse(trimmed);\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n Array.isArray(parsed)\n ) {\n cacheSet(path, { data: null, mtime: stats.mtimeMs, size: stats.size });\n return null;\n }\n\n // Cache the parsed JSON data, validating both mtime and size\n cacheSet(path, {\n data: structuredClone(parsed),\n mtime: stats.mtimeMs,\n size: stats.size,\n });\n return parsed as T;\n } catch {\n _configCache.delete(path);\n return null;\n }\n}\n\n// ── Write ─────────────────────────────────────────────────────────────\n\n/**\n * Write a named config file. Returns true on success.\n *\n * Safety gate: in vitest, if no explicit `configDir` is provided,\n * warns and returns false to prevent accidental writes to the real\n * ~/.pi/agent/extensions/ directory.\n *\n * @param filename e.g. \"pi-window-title-config.json\"\n * @param data Object to serialize as JSON\n * @param configDir Directory to write to. Defaults to getExtensionsDir().\n */\nexport function writeConfig<T>(\n filename: string,\n data: T,\n configDir?: string,\n): boolean {\n if (!guardRealDir(filename, configDir, \"write\")) return false;\n const path = join(resolveConfigDir(configDir), filename);\n _configCache.delete(path);\n try {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(data, null, 2)}\\n`, \"utf-8\");\n return true;\n } catch (error) {\n console.warn(\n `[pi-base] Failed to write \"${path}\": ${error instanceof Error ? error.message : String(error)}`,\n );\n return false;\n }\n}\n\n// ── Delete ────────────────────────────────────────────────────────────\n\n/**\n * Delete a named config file. No-op if the file doesn't exist.\n */\nexport function deleteConfig(filename: string, configDir?: string): void {\n if (!guardRealDir(filename, configDir, \"delete\")) return;\n const path = join(resolveConfigDir(configDir), filename);\n _configCache.delete(path);\n try {\n rmSync(path, { force: true });\n } catch {\n // No-op if file doesn't exist or can't be deleted\n }\n}\n\n// ── deepMerge ─────────────────────────────────────────────────────────\n\n/**\n * Recursively merge `overrides` into `base`.\n *\n * - Plain objects are recursively merged (not replaced).\n * - `null` in overrides replaces the base value (explicit reset).\n * - `undefined` in overrides leaves the base value unchanged.\n * - Arrays, primitives, and non-plain objects are replaced wholesale.\n * - Does not mutate the base object (returns a new object).\n */\nexport function deepMerge<T extends Record<string, unknown>>(\n base: T,\n overrides: Partial<T>,\n): T {\n if (!overrides || typeof overrides !== \"object\") {\n return { ...base };\n }\n const result = { ...base };\n\n for (const key of Object.keys(overrides)) {\n const overrideVal = (overrides as Record<string, unknown>)[key];\n\n if (overrideVal === undefined) {\n continue;\n }\n\n if (overrideVal === null) {\n (result as Record<string, unknown>)[key] = null;\n continue;\n }\n\n const baseVal = (result as Record<string, unknown>)[key];\n\n if (isPlainObject(baseVal) && isPlainObject(overrideVal)) {\n (result as Record<string, unknown>)[key] = deepMerge(\n baseVal as Record<string, unknown>,\n overrideVal as Record<string, unknown>,\n );\n } else {\n (result as Record<string, unknown>)[key] = overrideVal;\n }\n }\n\n return result as T;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n Object.getPrototypeOf(value) === Object.prototype\n );\n}\n\n// ── deepEqual ─────────────────────────────────────────────────────────\n\n/**\n * Deep equality check for two values.\n * - Handles primitives, Date, RegExp, Map, Set, arrays, and plain objects.\n * - Non-plain-object instances are compared by reference (strict equality).\n */\nexport function deepEqual(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n\n if (a === null || b === null || typeof a !== typeof b) return false;\n\n // Date\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n // RegExp\n if (a instanceof RegExp && b instanceof RegExp) {\n return a.source === b.source && a.flags === b.flags;\n }\n\n // Map\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [k, v] of a) {\n if (!b.has(k) || !deepEqual(v, b.get(k))) return false;\n }\n return true;\n }\n\n // Set\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const v of a) {\n if (!b.has(v)) return false;\n }\n return true;\n }\n\n // Arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!deepEqual(a[i], b[i])) return false;\n }\n return true;\n }\n\n // Plain objects\n if (isPlainObject(a) && isPlainObject(b)) {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!deepEqual(a[key], b[key])) return false;\n }\n return true;\n }\n\n return false;\n}\n\n// ── checkConfigFile ───────────────────────────────────────────────────\n\nexport interface ConfigFileStatus {\n /** Whether the file exists on disk */\n exists: boolean;\n /** Whether the file contains valid config data (valid JSON + a plain object) */\n valid: boolean;\n /** Human-readable error description when valid is false */\n error?: string;\n}\n\n/**\n * Check whether a config file exists and has valid JSON content.\n * Does NOT cache — every call reads the file header / full content.\n *\n * Use this before `readConfig` to distinguish \"file not found\" from\n * \"file exists but is malformed\".\n */\nexport function checkConfigFile(\n filename: string,\n configDir?: string,\n): ConfigFileStatus {\n const path = join(resolveConfigDir(configDir), filename);\n try {\n const stats = statSync(path, { throwIfNoEntry: false });\n if (!stats) {\n return { exists: false, valid: true };\n }\n\n const raw = readFileSync(path, \"utf-8\");\n const trimmed = raw.trim();\n\n if (trimmed.length === 0) {\n return { exists: true, valid: false, error: \"Config file is empty\" };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch (e) {\n return {\n exists: true,\n valid: false,\n error: `Invalid JSON: ${(e as Error).message}`,\n };\n }\n\n if (!isPlainObject(parsed)) {\n return {\n exists: true,\n valid: false,\n error: \"Config file must contain a plain JSON object at the top level\",\n };\n }\n\n return { exists: true, valid: true };\n } catch {\n return { exists: true, valid: false, error: \"Cannot read config file\" };\n }\n}\n\n// ── loadConfig ────────────────────────────────────────────────────────\n\nexport interface LoadConfigOptions {\n /**\n * Working directory for project-local overrides.\n * When set, reads from `<cwd>/.pi/<filename>` in addition to global.\n */\n cwd?: string;\n\n /**\n * Merge strategy for combining defaults ← global ← project.\n * - \"shallow\" (default): `{ ...defaults, ...global, ...project }`\n * - \"deep\": recursively merges nested objects.\n */\n merge?: \"shallow\" | \"deep\";\n\n /**\n * Explicit config directory. Defaults to getExtensionsDir().\n * Use in tests to read/write from a temporary or fixture directory.\n */\n configDir?: string;\n}\n\n/**\n * Load configuration with defaults, global file, and optional project-local override.\n *\n * Resolution order: defaults ← global file ← project-local file.\n * Each layer shallow-merges (or deep-merges if `merge: \"deep\"`).\n *\n * Always returns a full config object — null is never returned.\n * Missing keys fall back to defaults.\n */\nexport function loadConfig<T extends object>(\n filename: string,\n defaults: T,\n opts: LoadConfigOptions = {},\n): T {\n const dir = resolveConfigDir(opts.configDir);\n const mergeFn =\n opts.merge === \"deep\"\n ? (base: T, over: Partial<T>) =>\n deepMerge(\n base as Record<string, unknown>,\n over as Record<string, unknown>,\n ) as unknown as T\n : shallowMerge<T>;\n\n let config = defaults;\n\n // Layer 1: global\n config = mergeFn(\n config,\n readConfig<Partial<T>>(filename, dir) ?? ({} as Partial<T>),\n );\n\n // Layer 2: project-local\n if (opts.cwd) {\n const projectDir = join(opts.cwd, \".pi\");\n config = mergeFn(\n config,\n readConfig<Partial<T>>(filename, projectDir) ?? ({} as Partial<T>),\n );\n }\n\n return config;\n}\n\nfunction shallowMerge<T extends object>(base: T, overrides: Partial<T>): T {\n const result = { ...base } as Record<string, unknown>;\n for (const key of Object.keys(overrides as Record<string, unknown>)) {\n const val = (overrides as Record<string, unknown>)[key];\n if (val !== undefined) {\n result[key] = val;\n }\n }\n return result as unknown as T;\n}\n\n// ── Env helpers ───────────────────────────────────────────────────────\n\nexport function readBooleanEnv(name: string, fallback: boolean): boolean {\n const raw = process.env[name]?.trim().toLowerCase();\n if (!raw) return fallback;\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(raw)) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(raw)) return false;\n return fallback;\n}\n\nexport function readPositiveIntEnv(name: string, fallback: number): number {\n const raw = process.env[name]?.trim();\n if (!raw) return fallback;\n const value = Number.parseInt(raw, 10);\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n","/**\n * Declarative PI_BLACKHOLE_* environment overrides for the unified config.\n *\n * Single source of truth for the env-var surface, shared by:\n * - ConfigManager (pi-base/config-manager.ts) — modal + om-off/om-on path\n * - loadUnifiedConfig (core/unified-config.ts) — the runtime path\n *\n * This guarantees env overrides behave identically everywhere. (Previously\n * the runtime ignored the declarative map and only applied the passive\n * trio + compaction/compaction-engine vars.)\n */\nimport { readBooleanEnv, readPositiveIntEnv } from \"../pi-base/config.js\";\n\nexport interface EnvParser {\n /** Env var name */\n var: string;\n /** Custom parse function (receives raw string, returns parsed value) */\n parse: (raw: string, current: unknown) => unknown;\n}\n\nexport type EnvOverride = string | EnvParser;\n\n/**\n * Apply env overrides onto a config object. Field types are inferred from\n * the defaults (boolean → truthy parsing, positive integer → int parsing,\n * anything else → float). Returns a NEW object; input is not mutated.\n */\nexport function applyEnvOverrides<T extends object>(\n config: T,\n env: Record<string, EnvOverride>,\n defaults: Record<string, unknown>,\n): T {\n const result: Record<string, unknown> = {\n ...(config as Record<string, unknown>),\n };\n\n for (const [key, value] of Object.entries(env)) {\n if (!value) continue;\n\n const defaultValue = defaults[key];\n\n if (typeof value === \"string\") {\n if (typeof defaultValue === \"boolean\") {\n result[key] = readBooleanEnv(\n value,\n (result[key] as boolean) ?? (defaultValue as boolean),\n );\n } else if (typeof defaultValue === \"number\") {\n if (Number.isInteger(defaultValue) && defaultValue > 0) {\n result[key] = readPositiveIntEnv(\n value,\n (result[key] as number) ?? (defaultValue as number),\n );\n } else {\n // Float — parse and preserve\n const raw = process.env[value]?.trim();\n if (raw) {\n const parsed = Number.parseFloat(raw);\n if (Number.isFinite(parsed)) {\n result[key] = parsed;\n }\n }\n }\n }\n } else {\n const raw = process.env[value.var]?.trim();\n if (raw) {\n const parsed = value.parse(raw, result[key]);\n if (parsed !== undefined) {\n result[key] = parsed;\n }\n }\n }\n }\n\n return result as T;\n}\n\n/**\n * The declarative PI_BLACKHOLE_* env-var map. Keys are UnifiedConfig field\n * names; values are the env var names (or parsers for special types).\n */\nexport const DECLARATIVE_ENV_OVERRIDES: Record<string, EnvOverride> = {\n // Booleans\n memory: \"PI_BLACKHOLE_MEMORY\",\n debug: \"PI_BLACKHOLE_DEBUG\",\n debugLog: \"PI_BLACKHOLE_DEBUG_LOG\",\n sessionFallback: \"PI_BLACKHOLE_SESSION_FALLBACK\",\n fullFoldAlways: \"PI_BLACKHOLE_FULL_FOLD_ALWAYS\",\n // Positive integers\n compactAfterTokens: \"PI_BLACKHOLE_COMPACT_AFTER_TOKENS\",\n observeAfterTokens: \"PI_BLACKHOLE_OBSERVE_AFTER_TOKENS\",\n reflectAfterTokens: \"PI_BLACKHOLE_REFLECT_AFTER_TOKENS\",\n observationsPoolMaxTokens: \"PI_BLACKHOLE_OBSERVATIONS_POOL_MAX_TOKENS\",\n observationsPoolTargetTokens: \"PI_BLACKHOLE_OBSERVATIONS_POOL_TARGET_TOKENS\",\n reflectorInputMaxTokens: \"PI_BLACKHOLE_REFLECTOR_INPUT_MAX_TOKENS\",\n dropperInputMaxTokens: \"PI_BLACKHOLE_DROPPER_INPUT_MAX_TOKENS\",\n observerChunkMaxTokens: \"PI_BLACKHOLE_OBSERVER_CHUNK_MAX_TOKENS\",\n observerPreambleMaxTokens: \"PI_BLACKHOLE_OBSERVER_PREAMBLE_MAX_TOKENS\",\n agentMaxTurns: \"PI_BLACKHOLE_AGENT_MAX_TURNS\",\n // Float in (0, 1]\n dropperPressureThreshold: {\n var: \"PI_BLACKHOLE_DROPPER_PRESSURE_THRESHOLD\",\n parse: (raw: string) => {\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) && n > 0 && n <= 1 ? n : undefined;\n },\n },\n // Float in (0, 1]\n dropperPoolFullnessThreshold: {\n var: \"PI_BLACKHOLE_DROPPER_POOL_FULLNESS_THRESHOLD\",\n parse: (raw: string) => {\n const n = Number.parseFloat(raw);\n return Number.isFinite(n) && n > 0 && n <= 1 ? n : undefined;\n },\n },\n};\n","/**\n * Unified configuration loader — merges pi-vcc + OM settings into one file.\n *\n * Created by pi-vcc-om.\n * Reads ~/.pi/agent/pi-blackhole/pi-blackhole-config.json with legacy fallback support.\n * Model configs support cooldownHours and fallbackModel arrays.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { applyEnvOverrides, DECLARATIVE_ENV_OVERRIDES } from \"./config-env.js\";\nimport { getAgentDir as originalGetAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type { ModelThinkingLevel } from \"@earendil-works/pi-ai\";\n\n// ── getAgentDir with PI_CODING_AGENT_DIR override ───────────────────────────\n\nlet __lastAgentDirEnv: string | undefined;\nlet __cachedAgentDir: string | null = null;\n\n/**\n * Get the canonical pi-agent data directory.\n * Respects the `PI_CODING_AGENT_DIR` environment variable when set.\n * Memoized — only recomputes when the env var changes.\n */\nexport function getAgentDir(): string {\n const current = process.env.PI_CODING_AGENT_DIR?.trim();\n if (current === __lastAgentDirEnv && __cachedAgentDir !== null)\n return __cachedAgentDir;\n __lastAgentDirEnv = current;\n __cachedAgentDir = current || originalGetAgentDir();\n return __cachedAgentDir;\n}\n\n// ── Config path ──────────────────────────────────────────────────────────────\n\nconst CONFIG_DIR = \"pi-blackhole\";\nconst CONFIG_FILE = \"pi-blackhole-config.json\";\n\n/** Test-only: override for config directory. Set via __setTestConfigDir(). */\nlet __testConfigDir: string | undefined;\n\n/** Test-only: set to override config directory. Use in beforeEach/afterEach. */\nexport function __setTestConfigDir(dir: string | undefined): void {\n __testConfigDir = dir;\n}\n\nexport function configPath(): string {\n if (__testConfigDir) {\n return join(__testConfigDir, CONFIG_DIR, CONFIG_FILE);\n }\n return join(getAgentDir(), CONFIG_DIR, CONFIG_FILE);\n}\n\n// ── Types ────────────────────────────────────────────────────────────────────\n\nexport interface OmModelConfig {\n provider: string;\n id: string;\n thinking?: ModelThinkingLevel;\n /** Cooldown duration in hours after a retryable error (429/5xx/timeout).\n * Defaults to 1 hour when omitted. */\n cooldownHours?: number;\n /** Context window override for this model. Inherits from Pi's model registry when unset. */\n contextWindow?: number;\n}\n\nexport interface UnifiedConfig {\n /** @deprecated Use compactionEngine instead. */\n overrideDefaultCompaction?: boolean;\n /** Write debug snapshots to /tmp/pi-blackhole-debug.json. */\n debug: boolean;\n\n // ── New config surface — compaction, engine, tail behavior ──\n\n /** Unified compaction control: \"auto\" | \"manual\" | \"off\".\n * \"auto\" — auto-trigger on compactAfterTokens threshold\n * \"manual\" — only via /blackhole command\n * \"off\" — never compact (disables auto + blocks /blackhole) */\n compaction: \"auto\" | \"manual\" | \"off\";\n\n /** Which engine handles compaction.\n * \"blackhole\" — blackhole's compile() + OM injection\n * \"pi-default\" — Pi's built-in summarization */\n compactionEngine: \"blackhole\" | \"pi-default\";\n\n /** Mid-run auto-compaction (turn_end trigger, fires while the agent is still\n * executing tool loops — agent_end alone never fires during long runs).\n * \"resume\" — compact at threshold and inject a resume message so the agent\n * continues the task (default)\n * \"pause\" — compact at threshold but stop; user continues manually\n * \"off\" — only evaluate the threshold when the agent finishes a run */\n midRunCompaction: \"resume\" | \"pause\" | \"off\";\n\n /** How much recent transcript to keep visible after compaction.\n * \"pi-default\" — use Pi's firstKeptEntryId (respects Pi's keepRecentTokens)\n * \"minimal\" — keep only last user message (current agressive pi-vcc behavior)\n * ONLY applies when compactionEngine: \"blackhole\" */\n tailBehavior: \"pi-default\" | \"minimal\";\n\n /** Token threshold for observer runs. */\n observeAfterTokens: number;\n /** Token threshold for reflector and dropper. */\n reflectAfterTokens: number;\n /** Token threshold for proactive auto-compaction. */\n compactAfterTokens: number;\n /** Observation pool token pressure for full fold. */\n observationsPoolMaxTokens: number;\n /** Treat every compaction as a full-fold boundary so early reflections/drops\n * survive the first compaction in a fresh session. Default true. */\n fullFoldAlways: boolean;\n /** Target token budget for the observation pool (dropper aims here).\n * Optional; defaults to half of observationsPoolMaxTokens when unset.\n * Must be less than observationsPoolMaxTokens.\n *\n * NOTE: Ported from upstream as forward-compat (no-op in our pool algorithm).\n * Upstream renamed budgetTokens→targetTokens (52b5844) and uses this\n * for their tokensOverTarget / avgTokensPerObservation drop calculation.\n * We keep our ratio-based urgency algorithm; this knob exists so future\n * lockstep iterations don't diverge on the config shape. */\n observationsPoolTargetTokens: number;\n /** Max prompt tokens for reflector model input (rolling window cap). */\n reflectorInputMaxTokens: number;\n /** Max prompt tokens for dropper model input (rolling window cap). */\n dropperInputMaxTokens: number;\n /** Pressure threshold for dropper. When active observation pool tokens exceed\n * this fraction of reflectorInputMaxTokens, the dropper runs even without new\n * observations/reflections (to keep the pool pruned).\n * Default 0.70 (70%). Must be in range (0, 1]. */\n dropperPressureThreshold: number;\n /** Minimum observation-pool fullness (fraction of observationsPoolMaxTokens)\n * before the dropper may run. Prevents churn on a nearly empty pool.\n * Default 0.10 (10%). Must be in range (0, 1]. */\n dropperPoolFullnessThreshold: number;\n /** Max source entries tokens sent to observer per chunk. */\n observerChunkMaxTokens: number;\n /** Max preamble tokens (CURRENT REFLECTIONS / OBSERVATIONS) in the observer prompt.\n * Default 0 means auto-compute from observerChunkMaxTokens (30%). Only applied in\n * noAutoCompact mode where accumulated batch history can grow unbounded.\n * Set to an explicit value to override the auto-computed budget. */\n observerPreambleMaxTokens: number;\n /** Shared turn cap for background memory agents. */\n agentMaxTurns: number;\n\n /** Base model override for all memory workers. */\n model?: OmModelConfig;\n /** Model override for observer (most frequent worker). */\n observerModel?: OmModelConfig;\n /** Model override for reflector (synthesizes durable facts). */\n reflectorModel?: OmModelConfig;\n /** Model override for dropper (prunes observations). */\n dropperModel?: OmModelConfig;\n\n /** Fallback models for observer, tried in order after primary model fails. */\n observerFallbackModels?: OmModelConfig[];\n /** Fallback models for reflector, tried in order after primary model fails. */\n reflectorFallbackModels?: OmModelConfig[];\n /** Fallback models for dropper, tried in order after primary model fails. */\n dropperFallbackModels?: OmModelConfig[];\n\n /** When false, skip session model fallback when all OM model candidates are exhausted.\n * Default true for backward compatibility. */\n sessionFallback?: boolean;\n\n /** @deprecated Use compaction instead. */\n noAutoCompact?: boolean;\n /** @deprecated Use compaction + memory instead. */\n passive?: boolean;\n /** Enables observational memory (workers + content injection). Set to false for pi-vcc only. */\n memory: boolean;\n /** Writes debug JSONL to agent directory. */\n debugLog: boolean;\n}\n\n// ── Defaults ─────────────────────────────────────────────────────────────────\n\nexport const DEFAULTS: UnifiedConfig = {\n debug: false,\n sessionFallback: true,\n\n // New config surface\n compaction: \"auto\",\n compactionEngine: \"blackhole\",\n tailBehavior: \"minimal\",\n midRunCompaction: \"off\",\n\n observeAfterTokens: 15_000,\n reflectAfterTokens: 25_000,\n compactAfterTokens: 81_000,\n observationsPoolMaxTokens: 20_000,\n fullFoldAlways: true,\n observationsPoolTargetTokens: 10_000,\n reflectorInputMaxTokens: 80_000,\n dropperInputMaxTokens: 80_000,\n dropperPressureThreshold: 0.7,\n dropperPoolFullnessThreshold: 0.1,\n observerChunkMaxTokens: 40_000,\n observerPreambleMaxTokens: 0,\n agentMaxTurns: 16,\n\n memory: true,\n debugLog: false,\n};\n\n// ── Parsing helpers ──────────────────────────────────────────────────────────\n\nconst THINKING_LEVELS: readonly string[] = [\n \"off\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n];\n\n// String enums for new config surface\nconst COMPACTION_VALUES = [\"auto\", \"manual\", \"off\"] as const;\nconst COMPACTION_ENGINE_VALUES = [\"blackhole\", \"pi-default\"] as const;\nconst TAIL_BEHAVIOR_VALUES = [\"pi-default\", \"minimal\"] as const;\nconst MID_RUN_COMPACTION_VALUES = [\"resume\", \"pause\", \"off\"] as const;\n\nfunction isCompaction(v: unknown): v is \"auto\" | \"manual\" | \"off\" {\n return (\n typeof v === \"string\" &&\n (COMPACTION_VALUES as readonly string[]).includes(v)\n );\n}\nfunction isCompactionEngine(v: unknown): v is \"blackhole\" | \"pi-default\" {\n return (\n typeof v === \"string\" &&\n (COMPACTION_ENGINE_VALUES as readonly string[]).includes(v)\n );\n}\nfunction isTailBehavior(v: unknown): v is \"pi-default\" | \"minimal\" {\n return (\n typeof v === \"string\" &&\n (TAIL_BEHAVIOR_VALUES as readonly string[]).includes(v)\n );\n}\nfunction isMidRunCompaction(v: unknown): v is \"resume\" | \"pause\" | \"off\" {\n return (\n typeof v === \"string\" &&\n (MID_RUN_COMPACTION_VALUES as readonly string[]).includes(v)\n );\n}\n\nfunction isRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null;\n}\n\nfunction nonEmptyString(v: unknown): string | undefined {\n return typeof v === \"string\" && v.length > 0 ? v : undefined;\n}\n\nfunction isThinkingLevel(v: unknown): v is ModelThinkingLevel {\n return typeof v === \"string\" && THINKING_LEVELS.includes(v);\n}\n\nfunction positiveInt(v: unknown): number | undefined {\n return Number.isInteger(v) && typeof v === \"number\" && v > 0 ? v : undefined;\n}\n\n/** Like positiveInt but allows 0. Used for cooldownHours where 0 means \"disabled\". */\nfunction nonNegativeInt(v: unknown): number | undefined {\n return Number.isInteger(v) && typeof v === \"number\" && v >= 0 ? v : undefined;\n}\n\nfunction parseModel(v: unknown): OmModelConfig | undefined {\n if (!isRecord(v)) return undefined;\n const provider = nonEmptyString(v.provider);\n const id = nonEmptyString(v.id);\n if (!provider || !id) return undefined;\n const model: OmModelConfig = { provider, id };\n if (isThinkingLevel(v.thinking)) model.thinking = v.thinking;\n const cooldown = nonNegativeInt(v.cooldownHours);\n if (cooldown !== undefined) model.cooldownHours = cooldown;\n const ctxWindow = positiveInt(v.contextWindow);\n if (ctxWindow !== undefined) model.contextWindow = ctxWindow;\n return model;\n}\n\nfunction parseModelArray(v: unknown): OmModelConfig[] | undefined {\n if (!Array.isArray(v)) return undefined;\n const parsed = v\n .map(parseModel)\n .filter((m): m is OmModelConfig => m !== undefined);\n return parsed.length > 0 ? parsed : undefined;\n}\n\nfunction parseConfig(raw: Record<string, unknown>): Partial<UnifiedConfig> {\n const c: Partial<UnifiedConfig> = {};\n\n // String enums — compaction surface\n if (isCompaction(raw.compaction)) c.compaction = raw.compaction;\n if (isCompactionEngine(raw.compactionEngine))\n c.compactionEngine = raw.compactionEngine;\n if (isTailBehavior(raw.tailBehavior)) c.tailBehavior = raw.tailBehavior;\n if (isMidRunCompaction(raw.midRunCompaction))\n c.midRunCompaction = raw.midRunCompaction;\n\n // Booleans — pi-vcc\n if (typeof raw.overrideDefaultCompaction === \"boolean\")\n c.overrideDefaultCompaction = raw.overrideDefaultCompaction;\n if (typeof raw.debug === \"boolean\") c.debug = raw.debug;\n\n // Booleans — om\n if (typeof raw.sessionFallback === \"boolean\")\n c.sessionFallback = raw.sessionFallback;\n if (typeof raw.noAutoCompact === \"boolean\")\n c.noAutoCompact = raw.noAutoCompact;\n if (typeof raw.passive === \"boolean\") c.passive = raw.passive;\n if (typeof raw.memory === \"boolean\") c.memory = raw.memory;\n if (typeof raw.fullFoldAlways === \"boolean\")\n c.fullFoldAlways = raw.fullFoldAlways;\n if (typeof raw.debugLog === \"boolean\") c.debugLog = raw.debugLog;\n\n // Numeric fields — use nonNegativeInt for observerPreambleMaxTokens (0 = auto)\n const numKeys = [\n \"observeAfterTokens\",\n \"reflectAfterTokens\",\n \"compactAfterTokens\",\n \"observationsPoolMaxTokens\",\n \"observationsPoolTargetTokens\",\n \"reflectorInputMaxTokens\",\n \"dropperInputMaxTokens\",\n \"observerChunkMaxTokens\",\n \"observerPreambleMaxTokens\",\n \"agentMaxTurns\",\n ] as const;\n\n // dropperPressureThreshold: fractional, must be in (0, 1]\n if (\n typeof raw.dropperPressureThreshold === \"number\" &&\n Number.isFinite(raw.dropperPressureThreshold) &&\n raw.dropperPressureThreshold > 0 &&\n raw.dropperPressureThreshold <= 1\n ) {\n c.dropperPressureThreshold = raw.dropperPressureThreshold;\n }\n // dropperPoolFullnessThreshold: fractional, must be in (0, 1]\n if (\n typeof raw.dropperPoolFullnessThreshold === \"number\" &&\n Number.isFinite(raw.dropperPoolFullnessThreshold) &&\n raw.dropperPoolFullnessThreshold > 0 &&\n raw.dropperPoolFullnessThreshold <= 1\n ) {\n c.dropperPoolFullnessThreshold = raw.dropperPoolFullnessThreshold;\n }\n for (const k of numKeys) {\n // observerPreambleMaxTokens accepts 0 (auto-compute); everything else must be > 0\n const validator =\n k === \"observerPreambleMaxTokens\" ? nonNegativeInt : positiveInt;\n const v = validator(raw[k]);\n if (v !== undefined) (c as Record<string, unknown>)[k] = v;\n }\n\n // Models\n const model = parseModel(raw.model);\n if (model) c.model = model;\n const obsModel = parseModel(raw.observerModel);\n if (obsModel) c.observerModel = obsModel;\n const refModel = parseModel(raw.reflectorModel);\n if (refModel) c.reflectorModel = refModel;\n const dropModel = parseModel(raw.dropperModel);\n if (dropModel) c.dropperModel = dropModel;\n\n // Fallback model arrays\n const obsFallback = parseModelArray(raw.observerFallbackModels);\n if (obsFallback) c.observerFallbackModels = obsFallback;\n const refFallback = parseModelArray(raw.reflectorFallbackModels);\n if (refFallback) c.reflectorFallbackModels = refFallback;\n const dropFallback = parseModelArray(raw.dropperFallbackModels);\n if (dropFallback) c.dropperFallbackModels = dropFallback;\n\n return c;\n}\n\n// ── Migration ────────────────────────────────────────────────────────────────\n\n/**\n * Migrate legacy config knobs to new unified surface.\n * Operates on the in-memory parsed object each time loadUnifiedConfig() is called;\n * old keys are removed from this copy. Does NOT mutate the on-disk config file.\n * Idempotent — safe to call repeatedly.\n */\nfunction migrateOldKnobs(parsed: Record<string, unknown>): void {\n // Only run if new keys are absent AND old keys are present\n if (\n parsed.compaction !== undefined ||\n parsed.compactionEngine !== undefined\n ) {\n return; // new keys already set — no migration\n }\n\n // passive → compaction: \"off\" + memory: false\n if (parsed.passive === true) {\n parsed.compaction = \"off\";\n parsed.memory = false;\n }\n // noAutoCompact → compaction: \"manual\"\n else if (parsed.noAutoCompact === true) {\n parsed.compaction = \"manual\";\n }\n // overrideDefaultCompaction → compactionEngine + tailBehavior\n if (parsed.overrideDefaultCompaction === true) {\n parsed.compactionEngine = \"blackhole\";\n // Preserve aggressive cut for existing users\n if (parsed.tailBehavior === undefined) {\n parsed.tailBehavior = \"minimal\";\n }\n } else if (parsed.overrideDefaultCompaction === false) {\n parsed.compactionEngine = \"pi-default\";\n }\n\n // Remove old keys so migration runs only once\n delete parsed.passive;\n delete parsed.noAutoCompact;\n delete parsed.overrideDefaultCompaction;\n}\n\n// ── Load and save ────────────────────────────────────────────────────────────\n\nfunction readJson(path: string): {\n data: Record<string, unknown> | null;\n error: string | null;\n} {\n if (!existsSync(path)) return { data: null, error: null };\n try {\n return { data: JSON.parse(readFileSync(path, \"utf-8\")), error: null };\n } catch (e) {\n const msg = `blackhole: config file at ${path} has invalid JSON: ${(e as Error).message}. Using defaults.`;\n console.warn(msg);\n return { data: null, error: msg };\n }\n}\n\n/** Optional warning callback invoked when the primary config file has invalid JSON.\n * Receives the warning message string. Used by callers with UI access to surface\n * the error via ctx.ui.notify(message, \"warning\").\n */\ntype WarnFn = (message: string) => void;\n\n/**\n * Load unified configuration from ~/.pi/agent/pi-blackhole/pi-blackhole-config.json.\n * Falls back to legacy sources if the unified file doesn't exist.\n */\nexport function loadUnifiedConfig(cwd: string, onWarn?: WarnFn): UnifiedConfig {\n const path = configPath();\n let raw: Record<string, unknown> | null;\n let primaryError: string | null = null;\n const result = readJson(path);\n raw = result.data;\n primaryError = result.error;\n if (primaryError && onWarn) onWarn(primaryError);\n\n // Fallback to legacy sources if unified file doesn't exist\n if (!raw) {\n // Try legacy pi-vcc config\n const piVccPath = join(getAgentDir(), \"pi-vcc-config.json\");\n const piVccResult = readJson(piVccPath);\n const piVccRaw = piVccResult.data;\n if (piVccResult.error && onWarn) onWarn(piVccResult.error);\n\n // Try legacy om config from settings.json\n const settingsPath = join(getAgentDir(), \"settings.json\");\n const settingsResult = readJson(settingsPath);\n const settingsRaw = settingsResult.data;\n if (settingsResult.error && onWarn) onWarn(settingsResult.error);\n const omRaw =\n settingsRaw?.[\"pi-blackhole\"] ?? settingsRaw?.[\"observational-memory\"];\n const projectSettingsPath = join(cwd, \".pi\", \"settings.json\");\n const projectResult = readJson(projectSettingsPath);\n const projectRaw = projectResult.data;\n if (projectResult.error && onWarn) onWarn(projectResult.error);\n const projectOmRaw =\n projectRaw?.[\"pi-blackhole\"] ?? projectRaw?.[\"observational-memory\"];\n\n // Merge legacy sources\n const merged: Record<string, unknown> = {};\n if (piVccRaw && isRecord(piVccRaw)) Object.assign(merged, piVccRaw);\n if (omRaw && isRecord(omRaw)) Object.assign(merged, omRaw);\n if (projectOmRaw && isRecord(projectOmRaw))\n Object.assign(merged, projectOmRaw);\n raw = merged;\n }\n\n // Project-local override: <cwd>/.pi/pi-blackhole-config.json\n const projectConfigPath = join(cwd, \".pi\", CONFIG_FILE);\n const projectResult = readJson(projectConfigPath);\n const projectRaw = projectResult.data;\n if (projectResult.error && onWarn) onWarn(projectResult.error);\n if (projectRaw && isRecord(projectRaw)) {\n raw = { ...raw, ...projectRaw };\n }\n\n const parsed = parseConfig(raw);\n\n // ── Migration: old → new knobs ──\n migrateOldKnobs(parsed);\n\n // Env override — legacy passive env vars\n const envPassive =\n process.env.PI_BLACKHOLE_PASSIVE ??\n process.env.PI_VCC_OM_PASSIVE ??\n process.env.PI_OBSERVATIONAL_MEMORY_PASSIVE;\n if (envPassive !== undefined) {\n const v = envPassive.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(v)) {\n parsed.compaction = \"off\";\n parsed.memory = false;\n } else if ([\"0\", \"false\", \"no\", \"off\"].includes(v)) {\n // Falsy env override: undo passive migration when config relied on legacy key\n if (raw?.passive === true) {\n delete parsed.compaction;\n delete parsed.memory;\n }\n }\n }\n\n // Merge defaults then override\n const merged = { ...DEFAULTS, ...parsed };\n\n // ── Env override — compaction ──\n const envCompaction = process.env.PI_BLACKHOLE_COMPACTION;\n if (envCompaction !== undefined) {\n const trimmed = envCompaction.trim().toLowerCase();\n if (isCompaction(trimmed)) {\n merged.compaction = trimmed as \"auto\" | \"manual\" | \"off\";\n } else {\n console.warn(\n `blackhole: invalid PI_BLACKHOLE_COMPACTION value \"${envCompaction}\"; ignoring`,\n );\n }\n }\n\n // ── Env override — compaction engine ──\n const envCompactionEngine = process.env.PI_BLACKHOLE_COMPACTION_ENGINE;\n if (envCompactionEngine !== undefined) {\n const trimmed = envCompactionEngine.trim().toLowerCase();\n if (isCompactionEngine(trimmed)) {\n merged.compactionEngine = trimmed as \"blackhole\" | \"pi-default\";\n } else {\n console.warn(\n `blackhole: invalid PI_BLACKHOLE_COMPACTION_ENGINE value \"${envCompactionEngine}\"; ignoring`,\n );\n }\n }\n\n // ── Declarative PI_BLACKHOLE_* overrides ──\n // Same env map as the ConfigManager modal path, so env overrides apply\n // to the RUNTIME config, not just the modal. Overrides any file value.\n const withEnv = applyEnvOverrides(\n merged,\n DECLARATIVE_ENV_OVERRIDES,\n DEFAULTS as unknown as Record<string, unknown>,\n );\n\n return withEnv;\n}\n\n/**\n * Write settings back to disk. Preserves unknown keys.\n */\nexport function saveUnifiedConfig(settings: Partial<UnifiedConfig>): boolean {\n try {\n const path = configPath();\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n const existingResult = readJson(path);\n const existing = existingResult.data ?? {};\n if (existingResult.error) {\n console.warn(\"blackhole: overwriting corrupt config file at \" + path);\n }\n const next = { ...existing, ...settings };\n writeFileSync(path, `${JSON.stringify(next, null, 2)}\\n`);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Write settings back to disk for a specific scope.\n *\n * - global: writes to `<agentDir>/pi-blackhole/pi-blackhole-config.json`\n * - project: writes to `<cwd>/.pi/pi-blackhole-config.json`\n *\n * Preserves unknown keys in the target file.\n */\nexport function saveUnifiedConfigScoped(\n settings: Partial<UnifiedConfig>,\n scope: \"global\" | \"project\",\n cwd: string,\n): boolean {\n try {\n const dir =\n scope === \"project\"\n ? join(cwd, \".pi\")\n : join(getAgentDir(), \"pi-blackhole\");\n const path = join(dir, CONFIG_FILE);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n const existingResult = readJson(path);\n const existing = existingResult.data ?? {};\n if (existingResult.error) {\n console.warn(\"blackhole: overwriting corrupt config file at \" + path);\n }\n const next = { ...existing, ...settings };\n writeFileSync(path, `${JSON.stringify(next, null, 2)}\\n`);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Ensure ~/.pi/agent/pi-blackhole/pi-blackhole-config.json exists with defaults.\n *\n * Only creates the file if it doesn't exist. Missing keys are filled at read\n * time by loadUnifiedConfig() via { ...DEFAULTS, ...parsed } merge, so there\n * is no need to keep the on-disk file \"complete\". This avoids a crash on\n * read-only filesystems where the config is managed externally (e.g., Nix).\n */\nexport function scaffoldConfig(): void {\n try {\n const path = configPath();\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n\n if (!existsSync(path)) {\n writeFileSync(path, `${JSON.stringify(DEFAULTS, null, 2)}\\n`);\n }\n } catch (e) {\n console.error(\"blackhole: config scaffold failed\", e);\n }\n}\n\n// ── Migration detection ───────────────────────────────────────────────────────\n\n/**\n * Check if the on-disk config file still uses legacy keys (needs migration).\n * Returns true when the file exists, has no new keys, but has old keys.\n * Used to prompt users to save their config with the new keys.\n */\nexport function configFileNeedsMigration(): boolean {\n try {\n const path = configPath();\n if (!existsSync(path)) return false;\n const raw = JSON.parse(readFileSync(path, \"utf-8\")) as Record<\n string,\n unknown\n >;\n if (\n raw.compaction !== undefined ||\n raw.compactionEngine !== undefined ||\n raw.tailBehavior !== undefined\n ) {\n return false; // already has new keys\n }\n return (\n raw.passive !== undefined ||\n raw.noAutoCompact !== undefined ||\n raw.overrideDefaultCompaction !== undefined\n );\n } catch {\n return false;\n }\n}\n\n/**\n * Check whether the OM pipeline is in manual mode.\n *\n * In manual mode, observations/reflections/dropped are saved to the\n * per-session pending file instead of being appended to the branch.\n * On `/blackhole`, pending entries are flushed to the branch and\n * the pending file is cleared.\n *\n * Handles both the new `compaction: \"manual\"` key and the legacy\n * `noAutoCompact: true` key for backward compatibility.\n *\n * @param config — The current runtime config (may include legacy noAutoCompact)\n */\nexport function isManualMode(config: {\n compaction?: string;\n noAutoCompact?: boolean;\n}): boolean {\n return config.compaction === \"manual\" || config.noAutoCompact === true;\n}\n","/**\n * Scaffold the pi-blackhole config file on disk.\n *\n * Only holds scaffoldSettings(); config loading/parsing happens in unified-config.ts.\n */\nimport { scaffoldConfig } from \"./unified-config.js\";\n\nexport function scaffoldSettings(): void {\n scaffoldConfig();\n}\n","/** Canonical list of path-like argument keys across all Pi tools. */\nexport const PATH_KEYS = [\"path\", \"file_path\", \"filePath\", \"file\"] as const;\n\nexport const extractPath = (args: Record<string, unknown>): string | null => {\n for (const key of PATH_KEYS) {\n if (typeof args[key] === \"string\") return args[key] as string;\n }\n return null;\n};\n\nexport const summarizeToolArgs = (args: Record<string, unknown>): string => {\n const path = extractPath(args);\n if (path) return `path=${path}`;\n if (typeof args.command === \"string\") return `command=${args.command}`;\n if (typeof args.query === \"string\") return `query=${args.query}`;\n return Object.keys(args).join(\", \");\n};\n","import type { Message } from \"@earendil-works/pi-ai\";\nimport { PATH_KEYS } from \"./tool-args.js\";\n\nexport const clip = (text: string, max = 200): string => {\n if (text.length <= max) return text;\n // Try to cut at a word boundary\n const cut = text.lastIndexOf(\" \", max);\n let end = cut > max * 0.6 ? cut : max;\n // Avoid splitting a surrogate pair\n if (end > 0 && end < text.length) {\n const code = text.charCodeAt(end - 1);\n if (code >= 0xd800 && code <= 0xdbff) end--;\n }\n return text.slice(0, end);\n};\n\n/**\n * Clip text to last sentence boundary at or before `max` chars.\n * Falls back to word boundary (clip()) if no sentence end is found in the\n * acceptable range. Trailing whitespace stripped.\n */\nexport const clipSentence = (text: string, max = 200): string => {\n if (text.length <= max) return text;\n // Look for sentence terminators followed by space/newline within [max*0.5, max]\n const window = text.slice(0, max);\n const matches = [...window.matchAll(/[.!?](?:\\s|$)/g)];\n if (matches.length > 0) {\n const last = matches[matches.length - 1];\n const end = (last.index ?? 0) + 1; // include the punctuation\n if (end >= max * 0.5) return text.slice(0, end);\n }\n return clip(text, max);\n};\n\nexport const nonEmptyLines = (text: string): string[] =>\n text\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\nexport const firstLine = (text: string, max = 200): string =>\n clip(text.split(\"\\n\")[0] ?? \"\", max);\n\nexport const textParts = (content: Message[\"content\"]): string[] => {\n if (!content) return [];\n if (typeof content === \"string\") return [content];\n return content\n .filter((part) => part.type === \"text\")\n .map((part) => part.text);\n};\n\nexport const textOf = (content: Message[\"content\"]): string =>\n textParts(content).join(\"\\n\");\n\n/**\n * Check if tool call arguments contain content-bearing data.\n *\n * A call is content-bearing if it has a path argument AND at least one\n * large string/array field (content, edits, oldText, newText).\n * This is a generic heuristic — not dependent on tool names.\n */\nexport const isContentBearing = (args: Record<string, unknown>): boolean => {\n if (!args || typeof args !== \"object\") return false;\n // Must have a path in one of the known keys (from tool-args.ts)\n const hasPath = PATH_KEYS.some((k) => typeof args[k] === \"string\");\n if (!hasPath) return false;\n // Must have at least one content-bearing field\n if (typeof args.content === \"string\" && args.content.length > 0) return true;\n // edits must be a non-empty array of objects (each with oldText/newText)\n if (\n Array.isArray(args.edits) &&\n args.edits.length > 0 &&\n args.edits.every((e) => typeof e === \"object\" && e !== null)\n )\n return true;\n // oldText/newText without edits are content-bearing\n if (\n typeof args.oldText === \"string\" &&\n args.oldText.length > 0 &&\n args.edits === undefined\n )\n return true;\n if (\n typeof args.newText === \"string\" &&\n args.newText.length > 0 &&\n args.edits === undefined\n )\n return true;\n return false;\n};\n\n/**\n * Extract textual content from tool call arguments (write, edit, hex_edit).\n *\n * Looks for content-bearing tool calls (those with a `path` argument and\n * at least one large string/array field like `content`, `edits`, `oldText`, `newText`).\n * Each call is capped at `maxBytesPerCall` to avoid inflating the search index.\n */\nexport const toolCallArgsText = (\n content: Message[\"content\"],\n maxBytesPerCall = 10_240,\n): string => {\n if (!content || typeof content === \"string\") return \"\";\n const parts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== \"object\" || part.type !== \"toolCall\") continue;\n const args = part.arguments as Record<string, unknown>;\n if (!isContentBearing(args)) continue;\n\n let extracted = \"\";\n if (typeof args.content === \"string\") {\n extracted += args.content.slice(0, maxBytesPerCall) + \"\\n\";\n }\n if (Array.isArray(args.edits)) {\n for (const edit of args.edits) {\n if (extracted.length >= maxBytesPerCall) break;\n if (edit && typeof edit === \"object\") {\n if (typeof edit.oldText === \"string\") {\n extracted +=\n edit.oldText.slice(0, Math.floor(maxBytesPerCall / 2)) + \"\\n\";\n }\n if (extracted.length >= maxBytesPerCall) break;\n if (typeof edit.newText === \"string\") {\n extracted +=\n edit.newText.slice(0, Math.floor(maxBytesPerCall / 2)) + \"\\n\";\n }\n }\n }\n }\n if (typeof args.oldText === \"string\" && !Array.isArray(args.edits)) {\n extracted += args.oldText.slice(0, maxBytesPerCall) + \"\\n\";\n }\n if (typeof args.newText === \"string\" && !Array.isArray(args.edits)) {\n extracted += args.newText.slice(0, maxBytesPerCall) + \"\\n\";\n }\n\n if (extracted) {\n parts.push(extracted.slice(0, maxBytesPerCall));\n }\n }\n return parts.join(\"\\n\");\n};\n\n/** Extract a snippet of ~`radius` chars around the first match of `term` in `text`. */\nexport const snippet = (\n text: string,\n term: string,\n radius = 60,\n): string | null => {\n const idx = text.toLowerCase().indexOf(term.toLowerCase());\n if (idx === -1) return null;\n const start = Math.max(0, idx - radius);\n const end = Math.min(text.length, idx + term.length + radius);\n const prefix = start > 0 ? \"...\" : \"\";\n const suffix = end < text.length ? \"...\" : \"\";\n return `${prefix}${text.slice(start, end)}${suffix}`;\n};\n","const ANSI_RE = /\\x1b\\[[0-9;]*[A-Za-z]/g;\nconst CTRL_RE = /[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g;\n\nexport const sanitize = (text: string): string =>\n text\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\")\n .replace(ANSI_RE, \"\")\n .replace(CTRL_RE, \"\");\n","/**\n * Message normalization — converts raw messages to NormalizedBlock array.\n *\n * Upstream: https://github.com/sting8k/pi-vcc (src/core/normalize.ts)\n * Unmodified.\n */\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport type { NormalizedBlock } from \"../types\";\nimport { textOf } from \"./content\";\nimport { sanitize } from \"./sanitize\";\n\n// Mirrors @earendil-works/pi-coding-agent's BashExecutionMessage (not re-exported from index)\ninterface LocalBashMessage {\n role: \"bashExecution\";\n command: string;\n output: string;\n exitCode: number | undefined;\n}\n\nconst normalizeOne = (msg: Message, msgIndex: number): NormalizedBlock[] => {\n if (msg.role === \"user\") {\n const blocks: NormalizedBlock[] = [];\n const text = sanitize(textOf(msg.content));\n if (text) blocks.push({ kind: \"user\", text, sourceIndex: msgIndex });\n if (msg.content && typeof msg.content !== \"string\") {\n for (const part of msg.content) {\n if (part.type === \"image\") {\n blocks.push({\n kind: \"user\",\n text: `[image: ${part.mimeType}]`,\n sourceIndex: msgIndex,\n });\n }\n }\n }\n return blocks.length > 0\n ? blocks\n : [{ kind: \"user\", text: \"\", sourceIndex: msgIndex }];\n }\n\n if ((msg as any).role === \"bashExecution\") {\n const bashMsg = msg as unknown as LocalBashMessage;\n return [\n {\n kind: \"bash\",\n command: bashMsg.command ?? \"\",\n output: bashMsg.output ?? \"\",\n exitCode: bashMsg.exitCode,\n sourceIndex: msgIndex,\n },\n ];\n }\n\n if (msg.role === \"toolResult\") {\n return [\n {\n kind: \"tool_result\",\n name: msg.toolName,\n text: sanitize(textOf(msg.content)),\n isError: msg.isError,\n sourceIndex: msgIndex,\n },\n ];\n }\n\n if (msg.role === \"assistant\") {\n if (!msg.content) return [];\n if (typeof msg.content === \"string\") {\n return [\n {\n kind: \"assistant\",\n text: sanitize(msg.content),\n sourceIndex: msgIndex,\n },\n ];\n }\n\n const blocks: NormalizedBlock[] = [];\n for (const part of msg.content) {\n if (part.type === \"text\") {\n blocks.push({\n kind: \"assistant\",\n text: sanitize(part.text),\n sourceIndex: msgIndex,\n });\n } else if (part.type === \"thinking\") {\n blocks.push({\n kind: \"thinking\",\n text: sanitize(part.thinking),\n redacted: part.redacted ?? false,\n sourceIndex: msgIndex,\n });\n } else if (part.type === \"toolCall\") {\n blocks.push({\n kind: \"tool_call\",\n name: part.name,\n args: part.arguments,\n sourceIndex: msgIndex,\n });\n }\n }\n return blocks;\n }\n\n return [];\n};\n\nexport const normalize = (messages: Message[]): NormalizedBlock[] =>\n messages.flatMap((msg, i) => normalizeOne(msg, i));\n","import type { NormalizedBlock } from \"../types\";\n\nconst NOISE_TOOLS = new Set([\n \"TodoWrite\",\n \"TodoRead\",\n \"ToolSearch\",\n \"WebSearch\",\n \"AskUser\",\n \"ExitSpecMode\",\n \"GenerateDroid\",\n]);\n\nconst NOISE_STRINGS = [\n \"Continue from where you left off.\",\n \"No response requested.\",\n \"IMPORTANT: TodoWrite was not called yet.\",\n];\n\nconst XML_WRAPPER_RE =\n /<(system-reminder|ide_opened_file|command-message|context-window-usage)[^>]*>[\\s\\S]*?<\\/\\1>/g;\n\n/** Return cleaned user text, or null if the block is noise. Cleans once. */\nconst cleanOrNull = (text: string): string | null => {\n const trimmed = text.trim();\n if (NOISE_STRINGS.some((s) => trimmed.includes(s))) return null;\n const cleaned = trimmed.replace(XML_WRAPPER_RE, \"\").trim();\n return cleaned.length > 0 ? cleaned : null;\n};\n\nexport const filterNoise = (blocks: NormalizedBlock[]): NormalizedBlock[] => {\n const out: NormalizedBlock[] = [];\n for (const b of blocks) {\n if (b.kind === \"thinking\") continue;\n if (b.kind === \"tool_call\" && NOISE_TOOLS.has(b.name)) continue;\n if (b.kind === \"tool_result\" && NOISE_TOOLS.has(b.name)) continue;\n if (b.kind === \"user\") {\n const cleaned = cleanOrNull(b.text);\n if (!cleaned) continue;\n out.push({ ...b, text: cleaned }); // preserve sourceIndex and any future fields\n continue;\n }\n out.push(b);\n }\n return out;\n};\n","/** Shared skill-tag collapse utilities */\n\nconst SKILL_TAG_RE = /^-?\\s*<skill\\s+name=\"([^\"]+)\"/;\nconst SKILL_CLOSE_RE = /^-?\\s*<\\/skill>/;\n\n/** Collapse skill tags in an array of lines — dedup by name, drop all content inside block */\nexport const collapseSkillLines = (lines: string[]): string[] => {\n const result: string[] = [];\n const seenSkills = new Set<string>();\n let insideSkill = false;\n\n for (const line of lines) {\n const skillMatch = line.match(SKILL_TAG_RE);\n if (skillMatch) {\n insideSkill = true;\n const name = skillMatch[1];\n if (!seenSkills.has(name)) {\n seenSkills.add(name);\n result.push(`[skill: ${name}]`);\n }\n continue;\n }\n if (insideSkill) {\n if (SKILL_CLOSE_RE.test(line)) insideSkill = false;\n continue;\n }\n result.push(line);\n }\n return result;\n};\n\n/** Collapse <skill name=\"X\" ...>...</skill> blocks in raw text */\nconst SKILL_BLOCK_RE = /<skill\\s+name=\"([^\"]+)\"[^>]*>[\\s\\S]*?(?:<\\/skill>|$)/g;\nexport const collapseSkillText = (text: string): string =>\n text.replace(SKILL_BLOCK_RE, (_, name) => `[skill: ${name}]`);\n","import type { NormalizedBlock } from \"../types\";\nimport { nonEmptyLines, clip } from \"../core/content\";\nimport { collapseSkillLines } from \"../core/skill-collapse\";\n\nconst SCOPE_CHANGE_RE =\n /\\b(instead|actually|change of plan|forget that|new task|switch to|now I want|pivot|let'?s do|stop .* and)\\b/i;\n\nconst TASK_RE =\n /\\b(fix|implement|add|create|build|refactor|debug|investigate|update|remove|delete|migrate|deploy|test|write|set up)\\b/i;\n\nconst NOISE_SHORT_RE =\n /^(ok|yes|no|sure|yeah|yep|go|hi|hey|thx|thanks|ok\\b.*|y|n|k)\\s*[.!?]*$/i;\n\n// Reject lines that are clearly not user goals (pasted output, code, paths, tool dumps)\n// or meta-prompt boilerplate (command templates like `/issues` that start with \"For each issue:\"\n// followed by numbered \"Read the issue in full...\" steps).\nconst NON_GOAL_RE =\n /^\\s*[\\[│├└─╭╰]|```|^\\s*(=[A-Z]+\\(|function |const |let |var |import |export |class )|^(https?:|file:|\\/[A-Za-z])|\\\\n|^\\s*For each\\b|\\bin full\\b[^\\n]*\\b(comments|issue|issues|PRs?|linked)\\b/;\n\n// Signals that the rest of the user message is a command template (e.g. /issues),\n// in which case we should stop collecting goals at the signal line.\nconst TEMPLATE_SIGNAL_RE =\n /^\\s*(For each\\b|Do NOT implement\\b|Analyze and propose\\b|If Task\\/context\\b|Output:\\s*$)/i;\n\nconst truncateAtTemplate = (lines: string[]): string[] => {\n const idx = lines.findIndex((l) => TEMPLATE_SIGNAL_RE.test(l));\n return idx >= 0 ? lines.slice(0, idx) : lines;\n};\n\nconst stripLeadingBullet = (line: string): string =>\n line.replace(/^\\s*(?:[-*+]|\\d+\\.)\\s+/, \"\").trim();\n\nconst MAX_GOAL_CHARS = 200;\n\nconst isSubstantiveGoal = (text: string): boolean => {\n const t = text.trim();\n if (t.length <= 5) return false;\n if (t.length > MAX_GOAL_CHARS) return false;\n if (NOISE_SHORT_RE.test(t)) return false;\n if (NON_GOAL_RE.test(t)) return false;\n return true;\n};\n\nconst FIRST_MSG_CLIP = 80;\n\nconst indexSuffix = (sourceIndex?: number): string =>\n sourceIndex != null ? ` (#${sourceIndex})` : \"\";\n\n// Test scope-change / task intent only on the leading portion of a user block\n// so that pasted outputs below the actual instruction do not trigger matches.\nconst LEADING_CHARS = 200;\n\nexport const extractGoals = (blocks: NormalizedBlock[]): string[] => {\n const goals: string[] = [];\n let latestScopeChange: string[] | null = null;\n let latestScopeIndex: number | undefined;\n\n for (const b of blocks) {\n if (b.kind !== \"user\") continue;\n const rawLines = nonEmptyLines(b.text);\n const truncated = truncateAtTemplate(rawLines);\n const lines = collapseSkillLines(truncated.filter(isSubstantiveGoal))\n .map(stripLeadingBullet)\n .filter((l) => l.length > 5);\n if (lines.length === 0) continue;\n\n if (goals.length === 0) {\n goals.push(\n ...lines\n .slice(0, 6)\n .map((l) => clip(l, FIRST_MSG_CLIP) + indexSuffix(b.sourceIndex)),\n );\n continue;\n }\n\n const leading = b.text.slice(0, LEADING_CHARS);\n if (SCOPE_CHANGE_RE.test(leading)) {\n latestScopeChange = lines.slice(0, 3).map((l) => clip(l, MAX_GOAL_CHARS));\n latestScopeIndex = b.sourceIndex;\n } else if (TASK_RE.test(leading) && lines[0].length > 15) {\n latestScopeChange = lines.slice(0, 2).map((l) => clip(l, MAX_GOAL_CHARS));\n latestScopeIndex = b.sourceIndex;\n }\n }\n\n // Only emit the [Scope change] marker when we actually captured bullets.\n if (latestScopeChange && latestScopeChange.length > 0) {\n goals.push(\"[Scope change]\");\n for (const line of latestScopeChange) {\n goals.push(line + indexSuffix(latestScopeIndex));\n }\n }\n\n return goals.slice(0, 8);\n};\n","import type { FileOps, NormalizedBlock } from \"../types\";\nimport { extractPath } from \"../core/tool-args\";\n\ninterface FileActivity {\n read: Set<string>;\n modified: Set<string>;\n created: Set<string>;\n}\n\nconst FILE_READ_TOOLS = new Set([\"Read\", \"read_file\", \"View\"]);\n\nconst FILE_WRITE_TOOLS = new Set([\n \"Edit\",\n \"Write\",\n \"edit\",\n \"write\",\n \"edit_file\",\n \"write_file\",\n \"MultiEdit\",\n]);\n\n// Pi never exposes a \"createdFiles\" field — Write operations are tracked as modified.\n// FILE_CREATE_TOOLS kept as empty set for forward-compat if Pi adds a creation signal.\nconst FILE_CREATE_TOOLS = new Set<string>();\n\n/**\n * Find the longest common directory prefix among absolute paths.\n * Returns \"\" if fewer than 2 absolute paths or no meaningful common prefix.\n */\nconst longestCommonDirPrefix = (paths: string[]): string => {\n // Normalize backslashes (Windows) to forward slashes for uniform comparison\n const normalized = paths.map((p) => p.replace(/\\\\/g, \"/\"));\n const abs = normalized.filter(\n (p) => p.startsWith(\"/\") || /^[A-Za-z]:\\//.test(p),\n );\n if (abs.length < 2) return \"\";\n const split = abs.map((p) => p.split(\"/\"));\n const min = Math.min(...split.map((s) => s.length));\n let i = 0;\n while (i < min - 1) {\n const seg = split[0][i];\n if (!split.every((s) => s[i] === seg)) break;\n i++;\n }\n if (i < 2) return \"\"; // require at least /a/b common\n return split[0].slice(0, i).join(\"/\") + \"/\";\n};\n\nconst trimPaths = (set: Set<string>, prefix: string): Set<string> => {\n if (!prefix) return set;\n const out = new Set<string>();\n for (const p of set) {\n out.add(p.startsWith(prefix) ? p.slice(prefix.length) : p);\n }\n return out;\n};\n\nexport const extractFiles = (\n blocks: NormalizedBlock[],\n fileOps?: FileOps,\n): FileActivity => {\n const act: FileActivity = {\n read: new Set(fileOps?.readFiles ?? []),\n modified: new Set(fileOps?.modifiedFiles ?? []),\n created: new Set(fileOps?.createdFiles ?? []),\n };\n\n for (const b of blocks) {\n if (b.kind !== \"tool_call\") continue;\n const p = extractPath(b.args);\n if (!p) continue;\n\n if (FILE_READ_TOOLS.has(b.name)) act.read.add(p);\n if (FILE_WRITE_TOOLS.has(b.name)) act.modified.add(p);\n if (FILE_CREATE_TOOLS.has(b.name)) act.created.add(p);\n }\n\n const all = [...act.read, ...act.modified, ...act.created];\n const prefix = longestCommonDirPrefix(all);\n if (prefix) {\n act.read = trimPaths(act.read, prefix);\n act.modified = trimPaths(act.modified, prefix);\n act.created = trimPaths(act.created, prefix);\n }\n\n return act;\n};\n","import type { NormalizedBlock } from \"../types\";\nimport { clip, nonEmptyLines } from \"../core/content\";\n\n// Tightened patterns: require a clear preference construction, not bare keywords.\nconst PREF_PATTERNS = [\n /\\bprefer(?:s|red|ring)?\\s+\\w/i,\n /\\bdon'?t want\\b/i,\n /\\balways (?:use|do|run|prefer|keep|make|format|write|add|set|put|prefix|start|include|append)\\b/i,\n /\\bnever (?:use|do|run|push|commit|write|ignore|add|set|put|remove|delete|include|deploy)\\b/i,\n /\\bplease (?:use|avoid|keep|make|don'?t|do not|format|write)\\b/i,\n /\\b(?:style|format|language|naming)\\s*[:=]\\s*\\S/i,\n];\n\nexport const extractPreferences = (blocks: NormalizedBlock[]): string[] => {\n const prefs: string[] = [];\n const seen = new Set<string>();\n\n for (const b of blocks) {\n if (b.kind !== \"user\") continue;\n\n let perBlock = 0;\n for (const line of nonEmptyLines(b.text)) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.length < 5) continue;\n if (trimmed.length > 200) continue;\n // Reject questions.\n if (trimmed.endsWith(\"?\") || trimmed.includes(\"?...\")) continue;\n if (!PREF_PATTERNS.some((p) => p.test(trimmed))) continue;\n\n const clipped = clip(trimmed, 200);\n const key = clipped.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n prefs.push(clipped);\n\n // Cap per user block to avoid pasting long rule lists as many prefs.\n if (++perBlock >= 1) break;\n }\n }\n\n return prefs.slice(0, 10);\n};\n\n/**\n * Remove preferences that duplicate goals (case-insensitive, trimmed).\n * Called by `buildSections` so that the two sections do not overlap.\n */\nexport const dedupPreferencesAgainstGoals = (\n prefs: string[],\n goals: string[],\n): string[] => {\n const norm = (s: string) => s.trim().toLowerCase();\n const goalSet = new Set(goals.map(norm));\n return prefs.filter((p) => !goalSet.has(norm(p)));\n};\n","import type { NormalizedBlock } from \"../types\";\n\ninterface CommitInfo {\n hash?: string;\n message: string;\n}\n\nconst COMMIT_MSG_RE =\n /git\\s+commit[^\\n]*?-m\\s+(?:\"((?:[^\"\\\\]|\\\\.)*)\"|'((?:[^'\\\\]|\\\\.)*)'|\\$?'((?:[^'\\\\]|\\\\.)*)')/;\n// Match short hash from git output — only as fallback after bracket/range patterns fail.\n// Requires 8+ hex chars to reduce false positives from random hex in tool output.\nconst HASH_RE = /\\b([0-9a-f]{8,12})\\b/;\n\nconst firstLineOf = (text: string): string => {\n const line = text.split(/\\\\n|\\n/)[0] ?? \"\";\n return line.trim();\n};\n\nconst cleanMessage = (msg: string): string =>\n msg.replace(/\\\\\"/g, '\"').replace(/\\\\'/g, \"'\").trim();\n\n/** Extract commit hash from git output text (tool_result or bash output). */\nconst extractHashFromOutput = (text: string): string | undefined => {\n const bracket = text.match(/\\[\\S+\\s+([0-9a-f]{7,12})\\]/);\n if (bracket) return bracket[1];\n const range = text.match(/\\b([0-9a-f]{7,12})\\.\\.([0-9a-f]{7,12})\\b/);\n if (range) return range[2];\n const plain = text.match(HASH_RE);\n if (plain) return plain[1];\n return undefined;\n};\n\n/** Try to extract a commit message from a git commit command string. */\nconst tryExtractMessage = (cmd: string): string | undefined => {\n if (!/\\bgit\\s+commit\\b/.test(cmd)) return undefined;\n const m = cmd.match(COMMIT_MSG_RE);\n if (!m) return undefined;\n const message = firstLineOf(cleanMessage(m[1] ?? m[2] ?? m[3] ?? \"\"));\n return message || undefined;\n};\n\n/**\n * Extract git commits from bash tool calls, bash execution messages,\n * and user messages that wrap bash execution output (post-convertToLlm).\n *\n * Handles three block kinds:\n * - tool_call (name: \"bash\") — agent tool call to the bash tool\n * - bash — pi's internal bashExecution message\n * - user — convertToLlm wraps bashExecution as \"Ran `cmd`\\n```\\noutput\\n```\"\n */\nexport const extractCommits = (blocks: NormalizedBlock[]): CommitInfo[] => {\n const commits: CommitInfo[] = [];\n const addCommit = (hash: string | undefined, message: string) => {\n const key = `${hash ?? \"\"}::${message}`;\n if (!commits.some((c) => `${c.hash ?? \"\"}::${c.message}` === key)) {\n commits.push({ hash, message });\n }\n };\n\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n\n // ── Case 1: tool_call (agent calls bash tool) ──\n if (b.kind === \"tool_call\" && b.name === \"bash\") {\n const cmd =\n b.args && typeof b.args.command === \"string\" ? b.args.command : \"\";\n const message = tryExtractMessage(cmd);\n if (!message) continue;\n\n let hash: string | undefined;\n for (let j = i + 1; j < Math.min(blocks.length, i + 3); j++) {\n const r = blocks[j];\n if (r.kind !== \"tool_result\") continue;\n hash = extractHashFromOutput(r.text);\n if (hash) break;\n }\n addCommit(hash, message);\n continue;\n }\n\n // ── Case 2: bash execution message ──\n if (b.kind === \"bash\") {\n const message = tryExtractMessage(b.command);\n if (!message) continue;\n const hash = extractHashFromOutput(b.output);\n addCommit(hash, message);\n continue;\n }\n\n // ── Case 3: user message wrapping a bash execution (post-convertToLlm) ──\n if (b.kind === \"user\") {\n // Detect \"Ran `git commit -m \"...\"`\" pattern in user text\n const ranCmd = b.text.match(/Ran\\s+`((?:[^`\\\\]|\\\\.)*)`/);\n if (!ranCmd) continue;\n const message = tryExtractMessage(ranCmd[1]);\n if (!message) continue;\n // Extract output from the code block following the command\n const codeBlock = b.text.match(/```\\n([\\s\\S]*?)```/);\n const hash = codeBlock ? extractHashFromOutput(codeBlock[1]) : undefined;\n addCommit(hash, message);\n }\n }\n\n return commits;\n};\n\nexport const formatCommits = (commits: CommitInfo[], limit = 8): string[] => {\n const lines: string[] = [];\n const items = commits.slice(-limit); // keep most recent\n for (const c of items) {\n const prefix = c.hash ? `${c.hash}: ` : \"\";\n lines.push(`${prefix}${c.message}`);\n }\n return lines;\n};\n","import type { NormalizedBlock } from \"../types\";\nimport { clip, firstLine } from \"./content\";\nimport { extractPath } from \"./tool-args\";\nimport { collapseSkillText } from \"./skill-collapse\";\n\nconst TRUNCATE_USER = 256;\nconst TRUNCATE_ASSISTANT = 200;\n\n// Strip common self-reflective assistant prefixes that carry no semantic info.\n// Conservative list: only removes the leading filler, preserves the actual content.\nconst SELF_TALK_PREFIX_RE =\n /^\\s*(?:hmm|wait|actually|oh|okay|ok|well|so)[,.!\\s-]+/i;\n\n// ── noise filtering ──\n\nconst isNoiseUser = (text: string): boolean => {\n return !text.trim();\n};\n\n// ── truncation ──\n\n// Unicode-aware word segmentation via Intl.Segmenter with lazy init & fallback\nlet _segmenter: Intl.Segmenter | null | undefined = undefined;\nconst wordSegments = (\n text: string,\n): Array<{ segment: string; index: number; isWordLike?: boolean }> => {\n // Available: fast path\n if (_segmenter) return Array.from(_segmenter.segment(text));\n // Fallback already established: don't retry the constructor\n if (_segmenter === null) {\n const parts: Array<{\n segment: string;\n index: number;\n isWordLike?: boolean;\n }> = [];\n let idx = 0;\n for (const part of text.split(/(\\s+)/)) {\n if (!part) continue;\n parts.push({ segment: part, index: idx, isWordLike: /\\S/.test(part) });\n idx += part.length;\n }\n return parts;\n }\n // _segmenter === undefined: first call — attempt construction\n try {\n _segmenter = new Intl.Segmenter(undefined, { granularity: \"word\" });\n return Array.from(_segmenter.segment(text));\n } catch {\n _segmenter = null; // permanently fallback\n const parts: Array<{\n segment: string;\n index: number;\n isWordLike?: boolean;\n }> = [];\n let idx = 0;\n for (const part of text.split(/(\\s+)/)) {\n if (!part) continue;\n parts.push({ segment: part, index: idx, isWordLike: /\\S/.test(part) });\n idx += part.length;\n }\n return parts;\n }\n};\n\n/** Check if segment is a word (Bun's isWordLike is unreliable for alphanumeric tokens) */\nconst isWord = (seg: { segment: string; isWordLike?: boolean }): boolean =>\n !!seg.isWordLike || /[\\p{L}\\p{N}]/u.test(seg.segment);\n\n// Common stop words — don't count toward budget\nconst STOP_WORDS = new Set([\n \"a\",\n \"an\",\n \"the\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"be\",\n \"been\",\n \"being\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"will\",\n \"would\",\n \"could\",\n \"should\",\n \"may\",\n \"might\",\n \"shall\",\n \"can\",\n \"need\",\n \"must\",\n \"to\",\n \"of\",\n \"in\",\n \"for\",\n \"on\",\n \"with\",\n \"at\",\n \"by\",\n \"from\",\n \"as\",\n \"into\",\n \"through\",\n \"during\",\n \"before\",\n \"after\",\n \"above\",\n \"below\",\n \"between\",\n \"under\",\n \"over\",\n \"and\",\n \"but\",\n \"or\",\n \"nor\",\n \"not\",\n \"so\",\n \"yet\",\n \"both\",\n \"either\",\n \"neither\",\n \"each\",\n \"every\",\n \"all\",\n \"any\",\n \"few\",\n \"more\",\n \"most\",\n \"other\",\n \"some\",\n \"such\",\n \"no\",\n \"that\",\n \"this\",\n \"these\",\n \"those\",\n \"it\",\n \"its\",\n \"i\",\n \"me\",\n \"my\",\n \"we\",\n \"our\",\n \"you\",\n \"your\",\n \"he\",\n \"him\",\n \"his\",\n \"she\",\n \"her\",\n \"they\",\n \"them\",\n \"their\",\n \"who\",\n \"which\",\n \"what\",\n \"if\",\n \"then\",\n \"than\",\n \"when\",\n \"where\",\n \"how\",\n \"just\",\n \"also\",\n]);\n\nconst truncateTokens = (text: string, limit: number): string => {\n const flat = text.replace(/\\s+/g, \" \").trim();\n let count = 0;\n let lastEnd = 0;\n for (const seg of wordSegments(flat)) {\n if (isWord(seg)) {\n if (!STOP_WORDS.has(seg.segment.toLowerCase())) {\n count++;\n if (count > limit) {\n return flat.slice(0, lastEnd).trimEnd() + \"...(truncated)\";\n }\n }\n }\n lastEnd = seg.index + seg.segment.length;\n }\n return flat;\n};\n\n// ── bash command compression ──\n\nconst BASH_CAP = 120;\n// Only strip pure-formatting pipe tails (head/tail for truncation, sort/wc/column for display).\n// awk/python3/node/bun are data-processing commands — their output carries semantic meaning.\nconst PIPE_TAIL_RE =\n /\\s*\\|\\s*(?:head|tail|sort|wc|column|tr|cut|uniq)(?:\\s[^|]*)?$/;\n\n/** Semantic compression: strip cd prefix, pipe tail formatting, cap length */\nconst compressBash = (raw: string): string => {\n // Flatten multi-line: join lines with semicolons\n let cmd = raw\n .split(\"\\n\")\n .map((l) => l.trim())\n .filter(Boolean)\n .join(\"; \");\n // Strip cd <path> && prefix\n cmd = cmd.replace(/^cd\\s+\\S+\\s*&&\\s*/, \"\");\n // Strip pipe tail formatting commands (up to 10 iterations, stop when stable)\n for (let i = 0; i < 10; i++) {\n const stripped = cmd.replace(PIPE_TAIL_RE, \"\");\n if (stripped === cmd) break;\n cmd = stripped;\n }\n if (cmd.length > BASH_CAP) {\n // Cut at word boundary to avoid mid-word truncation\n const cut = cmd.lastIndexOf(\" \", BASH_CAP - 2);\n const end = cut > BASH_CAP * 0.6 ? cut : BASH_CAP - 3;\n return cmd.slice(0, end).trimEnd() + \"...\";\n }\n return cmd;\n};\n\n// ── tool summary ──\n\nconst TOOL_SUMMARY_FIELDS: Record<string, string> = {\n Read: \"file_path\",\n Edit: \"file_path\",\n Write: \"file_path\",\n read: \"path\",\n edit: \"path\",\n write: \"path\",\n Glob: \"pattern\",\n Grep: \"pattern\",\n};\n\nconst toolOneLiner = (name: string, args: Record<string, unknown>): string => {\n const field = TOOL_SUMMARY_FIELDS[name];\n if (field && typeof args[field] === \"string\") {\n return `* ${name} \"${args[field] as string}\"`;\n }\n const path = extractPath(args);\n if (path) return `* ${name} \"${path}\"`;\n if (name === \"bash\" || name === \"Bash\") {\n const raw = (args.command ?? args.description ?? \"\") as string;\n const cmd = compressBash(raw);\n return `* ${name} \"${cmd}\"`;\n }\n if (typeof args.query === \"string\") {\n return `* ${name} \"${clip(args.query as string, 60)}\"`;\n }\n return `* ${name}`;\n};\n\nexport interface BriefLine {\n /** Section header like \"[user]\", \"[assistant]\", \"[tool_error] bash\" */\n header: string;\n /** Content lines for this section */\n lines: string[];\n}\n\n/** Structured transcript entry for JSON output */\nexport interface TranscriptEntry {\n role: \"user\" | \"assistant\" | \"tool_error\";\n text?: string;\n tool?: string;\n cmd?: string;\n ref?: string;\n /** Collapse count when identical tool calls are grouped */\n count?: number;\n}\n\n/**\n * Build BriefLine sections from NormalizedBlocks.\n */\nexport const buildBriefSections = (blocks: NormalizedBlock[]): BriefLine[] => {\n const sections: BriefLine[] = [];\n let lastHeader = \"\";\n\n const push = (header: string, line: string) => {\n if (header === lastHeader && sections.length > 0) {\n sections[sections.length - 1].lines.push(line);\n return;\n }\n sections.push({ header, lines: [line] });\n lastHeader = header;\n };\n\n for (const b of blocks) {\n switch (b.kind) {\n case \"user\": {\n if (isNoiseUser(b.text)) break;\n const text = truncateTokens(collapseSkillText(b.text), TRUNCATE_USER);\n if (text) {\n const ref = b.sourceIndex != null ? ` (#${b.sourceIndex})` : \"\";\n push(\"[user]\", text + ref);\n }\n lastHeader = \"[user]\";\n break;\n }\n case \"bash\": {\n const cmd = compressBash(b.command);\n const ref = b.sourceIndex != null ? ` (#${b.sourceIndex})` : \"\";\n if (cmd) {\n push(\"[user]\", `$ ${cmd}${ref}`);\n }\n lastHeader = \"[user]\";\n break;\n }\n case \"assistant\": {\n let raw = b.text;\n // Strip leading self-talk prefix (up to 2x; assistants sometimes chain \"Hmm, actually, ...\")\n for (let i = 0; i < 2; i++) {\n const stripped = raw.replace(SELF_TALK_PREFIX_RE, \"\");\n if (stripped === raw) break;\n raw = stripped;\n }\n const text = truncateTokens(raw, TRUNCATE_ASSISTANT);\n if (text) {\n const ref = b.sourceIndex != null ? ` (#${b.sourceIndex})` : \"\";\n push(\"[assistant]\", text + ref);\n }\n break;\n }\n case \"tool_call\": {\n // Skip malformed tool calls from streaming providers (empty name / fragmented args).\n if (!b.name || b.name.trim() === \"\") break;\n const ref = b.sourceIndex != null ? ` (#${b.sourceIndex})` : \"\";\n const summary = toolOneLiner(b.name, b.args) + ref;\n push(\"[assistant]\", summary);\n break;\n }\n case \"tool_result\": {\n if (b.isError) {\n const body = firstLine(b.text, 150);\n // Drop empty/placeholder error bodies — keep the line only if it carries info.\n if (!body || body === \"(no output)\") break;\n const ref = b.sourceIndex != null ? ` (#${b.sourceIndex})` : \"\";\n const header = `[tool_error] ${b.name}${ref}`;\n push(header, body);\n lastHeader = header;\n }\n break;\n }\n case \"thinking\":\n break;\n }\n }\n\n // Collapse consecutive identical tool lines (same text, different #ref)\n for (const sec of sections) {\n if (sec.header !== \"[assistant]\") continue;\n const out: string[] = [];\n for (const line of sec.lines) {\n if (!line.startsWith(\"* \")) {\n out.push(line);\n continue;\n }\n const ref = line.match(/\\(#(\\d+)\\)$/)?.[1] ?? \"\";\n const base = ref ? line.slice(0, -(ref.length + 3)).trimEnd() : line;\n const last = out.length > 0 ? out[out.length - 1] : \"\";\n const m = last.match(/^(.*) \\((#[\\d, #]+)\\) x(\\d+)$/);\n if (m && m[1] === base) {\n out[out.length - 1] =\n `${base} (${m[2]}, #${ref}) x${parseInt(m[3]) + 1}`;\n } else if (\n last.match(/\\(#\\d+\\)$/) &&\n last.replace(/\\s*\\(#\\d+\\)$/, \"\") === base\n ) {\n const prevRef = last.match(/\\(#(\\d+)\\)$/)?.[1];\n out[out.length - 1] = `${base} (#${prevRef}, #${ref}) x2`;\n } else {\n out.push(line);\n }\n }\n sec.lines = out;\n }\n\n // Cap tool calls per [assistant] turn — keep tail (latest actions tend to\n // be the deciding edits/writes; head is usually exploration noise).\n const TOOL_CALLS_PER_TURN = 8;\n for (const sec of sections) {\n if (sec.header !== \"[assistant]\") continue;\n const toolIdxs = sec.lines\n .map((l, i) => (l.startsWith(\"* \") ? i : -1))\n .filter((i) => i >= 0);\n if (toolIdxs.length <= TOOL_CALLS_PER_TURN) continue;\n const dropCount = toolIdxs.length - TOOL_CALLS_PER_TURN;\n const dropSet = new Set(toolIdxs.slice(0, dropCount));\n const firstKeptToolIdx = toolIdxs[dropCount];\n const next: string[] = [];\n let inserted = false;\n for (let i = 0; i < sec.lines.length; i++) {\n if (dropSet.has(i)) continue;\n if (!inserted && i === firstKeptToolIdx) {\n next.push(`* (${dropCount} earlier tool-call entries omitted)`);\n inserted = true;\n }\n next.push(sec.lines[i]);\n }\n sec.lines = next;\n }\n\n // Collapse consecutive identical [tool_error] sections (same tool, same body).\n // E.g. 20 back-to-back `[tool_error] bash (#N) ... Command aborted` become one\n // `[tool_error] bash (#refs...) x20` entry.\n const collapsedErrors: BriefLine[] = [];\n for (const sec of sections) {\n const m = sec.header.match(/^\\[tool_error\\]\\s+(\\S+?)(?:\\s*\\(#(\\d+)\\))?$/);\n if (!m || sec.lines.length !== 1) {\n collapsedErrors.push(sec);\n continue;\n }\n const tool = m[1];\n const ref = m[2];\n const body = sec.lines[0];\n const prev = collapsedErrors[collapsedErrors.length - 1];\n const prevMatch = prev?.header.match(\n /^\\[tool_error\\]\\s+(\\S+?)\\s*\\(((?:#\\d+(?:,\\s*)?)+)\\)(?:\\s*x(\\d+))?$/,\n );\n if (\n prev &&\n prevMatch &&\n prevMatch[1] === tool &&\n prev.lines.length === 1 &&\n prev.lines[0] === body\n ) {\n const refs = prevMatch[2] + (ref ? `, #${ref}` : \"\");\n const count = prevMatch[3] ? parseInt(prevMatch[3]) + 1 : 2;\n prev.header = `[tool_error] ${tool} (${refs}) x${count}`;\n } else {\n collapsedErrors.push(sec);\n }\n }\n sections.length = 0;\n sections.push(...collapsedErrors);\n\n return sections;\n};\n\n/**\n * Stringify BriefLine sections into text format.\n */\nexport const stringifyBrief = (sections: BriefLine[]): string => {\n // Emit sections -- suppress blank lines between consecutive tool/error summaries\n const out: string[] = [];\n for (let i = 0; i < sections.length; i++) {\n const sec = sections[i];\n if (i > 0) {\n const prev = sections[i - 1];\n const prevIsToolLike =\n (prev.header === \"[assistant]\" &&\n prev.lines.every((l) => l.startsWith(\"* \"))) ||\n prev.header.startsWith(\"[tool_error]\");\n const curIsToolLike =\n (sec.header === \"[assistant]\" &&\n sec.lines.every((l) => l.startsWith(\"* \"))) ||\n sec.header.startsWith(\"[tool_error]\");\n if (!(prevIsToolLike && curIsToolLike)) {\n out.push(\"\");\n }\n }\n out.push(sec.header);\n for (const line of sec.lines) {\n out.push(line);\n }\n }\n\n return out.join(\"\\n\");\n};\n\n/** Parse a text line into a structured TranscriptEntry */\nconst parseToolLine = (\n line: string,\n): { tool: string; cmd?: string; ref?: string; count?: number } | null => {\n // * bash \"cmd\" (#5)\n // * bash \"cmd\" (#1, #3) x2\n // * tilth \"query\" (#7)\n const m = line.match(\n /^\\* (\\S+)\\s*(?:\"([^\"]*)\")?\\s*(?:\\((#[\\d, #]+)\\))?\\s*(?:x(\\d+))?$/,\n );\n if (!m) return null;\n return {\n tool: m[1],\n cmd: m[2] || undefined,\n ref: m[3] || undefined,\n count: m[4] ? parseInt(m[4]) : undefined,\n };\n};\n\nconst extractRef = (text: string): { clean: string; ref?: string } => {\n const m = text.match(/\\s*\\(#(\\d+)\\)$/);\n if (!m) return { clean: text };\n return { clean: text.slice(0, m.index).trimEnd(), ref: `#${m[1]}` };\n};\n\n/**\n * Convert BriefLine sections to structured TranscriptEntry array for JSON output.\n */\nexport const sectionsToTranscript = (\n sections: BriefLine[],\n): TranscriptEntry[] => {\n const entries: TranscriptEntry[] = [];\n\n for (const sec of sections) {\n if (sec.header === \"[user]\") {\n for (const line of sec.lines) {\n const { clean, ref } = extractRef(line);\n entries.push({ role: \"user\", text: clean, ...(ref && { ref }) });\n }\n } else if (sec.header === \"[assistant]\") {\n for (const line of sec.lines) {\n if (line.startsWith(\"* \")) {\n const parsed = parseToolLine(line);\n if (parsed) {\n entries.push({\n role: \"assistant\",\n tool: parsed.tool,\n ...(parsed.cmd && { cmd: parsed.cmd }),\n ...(parsed.ref && { ref: parsed.ref }),\n ...(parsed.count && { count: parsed.count }),\n });\n } else {\n // Fallback: unparseable tool line\n const { clean, ref } = extractRef(line.slice(2));\n entries.push({\n role: \"assistant\",\n text: clean,\n ...(ref && { ref }),\n });\n }\n } else {\n const { clean, ref } = extractRef(line);\n entries.push({ role: \"assistant\", text: clean, ...(ref && { ref }) });\n }\n }\n } else if (sec.header.startsWith(\"[tool_error]\")) {\n // [tool_error] bash (#5)\n const headerMatch = sec.header.match(\n /^\\[tool_error\\]\\s+(\\S+)\\s*(?:\\(#(\\d+)\\))?/,\n );\n const tool = headerMatch?.[1] ?? \"unknown\";\n const ref = headerMatch?.[2] ? `#${headerMatch[2]}` : undefined;\n for (const line of sec.lines) {\n entries.push({\n role: \"tool_error\",\n tool,\n text: line,\n ...(ref && { ref }),\n });\n }\n }\n }\n\n return entries;\n};\n\n/** Convenience: build sections from blocks and stringify to text */\nexport const compileBrief = (blocks: NormalizedBlock[]): string =>\n stringifyBrief(buildBriefSections(blocks));\n","/**\n * Section building — parses normalized blocks into structured sections.\n *\n * Upstream: https://github.com/sting8k/pi-vcc (src/core/build-sections.ts)\n * Unmodified.\n */\nimport type { NormalizedBlock } from \"../types\";\nimport { clipSentence, firstLine, nonEmptyLines } from \"./content\";\nimport type { SectionData } from \"../sections\";\nimport { extractGoals } from \"../extract/goals\";\nimport { extractFiles } from \"../extract/files\";\nimport {\n extractPreferences,\n dedupPreferencesAgainstGoals,\n} from \"../extract/preferences\";\nimport { extractCommits, formatCommits } from \"../extract/commits\";\nimport { buildBriefSections, stringifyBrief } from \"./brief\";\n\nexport interface BuildSectionsInput {\n blocks: NormalizedBlock[];\n}\n\nconst BLOCKER_RE =\n /\\b(fail(ed|s|ure|ing)?|broken|cannot|can't|won't work|does not work|doesn't work|still (broken|failing|wrong)|blocked|blocker|not (fixed|resolved|working)|crash(es|ed|ing)?)\\b/i;\n\nconst extractOutstandingContext = (blocks: NormalizedBlock[]): string[] => {\n const items: string[] = [];\n const tail = blocks.slice(-20);\n\n for (const b of tail) {\n if (b.kind === \"tool_result\" && b.isError) {\n items.push(`[${b.name}] ${firstLine(b.text, 150)}`);\n continue;\n }\n\n if (b.kind === \"assistant\" || b.kind === \"user\") {\n for (const line of nonEmptyLines(b.text)) {\n if (!BLOCKER_RE.test(line)) continue;\n if (line.length < 15) continue;\n // Skip continuation fragments (sub-bullets, parentheticals, dangling clauses)\n if (/^\\s*[-*+>]\\s/.test(line)) continue;\n if (/^\\s*\\(/.test(line)) continue;\n // Require sentence-like start: capital letter, code identifier, or quote\n if (!/^\\s*[\"'`*_]?[A-Z`]/.test(line)) continue;\n const clipped =\n b.kind === \"user\"\n ? `[user] ${clipSentence(line, 150)}`\n : clipSentence(line, 150);\n if (!items.includes(clipped)) items.push(clipped);\n break;\n }\n }\n }\n\n return items.slice(0, 5);\n};\n\nconst formatFileActivity = (blocks: NormalizedBlock[]): string[] => {\n const act = extractFiles(blocks);\n // Dedup: if already Modified, drop from Created (file existed before)\n for (const p of act.modified) act.created.delete(p);\n const lines: string[] = [];\n const cap = (set: Set<string>, limit: number) => {\n const arr = [...set];\n if (arr.length <= limit) return arr.join(\", \");\n return arr.slice(0, limit).join(\", \") + ` (+${arr.length - limit} more)`;\n };\n if (act.modified.size > 0) lines.push(`Modified: ${cap(act.modified, 10)}`);\n if (act.created.size > 0) lines.push(`Created: ${cap(act.created, 10)}`);\n if (act.read.size > 0) lines.push(`Read: ${cap(act.read, 10)}`);\n return lines;\n};\n\nexport const buildSections = (input: BuildSectionsInput): SectionData => {\n const { blocks } = input;\n const briefSections = buildBriefSections(blocks);\n const sessionGoal = extractGoals(blocks);\n const userPreferences = dedupPreferencesAgainstGoals(\n extractPreferences(blocks),\n sessionGoal,\n );\n return {\n sessionGoal,\n outstandingContext: extractOutstandingContext(blocks),\n filesAndChanges: formatFileActivity(blocks),\n commits: formatCommits(extractCommits(blocks)),\n userPreferences,\n briefTranscript: stringifyBrief(briefSections),\n };\n};\n","import type { SectionData } from \"../sections\";\nimport { wrapTextWithAnsi } from \"@earendil-works/pi-tui\";\n\nconst section = (title: string, items: string[]): string => {\n if (items.length === 0) return \"\";\n const body = items.map((i) => `- ${i}`).join(\"\\n\");\n return `[${title}]\\n${body}`;\n};\n\nconst BRIEF_MAX_LINES = 120;\nconst TUI_SAFE_LINE_CHARS = 120;\n\n/**\n * Wrap a single line of text, preserving list-item continuation indent.\n * Detects leading bullets (-, *, N.) and indents continuation lines\n * to match, so wrapped list items remain visually grouped.\n */\nfunction wrapLineWithContinuation(line: string, maxChars: number): string[] {\n const indent = line.match(/^\\s*(?:[-*]\\s+|\\d+\\.\\s+)?/)?.[0] ?? \"\";\n const continuationIndent = indent\n ? \" \".repeat(Math.min(indent.length, 8))\n : \"\";\n // Wrap at reduced width so prepending continuationIndent doesn't exceed maxChars\n const safeMaxChars = continuationIndent\n ? maxChars - continuationIndent.length\n : maxChars;\n const wrapped = wrapTextWithAnsi(line, safeMaxChars);\n if (wrapped.length <= 1 || !continuationIndent) return wrapped;\n return [wrapped[0], ...wrapped.slice(1).map((l) => continuationIndent + l)];\n}\n\nexport const wrapLongLines = (\n text: string,\n maxChars = TUI_SAFE_LINE_CHARS,\n): string =>\n text\n .split(\"\\n\")\n .flatMap((line) => wrapLineWithContinuation(line, maxChars))\n .join(\"\\n\");\n\nexport const capBrief = (text: string): string => {\n const lines = text.split(\"\\n\");\n if (lines.length <= BRIEF_MAX_LINES) return text;\n const kept = lines.slice(-BRIEF_MAX_LINES);\n // Find first section header to avoid cutting mid-section\n let firstHeader = kept.findIndex((l) => /^\\[.+\\]/.test(l));\n if (firstHeader < 0) {\n // No header in the kept window — scan for any bracket-delimited anchor\n // (e.g., tool name, inline reference) to avoid starting mid-paragraph.\n const anyAnchor = kept.findIndex((l) => /^\\[[^\\]]+\\]/.test(l));\n if (anyAnchor > 0) firstHeader = anyAnchor;\n }\n const clean = firstHeader > 0 ? kept.slice(firstHeader) : kept;\n const omitted = lines.length - clean.length;\n return `...(${omitted} earlier lines omitted)\\n\\n${clean.join(\"\\n\")}`;\n};\n\nexport const RECALL_NOTE =\n \"The conversation before this point has been compacted into the summary above. \" +\n \"Details not captured here — exact code, error messages, file paths — are only recoverable via `recall`. \" +\n \"Use `recall` to search the session history. Do not redo work already completed.\";\n\nexport const formatSummary = (data: SectionData): string => {\n const headerParts = [\n section(\"Session Goal\", data.sessionGoal),\n section(\"Files And Changes\", data.filesAndChanges),\n section(\"Commits\", data.commits),\n section(\"Outstanding Context\", data.outstandingContext),\n section(\"User Preferences\", data.userPreferences),\n ].filter(Boolean);\n\n const parts: string[] = [];\n if (headerParts.length > 0) {\n parts.push(headerParts.join(\"\\n\\n\"));\n }\n if (data.briefTranscript) {\n parts.push(capBrief(data.briefTranscript));\n }\n\n if (parts.length === 0) return \"\";\n\n // NOTE: RECALL_NOTE is appended by compile(), not here.\n // It is appended once by `compile()` at the very end, after merge-with-previous,\n // to avoid the note compounding inside the brief transcript across compactions.\n return wrapLongLines(parts.join(\"\\n\\n---\\n\\n\"));\n};\n","/**\n * Pi-vcc compile entry — orchestrates normalization → noise filtering → section building.\n *\n * Upstream: https://github.com/sting8k/pi-vcc (src/core/summarize.ts)\n * Unmodified.\n */\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport type { FileOps } from \"../types\";\nimport { normalize } from \"./normalize\";\nimport { filterNoise } from \"./filter-noise\";\nimport { buildSections } from \"./build-sections\";\nimport { formatSummary, capBrief, RECALL_NOTE, wrapLongLines } from \"./format\";\n\nexport interface CompileInput {\n messages: Message[];\n previousSummary?: string;\n fileOps?: FileOps;\n}\n\nconst HEADER_NAMES = [\n \"Session Goal\",\n \"Files And Changes\",\n \"Commits\",\n \"Outstanding Context\",\n \"User Preferences\",\n];\n\nconst SEPARATOR = \"\\n\\n---\\n\\n\";\n\n/** Extract a named section from summary text */\nconst sectionOf = (text: string, header: string): string => {\n const tag = `[${header}]`;\n const start = text.indexOf(tag);\n if (start < 0) return \"\";\n const after = text.slice(start);\n // Find next section header (must start at line boundary to avoid matching in content)\n const nextSection = HEADER_NAMES.filter((h) => h !== header)\n .map((h) => {\n // Escape the header name for regex safety\n const escaped = h.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const re = new RegExp(`(?:^|\\\\n)\\\\[${escaped}\\\\]`);\n const m = after.match(re);\n if (!m) return -1;\n // m.index points to \\n (or 0); advance past it to the [\n return m.index! + (m[0].startsWith(\"\\n\") ? 1 : 0);\n })\n .filter((n) => n >= 0);\n const nextSep = after.indexOf(\"\\n\\n---\\n\\n\");\n const candidates = [...nextSection, ...(nextSep > 0 ? [nextSep] : [])].sort(\n (a, b) => a - b,\n );\n const end = candidates[0];\n return (end ? after.slice(0, end) : after).trim();\n};\n\n/** Extract the brief transcript part (everything after ---) */\nconst briefOf = (text: string): string => {\n const idx = text.indexOf(SEPARATOR);\n if (idx < 0) return \"\";\n return text.slice(idx + SEPARATOR.length).trim();\n};\n\n/** Merge a header section */\nconst mergeHeaderSection = (\n header: string,\n prev: string,\n fresh: string,\n): string => {\n // Outstanding Context is volatile -- always use fresh only\n if (header === \"Outstanding Context\") return fresh;\n if (!prev) return fresh;\n if (!fresh) return prev;\n\n // Files And Changes: merge by category (Modified/Created/Read), dedup paths\n if (header === \"Files And Changes\") {\n return mergeFileLines(prev, fresh);\n }\n\n // Session Goal, User Preferences: line-level dedup, cap\n const isClean = (l: string) =>\n l.startsWith(\"- \") && !l.includes(\"<skill\") && !l.includes(\"</skill\");\n const prevLines = prev.split(\"\\n\").filter(isClean);\n const freshLines = fresh.split(\"\\n\").filter(isClean);\n const combined = [...new Set([...prevLines, ...freshLines])];\n const CAP = header === \"Session Goal\" ? 8 : header === \"Commits\" ? 8 : 15;\n // Session Goal: keep first items so the original first message persists\n // Other sections: keep last items (fresh overrides stale)\n const capped =\n combined.length > CAP\n ? header === \"Session Goal\"\n ? combined.slice(0, CAP)\n : combined.slice(-CAP)\n : combined;\n if (capped.length === 0) return \"\";\n return `[${header}]\\n${capped.join(\"\\n\")}`;\n};\n\n/** Merge Files And Changes by category, dedup paths across compactions */\nconst mergeFileLines = (prev: string, fresh: string): string => {\n const categories = [\"Modified\", \"Created\", \"Read\"] as const;\n const merged: Record<string, Set<string>> = {};\n for (const cat of categories) merged[cat] = new Set();\n\n // Parse \"- Modified: a, b, c (+N more)\" lines from both prev and fresh\n for (const text of [prev, fresh]) {\n for (const line of text.split(\"\\n\")) {\n for (const cat of categories) {\n const prefix = `- ${cat}: `;\n if (!line.startsWith(prefix)) continue;\n let rest = line.slice(prefix.length);\n // Strip \"(+N more)\" suffix\n rest = rest.replace(/\\s*\\(\\+\\d+ more\\)\\s*$/, \"\");\n for (const p of rest.split(\",\")) {\n const trimmed = p.trim();\n if (trimmed) merged[cat].add(trimmed);\n }\n }\n }\n }\n\n // Dedup: if already in Modified, drop from Created (file existed before)\n for (const p of merged.Modified) merged.Created.delete(p);\n // Also remove Read entries that also appear in Modified (same file read+edited)\n for (const p of merged.Modified) merged.Read.delete(p);\n\n const cap = (set: Set<string>, limit: number) => {\n const arr = [...set];\n if (arr.length <= limit) return arr.join(\", \");\n return arr.slice(0, limit).join(\", \") + ` (+${arr.length - limit} more)`;\n };\n\n const lines: string[] = [];\n if (merged.Modified.size > 0)\n lines.push(`- Modified: ${cap(merged.Modified, 10)}`);\n if (merged.Created.size > 0)\n lines.push(`- Created: ${cap(merged.Created, 10)}`);\n if (merged.Read.size > 0) lines.push(`- Read: ${cap(merged.Read, 10)}`);\n if (lines.length === 0) return \"\";\n return `[Files And Changes]\\n${lines.join(\"\\n\")}`;\n};\n\nconst mergeBriefTranscript = (prev: string, fresh: string): string => {\n if (!prev) return fresh;\n if (!fresh) return prev;\n return prev + \"\\n\\n\" + fresh;\n};\n\nconst mergePrevious = (prev: string, fresh: string): string => {\n // Merge header sections\n const headers = HEADER_NAMES.map((header) => {\n const freshSec = sectionOf(fresh, header);\n const prevSec = sectionOf(prev, header);\n return mergeHeaderSection(header, prevSec, freshSec);\n }).filter(Boolean);\n\n // Merge brief transcript\n const prevBrief = briefOf(prev);\n const freshBrief = briefOf(fresh);\n const mergedBrief = mergeBriefTranscript(prevBrief, freshBrief);\n\n const parts: string[] = [];\n if (headers.length > 0) {\n parts.push(headers.join(\"\\n\\n\"));\n }\n if (mergedBrief) {\n parts.push(capBrief(mergedBrief));\n }\n\n return parts.join(SEPARATOR);\n};\n\nexport const compile = (input: CompileInput): string => {\n const blocks = filterNoise(normalize(input.messages));\n const data = buildSections({ blocks });\n const fresh = formatSummary(data);\n\n // Strip OM content first (## Reflections / ## Observations + preamble),\n // then strip ALL recall notes from the previous summary using paragraph-level\n // matching. Order matters: OM sections appear before the recall note in the\n // stored summary, so we must remove them first to avoid leaving the recall\n // stripper with fragments.\n let prev = input.previousSummary\n ? stripOMContent(input.previousSummary)\n : undefined;\n prev = prev ? stripRecallNotes(prev) : undefined;\n const merged = prev ? mergePrevious(prev, fresh) : fresh;\n if (!merged) return \"\";\n // Defensive: remove any recall notes that survived the above (e.g. nested\n // inside the brief transcript after a prior merge).\n const cleaned = stripRecallNotes(merged);\n return wrapLongLines(cleaned + SEPARATOR + RECALL_NOTE);\n};\n\n/**\n * Strip ALL recall-note paragraphs from text using paragraph-level matching.\n *\n * The recall note is identified by the sentence:\n * \"The conversation before this point has been compacted\"\n *\n * After wrapLongLines runs, the recall note may be split across multiple lines,\n * so exact string matching against RECALL_NOTE fails. Instead, split the text\n * into paragraphs (double-newline boundaries) and drop any paragraph that\n * contains the identifying sentence.\n */\nconst stripRecallNotes = (text: string): string => {\n const paragraphs = text.split(/\\n\\n+/);\n const kept = paragraphs.filter(\n (p) => !p.includes(\"The conversation before this point has been compacted\"),\n );\n return kept.join(\"\\n\\n\");\n};\n\nconst stripOMContent = (text: string): string => {\n // Remove everything from \"## Reflections\" or \"## Observations\" onward,\n // plus the instructions preamble that precedes them.\n // The preamble starts with \"These are condensed memories from earlier in this session.\"\n // Use line-start anchoring to avoid matching inside conversation content\n const reflMatch = text.match(/^## Reflections/m);\n const reflIdx = reflMatch ? reflMatch.index! : -1;\n const obsMatch = text.match(/^## Observations/m);\n const obsIdx = obsMatch ? obsMatch.index! : -1;\n\n // Also detect the basic recall-guidance footer (no observation preamble)\n const basicFooterIdx = text.indexOf(\n \"Use `recall` with an id to retrieve original context, or `#N:path` drill-down\",\n );\n\n // Find the start of OM content: either the instructions preamble or the first section header\n let stripFrom = -1;\n if (reflIdx >= 0 || obsIdx >= 0) {\n const preambleIdx = text.indexOf(\n \"These are condensed memories from earlier in this session.\",\n );\n const minSectionIdx = Math.min(\n reflIdx >= 0 ? reflIdx : Infinity,\n obsIdx >= 0 ? obsIdx : Infinity,\n );\n // Old format: preamble before sections -> strip from preamble.\n // New format: preamble after sections -> strip from first section header.\n if (preambleIdx >= 0 && preambleIdx < minSectionIdx) {\n stripFrom = preambleIdx;\n } else if (minSectionIdx < Infinity) {\n stripFrom = minSectionIdx;\n }\n } else if (basicFooterIdx >= 0) {\n // Strip the basic recall-guidance footer (no observations/reflections present)\n stripFrom = basicFooterIdx;\n }\n\n if (stripFrom < 0) return text;\n\n // Also strip any trailing separators before the OM content\n let end = stripFrom;\n while (end > 0 && /\\s/.test(text[end - 1])) end--;\n // Strip trailing \"---\" separator if present\n const beforeEnd = text.slice(0, end).trimEnd();\n if (beforeEnd.endsWith(\"---\")) {\n return beforeEnd.slice(0, beforeEnd.length - 3).trimEnd();\n }\n return beforeEnd;\n};\n","/**\n * Observational memory ledger types — validated Entry, Observation, Reflection.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/session-ledger/types.ts)\n * Unmodified.\n */\nexport const OM_OBSERVATIONS_RECORDED = \"om.observations.recorded\";\nexport const OM_REFLECTIONS_RECORDED = \"om.reflections.recorded\";\nexport const OM_OBSERVATIONS_DROPPED = \"om.observations.dropped\";\nexport const OM_FOLDED = \"om.folded\";\n\nexport const RELEVANCE_VALUES = [\"low\", \"medium\", \"high\", \"critical\"] as const;\nexport type Relevance = (typeof RELEVANCE_VALUES)[number];\n\nexport const MEMORY_ID_PATTERN = /^[a-f0-9]{12}$/i;\n\nexport type Entry = {\n type: string;\n id: string;\n timestamp?: string;\n message?: unknown;\n content?: unknown;\n customType?: string;\n summary?: unknown;\n fromId?: string;\n data?: unknown;\n details?: unknown;\n firstKeptEntryId?: string;\n};\n\nexport type Observation = {\n id: string;\n content: string;\n timestamp: string;\n relevance: Relevance;\n sourceEntryIds: string[];\n tokenCount: number;\n};\n\nexport type Reflection = {\n id: string;\n content: string;\n supportingObservationIds: string[];\n tokenCount: number;\n};\n\nexport type ObservationsRecordedEntryData = {\n observations: Observation[];\n coversUpToId: string;\n};\n\nexport type ReflectionsRecordedEntryData = {\n reflections: Reflection[];\n coversUpToId: string;\n};\n\nexport type ObservationsDroppedEntryData = {\n observationIds: string[];\n coversUpToId: string;\n};\n\nexport type MemoryDetails = {\n type: typeof OM_FOLDED;\n version: 1;\n fullFold: boolean;\n observations: Observation[];\n reflections: Reflection[];\n};\n\nexport type V3MemoryCustomType =\n | typeof OM_OBSERVATIONS_RECORDED\n | typeof OM_REFLECTIONS_RECORDED\n | typeof OM_OBSERVATIONS_DROPPED;\n\nexport function isRelevance(value: unknown): value is Relevance {\n return (\n typeof value === \"string\" &&\n (RELEVANCE_VALUES as readonly string[]).includes(value)\n );\n}\n\nexport function isNonEmptyString(value: unknown): value is string {\n return typeof value === \"string\" && value.length > 0;\n}\n\nexport function isNonEmptyStringArray(value: unknown): value is string[] {\n return (\n Array.isArray(value) && value.length > 0 && value.every(isNonEmptyString)\n );\n}\n\nexport function isMemoryId(value: unknown): value is string {\n return typeof value === \"string\" && MEMORY_ID_PATTERN.test(value);\n}\n\nfunction isTokenCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\";\n}\n\nexport function isObservation(value: unknown): value is Observation {\n if (!isPlainRecord(value)) return false;\n return (\n isMemoryId(value.id) &&\n isNonEmptyString(value.content) &&\n isNonEmptyString(value.timestamp) &&\n isRelevance(value.relevance) &&\n isNonEmptyStringArray(value.sourceEntryIds) &&\n isTokenCount(value.tokenCount)\n );\n}\n\nexport function isReflection(value: unknown): value is Reflection {\n if (!isPlainRecord(value)) return false;\n return (\n isMemoryId(value.id) &&\n isNonEmptyString(value.content) &&\n !/\\r|\\n/.test(value.content) &&\n isNonEmptyStringArray(value.supportingObservationIds) &&\n isTokenCount(value.tokenCount)\n );\n}\n\nexport function isObservationsRecordedData(\n value: unknown,\n): value is ObservationsRecordedEntryData {\n if (!isPlainRecord(value)) return false;\n return (\n Array.isArray(value.observations) &&\n value.observations.length > 0 &&\n value.observations.every(isObservation) &&\n isNonEmptyString(value.coversUpToId)\n );\n}\n\nexport function isReflectionsRecordedData(\n value: unknown,\n): value is ReflectionsRecordedEntryData {\n if (!isPlainRecord(value)) return false;\n return (\n Array.isArray(value.reflections) &&\n value.reflections.length > 0 &&\n value.reflections.every(isReflection) &&\n isNonEmptyString(value.coversUpToId)\n );\n}\n\nexport function isObservationsDroppedData(\n value: unknown,\n): value is ObservationsDroppedEntryData {\n if (!isPlainRecord(value)) return false;\n return (\n isNonEmptyStringArray(value.observationIds) &&\n isNonEmptyString(value.coversUpToId)\n );\n}\n\nexport function isMemoryDetails(value: unknown): value is MemoryDetails {\n if (!isPlainRecord(value)) return false;\n return (\n value.type === OM_FOLDED &&\n value.version === 1 &&\n typeof value.fullFold === \"boolean\" &&\n Array.isArray(value.observations) &&\n value.observations.every(isObservation) &&\n Array.isArray(value.reflections) &&\n value.reflections.every(isReflection)\n );\n}\n\nexport function isObservationsRecordedEntry(entry: Entry): entry is Entry & {\n type: \"custom\";\n customType: typeof OM_OBSERVATIONS_RECORDED;\n data: ObservationsRecordedEntryData;\n} {\n return (\n entry.type === \"custom\" &&\n entry.customType === OM_OBSERVATIONS_RECORDED &&\n isObservationsRecordedData(entry.data)\n );\n}\n\nexport function isReflectionsRecordedEntry(entry: Entry): entry is Entry & {\n type: \"custom\";\n customType: typeof OM_REFLECTIONS_RECORDED;\n data: ReflectionsRecordedEntryData;\n} {\n return (\n entry.type === \"custom\" &&\n entry.customType === OM_REFLECTIONS_RECORDED &&\n isReflectionsRecordedData(entry.data)\n );\n}\n\nexport function isObservationsDroppedEntry(entry: Entry): entry is Entry & {\n type: \"custom\";\n customType: typeof OM_OBSERVATIONS_DROPPED;\n data: ObservationsDroppedEntryData;\n} {\n return (\n entry.type === \"custom\" &&\n entry.customType === OM_OBSERVATIONS_DROPPED &&\n isObservationsDroppedData(entry.data)\n );\n}\n\nexport function buildObservationsRecordedData(\n observations: Observation[],\n coversUpToId: string,\n): ObservationsRecordedEntryData | undefined {\n if (observations.length === 0 || !isNonEmptyString(coversUpToId))\n return undefined;\n return { observations, coversUpToId };\n}\n\nexport function buildReflectionsRecordedData(\n reflections: Reflection[],\n coversUpToId: string,\n): ReflectionsRecordedEntryData | undefined {\n if (reflections.length === 0 || !isNonEmptyString(coversUpToId))\n return undefined;\n return { reflections, coversUpToId };\n}\n\nexport function buildObservationsDroppedData(\n observationIds: string[],\n coversUpToId: string,\n): ObservationsDroppedEntryData | undefined {\n if (observationIds.length === 0 || !isNonEmptyString(coversUpToId))\n return undefined;\n return { observationIds, coversUpToId };\n}\n","/**\n * Token estimation for serialized entries.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/tokens.ts)\n * Unmodified.\n */\nimport { estimateTokens as estimateMessageTokens } from \"@earendil-works/pi-coding-agent\";\n\nexport function estimateStringTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nexport function estimateEntryTokens(entry: {\n type: string;\n message?: unknown;\n content?: unknown;\n summary?: unknown;\n}): number {\n if (entry.type === \"message\" && entry.message) {\n return estimateMessageTokens(\n entry.message as Parameters<typeof estimateMessageTokens>[0],\n );\n }\n if (entry.type === \"custom_message\" && entry.content) {\n const content = entry.content;\n if (typeof content === \"string\") return estimateStringTokens(content);\n if (Array.isArray(content)) {\n let total = 0;\n for (const block of content) {\n if (block.type === \"text\" && block.text)\n total += estimateStringTokens(block.text);\n }\n return total;\n }\n }\n if (entry.type === \"branch_summary\" && typeof entry.summary === \"string\") {\n return estimateStringTokens(entry.summary);\n }\n return 0;\n}\n","import { estimateEntryTokens } from \"../tokens.js\";\nimport {\n OM_OBSERVATIONS_DROPPED,\n OM_OBSERVATIONS_RECORDED,\n OM_REFLECTIONS_RECORDED,\n isObservationsRecordedData,\n isReflectionsRecordedData,\n type Entry,\n type Observation,\n type Reflection,\n type V3MemoryCustomType,\n} from \"./types.js\";\n\nconst SOURCE_ENTRY_TYPES = new Set([\n \"message\",\n \"custom_message\",\n \"branch_summary\",\n]);\n\nexport function isSourceEntry(entry: Entry): boolean {\n return SOURCE_ENTRY_TYPES.has(entry.type);\n}\n\nexport function entryIndexById(entries: Entry[]): Map<string, number> {\n const idToIndex = new Map<string, number>();\n for (let i = 0; i < entries.length; i++) idToIndex.set(entries[i].id, i);\n return idToIndex;\n}\n\nexport function entryIndexForId(\n entries: Entry[],\n entryId: string | undefined,\n): number {\n if (!entryId) return -1;\n const idx = entryIndexById(entries).get(entryId);\n return idx ?? -1;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isNonEmptyArray(value: unknown): value is unknown[] {\n return Array.isArray(value) && value.length > 0;\n}\n\nfunction isValidCoverageEntry(\n entry: Entry,\n customType: V3MemoryCustomType,\n): entry is Entry & { data: { coversUpToId: string } } {\n if (entry.type !== \"custom\" || entry.customType !== customType) return false;\n if (!isObject(entry.data) || typeof entry.data.coversUpToId !== \"string\")\n return false;\n\n if (customType === OM_OBSERVATIONS_RECORDED)\n return isNonEmptyArray(entry.data.observations);\n if (customType === OM_REFLECTIONS_RECORDED)\n return isNonEmptyArray(entry.data.reflections);\n return isNonEmptyArray(entry.data.observationIds);\n}\n\nexport function latestCoverageIndex(\n entries: Entry[],\n customType: V3MemoryCustomType,\n): number {\n const idToIndex = entryIndexById(entries);\n let latest = -1;\n\n for (const entry of entries) {\n if (!isValidCoverageEntry(entry, customType)) continue;\n const coveredIndex = idToIndex.get(entry.data.coversUpToId);\n if (coveredIndex === undefined) continue;\n if (coveredIndex > latest) latest = coveredIndex;\n }\n\n return latest;\n}\n\nexport function latestCoverageMarkerId(\n entries: Entry[],\n customType: V3MemoryCustomType,\n): string | undefined {\n const idToIndex = entryIndexById(entries);\n let latestIndex = -1;\n let latestMarkerId: string | undefined;\n\n for (const entry of entries) {\n if (!isValidCoverageEntry(entry, customType)) continue;\n const coveredIndex = idToIndex.get(entry.data.coversUpToId);\n if (coveredIndex === undefined) continue;\n if (coveredIndex > latestIndex) {\n latestIndex = coveredIndex;\n latestMarkerId = entry.data.coversUpToId;\n }\n }\n\n return latestMarkerId;\n}\n\nexport function earlierCoverageMarkerId(\n entries: Entry[],\n firstId: string | undefined,\n secondId: string | undefined,\n): string | undefined {\n if (!firstId) return secondId;\n if (!secondId) return firstId;\n\n const idToIndex = entryIndexById(entries);\n const firstIndex = idToIndex.get(firstId);\n const secondIndex = idToIndex.get(secondId);\n if (firstIndex === undefined)\n return secondIndex === undefined ? undefined : secondId;\n if (secondIndex === undefined) return firstId;\n return firstIndex <= secondIndex ? firstId : secondId;\n}\n\nexport function rawTokensAfterIndex(entries: Entry[], index: number): number {\n let total = 0;\n for (let i = Math.max(0, index + 1); i < entries.length; i++) {\n if (isSourceEntry(entries[i])) total += estimateEntryTokens(entries[i]);\n }\n return total;\n}\n\nexport function rawTokensSinceCoverage(\n entries: Entry[],\n customType: V3MemoryCustomType,\n): number {\n return rawTokensAfterIndex(entries, latestCoverageIndex(entries, customType));\n}\n\nexport function rawTokensSinceObservationCoverage(entries: Entry[]): number {\n return rawTokensSinceCoverage(entries, OM_OBSERVATIONS_RECORDED);\n}\n\nexport function rawTokensSinceReflectionCoverage(entries: Entry[]): number {\n return rawTokensSinceCoverage(entries, OM_REFLECTIONS_RECORDED);\n}\n\nexport function rawTokensSinceDropCoverage(entries: Entry[]): number {\n return rawTokensSinceCoverage(entries, OM_OBSERVATIONS_DROPPED);\n}\n\nexport function findLastCompactionIndex(entries: Entry[]): number {\n for (let i = entries.length - 1; i >= 0; i--) {\n if (entries[i].type === \"compaction\") return i;\n }\n return -1;\n}\n\nexport function rawTokensSinceLastCompaction(entries: Entry[]): number {\n const compactionIndex = findLastCompactionIndex(entries);\n if (compactionIndex === -1) return rawTokensAfterIndex(entries, -1);\n\n const firstKeptEntryId = entries[compactionIndex].firstKeptEntryId;\n const firstKeptIndex = entryIndexForId(entries, firstKeptEntryId);\n\n if (firstKeptIndex === -1)\n return rawTokensAfterIndex(entries, compactionIndex);\n return rawTokensAfterIndex(entries, firstKeptIndex - 1);\n}\n\n/**\n * Extract observations created since the given entry index.\n * Walks the branch and collects observations from OM_OBSERVATIONS_RECORDED\n * entries that were appended AFTER the given index.\n */\nexport function observationsCreatedAfterIndex(\n entries: Entry[],\n sinceIndex: number,\n): Observation[] {\n const observations: Observation[] = [];\n const seen = new Set<string>();\n\n for (let i = sinceIndex + 1; i < entries.length; i++) {\n const entry = entries[i];\n if (entry.type !== \"custom\") continue;\n if (entry.customType !== OM_OBSERVATIONS_RECORDED) continue;\n if (!isObservationsRecordedData(entry.data)) continue;\n for (const obs of entry.data.observations) {\n if (!seen.has(obs.id)) {\n seen.add(obs.id);\n observations.push(obs);\n }\n }\n }\n return observations;\n}\n\n/**\n * Extract reflections created since the given entry index.\n */\nexport function reflectionsCreatedAfterIndex(\n entries: Entry[],\n sinceIndex: number,\n): Reflection[] {\n const reflections: Reflection[] = [];\n const seen = new Set<string>();\n\n for (let i = sinceIndex + 1; i < entries.length; i++) {\n const entry = entries[i];\n if (entry.type !== \"custom\") continue;\n if (entry.customType !== OM_REFLECTIONS_RECORDED) continue;\n if (!isReflectionsRecordedData(entry.data)) continue;\n for (const ref of entry.data.reflections) {\n if (!seen.has(ref.id)) {\n seen.add(ref.id);\n reflections.push(ref);\n }\n }\n }\n return reflections;\n}\n\n/**\n * Build a compact one-line summary of existing observations for context.\n * Capped at maxTokens.\n */\nexport function buildExistingObservationsSummary(\n observations: Observation[],\n maxTokens: number,\n): string {\n const lines: string[] = [];\n let tokens = 0;\n for (const obs of observations) {\n const line = `[${obs.id}] ${obs.timestamp} [${obs.relevance}] ${obs.content}`;\n const lineTokens = Math.ceil(line.length / 4);\n if (tokens + lineTokens > maxTokens && lines.length > 0) break;\n lines.push(line);\n tokens += lineTokens;\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Build a compact one-line summary of existing reflections for context.\n * Capped at maxTokens.\n */\nexport function buildExistingReflectionsSummary(\n reflections: Reflection[],\n maxTokens: number,\n): string {\n const lines: string[] = [];\n let tokens = 0;\n for (const ref of reflections) {\n const line = `[${ref.id}] ${ref.content}`;\n const lineTokens = Math.ceil(line.length / 4);\n if (tokens + lineTokens > maxTokens && lines.length > 0) break;\n lines.push(line);\n tokens += lineTokens;\n }\n return lines.join(\"\\n\");\n}\n","/**\n * Debug logging — writes JSONL to ~/.pi/agent/pi-blackhole/debug.ndjson.\n *\n * Uses a memory buffer flushed asynchronously on a timer to avoid blocking\n * the event loop with synchronous disk I/O on every event.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/debug-log.ts)\n * Modified: path changed from observational-memory/ to pi-blackhole/; async buffered.\n */\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport {\n existsSync,\n mkdirSync,\n renameSync,\n statSync,\n unlinkSync,\n appendFileSync,\n} from \"node:fs\";\nimport { appendFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\nexport const DEBUG_LOG_MAX_BYTES = 10 * 1024 * 1024;\nexport const DEBUG_LOG_RELATIVE_PATH = join(\"pi-blackhole\", \"debug.ndjson\");\n\ninterface DebugLogContext {\n enabled: boolean;\n cwd?: string;\n runId?: string;\n}\n\nconst storage = new AsyncLocalStorage<DebugLogContext>();\n\nexport function withDebugLogContext<T>(\n context: DebugLogContext,\n fn: () => T,\n): T {\n const parent = storage.getStore();\n return storage.run({ ...parent, ...context }, fn);\n}\n\n// ── Async buffer ────────────────────────────────────────────────────────────\n\nconst BUFFER_FLUSH_MS = 1_000;\nconst FLUSH_IDLE_MS = 10_000;\nlet buffer: string[] = [];\nlet flushTimer: ReturnType<typeof setInterval> | null = null;\nlet flushing = false;\nlet lastWriteMs = 0;\n\nfunction ensureFlushTimer(): void {\n if (flushTimer) return;\n flushTimer = setInterval(() => {\n // Stop the timer if buffer has been empty for a while\n if (\n buffer.length === 0 &&\n lastWriteMs > 0 &&\n Date.now() - lastWriteMs > FLUSH_IDLE_MS\n ) {\n clearInterval(flushTimer!);\n flushTimer = null;\n return;\n }\n flushBuffer().catch(() => {});\n }, BUFFER_FLUSH_MS);\n // Don't prevent process exit\n if (flushTimer && typeof flushTimer === \"object\" && \"unref\" in flushTimer) {\n flushTimer.unref();\n }\n}\n\nasync function flushBuffer(): Promise<void> {\n if (flushing) return;\n if (buffer.length === 0) return;\n flushing = true;\n // Drain the buffer atomically so flushDebugLog doesn't split entries\n const batch = buffer;\n buffer = [];\n try {\n const path = join(getAgentDir(), DEBUG_LOG_RELATIVE_PATH);\n mkdirSync(dirname(path), { recursive: true });\n rotateIfNeeded(path);\n await appendFile(path, batch.join(\"\"), \"utf-8\");\n } catch (error) {\n console.error(\"blackhole: debug log write failed\", error);\n } finally {\n flushing = false;\n }\n}\n\n// Flush remaining buffer on exit — synchronous to work with process.exit() too\nprocess.on(\"exit\", () => {\n flushDebugLog();\n});\n\nexport function debugLog(\n event: string,\n data: Record<string, unknown> = {},\n forceEnabled?: boolean,\n): void {\n const context = storage.getStore();\n const enabled = forceEnabled ?? context?.enabled ?? false;\n if (enabled !== true) return;\n\n const payload = {\n ts: new Date().toISOString(),\n event,\n cwd: context?.cwd,\n runId: context?.runId,\n data,\n };\n buffer.push(JSON.stringify(payload) + \"\\n\");\n lastWriteMs = Date.now();\n ensureFlushTimer();\n}\n\n/**\n * Synchronously flush the buffer to disk. Used by tests to verify written content.\n * Skips if an async flush is in progress to avoid splitting the buffer.\n * In production, the background timer handles flushing automatically.\n */\nexport function flushDebugLog(): void {\n if (flushing || buffer.length === 0) return;\n const batch = buffer;\n buffer = [];\n try {\n const path = join(getAgentDir(), DEBUG_LOG_RELATIVE_PATH);\n mkdirSync(dirname(path), { recursive: true });\n rotateIfNeeded(path);\n appendFileSync(path, batch.join(\"\"), \"utf-8\");\n } catch (error) {\n console.error(\"blackhole: debug log flush failed\", error);\n }\n}\n\nfunction rotateIfNeeded(path: string): void {\n if (!existsSync(path)) return;\n if (statSync(path).size < DEBUG_LOG_MAX_BYTES) return;\n const backupPath = `${path}.1`;\n if (existsSync(backupPath)) unlinkSync(backupPath);\n renameSync(path, backupPath);\n}\n","/**\n * Ledger folding — deduplicates observations/reflections and applies tombstones.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/session-ledger/fold.ts)\n * Unmodified.\n */\nimport {\n isObservationsDroppedData,\n isObservationsRecordedData,\n isReflectionsRecordedData,\n OM_OBSERVATIONS_DROPPED,\n OM_OBSERVATIONS_RECORDED,\n OM_REFLECTIONS_RECORDED,\n type Entry,\n type Observation,\n type Reflection,\n} from \"./types.js\";\nimport { debugLog } from \"../debug-log.js\";\n\nexport type FoldLedgerOptions = {\n /** Fold entries from branch root through this entry id, inclusive. Omit to fold through branch tip. */\n upToEntryId?: string;\n};\n\nexport type FoldedLedger = {\n /** All first-valid observation records encountered through the fold boundary, including dropped observations. */\n observations: Observation[];\n /** Observation records not tombstoned by a folded drop entry. */\n activeObservations: Observation[];\n /** Tombstoned observation ids, including ids that may not have a corresponding folded observation. */\n droppedObservationIds: Set<string>;\n /** All first-valid reflection records encountered through the fold boundary. */\n reflections: Reflection[];\n /** All first-valid observation records by id, including dropped observations. */\n observationsById: Map<string, Observation>;\n /** All first-valid reflection records by id. */\n reflectionsById: Map<string, Reflection>;\n};\n\nfunction foldEndIndex(\n entries: Entry[],\n upToEntryId: string | undefined,\n): number {\n if (!upToEntryId) return entries.length - 1;\n const idx = entries.findIndex((entry) => entry.id === upToEntryId);\n return idx === -1 ? entries.length - 1 : idx;\n}\n\nfunction isCustomEntry(entry: Entry, customType: string): boolean {\n return entry.type === \"custom\" && entry.customType === customType;\n}\n\n/**\n * Fold valid V3 memory ledger entries from the branch root through the target entry.\n *\n * Unknown custom entries, old V2 entries, invalid V3-shaped data, and compaction details are ignored.\n * Observations and reflections use first-valid-record-wins semantics. Drops are tombstones and are\n * retained even when the dropped id is unknown at the time of folding.\n */\nexport function foldLedger(\n entries: Entry[],\n options: FoldLedgerOptions = {},\n): FoldedLedger {\n const observationsById = new Map<string, Observation>();\n const reflectionsById = new Map<string, Reflection>();\n const droppedObservationIds = new Set<string>();\n const endIdx = foldEndIndex(entries, options.upToEntryId);\n\n for (let i = 0; i <= endIdx; i++) {\n const entry = entries[i];\n if (!entry) continue;\n\n if (isCustomEntry(entry, OM_OBSERVATIONS_RECORDED)) {\n if (!isObservationsRecordedData(entry.data)) continue;\n for (const observation of entry.data.observations) {\n if (!observationsById.has(observation.id)) {\n observationsById.set(observation.id, observation);\n }\n }\n continue;\n }\n\n if (isCustomEntry(entry, OM_REFLECTIONS_RECORDED)) {\n if (!isReflectionsRecordedData(entry.data)) continue;\n for (const reflection of entry.data.reflections) {\n if (!reflectionsById.has(reflection.id)) {\n reflectionsById.set(reflection.id, reflection);\n }\n }\n continue;\n }\n\n if (isCustomEntry(entry, OM_OBSERVATIONS_DROPPED)) {\n if (!isObservationsDroppedData(entry.data)) continue;\n for (const observationId of entry.data.observationIds) {\n droppedObservationIds.add(observationId);\n }\n continue;\n }\n\n // Log unknown custom entry types — they are silently skipped, but\n // should be visible when debugging extension compatibility issues.\n if (entry.type === \"custom\" && entry.customType) {\n debugLog(\"fold.unknown_custom_type\", {\n customType: entry.customType,\n entryId: entry.id,\n });\n }\n }\n\n const observations = Array.from(observationsById.values());\n const activeObservations = observations.filter(\n (observation) => !droppedObservationIds.has(observation.id),\n );\n const reflections = Array.from(reflectionsById.values());\n\n return {\n observations,\n activeObservations,\n droppedObservationIds,\n reflections,\n observationsById,\n reflectionsById,\n };\n}\n","/**\n * Summary rendering — formats observations/reflections for compaction output.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/session-ledger/render-summary.ts)\n * Unmodified.\n */\nimport type { Observation, Reflection } from \"./types.js\";\n\nconst OM_INSTRUCTIONS_FULL = `Bracketed ids in reflections and observations connect to their source session entries. These are condensed memories from earlier in this session.\nWhen entries conflict, the most recent observation reflects the latest known state.\nUse \\`recall\\` with an id to retrieve original context, or \\`#N:path\\` drill-down to explore file content from referenced entries.\nWhen exact source context is needed for precision or traceability, use the \\`recall\\` tool with the relevant observation or reflection id. This is especially useful when a reflection materially affects a decision or is too compressed to continue confidently.`;\n\nconst OM_INSTRUCTIONS_BASIC = `Use \\`recall\\` with an id to retrieve original context, or \\`#N:path\\` drill-down to explore file content from referenced entries.\nWhen entries conflict, the most recent entry reflects the latest known state.`;\n\nexport const OM_FOOTER_FULL = `----\\n${OM_INSTRUCTIONS_FULL}\\n----`;\nexport const OM_FOOTER_BASIC = `----\\n${OM_INSTRUCTIONS_BASIC}\\n----`;\n\nexport function observationToSummaryLine(observation: Observation): string {\n return `[${observation.id}] ${observation.timestamp} [${observation.relevance}] ${observation.content}`;\n}\n\n/** Score an observation for cap/trim selection.\n * Relevance tier dominates: medium (5+) always outranks low (max 2).\n * Recency is based on position in the flat-mapped array (0 = oldest, N-1 = newest),\n * avoiding wall-clock dependency that punishes sessions spanning days or weeks. */\nexport function scoreObservation(\n obs: Observation,\n index: number,\n total: number,\n): number {\n const base =\n obs.relevance === \"high\" || obs.relevance === \"critical\"\n ? 10\n : obs.relevance === \"medium\"\n ? 5\n : 1;\n const recency = total > 1 ? index / (total - 1) : 1;\n return base + recency;\n}\n\n/** Select observations up to a token budget, keeping all high-relevance items\n * unconditionally and filling the remaining budget with the best-scoring\n * medium and low observations (relevance-tiered + recency).\n *\n * Reflections are never trimmed — they are inherently rare and always stay.\n * Observations stay in the branch either way; this only caps what is rendered\n * in the compaction summary output. */\nexport function selectPriorObservations(\n observations: Observation[],\n maxTokens: number,\n): Observation[] {\n // Track original indices so we can restore chronological order after scoring\n const indexed = observations.map((obs, i) => ({ obs, originalIndex: i }));\n const high = indexed.filter(\n (item) =>\n item.obs.relevance === \"high\" || item.obs.relevance === \"critical\",\n );\n const rest = indexed.filter(\n (item) =>\n item.obs.relevance !== \"high\" && item.obs.relevance !== \"critical\",\n );\n\n // High always kept — consume budget first\n let budget = maxTokens;\n const selected = new Set<{ obs: Observation; originalIndex: number }>();\n for (const item of high) {\n const lineTokens = Math.ceil(observationToSummaryLine(item.obs).length / 4);\n selected.add(item);\n budget -= lineTokens;\n }\n\n // Score medium + low and select best within remaining budget\n if (rest.length > 0 && budget > 0) {\n const scored = rest.map((item, i) => ({\n item,\n score: scoreObservation(item.obs, i, rest.length),\n }));\n scored.sort((a, b) => b.score - a.score); // highest score first\n for (const { item } of scored) {\n const lineTokens = Math.ceil(\n observationToSummaryLine(item.obs).length / 4,\n );\n if (budget - lineTokens < 0) break;\n selected.add(item);\n budget -= lineTokens;\n }\n }\n\n // Restore original chronological order before returning\n return Array.from(selected)\n .sort((a, b) => a.originalIndex - b.originalIndex)\n .map((item) => item.obs);\n}\n\nexport function reflectionToSummaryLine(reflection: Reflection): string {\n return `[${reflection.id}] ${reflection.content}`;\n}\n\nexport function renderSummary(\n reflections: Reflection[],\n observations: Observation[],\n): string {\n const hasContent = reflections.length > 0 || observations.length > 0;\n\n const parts: string[] = [];\n if (reflections.length > 0) {\n parts.push(\n `## Reflections\\n${reflections.map(reflectionToSummaryLine).join(\"\\n\")}`,\n );\n }\n if (observations.length > 0) {\n parts.push(\n `## Observations\\n${observations.map(observationToSummaryLine).join(\"\\n\")}`,\n );\n }\n\n const footer = hasContent ? OM_FOOTER_FULL : OM_FOOTER_BASIC;\n if (parts.length > 0) {\n parts.push(footer);\n return parts.join(\"\\n\\n\");\n }\n return footer;\n}\n","/**\n * Compaction projection — builds projection slices for compaction events.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/session-ledger/projection.ts)\n * Unmodified.\n */\nimport { selectPriorObservations } from \"./render-summary.js\";\nimport {\n OM_FOLDED,\n isMemoryDetails,\n isObservationsDroppedEntry,\n isObservationsRecordedEntry,\n isReflectionsRecordedEntry,\n type Entry,\n type MemoryDetails,\n type Observation,\n type Reflection,\n} from \"./types.js\";\n\nexport type Projection = {\n observations: Observation[];\n reflections: Reflection[];\n};\n\nexport type ProjectionDiff = {\n observationsOnlyInFull: Observation[];\n reflectionsOnlyInFull: Reflection[];\n droppedOnlyInFull: Observation[];\n};\n\nexport type CompactionProjectionConfig = {\n observationsPoolMaxTokens: number;\n fullFoldAlways?: boolean;\n};\n\nexport type CompactionProjection = Projection & {\n fullFold: boolean;\n details: MemoryDetails;\n};\n\ntype ProjectionBoundary =\n { kind: \"entry\"; entryId: string } | { kind: \"tip\" } | { kind: \"none\" };\n\ntype ProjectionFoldOptions = {\n observationsBoundary: ProjectionBoundary;\n reflectionsBoundary: ProjectionBoundary;\n dropsBoundary: ProjectionBoundary;\n};\n\nfunction entryIndexById(entries: Entry[]): Map<string, number> {\n const indexes = new Map<string, number>();\n for (let i = 0; i < entries.length; i++) indexes.set(entries[i].id, i);\n return indexes;\n}\n\nfunction entryBoundary(entryId: string): ProjectionBoundary {\n return { kind: \"entry\", entryId };\n}\n\nfunction tipBoundary(): ProjectionBoundary {\n return { kind: \"tip\" };\n}\n\nfunction noneBoundary(): ProjectionBoundary {\n return { kind: \"none\" };\n}\n\nfunction boundaryIndex(\n entries: Entry[],\n indexes: Map<string, number>,\n boundary: ProjectionBoundary,\n): number {\n if (boundary.kind === \"tip\") return entries.length - 1;\n if (boundary.kind === \"none\") return -1;\n return indexes.get(boundary.entryId) ?? -1;\n}\n\nfunction coverageIndex(\n entry: Entry & { data: { coversUpToId: string } },\n indexes: Map<string, number>,\n): number {\n return indexes.get(entry.data.coversUpToId) ?? -1;\n}\n\nfunction isAtOrBefore(index: number, boundaryIndex: number): boolean {\n return index >= 0 && boundaryIndex >= 0 && index <= boundaryIndex;\n}\n\nfunction isCoveredAtOrBefore(\n entry: Entry & { data: { coversUpToId: string } },\n indexes: Map<string, number>,\n boundaryIndex: number,\n): boolean {\n return isAtOrBefore(coverageIndex(entry, indexes), boundaryIndex);\n}\n\nfunction foldProjection(\n entries: Entry[],\n options: ProjectionFoldOptions,\n): Projection {\n const indexes = entryIndexById(entries);\n const observationsBoundary = boundaryIndex(\n entries,\n indexes,\n options.observationsBoundary,\n );\n const reflectionsBoundary = boundaryIndex(\n entries,\n indexes,\n options.reflectionsBoundary,\n );\n const dropsBoundary = boundaryIndex(entries, indexes, options.dropsBoundary);\n const observations: Observation[] = [];\n const reflections: Reflection[] = [];\n const observationsById = new Set<string>();\n const reflectionsById = new Set<string>();\n const droppedObservationIds = new Set<string>();\n\n for (const entry of entries) {\n if (\n isObservationsRecordedEntry(entry) &&\n isCoveredAtOrBefore(entry, indexes, observationsBoundary)\n ) {\n for (const observation of entry.data.observations) {\n if (observationsById.has(observation.id)) continue;\n observationsById.add(observation.id);\n observations.push(observation);\n }\n continue;\n }\n\n if (\n isReflectionsRecordedEntry(entry) &&\n isCoveredAtOrBefore(entry, indexes, reflectionsBoundary)\n ) {\n for (const reflection of entry.data.reflections) {\n if (reflectionsById.has(reflection.id)) continue;\n reflectionsById.add(reflection.id);\n reflections.push(reflection);\n }\n continue;\n }\n\n if (\n isObservationsDroppedEntry(entry) &&\n isCoveredAtOrBefore(entry, indexes, dropsBoundary)\n ) {\n for (const observationId of entry.data.observationIds)\n droppedObservationIds.add(observationId);\n }\n }\n\n return {\n observations: observations.filter(\n (observation) => !droppedObservationIds.has(observation.id),\n ),\n reflections,\n };\n}\n\nfunction projectionFromMemoryDetails(details: MemoryDetails): Projection {\n return {\n observations: [...details.observations],\n reflections: [...details.reflections],\n };\n}\n\nfunction latestV3CompactionDetails(\n entries: Entry[],\n): MemoryDetails | undefined {\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (entry.type !== \"compaction\") continue;\n const details = unwrapMemoryDetails(entry);\n if (details) return details;\n }\n return undefined;\n}\n\nexport function fullProjection(\n entries: Entry[],\n upToEntryId?: string,\n): Projection {\n const boundary = upToEntryId ? entryBoundary(upToEntryId) : tipBoundary();\n return foldProjection(entries, {\n observationsBoundary: boundary,\n reflectionsBoundary: boundary,\n dropsBoundary: boundary,\n });\n}\n\nexport function visibleProjection(\n entries: Entry[],\n upToEntryId?: string,\n): Projection {\n if (!upToEntryId) {\n const details = latestV3CompactionDetails(entries);\n if (details) return projectionFromMemoryDetails(details);\n // No compaction has run yet — show everything so the user sees\n // recorded data until first /blackhole creates a proper snapshot.\n return fullProjection(entries);\n }\n\n return buildCompactionProjection(entries, upToEntryId, {\n observationsPoolMaxTokens: Number.POSITIVE_INFINITY,\n });\n}\n\nfunction unwrapMemoryDetails(entry: Entry): MemoryDetails | undefined {\n if (isMemoryDetails(entry.details)) return entry.details;\n if (\n entry.details &&\n typeof entry.details === \"object\" &&\n !Array.isArray(entry.details)\n ) {\n const nested = (entry.details as Record<string, unknown>)[\"om.folded\"];\n if (isMemoryDetails(nested)) return nested;\n }\n return undefined;\n}\n\nexport function latestFullFoldBoundaryId(entries: Entry[]): string | undefined {\n const indexes = entryIndexById(entries);\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n if (entry.type !== \"compaction\") continue;\n const details = unwrapMemoryDetails(entry);\n if (!details) continue;\n if (!details.fullFold) continue;\n if (!entry.firstKeptEntryId) continue;\n if (!indexes.has(entry.firstKeptEntryId)) continue;\n return entry.firstKeptEntryId;\n }\n return undefined;\n}\n\nexport function buildCompactionProjection(\n entries: Entry[],\n firstKeptEntryId: string,\n config: CompactionProjectionConfig,\n): CompactionProjection {\n const fullFoldBoundaryId = latestFullFoldBoundaryId(entries);\n const maintenanceBoundary = fullFoldBoundaryId\n ? entryBoundary(fullFoldBoundaryId)\n : config.fullFoldAlways\n ? entryBoundary(firstKeptEntryId)\n : noneBoundary();\n const normalProjection = foldProjection(entries, {\n observationsBoundary: entryBoundary(firstKeptEntryId),\n reflectionsBoundary: maintenanceBoundary,\n dropsBoundary: maintenanceBoundary,\n });\n const observationTokens = normalProjection.observations.reduce(\n (total, observation) => total + observation.tokenCount,\n 0,\n );\n const fullFold = observationTokens >= config.observationsPoolMaxTokens;\n let projection = fullFold\n ? fullProjection(entries, firstKeptEntryId)\n : normalProjection;\n\n // Cap observations to budget using relevance-tiered + recency scoring.\n // Even if the dropper determined some old observations are worth keeping,\n // this safety valve ensures the compaction output never exceeds the pool\n // token budget. Observations survive in the branch regardless.\n if (\n config.observationsPoolMaxTokens > 0 &&\n observationTokens >= config.observationsPoolMaxTokens\n ) {\n projection = {\n observations: selectPriorObservations(\n projection.observations,\n config.observationsPoolMaxTokens,\n ),\n reflections: projection.reflections,\n };\n }\n\n const details: MemoryDetails = {\n type: OM_FOLDED,\n version: 1,\n fullFold,\n observations: projection.observations,\n reflections: projection.reflections,\n };\n\n return {\n fullFold,\n observations: projection.observations,\n reflections: projection.reflections,\n details,\n };\n}\n\nexport function diffProjection(\n visible: Projection,\n full: Projection,\n): ProjectionDiff {\n const visibleObservationIds = new Set(\n visible.observations.map((observation) => observation.id),\n );\n const fullObservationIds = new Set(\n full.observations.map((observation) => observation.id),\n );\n const visibleReflectionIds = new Set(\n visible.reflections.map((reflection) => reflection.id),\n );\n\n return {\n observationsOnlyInFull: full.observations.filter(\n (observation) => !visibleObservationIds.has(observation.id),\n ),\n reflectionsOnlyInFull: full.reflections.filter(\n (reflection) => !visibleReflectionIds.has(reflection.id),\n ),\n droppedOnlyInFull: visible.observations.filter(\n (observation) => !fullObservationIds.has(observation.id),\n ),\n };\n}\n","/**\n * Memory recall — resolves source evidence for observations and reflections.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/session-ledger/recall.ts)\n * Unmodified.\n */\nimport {\n isObservationsDroppedEntry,\n isObservationsRecordedEntry,\n isReflectionsRecordedEntry,\n type Entry,\n type Observation,\n type Reflection,\n} from \"./types.js\";\n\nconst SOURCE_TYPES = new Set([\"message\", \"custom_message\", \"branch_summary\"]);\n\nexport type { Entry, Observation, Reflection };\n\ntype ObservationLedgerLocation = {\n entryId: string;\n entryIndex: number;\n recordIndex: number;\n};\n\ntype ReflectionLedgerLocation = {\n entryId: string;\n entryIndex: number;\n recordIndex: number;\n};\n\nexport type RecalledObservation = {\n observation: Observation;\n observationEntryId: string;\n observationRecordIndex: number;\n status: \"active\" | \"dropped\";\n sourceEntryIds: string[];\n sourceEntries: Entry[];\n missingSourceEntryIds: string[];\n nonSourceEntryIds: string[];\n};\n\nexport type RecalledReflection = {\n reflection: Reflection;\n reflectionEntryId: string;\n reflectionRecordIndex: number;\n};\n\nexport type RecallResult =\n | {\n status: \"not_found\";\n memoryId: string;\n kind: undefined;\n reflections: [];\n observations: [];\n sourceEntries: [];\n missingSourceEntryIds: [];\n nonSourceEntryIds: [];\n missingSupportingObservationIds: [];\n collision: false;\n partial: false;\n }\n | {\n status: \"found\";\n memoryId: string;\n kind: \"observation\" | \"reflection\" | \"mixed\";\n reflections: RecalledReflection[];\n observations: RecalledObservation[];\n sourceEntries: Entry[];\n missingSourceEntryIds: string[];\n nonSourceEntryIds: string[];\n missingSupportingObservationIds: string[];\n collision: boolean;\n partial: boolean;\n };\n\ntype IndexedObservation = ObservationLedgerLocation & {\n observation: Observation;\n};\ntype IndexedReflection = ReflectionLedgerLocation & { reflection: Reflection };\n\nfunction isSourceEntry(entry: Entry): boolean {\n return SOURCE_TYPES.has(entry.type);\n}\n\nfunction uniqueById(entries: Entry[]): Entry[] {\n const seen = new Set<string>();\n const result: Entry[] = [];\n for (const entry of entries) {\n if (seen.has(entry.id)) continue;\n seen.add(entry.id);\n result.push(entry);\n }\n return result;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n\nexport function indexLedger(entries: Entry[]): {\n observations: IndexedObservation[];\n reflections: IndexedReflection[];\n droppedIds: Set<string>;\n} {\n const observations: IndexedObservation[] = [];\n const reflections: IndexedReflection[] = [];\n const droppedIds = new Set<string>();\n\n for (let entryIndex = 0; entryIndex < entries.length; entryIndex++) {\n const entry = entries[entryIndex];\n if (isObservationsRecordedEntry(entry)) {\n entry.data.observations.forEach((observation, recordIndex) => {\n observations.push({\n observation,\n entryId: entry.id,\n entryIndex,\n recordIndex,\n });\n });\n continue;\n }\n if (isReflectionsRecordedEntry(entry)) {\n entry.data.reflections.forEach((reflection, recordIndex) => {\n reflections.push({\n reflection,\n entryId: entry.id,\n entryIndex,\n recordIndex,\n });\n });\n continue;\n }\n if (isObservationsDroppedEntry(entry)) {\n entry.data.observationIds.forEach((id) => droppedIds.add(id));\n }\n }\n\n return { observations, reflections, droppedIds };\n}\n\nfunction resolveObservationSources(\n entries: Entry[],\n observation: Observation,\n location: ObservationLedgerLocation,\n): RecalledObservation {\n const sourceEntryIds = uniqueStrings(observation.sourceEntryIds);\n const byId = new Map(entries.map((entry) => [entry.id, entry]));\n const sourceEntries: Entry[] = [];\n const missingSourceEntryIds: string[] = [];\n const nonSourceEntryIds: string[] = [];\n\n for (const sourceEntryId of sourceEntryIds) {\n const sourceEntry = byId.get(sourceEntryId);\n if (!sourceEntry) {\n missingSourceEntryIds.push(sourceEntryId);\n continue;\n }\n if (!isSourceEntry(sourceEntry)) {\n nonSourceEntryIds.push(sourceEntryId);\n continue;\n }\n sourceEntries.push(sourceEntry);\n }\n\n return {\n observation,\n observationEntryId: location.entryId,\n observationRecordIndex: location.recordIndex,\n status: \"active\",\n sourceEntryIds,\n sourceEntries,\n missingSourceEntryIds,\n nonSourceEntryIds,\n };\n}\n\nfunction notFound(memoryId: string): RecallResult {\n return {\n status: \"not_found\",\n memoryId,\n kind: undefined,\n reflections: [],\n observations: [],\n sourceEntries: [],\n missingSourceEntryIds: [],\n nonSourceEntryIds: [],\n missingSupportingObservationIds: [],\n collision: false,\n partial: false,\n };\n}\n\nexport function recallMemorySources(\n entries: Entry[],\n memoryId: string,\n): RecallResult {\n const {\n observations: indexedObservations,\n reflections: indexedReflections,\n droppedIds,\n } = indexLedger(entries);\n const directObservationMatches = indexedObservations.filter(\n ({ observation }) => observation.id === memoryId,\n );\n const reflectionMatches = indexedReflections.filter(\n ({ reflection }) => reflection.id === memoryId,\n );\n\n if (directObservationMatches.length === 0 && reflectionMatches.length === 0)\n return notFound(memoryId);\n\n const observationsById = new Map<string, IndexedObservation>();\n for (const indexed of indexedObservations) {\n if (!observationsById.has(indexed.observation.id))\n observationsById.set(indexed.observation.id, indexed);\n }\n\n const recalledByKey = new Map<string, RecalledObservation>();\n const rawMissingSupportingObservationIds: string[] = [];\n\n function addObservation(indexed: IndexedObservation): void {\n const key = `${indexed.entryId}:${indexed.recordIndex}`;\n if (recalledByKey.has(key)) return;\n const recalled = resolveObservationSources(\n entries,\n indexed.observation,\n indexed,\n );\n recalled.status = droppedIds.has(indexed.observation.id)\n ? \"dropped\"\n : \"active\";\n recalledByKey.set(key, recalled);\n }\n\n for (const match of directObservationMatches) addObservation(match);\n\n for (const { reflection } of reflectionMatches) {\n for (const observationId of uniqueStrings(\n reflection.supportingObservationIds,\n )) {\n const indexed = observationsById.get(observationId);\n if (!indexed) {\n rawMissingSupportingObservationIds.push(observationId);\n continue;\n }\n addObservation(indexed);\n }\n }\n\n const recalledObservations = Array.from(recalledByKey.values());\n const recalledReflections: RecalledReflection[] = reflectionMatches.map(\n ({ reflection, entryId, recordIndex }) => ({\n reflection,\n reflectionEntryId: entryId,\n reflectionRecordIndex: recordIndex,\n }),\n );\n const sourceEntries = uniqueById(\n recalledObservations.flatMap((match) => match.sourceEntries),\n );\n const missingSourceEntryIds = uniqueStrings(\n recalledObservations.flatMap((match) => match.missingSourceEntryIds),\n );\n const nonSourceEntryIds = uniqueStrings(\n recalledObservations.flatMap((match) => match.nonSourceEntryIds),\n );\n const uniqueMissingSupportingObservationIds = uniqueStrings(\n rawMissingSupportingObservationIds,\n );\n const matchCount = directObservationMatches.length + reflectionMatches.length;\n\n return {\n status: \"found\",\n memoryId,\n kind:\n directObservationMatches.length > 0 && reflectionMatches.length > 0\n ? \"mixed\"\n : reflectionMatches.length > 0\n ? \"reflection\"\n : \"observation\",\n reflections: recalledReflections,\n observations: recalledObservations,\n sourceEntries,\n missingSourceEntryIds,\n nonSourceEntryIds,\n missingSupportingObservationIds: uniqueMissingSupportingObservationIds,\n collision: matchCount > 1,\n partial:\n missingSourceEntryIds.length > 0 ||\n nonSourceEntryIds.length > 0 ||\n uniqueMissingSupportingObservationIds.length > 0,\n };\n}\n","/**\n * Before-compact hook — handles pi-vcc compaction + OM content injection.\n *\n * Upstream: https://github.com/sting8k/pi-vcc (src/hooks/before-compact.ts)\n * Modified by pi-vcc-om:\n * - After pi-vcc compiles its summary, calls buildCompactionProjection\n * and renderSummary to append observations/reflections to the output.\n * - This is the single joining point between pi-vcc and OM.\n */\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { convertToLlm } from \"@earendil-works/pi-coding-agent\";\nimport { writeFileSync } from \"fs\";\nimport { compile } from \"../core/summarize\";\nimport type { PiVccCompactionDetails } from \"../details\";\nimport {\n buildCompactionProjection,\n renderSummary,\n} from \"../om/ledger/index.js\";\nimport type { Runtime } from \"../om/runtime.js\";\nimport { debugLog } from \"../om/debug-log.js\";\nimport { configFileNeedsMigration } from \"../core/unified-config.js\";\n\nexport const PI_VCC_COMPACT_INSTRUCTION = \"__pi_vcc__\";\n\n// ── Migration reminder ────────────────────────────────────────────────────────\n\n/** Per-session notification count for migration reminder (max 2). */\nconst migrationNotifyCount = new Map<string, number>();\n\n/**\n * Show migration reminder notification if user's on-disk config still has legacy keys.\n * At most 2 notifications per session. Call after compaction completes.\n */\nexport function notifyMigrationReminder(\n sessionId: string,\n notify: (msg: string, level: string) => void,\n): void {\n const count = migrationNotifyCount.get(sessionId) ?? 0;\n if (count >= 2) return;\n if (!configFileNeedsMigration()) return;\n migrationNotifyCount.set(sessionId, count + 1);\n notify(\n \"blackhole: Use `/blackhole configure` to save your updated configuration.\",\n \"info\",\n );\n}\n\nconst formatTokens = (n: number): string => {\n if (n >= 1000) return `${(n / 1000).toFixed(1)}k`;\n return String(n);\n};\n\nexport interface CompactionStats {\n summarized: number;\n kept: number;\n keptTokensEst: number;\n compactAll: boolean;\n totalUserTurns: number;\n keptUserTurns: number;\n requestedKeepUserTurns: number;\n keepUserTurnsExplicit: boolean;\n keepFallbackToCompactAll: boolean;\n smartKeepAdjusted: boolean;\n smartFromKeep: number;\n}\n\n/**\n * Format compaction stats for user-visible notification.\n * Example output:\n * blackhole: 6 source entries processed; tail kept 1/4 user turns (~0.5k tok).\n */\nexport const formatCompactionStats = (stats: CompactionStats): string => {\n const parts: string[] = [`${stats.summarized} source entries processed`];\n parts.push(\n `tail kept ${stats.keptUserTurns}/${stats.totalUserTurns} user turns`,\n );\n if (stats.smartKeepAdjusted) {\n parts.push(`smart keep:${stats.smartFromKeep}→${stats.keptUserTurns}`);\n }\n if (stats.keepFallbackToCompactAll) {\n parts.push(`compact-all`);\n }\n return `blackhole: ${parts.join(\"; \")} (~${formatTokens(stats.keptTokensEst)} tok).`;\n};\n\nconst dbg = (debug: boolean, data: Record<string, unknown>) => {\n if (!debug) return;\n try {\n writeFileSync(\n \"/tmp/pi-blackhole-debug.json\",\n JSON.stringify(data, null, 2),\n );\n } catch {}\n};\n\nconst previewContent = (content: unknown): string => {\n if (typeof content === \"string\") return content.slice(0, 300);\n if (Array.isArray(content)) {\n return content\n .map((c: any) => {\n if (c?.type === \"text\") return c.text ?? \"\";\n if (c?.type === \"toolCall\") return `[toolCall:${c.name}]`;\n if (c?.type === \"thinking\") return `[thinking]`;\n if (c?.type === \"image\") return `[image:${c.mimeType}]`;\n return `[${c?.type ?? \"unknown\"}]`;\n })\n .join(\"\\n\")\n .slice(0, 300);\n }\n return \"\";\n};\n\ninterface EntryWithMessage {\n entry: { id: string; type: string };\n message: { role: string; content: unknown };\n}\n\nexport type OwnCutCancelReason = \"no_live_messages\" | \"too_few_live_messages\";\n\nexport type OwnCutResult =\n | { ok: true; messages: any[]; firstKeptEntryId: string; compactAll: boolean }\n | { ok: false; reason: OwnCutCancelReason };\n\nexport function buildOwnCut(\n branchEntries: any[],\n /** Pi's firstKeptEntryId from preparation (undefined = don't use Pi's cut). */\n piFirstKeptEntryId?: string,\n /** \"pi-default\" = use Pi's cut, \"minimal\" = keep only last user message (current). */\n tailBehavior?: \"pi-default\" | \"minimal\",\n): OwnCutResult {\n // Find the last compaction entry and its firstKeptEntryId\n let lastCompactionIdx = -1;\n let lastKeptId: string | undefined;\n for (let i = branchEntries.length - 1; i >= 0; i--) {\n if (branchEntries[i].type === \"compaction\") {\n lastCompactionIdx = i;\n lastKeptId = branchEntries[i].firstKeptEntryId;\n break;\n }\n }\n\n // Orphan recovery: triggers when lastKeptId is set to \"\" (sentinel from prior\n // compact-all) OR set to an id that no longer exists in the branch. In both cases,\n // start collecting from right after the last compaction entry.\n const hasPriorCompaction = lastCompactionIdx >= 0;\n const hasValidKeptId =\n !!lastKeptId && branchEntries.some((e: any) => e.id === lastKeptId);\n const orphanRecovery = hasPriorCompaction && !hasValidKeptId;\n\n // Collect live messages\n const liveMessages: EntryWithMessage[] = [];\n if (orphanRecovery) {\n for (let i = lastCompactionIdx + 1; i < branchEntries.length; i++) {\n const e = branchEntries[i];\n if (e.type === \"compaction\") continue;\n if (e.type === \"message\" && e.message) {\n liveMessages.push({ entry: e, message: e.message });\n }\n }\n } else {\n let foundKept = !lastKeptId; // if no prior compaction, start collecting immediately\n for (const e of branchEntries) {\n if (!foundKept && e.id === lastKeptId) foundKept = true;\n if (!foundKept) continue;\n if (e.type === \"compaction\") continue;\n if (e.type === \"message\" && e.message) {\n liveMessages.push({ entry: e, message: e.message });\n }\n }\n }\n\n // ── Pi's cut path: use Pi's firstKeptEntryId instead of last-user cut ──\n if (tailBehavior === \"pi-default\" && piFirstKeptEntryId) {\n const cutInBranch = branchEntries.findIndex(\n (e: any) => e.id === piFirstKeptEntryId,\n );\n if (cutInBranch >= 0) {\n const liveCutIdx = liveMessages.findIndex(\n (lm) => lm.entry.id === piFirstKeptEntryId,\n );\n if (liveCutIdx > 0) {\n return {\n ok: true,\n messages: liveMessages.slice(0, liveCutIdx).map((e) => e.message),\n firstKeptEntryId: piFirstKeptEntryId,\n compactAll: false,\n };\n }\n if (liveCutIdx === 0) {\n // Pi's cut is at first live message.\n // Pi wants to keep everything, so only compact-all is acceptable (summarizes\n // everything for a fresh page). If minimal path would aggressively cut\n // (multiple user messages), cancel to respect Pi's guidance.\n let lastUserIdx = liveMessages.length - 1;\n while (\n lastUserIdx > 0 &&\n liveMessages[lastUserIdx].message.role !== \"user\"\n ) {\n lastUserIdx--;\n }\n if (lastUserIdx > 0) {\n // Multiple user messages — minimal would aggressively cut, violating Pi\n return { ok: false, reason: \"too_few_live_messages\" };\n }\n // Single user message — fall through to minimal path (will compact-all)\n }\n // liveCutIdx === -1: piFirstKeptEntryId not found in liveMessages\n // (e.g., refers to a non-message entry like type:\"custom\" OM metadata or\n // type:\"compaction\"). Resolve to the next message entry after pi's cut point.\n if (liveCutIdx < 0) {\n const nextMsgEntry = branchEntries.find(\n (e: any, i: number) =>\n i > cutInBranch && e.type === \"message\" && e.message,\n );\n if (nextMsgEntry) {\n const resolvedId: string = nextMsgEntry.id;\n const resolvedLiveIdx = liveMessages.findIndex(\n (lm) => lm.entry.id === resolvedId,\n );\n if (resolvedLiveIdx > 0) {\n return {\n ok: true,\n messages: liveMessages\n .slice(0, resolvedLiveIdx)\n .map((e) => e.message),\n firstKeptEntryId: resolvedId,\n compactAll: false,\n };\n }\n if (resolvedLiveIdx === 0) {\n let lastUserIdx = liveMessages.length - 1;\n while (\n lastUserIdx > 0 &&\n liveMessages[lastUserIdx].message.role !== \"user\"\n ) {\n lastUserIdx--;\n }\n if (lastUserIdx > 0) {\n return { ok: false, reason: \"too_few_live_messages\" };\n }\n // Single user message — fall through to minimal (will compact-all)\n }\n // resolvedLiveIdx === -1: resolved message not in liveMessages\n // (shouldn't happen since liveMessages starts from prior firstKeptEntryId\n // which should be before or at pi's cut), but fall through if it does.\n }\n // No message found after pi's cut point in branch — fall through\n }\n }\n // piFirstKeptEntryId not found in branch → fall through to minimal / orphan recovery\n }\n\n if (liveMessages.length === 0)\n return { ok: false, reason: \"no_live_messages\" };\n if (liveMessages.length <= 2)\n return { ok: false, reason: \"too_few_live_messages\" };\n\n // Summarize all messages, keep only the last user message as context\n let cutIdx = liveMessages.length - 1;\n while (cutIdx > 0 && liveMessages[cutIdx].message.role !== \"user\") {\n cutIdx--;\n }\n\n if (cutIdx <= 0) {\n // Single user prompt scenario (or no user at all).\n // Compact EVERYTHING and keep no tail. This handles both:\n // - Single user prompt at index 0: compact all, fresh start after summary\n // - No user message at all (e.g., long assistant/tool chain): still compact\n // to recover from context overflow rather than cancelling and leaving\n // the session unrecoverable.\n // firstKeptEntryId=\"\" is a sentinel: pi-core's buildSessionContext won't match it\n // (so 0 kept from pre-compaction), and next buildOwnCut triggers orphan recovery.\n return {\n ok: true,\n messages: liveMessages.map((e) => e.message),\n firstKeptEntryId: \"\",\n compactAll: true,\n };\n }\n\n return {\n ok: true,\n messages: liveMessages.slice(0, cutIdx).map((e) => e.message),\n firstKeptEntryId: liveMessages[cutIdx].entry.id,\n compactAll: false,\n };\n}\n\nconst REASON_MESSAGES: Record<OwnCutCancelReason, string> = {\n no_live_messages: \"blackhole: Nothing to compact (no live messages)\",\n too_few_live_messages:\n 'blackhole: Too few live messages — Pi\\'s default logic preserves visible context. Set tailBehavior to \"minimal\" in config to force compaction with fewer messages.',\n};\n\nexport const registerBeforeCompactHook = (\n pi: ExtensionAPI,\n omRuntime: Runtime,\n) => {\n pi.on(\"session_before_compact\", (event, ctx) => {\n const { preparation, branchEntries, customInstructions } = event;\n omRuntime.ensureConfig(ctx.cwd ?? process.cwd(), (msg) =>\n ctx.ui?.notify?.(msg, \"warning\"),\n );\n const trace = (ev: string, d?: Record<string, unknown>) =>\n debugLog(ev, d, omRuntime.config.debugLog === true);\n\n trace(\"before_compact.enter\", {\n customInstructions,\n isPiVcc: customInstructions === PI_VCC_COMPACT_INSTRUCTION,\n overrideDefaultCompaction: omRuntime.config.overrideDefaultCompaction,\n manualMode:\n omRuntime.config.compaction === \"manual\" ||\n omRuntime.config.noAutoCompact === true,\n branchLength: branchEntries.length,\n hasPreviousSummary: !!preparation.previousSummary,\n });\n\n // Always handle explicit /blackhole marker.\n // Otherwise, only handle when user opted in via settings.\n const isPiVcc = customInstructions === PI_VCC_COMPACT_INSTRUCTION;\n\n // NEW: Unified compaction guards\n // compaction \"off\": blackhole skips auto-triggered, but /blackhole still uses blackhole pipeline\n if (omRuntime.config.compaction === \"off\" && !isPiVcc) {\n trace(\"before_compact.return_early\", { reason: \"compaction_off\" });\n return;\n }\n\n // compactionEngine \"pi-default\" means let Pi handle auto-triggered compactions\n if (omRuntime.config.compactionEngine === \"pi-default\" && !isPiVcc) {\n trace(\"before_compact.return_early\", {\n reason: \"compactionEngine_pi_default\",\n });\n return;\n }\n\n // compaction \"manual\": /compact falls through to Pi, /blackhole still works\n if (omRuntime.config.compaction === \"manual\" && !isPiVcc) {\n trace(\"before_compact.return_early\", { reason: \"compaction_manual\" });\n return;\n }\n\n // LEGACY: old config key guards — only apply when new keys are absent (unmigrated config)\n if (\n omRuntime.config.compaction === undefined &&\n omRuntime.config.compactionEngine === undefined\n ) {\n if (!isPiVcc && !omRuntime.config.overrideDefaultCompaction) {\n trace(\"before_compact.return_early\", {\n reason: \"overrideDefaultCompaction=false and not /blackhole\",\n });\n return;\n }\n\n if (\n (omRuntime.config.compaction === \"manual\" ||\n omRuntime.config.noAutoCompact) &&\n !isPiVcc\n ) {\n trace(\"before_compact.cancel\", {\n reason: \"manual mode and not /blackhole\",\n });\n return { cancel: true };\n }\n }\n\n // Determine effective tail behavior for buildOwnCut\n // Both /blackhole and auto-triggered default to \"minimal\" (aggressive cut);\n // users can opt into \"pi-default\" (gentler) by setting tailBehavior in config.\n const effectiveTailBehavior = omRuntime.config.tailBehavior ?? \"minimal\";\n\n trace(\"before_compact.tail_behavior\", {\n effectiveTailBehavior,\n configTailBehavior: omRuntime.config.tailBehavior,\n isPiVcc,\n piFirstKeptEntryId: preparation.firstKeptEntryId,\n });\n\n const ownCut = buildOwnCut(\n branchEntries as any[],\n preparation.firstKeptEntryId,\n effectiveTailBehavior,\n );\n if (!ownCut.ok) {\n const lastComp = [...branchEntries]\n .reverse()\n .find((e: any) => e.type === \"compaction\");\n const lastCompIdx = lastComp\n ? (branchEntries as any[]).indexOf(lastComp)\n : -1;\n\n // Recompute liveMessages view (same logic as buildOwnCut) for diagnostic\n const lastKeptId: string | undefined = (lastComp as any)\n ?.firstKeptEntryId;\n const hasPriorCompaction = lastCompIdx >= 0;\n const hasValidKeptId =\n !!lastKeptId &&\n (branchEntries as any[]).some((e: any) => e.id === lastKeptId);\n const diagOrphan = hasPriorCompaction && !hasValidKeptId;\n const liveRoles: string[] = [];\n if (diagOrphan) {\n for (let i = lastCompIdx + 1; i < branchEntries.length; i++) {\n const e = (branchEntries as any[])[i];\n if (e.type === \"compaction\") continue;\n if (e.type === \"message\" && e.message) liveRoles.push(e.message.role);\n }\n } else {\n let foundKept = !lastKeptId;\n for (const e of branchEntries as any[]) {\n if (!foundKept && e.id === lastKeptId) foundKept = true;\n if (!foundKept) continue;\n if (e.type === \"compaction\") continue;\n if (e.type === \"message\" && e.message) liveRoles.push(e.message.role);\n }\n }\n const userIndices = liveRoles.reduce<number[]>(\n (acc, r, i) => (r === \"user\" ? (acc.push(i), acc) : acc),\n [],\n );\n\n dbg(omRuntime.config.debug, {\n cancelled: true,\n reason: ownCut.reason,\n isPiVcc,\n counts: {\n total: branchEntries.length,\n messages: (branchEntries as any[]).filter(\n (e: any) => e.type === \"message\",\n ).length,\n compactions: (branchEntries as any[]).filter(\n (e: any) => e.type === \"compaction\",\n ).length,\n entriesAfterLastCompaction:\n lastCompIdx >= 0 ? branchEntries.length - lastCompIdx - 1 : null,\n },\n liveMessages: {\n count: liveRoles.length,\n userCount: userIndices.length,\n firstUserIdx: userIndices[0] ?? null,\n lastUserIdx: userIndices[userIndices.length - 1] ?? null,\n roleSequence:\n liveRoles.length <= 30\n ? liveRoles\n : [...liveRoles.slice(0, 10), \"...\", ...liveRoles.slice(-10)],\n },\n lastCompaction: lastComp\n ? {\n hasFirstKeptEntryId: !!(lastComp as any).firstKeptEntryId,\n foundInBranch: (lastComp as any).firstKeptEntryId\n ? (branchEntries as any[]).some(\n (e: any) => e.id === (lastComp as any).firstKeptEntryId,\n )\n : null,\n }\n : null,\n tail: (branchEntries as any[]).slice(-5).map((e: any) => ({\n type: e.type,\n role: e.type === \"message\" ? e.message?.role : undefined,\n hasContent:\n e.type === \"message\" ? e.message?.content != null : undefined,\n })),\n });\n\n trace(\"before_compact.cancel\", { reason: ownCut.reason, isPiVcc });\n try {\n ctx?.ui?.notify?.(REASON_MESSAGES[ownCut.reason], \"warning\");\n } catch {}\n return { cancel: true };\n }\n\n trace(\"before_compact.proceeding\", {\n messageCount: ownCut.messages.length,\n firstKeptEntryId: ownCut.firstKeptEntryId,\n compactAll: ownCut.compactAll,\n isPiVcc,\n });\n\n const agentMessages = ownCut.messages;\n const firstKeptEntryId = ownCut.firstKeptEntryId;\n const messages = convertToLlm(agentMessages);\n\n // Count kept messages and estimate tokens\n const keptIdx = (branchEntries as any[]).findIndex(\n (e: any) => e.id === firstKeptEntryId,\n );\n const keptEntries =\n keptIdx >= 0\n ? (branchEntries as any[])\n .slice(keptIdx)\n .filter((e: any) => e.type === \"message\")\n : [];\n const keptChars = keptEntries.reduce((sum: number, e: any) => {\n const c = e.message?.content;\n if (typeof c === \"string\") return sum + c.length;\n if (Array.isArray(c))\n return (\n sum +\n c.reduce((s: number, p: any) => {\n if (p.text) return s + p.text.length;\n if (p.type === \"toolCall\")\n return (\n s +\n (p.name?.length ?? 0) +\n (typeof p.input === \"string\"\n ? p.input.length\n : JSON.stringify(p.input ?? \"\").length)\n );\n if (p.type === \"toolResult\")\n return (\n s +\n (typeof p.content === \"string\"\n ? p.content.length\n : JSON.stringify(p.content ?? \"\").length)\n );\n return s;\n }, 0)\n );\n return sum;\n }, 0);\n const totalUserTurns = (branchEntries as any[]).filter(\n (e: any) => e.type === \"message\" && e.message?.role === \"user\",\n ).length;\n const keptUserTurns = ownCut.compactAll\n ? 0\n : (branchEntries as any[])\n .slice(keptIdx)\n .filter(\n (e: any) => e.type === \"message\" && e.message?.role === \"user\",\n ).length;\n omRuntime.compactionStats = {\n summarized: agentMessages.length,\n kept: keptEntries.length,\n keptTokensEst: Math.round(keptChars / 4),\n compactAll: ownCut.compactAll,\n totalUserTurns,\n keptUserTurns,\n requestedKeepUserTurns: 1,\n keepUserTurnsExplicit: false,\n keepFallbackToCompactAll: ownCut.compactAll,\n smartKeepAdjusted: false,\n smartFromKeep: 1,\n };\n\n const summary = compile({\n messages,\n previousSummary: preparation.previousSummary,\n fileOps: {\n readFiles: [...preparation.fileOps.read],\n modifiedFiles: [\n ...preparation.fileOps.written,\n ...preparation.fileOps.edited,\n ],\n },\n });\n\n const branchIds = branchEntries.map((e: any) => e.id);\n const cutIdx = branchIds.indexOf(firstKeptEntryId);\n const cutWindow =\n cutIdx >= 0\n ? branchEntries\n .slice(\n Math.max(0, cutIdx - 3),\n Math.min(branchEntries.length, cutIdx + 3),\n )\n .map((e: any) => ({\n id: e.id,\n type: e.type,\n role: e.type === \"message\" ? e.message?.role : undefined,\n preview:\n e.type === \"message\"\n ? previewContent(e.message?.content)\n : undefined,\n }))\n : [];\n\n dbg(omRuntime.config.debug, {\n usedOwnCut: true,\n messagesToSummarize: agentMessages.length,\n messagesPreviewHead: agentMessages.slice(0, 3).map((m: any) => ({\n role: m.role,\n preview: previewContent(m.content),\n })),\n messagesPreviewTail: agentMessages.slice(-3).map((m: any) => ({\n role: m.role,\n preview: previewContent(m.content),\n })),\n convertedMessages: messages.length,\n firstKeptEntryId,\n cutWindow,\n tokensBefore: preparation.tokensBefore,\n summaryLength: summary.length,\n summaryPreview: summary.slice(0, 500),\n sections: [...summary.matchAll(/^\\[(.+?)\\]/gm)].map((m) => m[1]),\n });\n\n trace(\"before_compact.summary_generated\", {\n summaryLength: summary.length,\n messageCount: agentMessages.length,\n });\n\n const details: PiVccCompactionDetails = {\n compactor: \"blackhole\",\n version: 1,\n sections: [...summary.matchAll(/^\\[(.+?)\\]/gm)].map((m) => m[1]),\n sourceMessageCount: agentMessages.length,\n previousSummaryUsed: Boolean(preparation.previousSummary),\n };\n\n omRuntime.compactWasPiVcc = isPiVcc;\n\n // ── Inject observational-memory content ───────────────────────────\n let omContent: string;\n let omDetails: Record<string, unknown> | undefined;\n trace(\"before_compact.om_injection\", {\n memoryEnabled: omRuntime.config.memory !== false,\n });\n if (omRuntime.config.memory !== false) {\n const projection = buildCompactionProjection(\n branchEntries as any[],\n firstKeptEntryId,\n {\n observationsPoolMaxTokens: omRuntime.config.observationsPoolMaxTokens,\n fullFoldAlways: omRuntime.config.fullFoldAlways,\n },\n );\n omContent = renderSummary(\n projection.reflections,\n projection.observations,\n );\n omDetails = projection.details;\n } else {\n omContent = renderSummary([], []);\n }\n\n return {\n compaction: {\n summary: summary + \"\\n\\n\" + omContent,\n details: { ...details, \"om.folded\": omDetails },\n tokensBefore: preparation.tokensBefore,\n firstKeptEntryId,\n },\n };\n });\n\n // Fire success toast for /compact path only (delayed to let UI settle).\n // /blackhole path uses its own onComplete callback in the command handler.\n pi.on(\"session_compact\", (event, ctx) => {\n if (!event.fromExtension) return;\n if (omRuntime.compactWasPiVcc) return; // /blackhole handles its own toast via onComplete\n const stats = omRuntime.compactionStats;\n if (!stats) return;\n const sessionId = ctx.sessionManager.getSessionId();\n setTimeout(() => {\n try {\n ctx?.ui?.notify?.(formatCompactionStats(stats), \"info\");\n notifyMigrationReminder(sessionId, (msg, level) =>\n ctx?.ui?.notify?.(msg, level as any),\n );\n } catch {}\n }, 500);\n });\n};\n","/**\n * Pending OM state persistence.\n *\n * When `compaction: \"manual\"` is enabled (or legacy `noAutoCompact`), observations, reflections, and dropper\n * results are saved to disk instead of being appended to the conversation.\n * Each new pipeline run replaces the previous result (latest subsumes earlier\n * since every run processes all entries since the last actual branch append).\n *\n * On manual `/blackhole` trigger, pending entries are flushed to the branch\n * and the file is cleared.\n *\n * Per-session files: each session gets its own <sessionId>-pending.json\n * under ~/.pi/agent/pi-blackhole/. This eliminates race conditions from\n * concurrent pi sessions writing to a shared file.\n */\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n renameSync,\n unlinkSync,\n writeFileSync,\n} from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface PendingObservation {\n coversUpToId: string;\n data: unknown;\n}\n\nexport interface PendingReflection {\n coversUpToId: string;\n data: unknown;\n}\n\nexport interface PendingDropped {\n coversUpToId: string;\n data: unknown;\n}\n\nexport interface PendingOMState {\n /** Latest observation run (replaced each time, not accumulated). */\n observation?: PendingObservation;\n /** Latest reflection run (replaced each time, not accumulated). */\n reflection?: PendingReflection;\n /** Latest dropper run (replaced each time, not accumulated). */\n dropped?: PendingDropped;\n /**\n * All observation batches accumulated across manual mode pipeline runs.\n * Each batch preserves per-run coverage (coversUpToId) matching the normal\n * branch-marker pattern. Used for LLM context and /blackhole flush.\n */\n observationBatches?: PendingObservation[];\n /**\n * All reflection batches accumulated across manual mode pipeline runs.\n * Preserves per-run coverage for LLM context and /blackhole flush.\n */\n reflectionBatches?: PendingReflection[];\n /**\n * All dropper batches accumulated across manual mode pipeline runs.\n * Each batch preserves which observations were dropped in that run.\n * Without accumulation, earlier drops are lost when the next dropper\n * run overwrites pending.dropped, causing them to be \"un-dropped\" on\n * /blackhole flush.\n */\n droppedBatches?: PendingDropped[];\n /** Pipeline progress cursors — persist across restarts and fork recovery. */\n cursors?: {\n observer?: { entryId: string; state: string };\n reflector?: { entryId: string; state: string };\n dropper?: { entryId: string; state: string };\n };\n}\n\n// ── Persistence ─────────────────────────────────────────────────────────────\n\nconst PENDING_DIR = \"pi-blackhole\";\nconst PENDING_SUFFIX = \"-pending.json\";\nconst STALE_SUFFIX = \"-pending.stale.json\";\n\n/** Build the path for a given session's pending file. */\nfunction pendingPath(sessionId: string): string {\n return join(getAgentDir(), PENDING_DIR, `${sessionId}${PENDING_SUFFIX}`);\n}\n\n/** Build the path for a given session's stale pending file (backup of previous write). */\nfunction stalePath(sessionId: string): string {\n return join(getAgentDir(), PENDING_DIR, `${sessionId}${STALE_SUFFIX}`);\n}\n\n/** Ensure the pending directory exists. */\nfunction ensureDir(): void {\n const dir = join(getAgentDir(), PENDING_DIR);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n}\n\nfunction defaultState(): PendingOMState {\n return {};\n}\n\nfunction isEmptyState(s: PendingOMState): boolean {\n const hasCursors =\n s.cursors &&\n (s.cursors.observer || s.cursors.reflector || s.cursors.dropper);\n if (hasCursors) return false;\n return (\n !s.observation &&\n !s.reflection &&\n !s.dropped &&\n (!s.observationBatches || s.observationBatches.length === 0) &&\n (!s.reflectionBatches || s.reflectionBatches.length === 0) &&\n (!s.droppedBatches || s.droppedBatches.length === 0)\n );\n}\n\n// ── Per-session file read/write ─────────────────────────────────────────────\n\n/**\n * Read pending state for a specific session from its dedicated file.\n * Returns default (empty) state if file doesn't exist or is corrupt.\n */\nfunction readSessionState(sessionId: string): PendingOMState {\n const path = pendingPath(sessionId);\n if (!existsSync(path)) return defaultState();\n\n try {\n const raw = JSON.parse(readFileSync(path, \"utf-8\"));\n if (isPendingOMState(raw)) return sanitizePendingState(raw);\n return defaultState();\n } catch {\n return defaultState();\n }\n}\n\n/**\n * Write pending state for a specific session to its dedicated file.\n * Deletes the file if state is empty.\n * Preserves the previous state as <sessionId>-pending.stale.json as backup.\n */\nfunction writeSessionState(sessionId: string, state: PendingOMState): void {\n const path = pendingPath(sessionId);\n if (isEmptyState(state)) {\n // Clear: remove both main and stale\n try {\n if (existsSync(path)) unlinkSync(path);\n } catch {\n /* best-effort */\n }\n try {\n const stale = stalePath(sessionId);\n if (existsSync(stale)) unlinkSync(stale);\n } catch {\n /* best-effort */\n }\n return;\n }\n\n ensureDir();\n\n // Before writing new state, rename current file to stale as backup\n try {\n if (existsSync(path)) {\n renameSync(path, stalePath(sessionId));\n }\n } catch {\n /* best-effort — stale backup is optional */\n }\n\n try {\n writeFileSync(path, `${JSON.stringify(state, null, 2)}\\n`);\n } catch {\n // Best-effort: pending state loss means consolidation may re-process\n // the same data on the next run — safe (idempotent by design).\n // Prevents process crash on read-only filesystems.\n }\n}\n\n/** Validate that unknown value is shape-compatible with PendingOMState. */\nfunction isPendingOMState(value: unknown): value is PendingOMState {\n if (!value || typeof value !== \"object\") return false;\n const v = value as Record<string, unknown>;\n const hasObs = !!(\n v.observation &&\n typeof v.observation === \"object\" &&\n typeof (v.observation as any).coversUpToId === \"string\"\n );\n const hasRef = !!(\n v.reflection &&\n typeof v.reflection === \"object\" &&\n typeof (v.reflection as any).coversUpToId === \"string\"\n );\n const hasDrop = !!(\n v.dropped &&\n typeof v.dropped === \"object\" &&\n typeof (v.dropped as any).coversUpToId === \"string\"\n );\n // Also accept states with only batch arrays (no singular fields)\n const hasBatches =\n Array.isArray(v.observationBatches) ||\n Array.isArray(v.reflectionBatches) ||\n Array.isArray(v.droppedBatches);\n // Accept cursor-only states (no observations/reflections yet, but persisted)\n const hasCursors = !!(v.cursors && typeof v.cursors === \"object\");\n return hasObs || hasRef || hasDrop || hasBatches || hasCursors;\n}\n\n/**\n * Sanitize pending state: filter out corrupted batch entries (missing required fields).\n * Returns a clean copy; does not mutate the input.\n */\nfunction sanitizePendingState(raw: PendingOMState): PendingOMState {\n const sanitized: PendingOMState = {\n ...raw,\n observation: raw.observation ?? undefined,\n reflection: raw.reflection ?? undefined,\n dropped: raw.dropped ?? undefined,\n };\n // Filter batch arrays to only include valid entries with the required shape\n if (Array.isArray(raw.observationBatches)) {\n sanitized.observationBatches = raw.observationBatches.filter(\n (b): b is PendingObservation =>\n !!b &&\n typeof b === \"object\" &&\n typeof (b as any).coversUpToId === \"string\" &&\n (b as any).data !== undefined,\n );\n }\n if (Array.isArray(raw.reflectionBatches)) {\n sanitized.reflectionBatches = raw.reflectionBatches.filter(\n (b): b is PendingReflection =>\n !!b &&\n typeof b === \"object\" &&\n typeof (b as any).coversUpToId === \"string\" &&\n (b as any).data !== undefined,\n );\n }\n if (Array.isArray(raw.droppedBatches)) {\n sanitized.droppedBatches = raw.droppedBatches.filter(\n (b): b is PendingDropped =>\n !!b &&\n typeof b === \"object\" &&\n typeof (b as any).coversUpToId === \"string\" &&\n (b as any).data !== undefined,\n );\n }\n return sanitized;\n}\n\n// ── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Save (replace) the latest observation result for a session.\n * Each new run covers all entries since last branch append, so the latest\n * result fully subsumes any previous one.\n */\nexport function savePendingObservation(\n sessionId: string,\n entry: PendingObservation,\n): void {\n const state = readSessionState(sessionId);\n state.observation = entry;\n // Append to accumulated batches for LLM context and /blackhole flush.\n // Each batch preserves per-run coverage (coversUpToId) matching the\n // normal branch-marker pattern.\n state.observationBatches = [...(state.observationBatches ?? []), entry];\n writeSessionState(sessionId, state);\n}\n\n/**\n * Save (replace) the latest reflection result for a session.\n */\nexport function savePendingReflection(\n sessionId: string,\n entry: PendingReflection,\n): void {\n const state = readSessionState(sessionId);\n state.reflection = entry;\n // Append to accumulated batches for LLM context and /blackhole flush.\n state.reflectionBatches = [...(state.reflectionBatches ?? []), entry];\n writeSessionState(sessionId, state);\n}\n\n/**\n * Save (replace) the latest dropper result for a session and\n * append to droppedBatches so no drops are lost across cycles\n * before /blackhole flush.\n */\nexport function savePendingDropped(\n sessionId: string,\n entry: PendingDropped,\n): void {\n const state = readSessionState(sessionId);\n state.dropped = entry;\n state.droppedBatches = [...(state.droppedBatches ?? []), entry];\n writeSessionState(sessionId, state);\n}\n\n/**\n * Check whether a coversUpToId matches the already-pending observation\n * for the given session. Returns true if the chunk was already processed.\n */\nexport function isObservationChunkPending(\n sessionId: string,\n coversUpToId: string,\n): boolean {\n const s = readSessionState(sessionId);\n return s.observation?.coversUpToId === coversUpToId;\n}\n\n/**\n * Check whether a coversUpToId matches the already-pending reflection\n * for the given session.\n */\nexport function isReflectionChunkPending(\n sessionId: string,\n coversUpToId: string,\n): boolean {\n const s = readSessionState(sessionId);\n return s.reflection?.coversUpToId === coversUpToId;\n}\n\n/** Read the pending OM state for a specific session. */\nexport function readPendingState(sessionId: string): PendingOMState {\n return readSessionState(sessionId);\n}\n\n/** Clear the pending OM state for a specific session after flushing to branch. */\nexport function clearPendingState(sessionId: string): void {\n writeSessionState(sessionId, defaultState());\n}\n\n/** Check whether there is any pending OM state for a specific session. */\nexport function hasPendingData(sessionId: string): boolean {\n return !isEmptyState(readSessionState(sessionId));\n}\n\n/** Read cursors from pending state for a session. */\nexport function readPendingCursors(\n sessionId: string,\n): PendingOMState[\"cursors\"] {\n const state = readSessionState(sessionId);\n return state.cursors;\n}\n\n/** Write cursors to pending state for a session (replaces existing cursors).\n * Uses assignment (not merge) so deletions from validateCursors persist. */\nexport function writePendingCursors(\n sessionId: string,\n cursors: PendingOMState[\"cursors\"],\n): void {\n const state = readSessionState(sessionId);\n state.cursors = { ...cursors };\n writeSessionState(sessionId, state);\n}\n\n/**\n * List all session IDs that have pending data by scanning the pending directory\n * for *-pending.json files.\n */\nexport function listPendingSessions(): string[] {\n const dir = join(getAgentDir(), PENDING_DIR);\n if (!existsSync(dir)) return [];\n\n try {\n const files = readdirSync(dir);\n const sessions: string[] = [];\n for (const file of files) {\n if (!file.endsWith(PENDING_SUFFIX)) continue;\n const sessionId = file.slice(0, -PENDING_SUFFIX.length);\n if (!sessionId) continue;\n // Verify the file actually has non-empty data\n const state = readSessionState(sessionId);\n if (!isEmptyState(state)) sessions.push(sessionId);\n }\n return sessions;\n } catch {\n return [];\n }\n}\n","/**\n * Cleanup utility — scans pending JSON files and cross-references against\n * session JSONL files to find orphaned entries safe to delete.\n *\n * Per-session pending files under ~/.pi/agent/pi-blackhole/ accumulate when:\n * - compaction is set to \"manual\" — OM outputs are\n * buffered rather than appended to the session\n * - sessions are forked, abandoned, or deleted — the pending files remain\n * - stale backup files (-pending.stale.json) persist after write-safe renames\n *\n * Safety invariant: a pending file is ONLY orphaned if its sessionId does NOT\n * appear in ANY session JSONL file across all known session directories.\n */\nimport {\n existsSync,\n readdirSync,\n readFileSync,\n statSync,\n unlinkSync,\n} from \"node:fs\";\nimport { join, resolve, sep } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface PendingFile {\n sessionId: string;\n filename: string;\n path: string;\n /** True for -pending.stale.json (backup of previous write). */\n isStale: boolean;\n sizeBytes: number;\n /** Last modified timestamp (epoch ms). */\n mtimeMs: number;\n}\n\nexport interface CleanupReport {\n /** All pending files found (both pending and stale). */\n all: PendingFile[];\n /** Files whose sessionId does not appear in any session JSONL. */\n orphaned: PendingFile[];\n /** Files whose sessionId was matched to an active session. */\n active: PendingFile[];\n}\n\n// ── Constants ───────────────────────────────────────────────────────────────\n\nconst PENDING_DIR = \"pi-blackhole\";\nconst PENDING_SUFFIX = \"-pending.json\";\nconst STALE_SUFFIX = \"-pending.stale.json\";\n\n// ── Helper: extract session ID from filename ────────────────────────────────\n\nfunction extractSessionId(filename: string): string | null {\n if (filename.endsWith(STALE_SUFFIX)) {\n return filename.slice(0, -STALE_SUFFIX.length) || null;\n }\n if (filename.endsWith(PENDING_SUFFIX)) {\n return filename.slice(0, -PENDING_SUFFIX.length) || null;\n }\n return null;\n}\n\n// ── Scan pending files ──────────────────────────────────────────────────────\n\n/**\n * Scan the pi-blackhole directory for all *-pending.json and *-pending.stale.json\n * files. Returns file metadata sorted by mtime (newest first).\n */\nfunction scanPendingFiles(agentDir: string = getAgentDir()): PendingFile[] {\n const dir = join(agentDir, PENDING_DIR);\n if (!existsSync(dir)) return [];\n\n const results: PendingFile[] = [];\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return [];\n }\n\n for (const filename of entries) {\n const sessionId = extractSessionId(filename);\n if (!sessionId) continue;\n\n const filePath = join(dir, filename);\n let stat;\n try {\n stat = statSync(filePath);\n } catch {\n continue; // file disappeared between readdir and stat\n }\n\n results.push({\n sessionId,\n filename,\n path: filePath,\n isStale: filename.endsWith(STALE_SUFFIX),\n sizeBytes: stat.size,\n mtimeMs: stat.mtimeMs,\n });\n }\n\n // Sort: newest first\n results.sort((a, b) => b.mtimeMs - a.mtimeMs);\n return results;\n}\n\n// ── Scan session IDs from JSONL files ───────────────────────────────────────\n\n/**\n * Recursively scan a directory for .jsonl files and extract session IDs from\n * their header line (first line: {\"type\":\"session\",\"id\":\"<uuid>\",...}).\n */\nfunction scanSessionDir(dir: string): Set<string> {\n const ids = new Set<string>();\n if (!existsSync(dir)) return ids;\n\n const stack: string[] = [dir];\n while (stack.length > 0) {\n const current = stack.pop()!;\n let names: string[];\n try {\n names = readdirSync(current);\n } catch {\n continue;\n }\n\n for (const name of names) {\n const fullPath = join(current, name);\n let st;\n try {\n st = statSync(fullPath);\n } catch {\n continue;\n }\n\n if (st.isDirectory()) {\n stack.push(fullPath);\n } else if (st.isFile() && name.endsWith(\".jsonl\")) {\n try {\n const fd = readFileSync(fullPath, \"utf-8\");\n const newlineIdx = fd.indexOf(\"\\n\");\n const firstLine = newlineIdx >= 0 ? fd.slice(0, newlineIdx) : fd;\n const header = JSON.parse(firstLine) as Record<string, unknown>;\n if (\n header.type === \"session\" &&\n typeof header.id === \"string\" &&\n header.id.length > 0\n ) {\n ids.add(header.id);\n }\n } catch {\n // Corrupt or unreadable file — skip\n }\n }\n }\n }\n\n return ids;\n}\n\n/**\n * Read sessionDir override from settings.json, if any.\n * Returns the resolved absolute path, or undefined if not set or unreadable.\n */\nfunction readSettingsSessionDir(): string | undefined {\n try {\n const settingsPath = join(getAgentDir(), \"settings.json\");\n if (!existsSync(settingsPath)) return undefined;\n const raw = JSON.parse(readFileSync(settingsPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n const dir = raw.sessionDir;\n if (typeof dir === \"string\" && dir.trim().length > 0) {\n // Expand ~ if present\n const expanded = dir.startsWith(\"~\")\n ? join(process.env.HOME ?? \"/home\", dir.slice(2))\n : dir;\n return resolve(expanded);\n }\n } catch {\n // Unreadable settings — use default\n }\n return undefined;\n}\n\n/**\n * Find all known session directories.\n * Always includes the default sessions dir; also includes custom sessionDir\n * from settings.json if present and different from the default.\n */\n/** Get the default sessions directory. */\nfunction getDefaultSessionsDir(): string {\n return join(getAgentDir(), \"sessions\");\n}\n\nfunction findSessionDirs(): string[] {\n const dirs: string[] = [];\n const default_ = getDefaultSessionsDir();\n dirs.push(default_);\n\n const custom = readSettingsSessionDir();\n if (custom && custom !== default_ && existsSync(custom)) {\n dirs.push(custom);\n }\n\n return dirs;\n}\n\n/**\n * Collect all session IDs from all known session directories.\n * Returns a Set of session UUIDs found in JSONL headers.\n */\nfunction collectAllSessionIds(sessionDirs?: string[]): Set<string> {\n const dirs = sessionDirs ?? findSessionDirs();\n const allIds = new Set<string>();\n for (const dir of dirs) {\n const ids = scanSessionDir(dir);\n for (const id of ids) allIds.add(id);\n }\n return allIds;\n}\n\n// ── Cross-reference: find orphaned files ────────────────────────────────────\n\n/**\n * Determine which pending files are orphaned (no matching session JSONL).\n *\n * A pending file is orphaned when no session JSONL in any known session\n * directory declares the same session ID in its header.\n *\n * Returns the full report with all files classified.\n */\nfunction crossReference(\n pending: PendingFile[],\n sessionIds: Set<string>,\n): CleanupReport {\n const orphaned: PendingFile[] = [];\n const active: PendingFile[] = [];\n\n for (const pf of pending) {\n if (sessionIds.has(pf.sessionId)) {\n active.push(pf);\n } else {\n orphaned.push(pf);\n }\n }\n\n return { all: pending, orphaned, active };\n}\n\n/**\n * Full pipeline: scan pending files, collect session IDs, cross-reference.\n * Returns the cleanup report.\n */\nexport function analyzeOrphaned(\n agentDir?: string,\n sessionDirs?: string[],\n): CleanupReport {\n const pending = scanPendingFiles(agentDir);\n if (pending.length === 0) {\n return { all: [], orphaned: [], active: [] };\n }\n const sessionIds = collectAllSessionIds(sessionDirs);\n return crossReference(pending, sessionIds);\n}\n\n// ── Deletion ────────────────────────────────────────────────────────────────\n\n/** Session IDs are UUIDs or similar alphanumeric+hyphen strings. */\nconst SAFE_SESSION_ID_RE = /^[a-zA-Z0-9][-a-zA-Z0-9]*$/;\n\n/**\n * Validate that resolving and joining with `sessionId` cannot escape the\n * pi-blackhole directory. Must be called before any unlink.\n */\nfunction validateDeletionPaths(\n sessionId: string,\n pendingDir: string,\n): { ok: true; pendingPath: string; stalePath: string } | { ok: false } {\n // sessionId must be non-empty and contain only safe filesystem characters\n if (!sessionId || typeof sessionId !== \"string\") return { ok: false };\n if (!SAFE_SESSION_ID_RE.test(sessionId)) return { ok: false };\n\n const resolvedDir = resolve(pendingDir);\n const pendingPath = join(resolvedDir, `${sessionId}${PENDING_SUFFIX}`);\n const stalePath = join(resolvedDir, `${sessionId}${STALE_SUFFIX}`);\n\n // Resolve to absolute and verify containment within pi-blackhole/\n const resolvedPending = resolve(pendingPath);\n const resolvedStale = resolve(stalePath);\n\n if (!resolvedPending.startsWith(resolvedDir + sep)) return { ok: false };\n if (!resolvedStale.startsWith(resolvedDir + sep)) return { ok: false };\n\n return { ok: true, pendingPath: resolvedPending, stalePath: resolvedStale };\n}\n\n/**\n * Delete all pending files (pending + stale) for a given sessionId.\n *\n * Safety: validates that both resolved paths live under the pi-blackhole/\n * directory before unlinking. Returns false if validation fails.\n *\n * Returns true if at least one file was deleted, false if no files existed\n * or if the paths failed containment validation.\n */\nexport function deletePendingFiles(\n sessionId: string,\n agentDir?: string,\n): boolean {\n const dir = join(agentDir ?? getAgentDir(), PENDING_DIR);\n const valid = validateDeletionPaths(sessionId, dir);\n if (!valid.ok) return false;\n\n const { pendingPath, stalePath } = valid;\n\n let deleted = false;\n\n try {\n if (existsSync(pendingPath)) {\n unlinkSync(pendingPath);\n deleted = true;\n }\n } catch {\n // Best-effort — file may be locked or already gone\n }\n\n try {\n if (existsSync(stalePath)) {\n unlinkSync(stalePath);\n deleted = true;\n }\n } catch {\n // Best-effort\n }\n\n return deleted;\n}\n\n/**\n * Delete multiple pending files by sessionId.\n * Returns the count of successfully deleted file sets.\n */\nexport function deleteOrphanedBatch(\n orphaned: PendingFile[],\n agentDir?: string,\n): number {\n let count = 0;\n for (const pf of orphaned) {\n if (deletePendingFiles(pf.sessionId, agentDir)) {\n count++;\n }\n }\n return count;\n}\n\n// ── Formatting helpers ──────────────────────────────────────────────────────\n\n/** Human-readable file size. */\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n/** Human-readable age from epoch ms. */\nfunction formatAge(mtimeMs: number, nowMs: number = Date.now()): string {\n const diffMs = nowMs - mtimeMs;\n const seconds = Math.floor(diffMs / 1000);\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n if (days < 365) return `${days}d ago`;\n const years = Math.floor(days / 365);\n return `${years}y ago`;\n}\n\n/** Summary line for a pending file. */\nexport function describeFile(pf: PendingFile, nowMs?: number): string {\n const label = pf.isStale ? \"stale\" : \"pending\";\n return `${pf.sessionId.slice(0, 8)}… ${label} ${formatSize(pf.sizeBytes)} ${formatAge(pf.mtimeMs, nowMs)}`;\n}\n","/**\n * Cleanup handler — TUI picker for orphaned pending files.\n *\n * Called from /blackhole cleanup subcommand.\n * Scans pi-blackhole pending files, cross-references against session JSONL\n * files, and lets the user delete orphaned ones interactively.\n *\n * TUI picker (overlay) provides:\n * ↑↓ navigate\n * Enter delete selected file\n * D delete all orphaned (with inline confirmation)\n * Esc cancel / close\n *\n * Non-TUI fallback (RPC / JSON / print modes): lists orphaned files as text\n * notification. Use TUI mode to actually delete.\n */\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { matchesKey, decodeKittyPrintable } from \"@earendil-works/pi-tui\";\nimport { visibleWidth } from \"../om/key-matcher.js\";\nimport {\n analyzeOrphaned,\n deletePendingFiles,\n deleteOrphanedBatch,\n describeFile,\n type PendingFile,\n} from \"../om/cleanup.js\";\n\n// ── TUI Picker Component ────────────────────────────────────────────────────\n\nconst LIST_ROWS = 10;\n\n/** Clamp a list index to [0, length-1]. */\nfunction clampIndex(idx: number, length: number): number {\n if (length === 0) return 0;\n return Math.max(0, Math.min(idx, length - 1));\n}\n\n/** Build the framed top border with optional title and right-aligned info. */\nfunction buildTopBorder(\n width: number,\n border: (s: string) => string,\n dim: (s: string) => string,\n title?: string,\n right?: string,\n): string {\n const innerW = Math.max(1, width - 2);\n if (!title && !right) {\n return border(`┏${\"━\".repeat(innerW)}┓`);\n }\n const rightText = right ? ` ${right} ` : \"\";\n const titleBudget = Math.max(1, innerW - visibleWidth(rightText) - 1);\n const titleFitted = title\n ? ` ${title.slice(0, Math.max(1, titleBudget - 2))}${title.length > titleBudget - 2 ? \"…\" : \"\"} `\n : \"\";\n const fill = Math.max(\n 1,\n innerW - visibleWidth(titleFitted) - visibleWidth(rightText),\n );\n return border(\n `┏${titleFitted}${\"━\".repeat(fill)}${right ? dim(rightText) : \"\"}┓`,\n );\n}\n\n// ── Component ───────────────────────────────────────────────────────────────\n\n/**\n * Create the orphaned-files picker component for ctx.ui.custom().\n *\n * The component mutates the `orphaned` array in-place when single items are\n * deleted (immediate feedback). The caller creates a copy if needed.\n */\nfunction createCleanupPicker(\n orphaned: PendingFile[],\n theme: {\n fg: (s: string, t: string) => string;\n bg: (s: string, t: string) => string;\n },\n done: (result: \"deleteAll\" | \"cancel\") => void,\n): {\n render(width: number): string[];\n handleInput(data: string): void;\n invalidate(): void;\n} {\n let selectedIndex = 0;\n let scrollOffset = 0;\n let confirmDeleteAll = false;\n\n function clampScroll(): void {\n const count = orphaned.length;\n selectedIndex = clampIndex(selectedIndex, count);\n const maxOffset = Math.max(0, count - LIST_ROWS);\n scrollOffset = Math.max(0, Math.min(scrollOffset, maxOffset));\n if (selectedIndex < scrollOffset) scrollOffset = selectedIndex;\n if (selectedIndex >= scrollOffset + LIST_ROWS && count > 0) {\n scrollOffset = selectedIndex - LIST_ROWS + 1;\n }\n }\n\n const bdr = (t: string) => theme.fg(\"border\", t);\n const dim = (t: string) => theme.fg(\"dim\", t);\n const accent = (t: string) => theme.fg(\"accent\", t);\n const err = (t: string) => theme.fg(\"error\", t);\n const now = Date.now();\n\n function itemLine(pf: PendingFile, isSel: boolean, cw: number): string {\n const desc = describeFile(pf, now);\n const prefix = isSel ? accent(\" ▶\") : \" \";\n const main = isSel ? accent(desc) : desc;\n const line = `${prefix} ${main}`;\n return ` ${line}${\" \".repeat(Math.max(0, cw - visibleWidth(line)))} `;\n }\n\n return {\n invalidate(): void {\n // No cache — render is always fresh\n },\n\n render(width: number): string[] {\n const w = Math.max(40, width);\n const innerW = Math.max(1, w - 2);\n const PX = 1;\n const cw = Math.max(1, innerW - PX * 2);\n const lines: string[] = [];\n\n // ── Confirm-delete-all ──\n if (confirmDeleteAll) {\n const title = `Delete ${orphaned.length} orphaned file${orphaned.length === 1 ? \"\" : \"s\"}?`;\n lines.push(buildTopBorder(w, bdr, dim, \"Cleanup Pending Files\"));\n lines.push(bdr(`┃${\" \".repeat(innerW)}┃`));\n lines.push(\n bdr(\n `┃ ${err(title)}${\" \".repeat(Math.max(0, cw - visibleWidth(title)))} ┃`,\n ),\n );\n lines.push(bdr(`┃${\" \".repeat(innerW)}┃`));\n const hint = \"Enter confirm · Esc cancel\";\n lines.push(\n bdr(\n `┃ ${dim(hint)}${\" \".repeat(Math.max(0, cw - visibleWidth(hint)))} ┃`,\n ),\n );\n lines.push(bdr(`┗${\"━\".repeat(innerW)}┛`));\n return lines;\n }\n\n // ── List ──\n clampScroll();\n\n const sizeLabel = `${orphaned.length} file${orphaned.length === 1 ? \"\" : \"s\"}`;\n lines.push(\n buildTopBorder(w, bdr, dim, \"Orphaned Pending Files\", sizeLabel),\n );\n lines.push(bdr(`┃${\" \".repeat(innerW)}┃`));\n\n if (orphaned.length === 0) {\n lines.push(\n bdr(\n `┃ ${dim(\"No orphaned pending files found\")}${\" \".repeat(Math.max(0, cw - 29))} ┃`,\n ),\n );\n } else {\n const visible = orphaned.slice(scrollOffset, scrollOffset + LIST_ROWS);\n for (let vi = 0; vi < visible.length; vi++) {\n const idx = scrollOffset + vi;\n const pf = visible[vi];\n if (!pf) continue;\n const isSel = idx === selectedIndex;\n const row = itemLine(pf, isSel, cw);\n lines.push(\n isSel ? theme.bg(\"selectedBg\", bdr(`┃${row}┃`)) : bdr(`┃${row}┃`),\n );\n }\n }\n\n // Filler rows\n for (let i = Math.min(orphaned.length, LIST_ROWS); i < LIST_ROWS; i++) {\n lines.push(bdr(`┃${\" \".repeat(innerW)}┃`));\n }\n\n lines.push(bdr(`┃${\" \".repeat(innerW)}┃`));\n\n if (orphaned.length > 0) {\n const totalBytes = orphaned.reduce((s, pf) => s + pf.sizeBytes, 0);\n const kb = totalBytes > 0 ? (totalBytes / 1024).toFixed(1) : \"0.0\";\n const totalStr = `Total: ${kb} KB`;\n const hint = \"↑↓ navigate Enter delete D delete all Esc cancel\";\n lines.push(\n bdr(\n `┃ ${dim(totalStr)}${\" \".repeat(Math.max(0, cw - visibleWidth(totalStr)))} ┃`,\n ),\n );\n lines.push(\n bdr(\n `┃ ${dim(hint)}${\" \".repeat(Math.max(0, cw - visibleWidth(hint)))} ┃`,\n ),\n );\n } else {\n const hint = \"Esc close\";\n lines.push(\n bdr(\n `┃ ${dim(hint)}${\" \".repeat(Math.max(0, cw - visibleWidth(hint)))} ┃`,\n ),\n );\n }\n lines.push(bdr(`┗${\"━\".repeat(innerW)}┛`));\n return lines;\n },\n\n handleInput(data: string): void {\n const key = decodeKittyPrintable(data) ?? data;\n\n if (confirmDeleteAll) {\n if (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) {\n done(\"deleteAll\");\n return;\n }\n if (matchesKey(data, \"escape\")) {\n confirmDeleteAll = false;\n return;\n }\n return;\n }\n\n if (orphaned.length === 0) {\n if (matchesKey(data, \"escape\")) done(\"cancel\");\n return;\n }\n\n if (matchesKey(data, \"up\")) {\n selectedIndex = clampIndex(selectedIndex - 1, orphaned.length);\n clampScroll();\n return;\n }\n if (matchesKey(data, \"down\")) {\n selectedIndex = clampIndex(selectedIndex + 1, orphaned.length);\n clampScroll();\n return;\n }\n if (matchesKey(data, \"pageUp\") || key === \"-\") {\n selectedIndex = clampIndex(selectedIndex - LIST_ROWS, orphaned.length);\n clampScroll();\n return;\n }\n if (matchesKey(data, \"pageDown\") || key === \"=\") {\n selectedIndex = clampIndex(selectedIndex + LIST_ROWS, orphaned.length);\n clampScroll();\n return;\n }\n if (matchesKey(data, \"home\")) {\n selectedIndex = 0;\n scrollOffset = 0;\n return;\n }\n if (matchesKey(data, \"end\")) {\n selectedIndex = Math.max(0, orphaned.length - 1);\n clampScroll();\n return;\n }\n if (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) {\n const pf = orphaned[selectedIndex];\n if (pf) {\n deletePendingFiles(pf.sessionId);\n orphaned.splice(selectedIndex, 1);\n if (orphaned.length === 0) {\n done(\"cancel\");\n return;\n }\n selectedIndex = clampIndex(selectedIndex, orphaned.length);\n clampScroll();\n }\n return;\n }\n if (key === \"d\" || key === \"D\") {\n confirmDeleteAll = true;\n return;\n }\n if (matchesKey(data, \"escape\")) {\n done(\"cancel\");\n return;\n }\n },\n };\n}\n\n// ── Public handler ──────────────────────────────────────────────────────────\n\n/**\n * Handle the /blackhole cleanup subcommand.\n *\n * Runs the full analysis pipeline (scan pending → scan sessions → cross-ref),\n * then opens the TUI picker if there are orphaned files.\n *\n * In non-TUI modes (RPC/JSON/print): lists orphaned files as a notification\n * without deleting anything.\n */\nexport async function handleCleanup(ctx: ExtensionContext): Promise<void> {\n const { orphaned } = analyzeOrphaned();\n\n if (orphaned.length === 0) {\n ctx.ui.notify(\"pi-blackhole: No orphaned pending files found.\", \"info\");\n return;\n }\n\n const isRpc =\n ctx.mode === \"rpc\" || ctx.mode === \"json\" || ctx.mode === \"print\";\n if (isRpc) {\n // Non-TUI: list only\n const totalSize = orphaned.reduce((s, pf) => s + pf.sizeBytes, 0);\n const lines = [\n `Orphaned pending files: ${orphaned.length} (${(totalSize / 1024).toFixed(1)} KB)`,\n \"\",\n ...orphaned.map((pf) => ` ${describeFile(pf)}`),\n \"\",\n \"Use /blackhole cleanup in TUI mode to delete these files.\",\n ];\n ctx.ui.notify(lines.join(\"\\n\"), \"warning\");\n return;\n }\n\n // Work on a copy — the picker mutates the array for inline deletes.\n const items = [...orphaned];\n const result = await ctx.ui.custom<\"deleteAll\" | \"cancel\" | null>(\n (_tui, theme, _kb, done) => {\n return createCleanupPicker(items, theme as any, done);\n },\n { overlay: true },\n );\n\n if (result === \"deleteAll\") {\n const deleted = deleteOrphanedBatch(items);\n const intended = items.length;\n if (deleted === intended) {\n ctx.ui.notify(\n `pi-blackhole: Deleted ${intended} orphaned pending file${intended === 1 ? \"\" : \"s\"}.`,\n \"info\",\n );\n } else {\n ctx.ui.notify(\n `pi-blackhole: Deleted ${deleted}/${intended} orphaned pending file${intended === 1 ? \"\" : \"s\"} (${intended - deleted} failed).`,\n \"warning\",\n );\n }\n } else if (items.length > 0 && items.length < orphaned.length) {\n // Some were deleted inline, some remain\n const remainingSize = items.reduce((s, pf) => s + pf.sizeBytes, 0);\n ctx.ui.notify(\n `pi-blackhole: ${orphaned.length - items.length} deleted, ${items.length} remain (${(remainingSize / 1024).toFixed(1)} KB).`,\n \"info\",\n );\n } else if (items.length === 0 && orphaned.length > 0) {\n // All were deleted inline\n ctx.ui.notify(\n `pi-blackhole: All ${orphaned.length} orphaned pending file${orphaned.length === 1 ? \"\" : \"s\"} removed.`,\n \"info\",\n );\n }\n // If nothing was deleted (user just pressed Esc), stay silent\n}\n","/**\n * Field value validation utilities.\n *\n * Each `validateFieldValue` call checks a single value against the\n * field's type-specific constraints (enum membership, boolean type,\n * string no-newlines, number range / integer / values / step) and\n * returns either `undefined` (valid) or a warning message string.\n *\n * The primary consumer is the settings modal (body.ts), which shows\n * per-field warnings in the focused-row description area. Callers\n * can also use this in ConfigManager to skip invalid values during\n * save, or to repair loaded configs.\n */\n\nimport type { Field } from \"./types\";\n\n/**\n * Validate a field value against the field's type-specific constraints.\n *\n * @param field - The field definition\n * @param value - The value to validate\n * @returns A warning message if invalid, `undefined` if valid\n */\nexport function validateFieldValue(\n field: Field,\n value: unknown,\n): string | undefined {\n if (value === undefined || value === null) return undefined;\n\n switch (field.type) {\n case \"enum\": {\n if (typeof value !== \"string\")\n return `Must be a string, got ${typeof value}`;\n if (!field.options.includes(value as never))\n return `Must be one of: ${field.options.join(\", \")}`;\n return undefined;\n }\n\n case \"boolean\": {\n if (typeof value !== \"boolean\")\n return `Must be a boolean, got ${typeof value}`;\n return undefined;\n }\n\n case \"string\": {\n if (typeof value !== \"string\")\n return `Must be a string, got ${typeof value}`;\n if (value.includes(\"\\n\") || value.includes(\"\\r\"))\n return \"Must be a single-line string (no newlines)\";\n return undefined;\n }\n\n case \"text\": {\n if (typeof value !== \"string\")\n return `Must be a string, got ${typeof value}`;\n return undefined;\n }\n\n case \"number\": {\n if (typeof value !== \"number\" || !Number.isFinite(value))\n return `Must be a finite number, got ${typeof value === \"number\" ? String(value) : typeof value}`;\n if (field.integer && !Number.isInteger(value))\n return \"Must be an integer\";\n if (field.values !== undefined && field.values.length > 0) {\n if (!field.values.includes(value))\n return `Must be one of: ${field.values.join(\", \")}`;\n }\n if (typeof field.min === \"number\" && value < field.min)\n return `Must be at least ${field.min}`;\n if (typeof field.max === \"number\" && value > field.max)\n return `Must be at most ${field.max}`;\n if (field.step !== undefined && field.step > 0) {\n // Check alignment to step within floating-point tolerance\n const min = field.min ?? 0;\n const offset = value - min;\n const rem = offset % field.step;\n if (rem > 1e-9 && field.step - rem > 1e-9) {\n return `Must be aligned to step ${field.step}`;\n }\n }\n return undefined;\n }\n\n case \"secret\": {\n if (typeof value !== \"string\")\n return `Must be a string, got ${typeof value}`;\n return undefined;\n }\n\n case \"path\": {\n if (typeof value !== \"string\")\n return `Must be a string, got ${typeof value}`;\n return undefined;\n }\n\n case \"model\": {\n if (typeof value !== \"object\" || value === null)\n return `Must be an object with id, got ${typeof value}`;\n const v = value as { id?: unknown };\n if (typeof v.id !== \"string\")\n return `Must have a string id, got ${typeof v.id}`;\n return undefined;\n }\n\n case \"action\":\n case \"custom\":\n // Custom types can't be validated generically\n return undefined;\n\n default:\n return undefined;\n }\n}\n","/**\n * Renderer for `type: \"action\"` rows. Non-storing — Enter triggers the\n * caller-supplied `onActivate(ctx)` and never changes a value.\n */\n\nimport { matchesKey } from \"@earendil-works/pi-tui\";\nimport type { ActionField, FieldRenderer } from \"../types\";\n\nexport const actionRenderer: FieldRenderer<ActionField, void> = {\n type: \"action\",\n renderValue(row, { selected, ctx }) {\n const text = row.field.display ?? \"(run)\";\n if (row.field.disabled) {\n return ctx.theme.fg(\"muted\", text);\n }\n return ctx.theme.fg(selected ? \"accent\" : \"muted\", text);\n },\n hints(row) {\n if (row.field.disabled) return [];\n return [{ key: \"enter\", label: \"run\" }];\n },\n handleKey(row, data, { ctx }) {\n if (row.field.disabled) return {};\n if (\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n data === \" \"\n ) {\n // Fire and forget — actions are deliberately fire-and-go so the\n // modal stays responsive even when `onActivate` is async.\n try {\n const ret = row.field.onActivate(ctx.ctx);\n if (ret && typeof (ret as Promise<void>).then === \"function\") {\n (ret as Promise<void>).catch(() => {});\n }\n } catch {\n // Swallow — actions must never break the modal loop.\n }\n return { consumed: true };\n }\n return {};\n },\n};\n","/**\n * Renderer for `type: \"boolean\"` rows. Enter / Space toggles between\n * `on` and `off`; the value is committed immediately.\n */\n\nimport { matchesKey } from \"@earendil-works/pi-tui\";\nimport type { BooleanField, FieldRenderer } from \"../types\";\n\nexport const booleanRenderer: FieldRenderer<BooleanField, boolean> = {\n type: \"boolean\",\n renderValue(row, { selected, ctx }) {\n const text = row.value ? \"on\" : \"off\";\n if (row.field.disabled) {\n return ctx.theme.fg(\"muted\", text);\n }\n return ctx.theme.fg(\n selected ? \"accent\" : row.value ? \"success\" : \"muted\",\n text,\n );\n },\n hints(row) {\n if (row.field.disabled) return [];\n return [\n { key: \"enter/space\", label: row.value ? \"turn off\" : \"turn on\" },\n { key: \"←/→\", label: \"toggle\" },\n ];\n },\n handleKey(row, data) {\n if (row.field.disabled) return {};\n if (\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n data === \" \"\n ) {\n return { consumed: true, commit: !row.value };\n }\n if (matchesKey(data, \"left\")) {\n if (row.value === false) return { consumed: true };\n return { consumed: true, commit: false };\n }\n if (matchesKey(data, \"right\")) {\n if (row.value === true) return { consumed: true };\n return { consumed: true, commit: true };\n }\n return {};\n },\n};\n","/**\n * Renderer for `type: \"custom\"` rows. The caller supplies:\n *\n * - `render(args)` — returns the right-hand value cell as a string.\n * - `handleInput?(data, args)` — optional inline-edit handler; return\n * true to consume the key.\n * - `openSubmenu?(args)` — optional submenu mounted on Enter; the\n * factory receives a `done(value?)` callback the modal supplies.\n *\n * Anything more exotic than the built-in `model` widget belongs here.\n */\n\nimport { matchesKey } from \"@earendil-works/pi-tui\";\nimport type { CustomField, FieldRenderer, SubmenuFactory } from \"../types\";\n\nexport const customRenderer: FieldRenderer<CustomField, unknown> = {\n type: \"custom\",\n renderValue(row, args) {\n const text = row.field.render({\n value: row.value,\n width: args.width,\n selected: args.selected && !row.field.disabled,\n theme: args.ctx.theme,\n });\n if (row.field.disabled) {\n return args.ctx.theme.fg(\"muted\", text);\n }\n return text;\n },\n hints(row) {\n if (row.field.disabled) return [];\n // Caller-supplied override wins outright — useful when\n // `handleInput` consumes a specific key (e.g. space) but Enter\n // is a no-op, in which case the default \"enter edit\" heuristic\n // would be misleading.\n if (row.field.hints) return row.field.hints;\n if (row.field.openSubmenu) return [{ key: \"enter\", label: \"open\" }];\n if (row.field.handleInput) return [{ key: \"enter\", label: \"edit\" }];\n return [];\n },\n handleKey(row, data, args) {\n if (row.field.disabled) return {};\n // Caller-supplied inline-edit handler runs first so it can intercept\n // arrow keys etc. before we treat Enter as \"open submenu\".\n if (row.field.handleInput) {\n const consumed = row.field.handleInput(data, {\n value: row.value,\n width: 0,\n selected: true,\n theme: args.ctx.theme,\n });\n if (consumed) return { consumed: true };\n }\n if (\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n data === \" \"\n ) {\n if (row.field.openSubmenu) {\n const factory: SubmenuFactory<unknown> = (done) =>\n row.field.openSubmenu!({\n value: row.value,\n theme: args.ctx.theme,\n tui: args.ctx.tui,\n done,\n });\n return { consumed: true, submenu: factory };\n }\n }\n return {};\n },\n};\n","/**\n * Rounded-light frame helpers for the settings modal — and for any\n * future overlay in this package that wants the same look.\n *\n * Visual:\n *\n * ╭── Title ──────────────────────╮\n * │ │\n * │ Muted off │\n * │ Voice Umbriel │\n * │ │\n * ╰────────────────────────────────╯\n *\n * The frame draws:\n * - A single-line top border with an inline title pill (`╭── Title ──╮`).\n * Title text is coloured via the host theme's `accent` foreground.\n * - A bottom border closing with `╰─╯`.\n * - Vertical sides as `│` separators.\n * - `paddingY` blank rows above and below the body, plus `paddingX`\n * spaces left and right of every body row.\n * - Optional row-count cap (`fixedInnerRows`) so a too-tall body is\n * truncated with a `↓ N more line(s)` indicator instead of overflowing\n * the popup.\n *\n * All helpers are width-aware: every output line is right-truncated to\n * `width` columns using pi-tui's `truncateToWidth` so they never escape\n * the overlay rectangle.\n */\n\nimport type { Theme } from \"@earendil-works/pi-coding-agent\";\nimport {\n truncateToWidth,\n visibleWidth,\n wrapTextWithAnsi,\n} from \"@earendil-works/pi-tui\";\n\n/** Default horizontal padding inside the frame, in columns. */\nexport const DEFAULT_PADDING_X = 2;\n/** Default vertical padding inside the frame, in rows. */\nexport const DEFAULT_PADDING_Y = 1;\n/** Total vertical rows consumed by the frame chrome (top + bottom + 2× padY). */\nexport const FRAME_VERTICAL_CHROME = 2 + DEFAULT_PADDING_Y * 2;\n\nexport interface FrameOptions {\n /** Inline title in the top border. Truncated with `…` when too wide. */\n title?: string;\n /** Inner padding columns (left and right). Defaults to {@link DEFAULT_PADDING_X}. */\n paddingX?: number;\n /** Inner padding rows (top and bottom). Defaults to {@link DEFAULT_PADDING_Y}. */\n paddingY?: number;\n /**\n * If set, the body is forced to exactly this many inner rows. Excess\n * lines are replaced with a `↓ N more` indicator at the bottom; missing\n * lines are padded with blank rows so the overlay never visually shrinks\n * mid-session.\n */\n fixedInnerRows?: number;\n}\n\n/** Width available to body content, given a frame's outer `width`. */\nexport function frameContentWidth(\n width: number,\n paddingX: number = DEFAULT_PADDING_X,\n): number {\n return Math.max(1, width - 2 - paddingX * 2);\n}\n\n/** Right-pad a (possibly ANSI-coloured) string to exactly `width` columns. */\nexport function pad(text: string, width: number): string {\n const truncated = truncateToWidth(text, width, \"\");\n return `${truncated}${\" \".repeat(Math.max(0, width - visibleWidth(truncated)))}`;\n}\n\n/**\n * Wrap `line` to fit `width` columns. Hard newlines split the line first;\n * each segment is then word-wrapped (ANSI-aware via pi-tui's helper) and\n * finally truncated as a defence-in-depth against pathological cases.\n */\nexport function wrapLine(line: string, width: number): string[] {\n const safeWidth = Math.max(1, width);\n const normalized = String(line ?? \"\").replace(/\\t/g, \" \");\n const wrapped = normalized.split(/\\r?\\n/).flatMap((part) => {\n const rows = wrapTextWithAnsi(part, safeWidth);\n return rows.length > 0 ? rows : [\"\"];\n });\n return wrapped.map((part) => truncateToWidth(part, safeWidth, \"\"));\n}\n\n/** Render a single horizontal divider line, themed in `dim`. */\nexport function divider(width: number, theme: Theme): string {\n return theme.fg(\"dim\", \"─\".repeat(Math.max(1, width)));\n}\n\n/** One key-hint pair as rendered in the modal's footer. */\nexport interface KeyHint {\n key: string;\n label: string;\n}\n\n/**\n * Format a list of key hints as a single line: each `key` rendered in\n * the host theme's `accent` colour and each `label` in `dim`, joined\n * by a dim middle-dot (`·`). Used by both the main settings modal\n * footer and any submenu that wants matching highlighting.\n *\n * Returns the raw composed string — caller is responsible for\n * truncating / wrapping if needed.\n */\nexport function formatHintLine(hints: KeyHint[], theme: Theme): string {\n return hints\n .map((h) => `${theme.fg(\"accent\", h.key)} ${theme.fg(\"dim\", h.label)}`)\n .join(theme.fg(\"dim\", \" · \"));\n}\n\n/**\n * Wrap `lines` in a rounded-light frame. The top border embeds an\n * optional title pill rendered in the host theme's `accent` colour; the\n * border itself is themed in `borderAccent` so it stands out from chat\n * but blends with the user's chosen palette.\n *\n * The output is exactly the right shape to hand to `ctx.ui.custom`'s\n * overlay component — every line is exactly `width` columns wide.\n */\nexport function frame(\n lines: string[],\n width: number,\n theme: Theme,\n options: FrameOptions = {},\n): string[] {\n const paddingX = options.paddingX ?? DEFAULT_PADDING_X;\n const paddingY = options.paddingY ?? DEFAULT_PADDING_Y;\n const inner = Math.max(1, width - 2);\n const contentWidth = frameContentWidth(width, paddingX);\n const border = (s: string) => theme.fg(\"borderAccent\", s);\n\n let body = lines;\n if (\n options.fixedInnerRows !== undefined &&\n body.length > options.fixedInnerRows\n ) {\n const hidden = body.length - options.fixedInnerRows + 1;\n body = [\n ...body.slice(0, Math.max(0, options.fixedInnerRows - 1)),\n theme.fg(\"dim\", `↓ ${hidden} more line(s)`),\n ].slice(0, options.fixedInnerRows);\n }\n\n const blank = `${border(\"│\")}${\" \".repeat(inner)}${border(\"│\")}`;\n const top = (): string => {\n if (!options.title)\n return `${border(\"╭\")}${border(\"─\".repeat(inner))}${border(\"╮\")}`;\n // Title pill: `── <title> ──`, truncated to fit; surrounded by border\n // dashes on both sides so the pill always reaches the corners.\n const titlePlain = ` ${truncateToWidth(options.title, Math.max(1, inner - 4), \"…\")} `;\n const titleVisible = visibleWidth(titlePlain);\n const leftDash = 2;\n const rightDash = Math.max(1, inner - leftDash - titleVisible);\n return (\n `${border(\"╭\")}${border(\"─\".repeat(leftDash))}` +\n `${theme.fg(\"accent\", theme.bold(titlePlain))}` +\n `${border(\"─\".repeat(rightDash))}${border(\"╮\")}`\n );\n };\n\n const out: string[] = [top()];\n for (let i = 0; i < paddingY; i += 1) out.push(blank);\n for (const line of body) {\n out.push(\n `${border(\"│\")}${\" \".repeat(paddingX)}${pad(line, contentWidth)}${\" \".repeat(paddingX)}${border(\"│\")}`,\n );\n }\n for (let i = 0; i < paddingY; i += 1) out.push(blank);\n out.push(`${border(\"╰\")}${border(\"─\".repeat(inner))}${border(\"╯\")}`);\n return out.map((line) => truncateToWidth(line, width, \"\"));\n}\n\n/**\n * Compute a sensible inner-row count given the terminal height and a\n * preferred maximum. Mirrors the `responsiveInnerRows` math from\n * `extension-manager.ts` so popups shrink gracefully on short terminals\n * instead of clipping past the bottom edge.\n */\nexport function responsiveInnerRows(\n terminalRows: number,\n preferred: number,\n minimum = 12,\n ratio = 0.85,\n): number {\n const available = Math.max(\n minimum + FRAME_VERTICAL_CHROME,\n Math.floor(Math.max(1, terminalRows) * ratio),\n );\n return Math.max(\n minimum,\n Math.min(preferred, available - FRAME_VERTICAL_CHROME),\n );\n}\n","/**\n * Renderer for `type: \"enum\"` rows.\n *\n * Short option lists (≤ `cycleThreshold`, default 4) cycle in place via\n * Enter / Space; longer lists open a `SelectList` submenu so users\n * don't have to mash Enter to scroll through 20+ entries.\n */\n\nimport { getSelectListTheme } from \"@earendil-works/pi-coding-agent\";\nimport {\n matchesKey,\n SelectList,\n truncateToWidth,\n type Component,\n type SelectItem,\n} from \"@earendil-works/pi-tui\";\nimport { formatHintLine } from \"../frame\";\nimport type {\n EnumField,\n FieldRenderContext,\n FieldRenderer,\n SubmenuFactory,\n} from \"../types\";\n\nconst DEFAULT_CYCLE_THRESHOLD = 4;\nconst MAX_VISIBLE_ROWS = 12;\n\nfunction labelFor(field: EnumField, value: string): string {\n return field.optionLabels?.[value] ?? value;\n}\n\nfunction nextCycleValue(field: EnumField, current: string): string {\n if (field.options.length === 0) return current;\n const idx = field.options.indexOf(current as never);\n const nextIdx = (idx + 1 + field.options.length) % field.options.length;\n return field.options[nextIdx]!;\n}\n\nfunction prevCycleValue(field: EnumField, current: string): string {\n if (field.options.length === 0) return current;\n const idx = field.options.indexOf(current as never);\n const prevIdx = (idx - 1 + field.options.length) % field.options.length;\n return field.options[prevIdx]!;\n}\n\n/** Build a submenu factory the modal can mount with its own `done`. */\nfunction makeEnumSubmenu(\n field: EnumField,\n current: string,\n ctx: FieldRenderContext,\n): SubmenuFactory<string> {\n if (field.search) {\n return makeSearchableEnumSubmenu(field, current, ctx);\n }\n\n return (done) => {\n const items: SelectItem[] = field.options.map((value, idx) => ({\n value,\n label: `${idx + 1}. ${labelFor(field, value)}`,\n }));\n const list = new SelectList(\n items,\n Math.min(items.length, MAX_VISIBLE_ROWS),\n getSelectListTheme(),\n );\n const idx = field.options.indexOf(current);\n list.setSelectedIndex(idx >= 0 ? idx : 0);\n list.onSelect = (item) => done(item.value);\n list.onCancel = () => done();\n\n const component: Component = {\n render(width: number): string[] {\n const lines = [...list.render(width)];\n lines.push(\"\");\n const hints = [\n { key: \"↑↓\", label: \"select\" },\n ...(items.length > 1\n ? [{ key: `1-${Math.min(9, items.length)}`, label: \"choose\" }]\n : []),\n { key: \"enter\", label: \"save\" },\n { key: \"esc\", label: \"cancel\" },\n ];\n const hintText = ` ${formatHintLine(hints, ctx.theme)}`;\n lines.push(truncateToWidth(hintText, width, \"…\", true));\n return lines;\n },\n invalidate(): void {\n list.invalidate();\n },\n handleInput(data: string): void {\n const num = parseInt(data, 10);\n if (\n data.length === 1 &&\n !isNaN(num) &&\n num >= 1 &&\n num <= Math.min(9, items.length)\n ) {\n const item = items[num - 1];\n if (item) {\n done(item.value);\n return;\n }\n }\n list.handleInput(data);\n ctx.tui.requestRender();\n },\n };\n return component;\n };\n}\n\n/**\n * Build a searchable enum submenu with a filter bar at the top.\n * Used when `field.search === true`.\n */\nfunction makeSearchableEnumSubmenu(\n field: EnumField,\n _current: string,\n ctx: FieldRenderContext,\n): SubmenuFactory<string> {\n return (done) => {\n const allItems: SelectItem[] = field.options.map((value) => ({\n value,\n label: labelFor(field, value),\n }));\n\n let search = \"\";\n let selected = 0;\n\n function filteredItems(): SelectItem[] {\n if (!search.trim()) return allItems;\n const q = search.toLowerCase();\n return allItems.filter(\n (item) =>\n item.label.toLowerCase().includes(q) ||\n item.value.toLowerCase().includes(q),\n );\n }\n\n const component: Component = {\n render(width: number): string[] {\n const lines: string[] = [];\n const items = filteredItems();\n const searchPrompt = `Search: ${search}${ctx.theme.inverse(\" \")}`;\n lines.push(\n ctx.theme.bg(\n \"toolPendingBg\",\n truncateToWidth(searchPrompt, width, \"…\", true),\n ),\n );\n lines.push(\"\");\n\n if (items.length === 0) {\n lines.push(ctx.theme.fg(\"muted\", \" No matching options.\"));\n } else {\n const maxVisible = MAX_VISIBLE_ROWS;\n const scroll = Math.max(\n 0,\n Math.min(\n selected - Math.floor(maxVisible / 2),\n Math.max(0, items.length - maxVisible),\n ),\n );\n const slice = items.slice(scroll, scroll + maxVisible);\n for (let i = 0; i < slice.length; i++) {\n const isSelected = scroll + i === selected;\n const prefix = isSelected ? ctx.theme.fg(\"accent\", \"▌ \") : \" \";\n const display = isSelected\n ? ctx.theme.fg(\"accent\", slice[i]!.label)\n : ctx.theme.fg(\"muted\", slice[i]!.label);\n const line = `${prefix}${display}`;\n lines.push(\n isSelected\n ? ctx.theme.bg(\n \"selectedBg\",\n truncateToWidth(line, width, \"…\", true),\n )\n : truncateToWidth(line, width, \"…\", true),\n );\n }\n }\n\n lines.push(\"\");\n const hints = [\n { key: \"↑↓\", label: \"select\" },\n { key: \"enter\", label: \"save\" },\n { key: \"esc\", label: \"cancel\" },\n ];\n if (search) hints.unshift({ key: \"type\", label: \"to filter\" });\n lines.push(` ${formatHintLine(hints, ctx.theme)}`);\n return lines;\n },\n invalidate(): void {\n // no external state to invalidate\n },\n handleInput(data: string): void {\n if (matchesKey(data, \"up\")) {\n selected = Math.max(0, selected - 1);\n ctx.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"down\")) {\n const items = filteredItems();\n selected = Math.min(selected + 1, Math.max(0, items.length - 1));\n ctx.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) {\n const items = filteredItems();\n if (items.length > 0) {\n done(items[Math.min(selected, items.length - 1)]!.value);\n }\n return;\n }\n if (matchesKey(data, \"escape\")) {\n done();\n return;\n }\n if (matchesKey(data, \"backspace\") || matchesKey(data, \"ctrl+h\")) {\n search = search.slice(0, -1);\n selected = 0;\n ctx.tui.requestRender();\n return;\n }\n if (data.length === 1 && data >= \" \" && data !== \"\\x7f\") {\n search += data;\n selected = 0;\n ctx.tui.requestRender();\n }\n },\n };\n return component;\n };\n}\n\nexport const enumRenderer: FieldRenderer<EnumField, string> = {\n type: \"enum\",\n renderValue(row, { selected, ctx }) {\n const text = labelFor(row.field, row.value);\n if (row.field.disabled) {\n return ctx.theme.fg(\"muted\", text);\n }\n return ctx.theme.fg(selected ? \"accent\" : \"muted\", text);\n },\n hints(row) {\n if (row.field.disabled) return [];\n // Searchable enums always open a list submenu\n if (row.field.search) {\n return [{ key: \"enter\", label: \"open list\" }];\n }\n const threshold = row.field.cycleThreshold ?? DEFAULT_CYCLE_THRESHOLD;\n if (row.field.options.length > threshold) {\n return [{ key: \"enter\", label: \"open list\" }];\n }\n return [\n { key: \"enter/space\", label: \"cycle\" },\n { key: \"←/→\", label: \"prev/next\" },\n ];\n },\n handleKey(row, data, { ctx }) {\n if (row.field.disabled) return {};\n // Searchable enums always open a submenu on Enter/Space\n if (row.field.search) {\n if (\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n data === \" \"\n ) {\n return {\n consumed: true,\n submenu: makeEnumSubmenu(row.field, row.value, ctx),\n };\n }\n // No cycling for searchable enums — all navigation is in the submenu\n return {};\n }\n\n const threshold = row.field.cycleThreshold ?? DEFAULT_CYCLE_THRESHOLD;\n const isLongList = row.field.options.length > threshold;\n\n if (\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n data === \" \"\n ) {\n if (isLongList) {\n return {\n consumed: true,\n submenu: makeEnumSubmenu(row.field, row.value, ctx),\n };\n }\n return { consumed: true, commit: nextCycleValue(row.field, row.value) };\n }\n\n if (!isLongList) {\n if (matchesKey(data, \"left\")) {\n const prev = prevCycleValue(row.field, row.value);\n if (prev === row.value) return { consumed: true };\n return { consumed: true, commit: prev };\n }\n if (matchesKey(data, \"right\")) {\n const next = nextCycleValue(row.field, row.value);\n if (next === row.value) return { consumed: true };\n return { consumed: true, commit: next };\n }\n }\n\n return {};\n },\n};\n","/**\n * Inline string-editor state machine for single-line value editing inside\n * settings rows.\n *\n * Ported from the helpers in vstack's `extension-manager.ts`. This file is\n * **pure logic** — no terminal access, no theme, no rendering — so it can\n * be exercised in `bun test` / `vitest` without a TUI.\n *\n * Key shape: a tiny `{ buffer, cursor }` struct mutated in place by the\n * helper functions. `cursor` is a **code-unit** index into `buffer` (so\n * `buffer.slice(0, cursor)` is always safe), but every cursor-moving\n * helper internally walks **code points** so multi-unit characters\n * (CJK, emoji, regional indicators) move atomically — pressing `←` once\n * over a 🌍 jumps two code units, not one.\n *\n * Word-jump uses the same three-class scheme as most readline-derived\n * editors:\n * - `space`: `\\s` (whitespace);\n * - `word`: `[A-Za-z0-9_]` (identifier-ish);\n * - `punct`: everything else.\n *\n * Tabs / hard-newlines are intentionally not special-cased — settings\n * values are single-line strings, and any `\\n` arriving from terminal\n * input would be the wrong kind of input to this editor anyway.\n */\n\nimport { matchesKey, decodeKittyPrintable } from \"@earendil-works/pi-tui\";\n\n/** Shared yank buffer for storing killed text. */\nlet yankBuffer = \"\";\n\n/** Retrieve the current content of the yank buffer. */\nexport function getInlineYankBuffer(): string {\n return yankBuffer;\n}\n\n/** Set the content of the yank buffer. */\nexport function setInlineYankBuffer(val: string): void {\n yankBuffer = val;\n}\n\n/** Mutable cursor state. `cursor` is a code-unit offset into `buffer`. */\nexport interface InlineEditState {\n buffer: string;\n cursor: number;\n}\n\ninterface InlineEditChar {\n ch: string;\n /** Inclusive code-unit start of this char in the source buffer. */\n start: number;\n /** Exclusive code-unit end (==start of the next char). */\n end: number;\n}\n\n/** Decompose `text` into its sequence of code-point chars with their\n * code-unit ranges. Used to keep the cursor on a code-point boundary. */\nexport function inlineEditChars(text: string): InlineEditChar[] {\n const out: InlineEditChar[] = [];\n let offset = 0;\n for (const ch of text) {\n const start = offset;\n offset += ch.length;\n out.push({ ch, start, end: offset });\n }\n return out;\n}\n\n/** Force `cursor` back into `[0, buffer.length]` after a buffer mutation. */\nexport function clampInlineCursor(editing: InlineEditState): void {\n editing.cursor = Math.max(0, Math.min(editing.cursor, editing.buffer.length));\n}\n\n/**\n * Convert a code-unit offset into the index of the char immediately to\n * the right of the cursor. A cursor sitting on a char boundary returns\n * the index of the char it is just before. A cursor past the end returns\n * `chars.length`.\n */\nexport function codeUnitToCharIndex(\n chars: InlineEditChar[],\n cursor: number,\n): number {\n let index = 0;\n while (index < chars.length && chars[index]!.end <= cursor) index += 1;\n return index;\n}\n\n/** Inverse of `codeUnitToCharIndex`. */\nexport function charIndexToCodeUnit(\n chars: InlineEditChar[],\n index: number,\n textLength: number,\n): number {\n if (index <= 0) return 0;\n if (index >= chars.length) return textLength;\n return chars[index]!.start;\n}\n\n/** Three-class word/word-boundary classifier used by word-jump helpers. */\nexport function inlineCharKind(ch: string): \"space\" | \"word\" | \"punct\" {\n if (/\\s/u.test(ch)) return \"space\";\n if (/[A-Za-z0-9_]/.test(ch)) return \"word\";\n return \"punct\";\n}\n\n/** Move the cursor by `delta` code-points (negative = left). */\nexport function moveInlineCursorByChars(\n editing: InlineEditState,\n delta: number,\n): void {\n const chars = inlineEditChars(editing.buffer);\n const index = codeUnitToCharIndex(chars, editing.cursor);\n editing.cursor = charIndexToCodeUnit(\n chars,\n index + delta,\n editing.buffer.length,\n );\n}\n\n/** Skip whitespace then a contiguous run of the same char-kind to the left. */\nexport function moveInlineCursorWordLeft(editing: InlineEditState): void {\n const chars = inlineEditChars(editing.buffer);\n let index = codeUnitToCharIndex(chars, editing.cursor);\n while (index > 0 && inlineCharKind(chars[index - 1]!.ch) === \"space\")\n index -= 1;\n if (index <= 0) {\n editing.cursor = 0;\n return;\n }\n const kind = inlineCharKind(chars[index - 1]!.ch);\n while (index > 0 && inlineCharKind(chars[index - 1]!.ch) === kind) index -= 1;\n editing.cursor = charIndexToCodeUnit(chars, index, editing.buffer.length);\n}\n\n/** Skip whitespace then a contiguous run of the same char-kind to the right. */\nexport function moveInlineCursorWordRight(editing: InlineEditState): void {\n const chars = inlineEditChars(editing.buffer);\n let index = codeUnitToCharIndex(chars, editing.cursor);\n while (index < chars.length && inlineCharKind(chars[index]!.ch) === \"space\")\n index += 1;\n if (index >= chars.length) {\n editing.cursor = editing.buffer.length;\n return;\n }\n const kind = inlineCharKind(chars[index]!.ch);\n while (index < chars.length && inlineCharKind(chars[index]!.ch) === kind)\n index += 1;\n editing.cursor = charIndexToCodeUnit(chars, index, editing.buffer.length);\n}\n\n/** Insert `text` at the cursor and advance past it. */\nexport function insertInlineText(editing: InlineEditState, text: string): void {\n clampInlineCursor(editing);\n editing.buffer = `${editing.buffer.slice(0, editing.cursor)}${text}${editing.buffer.slice(editing.cursor)}`;\n editing.cursor += text.length;\n}\n\n/** Delete the half-open `[start, end)` code-unit range; cursor lands at `start`. */\nexport function deleteInlineRange(\n editing: InlineEditState,\n start: number,\n end: number,\n): void {\n const safeStart = Math.max(0, Math.min(start, editing.buffer.length));\n const safeEnd = Math.max(safeStart, Math.min(end, editing.buffer.length));\n editing.buffer = `${editing.buffer.slice(0, safeStart)}${editing.buffer.slice(safeEnd)}`;\n editing.cursor = safeStart;\n}\n\n/** Heuristic: is `data` a single, plain printable input character? */\nexport function isPlainSearchInput(data: string): boolean {\n // Kitty terminals report printable characters as CSI-u sequences\n // (e.g. \"5\" arrives as \\x1b[53u). Decode them so typing works there.\n const decoded = decodeKittyPrintable(data) ?? data;\n return decoded.length === 1 && decoded >= \" \" && decoded !== \"\\x7f\";\n}\n\n/**\n * Dispatch a raw terminal input string to the editor. Returns true when\n * the input was consumed (caller should re-render); false when it didn't\n * match any inline-edit shortcut (caller may handle it as a hot-key).\n */\nexport function handleInlineEditInput(\n editing: InlineEditState,\n data: string,\n): boolean {\n clampInlineCursor(editing);\n if (matchesKey(data, \"left\") || matchesKey(data, \"ctrl+b\")) {\n moveInlineCursorByChars(editing, -1);\n return true;\n }\n if (matchesKey(data, \"right\") || matchesKey(data, \"ctrl+f\")) {\n moveInlineCursorByChars(editing, 1);\n return true;\n }\n if (\n matchesKey(data, \"alt+left\") ||\n matchesKey(data, \"ctrl+left\") ||\n matchesKey(data, \"alt+b\")\n ) {\n moveInlineCursorWordLeft(editing);\n return true;\n }\n if (\n matchesKey(data, \"alt+right\") ||\n matchesKey(data, \"ctrl+right\") ||\n matchesKey(data, \"alt+f\")\n ) {\n moveInlineCursorWordRight(editing);\n return true;\n }\n if (matchesKey(data, \"home\") || matchesKey(data, \"ctrl+a\")) {\n editing.cursor = 0;\n return true;\n }\n if (matchesKey(data, \"end\") || matchesKey(data, \"ctrl+e\")) {\n editing.cursor = editing.buffer.length;\n return true;\n }\n if (matchesKey(data, \"backspace\") || matchesKey(data, \"ctrl+h\")) {\n const before = editing.cursor;\n moveInlineCursorByChars(editing, -1);\n deleteInlineRange(editing, editing.cursor, before);\n return true;\n }\n if (matchesKey(data, \"delete\") || matchesKey(data, \"ctrl+d\")) {\n const start = editing.cursor;\n moveInlineCursorByChars(editing, 1);\n deleteInlineRange(editing, start, editing.cursor);\n return true;\n }\n if (matchesKey(data, \"ctrl+u\")) {\n editing.buffer = \"\";\n editing.cursor = 0;\n return true;\n }\n if (matchesKey(data, \"ctrl+w\")) {\n const current = editing.cursor;\n moveInlineCursorWordLeft(editing);\n const target = editing.cursor;\n const killedText = editing.buffer.slice(target, current);\n if (killedText) {\n yankBuffer = killedText;\n }\n deleteInlineRange(editing, target, current);\n return true;\n }\n if (matchesKey(data, \"alt+d\")) {\n const current = editing.cursor;\n moveInlineCursorWordRight(editing);\n const target = editing.cursor;\n const killedText = editing.buffer.slice(current, target);\n if (killedText) {\n yankBuffer = killedText;\n }\n deleteInlineRange(editing, current, target);\n return true;\n }\n if (matchesKey(data, \"ctrl+k\")) {\n const killedText = editing.buffer.slice(editing.cursor);\n if (killedText) {\n yankBuffer = killedText;\n }\n deleteInlineRange(editing, editing.cursor, editing.buffer.length);\n return true;\n }\n if (matchesKey(data, \"ctrl+y\")) {\n if (yankBuffer) {\n insertInlineText(editing, yankBuffer);\n }\n return true;\n }\n if (isPlainSearchInput(data)) {\n // Kitty terminals deliver printable chars as CSI-u sequences —\n // decode them so the decoded char (not the raw escape bytes) is\n // inserted into the buffer.\n const decoded = decodeKittyPrintable(data) ?? data;\n insertInlineText(editing, decoded);\n return true;\n }\n return false;\n}\n\n/**\n * Render the buffer with a `█` block at the cursor position. Suitable\n * for embedding in a one-line settings row.\n */\nexport function renderInlineEditValue(editing: InlineEditState): string {\n clampInlineCursor(editing);\n return `${editing.buffer.slice(0, editing.cursor)}█${editing.buffer.slice(editing.cursor)}`;\n}\n\n/**\n * Word-deletion helper to delete a word backward from the end of a string.\n */\nexport function deleteWordBackward(text: string): string {\n let i = text.length;\n while (i > 0 && /\\s/.test(text[i - 1]!)) {\n i--;\n }\n if (i === 0) return \"\";\n const charKind = (ch: string) => {\n if (/\\s/.test(ch)) return \"space\";\n if (/[A-Za-z0-9_]/.test(ch)) return \"word\";\n return \"punct\";\n };\n const kind = charKind(text[i - 1]!);\n while (i > 0 && charKind(text[i - 1]!) === kind) {\n i--;\n }\n return text.slice(0, i);\n}\n","/**\n * Renderer for `type: \"model\"` — the two-axis \"model + reasoning\n * effort\" widget that voice and web both reinvented before this\n * package existed.\n *\n * UX:\n * - Row collapsed: `<model> · <effort>` (or just `<model>` when\n * `hideEffort` is set).\n * - Enter opens a submenu with:\n * · a typeable filter row at the top — printable keystrokes\n * narrow the model list by name (case-insensitive substring);\n * · `↑/↓` over a `SelectList` of models;\n * · `←/→` over the supported effort ladder for the highlighted\n * model (skipped entirely when `hideEffort` is set).\n * Enter saves both axes atomically; Esc abandons.\n * - Discovery: by default, models come from\n * `pi.modelRegistry.getAvailable()` (filtered to entries the user\n * has authed, matching voice's old behaviour). The caller can\n * narrow with `filter` or replace the list entirely with `models`.\n *\n * The submenu's footer reuses `formatHintLine` so the hot-keys are\n * highlighted with the same accent colour as the main modal's footer\n * — no second-class colour scheme inside submenus.\n */\n\nimport { getSelectListTheme } from \"@earendil-works/pi-coding-agent\";\nimport type {\n Api,\n Model,\n ModelThinkingLevel,\n ThinkingLevelMap,\n} from \"@earendil-works/pi-ai\";\nimport {\n matchesKey,\n SelectList,\n SelectItem,\n truncateToWidth,\n} from \"@earendil-works/pi-tui\";\nimport { formatHintLine, type KeyHint } from \"../frame\";\nimport { handleInlineEditInput, type InlineEditState } from \"../inline-edit\";\nimport type {\n FieldRenderContext,\n FieldRenderer,\n ModelField,\n ModelOption,\n ModelValue,\n SubmenuFactory,\n} from \"../types\";\n\nconst ALL_THINKING_LEVELS: ModelThinkingLevel[] = [\n \"off\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n];\n\n/** Short display labels for pi's internal thinking levels — used as a\n * fallback when the model's `thinkingLevelMap` doesn't override one.\n * Mirrors `THINK_LABELS` in `packages/statusline/index.ts` so the\n * picker and statusline never disagree on what `medium` looks like. */\nconst LEVEL_FALLBACK_LABELS: Record<ModelThinkingLevel, string> = {\n off: \"off\",\n minimal: \"min\",\n low: \"low\",\n medium: \"med\",\n high: \"high\",\n xhigh: \"xhigh\",\n max: \"max\",\n};\n\nconst DEFAULT_SESSION_LABEL = \"(session model)\";\nconst MAX_VISIBLE_MODELS = 12;\n\n/**\n * Resolve the human-readable label for a thinking level.\n *\n * Models may override per-level display strings via\n * `thinkingLevelMap` (e.g. Anthropic models map `xhigh` to a token\n * budget like `\"60000\"`); we honour those overrides exactly the\n * same way `packages/statusline/index.ts` does. Missing keys and\n * non-string values fall back to the short label. Pure presentation\n * — callers still pass / store the canonical level name (`\"xhigh\"`).\n */\nfunction effortDisplayLabel(\n level: ModelThinkingLevel,\n thinkingLevelMap: ThinkingLevelMap | undefined,\n): string {\n const mapped = thinkingLevelMap?.[level];\n if (typeof mapped === \"string\" && mapped.length > 0) return mapped;\n return LEVEL_FALLBACK_LABELS[level] ?? level;\n}\n\nfunction listModelOptions(\n field: ModelField,\n ctx: FieldRenderContext,\n): ModelOption[] {\n if (field.models) return field.models;\n const sessionLabel = field.sessionLabel ?? DEFAULT_SESSION_LABEL;\n const available = ctx.ctx.modelRegistry.getAvailable();\n const filtered = field.filter ? available.filter(field.filter) : available;\n const live: ModelOption[] = filtered.map((m) => ({\n value: `${m.provider}/${m.id}`,\n label: `${m.name} [${m.provider}]`,\n model: m,\n }));\n return field.hideSession\n ? live\n : [{ value: \"\", label: sessionLabel }, ...live];\n}\n\n/**\n * Find the live `Model<Api>` for a stored value.\n *\n * Looks at the caller-provided `field.models` first (so `web` and\n * other extensions that pre-build their option list still get rich\n * label resolution), then falls back to the host model registry.\n * Returns undefined for the `(session model)` sentinel and for any\n * value that no longer matches a registered model.\n */\nfunction resolveModelForValue(\n field: ModelField,\n value: ModelValue,\n ctx: FieldRenderContext,\n): Model<Api> | undefined {\n if (!value.id) return undefined;\n if (field.models) {\n const opt = field.models.find((o) => o.value === value.id);\n if (opt?.model) return opt.model;\n // Pre-built option without a backing `Model<Api>` — we can't\n // resolve thinkingLevelMap from here. Fall through to the registry.\n }\n const slash = value.id.indexOf(\"/\");\n if (slash <= 0) return undefined;\n const provider = value.id.slice(0, slash);\n const id = value.id.slice(slash + 1);\n return ctx.ctx.modelRegistry.find(provider, id);\n}\n\nfunction supportedEfforts(model: Model<Api> | undefined): ModelThinkingLevel[] {\n if (!model || !model.thinkingLevelMap) return ALL_THINKING_LEVELS;\n const map = model.thinkingLevelMap;\n return ALL_THINKING_LEVELS.filter(\n (lvl) => !(lvl in map && map[lvl] === null),\n );\n}\n\nfunction clampEffort(\n desired: ModelThinkingLevel | undefined,\n supported: ModelThinkingLevel[],\n): ModelThinkingLevel {\n if (desired && supported.includes(desired)) return desired;\n return supported.includes(\"medium\") ? \"medium\" : (supported[0] ?? \"off\");\n}\n\nfunction modelDisplay(field: ModelField, value: ModelValue): string {\n if (value.id === \"\") return field.sessionLabel ?? DEFAULT_SESSION_LABEL;\n return value.id;\n}\n\nfunction rowLabel(\n field: ModelField,\n value: ModelValue,\n ctx: FieldRenderContext,\n): string {\n const left = modelDisplay(field, value);\n if (field.hideEffort) return left;\n if (!value.thinking) return left;\n // Honour the model's `thinkingLevelMap` overrides so the row\n // displays the same label statusline shows (e.g. token-budget\n // numbers for Anthropic) instead of pi's internal level name.\n const model = resolveModelForValue(field, value, ctx);\n const label = effortDisplayLabel(value.thinking, model?.thinkingLevelMap);\n return `${left} · ${label}`;\n}\n\n/**\n * Build the submenu component. The submenu owns three pieces of state:\n *\n * 1. `filter` — the typeable name-filter buffer.\n * 2. `effortIndex` / `supported` — current effort axis (only when\n * `hideEffort` is unset).\n * 3. The currently-mounted SelectList. We rebuild it whenever the\n * filter changes so SelectList's internal selectedIndex stays\n * coherent with the visible items.\n */\nfunction makeSubmenu(\n field: ModelField,\n current: ModelValue,\n ctx: FieldRenderContext,\n): SubmenuFactory<ModelValue> {\n return (done) => {\n const allOptions = listModelOptions(field, ctx);\n const showEffort = !field.hideEffort;\n\n const filter: InlineEditState = { buffer: \"\", cursor: 0 };\n\n let list!: SelectList;\n let visibleOptions: ModelOption[] = [];\n\n let effortIndex = 0;\n let supported: ModelThinkingLevel[] = [];\n\n const refreshEffort = (preferred: ModelThinkingLevel | undefined): void => {\n if (!showEffort) return;\n const item = list.getSelectedItem();\n const opt = visibleOptions.find((m) => m.value === item?.value);\n supported = supportedEfforts(opt?.model);\n if (supported.length === 0) supported = [\"off\"];\n const clamped = clampEffort(preferred, supported);\n effortIndex = Math.max(0, supported.indexOf(clamped));\n };\n\n /** Build / rebuild the SelectList from the current filter. Tries\n * to keep the highlight on `preserveValue` when possible so\n * cursor focus doesn't jump around on every keystroke. */\n const buildList = (preserveValue: string | undefined): void => {\n const query = filter.buffer.trim().toLowerCase();\n visibleOptions = query\n ? allOptions.filter(\n (o) =>\n o.label.toLowerCase().includes(query) ||\n o.value.toLowerCase().includes(query),\n )\n : allOptions;\n\n const items: SelectItem[] = visibleOptions.map((m) => ({\n value: m.value,\n label: m.label,\n description: m.value || undefined,\n }));\n list = new SelectList(\n items,\n Math.min(Math.max(items.length, 1), MAX_VISIBLE_MODELS),\n getSelectListTheme(),\n );\n const idx =\n preserveValue !== undefined\n ? items.findIndex((i) => i.value === preserveValue)\n : -1;\n list.setSelectedIndex(idx >= 0 ? idx : 0);\n\n list.onSelect = (item) => {\n if (showEffort) {\n const effort = supported[effortIndex] ?? \"off\";\n done({ id: item.value, thinking: effort });\n } else {\n done({ id: item.value });\n }\n };\n list.onCancel = () => done();\n list.onSelectionChange = () => {\n if (showEffort) {\n const previous = supported[effortIndex];\n refreshEffort(previous);\n }\n ctx.tui.requestRender();\n };\n };\n\n buildList(current.id);\n refreshEffort(current.thinking);\n\n const renderEffortRow = (width: number): string => {\n const currentLevel = supported[effortIndex] ?? \"off\";\n // Resolve the override label from the highlighted model's\n // thinkingLevelMap so the user sees what statusline shows\n // (token budget for Anthropic, etc.) rather than pi's\n // internal level name.\n const item = list.getSelectedItem();\n const opt = visibleOptions.find((m) => m.value === item?.value);\n const displayLabel = effortDisplayLabel(\n currentLevel,\n opt?.model?.thinkingLevelMap,\n );\n const left =\n effortIndex > 0\n ? ctx.theme.fg(\"accent\", \"‹\")\n : ctx.theme.fg(\"dim\", \"‹\");\n const right =\n effortIndex < supported.length - 1\n ? ctx.theme.fg(\"accent\", \"›\")\n : ctx.theme.fg(\"dim\", \"›\");\n const label = ctx.theme.fg(\"muted\", \" effort: \");\n // Show the canonical level name in dim parentheses next to the\n // override so power-users still know which pi level they're\n // selecting (e.g. `60000 (xhigh)`).\n const valueText =\n displayLabel === currentLevel\n ? displayLabel\n : `${displayLabel} ${ctx.theme.fg(\"dim\", `(${currentLevel})`)}`;\n const value = ctx.theme.fg(\"accent\", ctx.theme.bold(valueText));\n const counter = ctx.theme.fg(\n \"dim\",\n ` (${effortIndex + 1}/${supported.length})`,\n );\n return truncateToWidth(\n `${label}${left} ${value} ${right}${counter}`,\n width,\n \"…\",\n true,\n );\n };\n\n const renderFilterRow = (width: number): string => {\n const cursorBlock = ctx.theme.inverse(\" \");\n const buf = filter.buffer;\n const before = buf.slice(0, filter.cursor);\n const after = buf.slice(filter.cursor);\n const placeholder = !buf ? ctx.theme.fg(\"dim\", \" type to filter…\") : \"\";\n const hasMatches = visibleOptions.length > 0;\n const colorKey = hasMatches ? \"accent\" : \"warning\";\n const text = buf\n ? ` ${ctx.theme.fg(\"muted\", \"filter:\")} ${ctx.theme.fg(colorKey, before)}${cursorBlock}${ctx.theme.fg(colorKey, after)}`\n : ` ${ctx.theme.fg(\"muted\", \"filter:\")} ${cursorBlock}${placeholder}`;\n return truncateToWidth(text, width, \"…\", true);\n };\n\n const renderHints = (width: number): string => {\n const hints: KeyHint[] = [{ key: \"↑↓\", label: \"model\" }];\n if (showEffort) hints.push({ key: \"←→\", label: \"effort\" });\n hints.push(\n { key: \"type\", label: \"filter\" },\n { key: \"enter\", label: \"save\" },\n );\n if (filter.buffer !== \"\") {\n hints.push({ key: \"esc\", label: \"clear filter\" });\n } else {\n hints.push({ key: \"esc\", label: \"cancel\" });\n }\n return truncateToWidth(\n ` ${formatHintLine(hints, ctx.theme)}`,\n width,\n \"…\",\n true,\n );\n };\n\n return {\n render(width: number): string[] {\n const lines: string[] = [];\n lines.push(renderFilterRow(width));\n lines.push(\"\");\n if (visibleOptions.length === 0) {\n lines.push(\n ctx.theme.fg(\"muted\", \" No matching models. (press esc to clear)\"),\n );\n } else {\n for (const line of list.render(width)) lines.push(line);\n }\n lines.push(\"\");\n if (showEffort) {\n lines.push(renderEffortRow(width));\n lines.push(\"\");\n }\n lines.push(renderHints(width));\n return lines;\n },\n invalidate(): void {\n list.invalidate();\n },\n handleInput(data: string): void {\n // Effort axis (only when not hidden) — must run before the\n // filter handler so ←/→ aren't typed into the search buffer.\n if (showEffort) {\n if (matchesKey(data, \"left\")) {\n if (effortIndex > 0) {\n effortIndex -= 1;\n ctx.tui.requestRender();\n }\n return;\n }\n if (matchesKey(data, \"right\")) {\n if (effortIndex < supported.length - 1) {\n effortIndex += 1;\n ctx.tui.requestRender();\n }\n return;\n }\n }\n // Intercept escape key to clear filter first\n if (matchesKey(data, \"escape\") && filter.buffer !== \"\") {\n const previousValue = list.getSelectedItem()?.value;\n filter.buffer = \"\";\n filter.cursor = 0;\n buildList(previousValue);\n refreshEffort(supported[effortIndex]);\n ctx.tui.requestRender();\n return;\n }\n // Up / Down / Enter / Esc go to the SelectList first so the\n // user can still drive the list while typing.\n if (\n matchesKey(data, \"up\") ||\n matchesKey(data, \"down\") ||\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n matchesKey(data, \"escape\") ||\n matchesKey(data, \"ctrl+c\")\n ) {\n list.handleInput(data);\n ctx.tui.requestRender();\n return;\n }\n // Everything else (printable chars, backspace, ctrl+u, …) is\n // routed to the inline-edit state machine.\n const previousValue = list.getSelectedItem()?.value;\n const consumed = handleInlineEditInput(filter, data);\n if (consumed) {\n buildList(previousValue);\n refreshEffort(supported[effortIndex]);\n ctx.tui.requestRender();\n }\n },\n };\n };\n}\n\nexport const modelRenderer: FieldRenderer<ModelField, ModelValue> = {\n type: \"model\",\n renderValue(row, { selected, ctx }) {\n const text = rowLabel(row.field, row.value, ctx);\n if (row.field.disabled) {\n return ctx.theme.fg(\"muted\", text);\n }\n return ctx.theme.fg(selected ? \"accent\" : \"muted\", text);\n },\n hints(row) {\n if (row.field.disabled) return [];\n // The main-window hint advertises only what the row itself does\n // there: opening the submenu. `↑↓` and `←→` only fire **inside**\n // the submenu — emitting them at row level would mislead the\n // user about what the keys do. The submenu has its own footer.\n return [{ key: \"enter\", label: \"open\" }];\n },\n handleKey(row, data, { ctx }) {\n if (row.field.disabled) return {};\n if (\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n data === \" \"\n ) {\n return {\n consumed: true,\n submenu: makeSubmenu(row.field, row.value, ctx),\n };\n }\n return {};\n },\n};\n","/**\n * Renderer for inline-edit text fields: `string`, `number`, `secret`,\n * `path`. They share a single state machine — the only differences are:\n *\n * - `number` parses + validates in `commitFromBuffer`.\n * - `secret` masks the displayed value when not editing.\n * - `path` is identical to `string` today (kept distinct so future\n * completion / validation can hang off the type without\n * another flag).\n *\n * Editing flow:\n * 1. User presses Enter on the row → `setEditing(true)` and seed the\n * buffer from the current value.\n * 2. Subsequent keystrokes are routed to `handleInlineEditInput`.\n * 3. Enter commits, Esc cancels, both call `setEditing(false)`.\n * 4. The modal re-reads the buffer on every render, so the user sees\n * live feedback as they type.\n *\n * The buffer state is stored on the modal side (one InlineEditState per\n * row keyed by `field.key`) so renderers stay stateless.\n */\n\nimport {\n matchesKey,\n type Component,\n type SelectItem,\n} from \"@earendil-works/pi-tui\";\nimport { SelectList } from \"@earendil-works/pi-tui\";\nimport { getSelectListTheme } from \"@earendil-works/pi-coding-agent\";\nimport {\n handleInlineEditInput,\n renderInlineEditValue,\n type InlineEditState,\n} from \"../inline-edit\";\nimport type {\n FieldKeyResult,\n FieldRenderer,\n FieldRenderContext,\n NumberField,\n PathField,\n SecretField,\n StringField,\n SubmenuFactory,\n} from \"../types\";\n\n/**\n * The modal stores one InlineEditState per editable row. Renderers\n * access it through this lookup, set by the modal in `FieldRenderContext`.\n *\n * We intentionally don't bake the lookup into `FieldRenderContext` to\n * keep the public type surface clean — instead, the modal mutates a\n * weak-keyed registry passed via `(ctx as any).editStates`. The\n * renderers below pull it out in a single helper to keep the cast\n * isolated.\n */\nfunction getEditState(\n args: { ctx: unknown },\n key: string,\n): InlineEditState | undefined {\n const registry = (args.ctx as { editStates?: Map<string, InlineEditState> })\n .editStates;\n return registry?.get(key);\n}\n\nfunction setEditState(\n args: { ctx: unknown },\n key: string,\n state: InlineEditState | undefined,\n): void {\n const registry = (args.ctx as { editStates?: Map<string, InlineEditState> })\n .editStates;\n if (!registry) return;\n if (state === undefined) registry.delete(key);\n else registry.set(key, state);\n}\n\nfunction maskedSecret(value: string): string {\n if (!value) return \"(unset)\";\n return \"••••••\";\n}\n\nfunction placeholderOrEmpty(\n field: StringField | PathField,\n value: string,\n dim: (s: string) => string,\n): string {\n if (value) return value;\n const placeholder = (field as StringField).placeholder;\n if (placeholder) return dim(placeholder);\n return dim(\"(unset)\");\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// String\n// ─────────────────────────────────────────────────────────────────────\n\nexport const stringRenderer: FieldRenderer<StringField, string> = {\n type: \"string\",\n renderValue(row, args) {\n const dim = (s: string) => args.ctx.theme.fg(\"dim\", s);\n if (row.field.disabled) {\n const text = placeholderOrEmpty(row.field, row.value, dim);\n return args.ctx.theme.fg(\"muted\", text);\n }\n if (args.isEditing) {\n const state = getEditState(args, row.field.key);\n if (state) {\n return args.ctx.theme.fg(\"accent\", renderInlineEditValue(state));\n }\n }\n const text = placeholderOrEmpty(row.field, row.value, dim);\n return args.selected\n ? args.ctx.theme.fg(\"text\", text)\n : args.ctx.theme.fg(\"muted\", text);\n },\n hints(row, { isEditing }) {\n if (row.field.disabled) return [];\n if (isEditing) {\n return [\n { key: \"enter\", label: \"save\" },\n { key: \"esc\", label: \"cancel\" },\n { key: \"←/→\", label: \"move\" },\n ];\n }\n return [{ key: \"enter\", label: \"edit\" }];\n },\n handleKey(row, data, args) {\n if (row.field.disabled) return {};\n return handleStringLikeKey<string>(\n row.field.key,\n row.value,\n data,\n args,\n (buf) => buf,\n );\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// Path\n// ─────────────────────────────────────────────────────────────────────\n\nexport const pathRenderer: FieldRenderer<PathField, string> = {\n type: \"path\",\n renderValue(row, args) {\n // Reuse the string renderer's body — `StringField` and `PathField`\n // share identical render shape today; we cross the variant boundary\n // via an `unknown` cast to satisfy TS's nominal discriminator.\n return (\n stringRenderer.renderValue as unknown as FieldRenderer<\n PathField,\n string\n >[\"renderValue\"]\n )(row, args);\n },\n hints(row, args) {\n return (\n stringRenderer.hints as unknown as FieldRenderer<\n PathField,\n string\n >[\"hints\"]\n )(row, args);\n },\n handleKey(row, data, args) {\n if (row.field.disabled) return {};\n return handleStringLikeKey<string>(\n row.field.key,\n row.value,\n data,\n args,\n (buf) => buf,\n );\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// Secret\n// ─────────────────────────────────────────────────────────────────────\n\nexport const secretRenderer: FieldRenderer<SecretField, string> = {\n type: \"secret\",\n renderValue(row, args) {\n if (row.field.disabled) {\n const display = maskedSecret(row.value);\n return args.ctx.theme.fg(\"muted\", display);\n }\n if (args.isEditing) {\n const state = getEditState(args, row.field.key);\n if (state) {\n // Mask in place: render the buffer through the cursor block but\n // replace every non-cursor char with `•` so over-the-shoulder\n // viewers can't see the secret as it's being typed.\n const masked = \"•\".repeat(state.buffer.length);\n const view: { buffer: string; cursor: number } = {\n buffer: masked,\n cursor: state.cursor,\n };\n return args.ctx.theme.fg(\n \"accent\",\n renderInlineEditValue(view as InlineEditState),\n );\n }\n }\n const display = maskedSecret(row.value);\n return args.selected\n ? args.ctx.theme.fg(\"text\", display)\n : args.ctx.theme.fg(row.value ? \"success\" : \"muted\", display);\n },\n hints(row, args) {\n return (\n stringRenderer.hints as unknown as FieldRenderer<\n SecretField,\n string\n >[\"hints\"]\n )(row, args);\n },\n handleKey(row, data, args) {\n if (row.field.disabled) return {};\n return handleStringLikeKey<string>(\n row.field.key,\n row.value,\n data,\n args,\n (buf) => buf,\n );\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// Number — helpers\n// ─────────────────────────────────────────────────────────────────────\n\nfunction nextValue(values: readonly number[], current: number): number {\n if (values.length === 0) return current;\n const idx = values.indexOf(current);\n return values[(idx + 1 + values.length) % values.length]!;\n}\n\nfunction prevValue(values: readonly number[], current: number): number {\n if (values.length === 0) return current;\n const idx = values.indexOf(current);\n return values[(idx - 1 + values.length) % values.length]!;\n}\n\nfunction stepUp(\n value: number,\n step: number,\n min?: number,\n max?: number,\n): number {\n const next = value + step;\n if (max !== undefined && next > max) return min ?? value;\n return next;\n}\n\nfunction stepDown(\n value: number,\n step: number,\n min?: number,\n max?: number,\n): number {\n const prev = value - step;\n if (min !== undefined && prev < min) return max ?? value;\n return prev;\n}\n\nfunction getValueDesc(field: NumberField): string | undefined {\n return field.valueDescriptions?.[String(field.value)];\n}\n\nfunction makeNumberValuesSubmenu(\n values: readonly number[],\n current: number,\n _valueDesc: string | undefined,\n ctx: FieldRenderContext,\n): SubmenuFactory<number> {\n return (done) => {\n const items: SelectItem[] = values.map((v) => ({\n value: String(v),\n label: String(v),\n }));\n const list = new SelectList(\n items,\n Math.min(items.length, 12),\n getSelectListTheme(),\n );\n const idx = items.findIndex((i) => Number(i.value) === current);\n list.setSelectedIndex(idx >= 0 ? idx : 0);\n list.onSelect = (item) => done(Number(item.value));\n list.onCancel = () => done();\n\n const component: Component = {\n render(width: number): string[] {\n const lines = [...list.render(width)];\n lines.push(\"\");\n return lines;\n },\n invalidate(): void {\n list.invalidate();\n },\n handleInput(data: string): void {\n list.handleInput(data);\n ctx.tui.requestRender();\n },\n };\n return component;\n };\n}\n\n// ─────────────────────────────────────────────────────────────────────\n// Number\n// ─────────────────────────────────────────────────────────────────────\n\nexport const numberRenderer: FieldRenderer<NumberField, number> = {\n type: \"number\",\n renderValue(row, args) {\n if (row.field.disabled) {\n const text = String(row.value);\n return args.ctx.theme.fg(\"muted\", text);\n }\n if (args.isEditing) {\n const state = getEditState(args, row.field.key);\n if (state) {\n return args.ctx.theme.fg(\"accent\", renderInlineEditValue(state));\n }\n }\n const text = String(row.value);\n return args.selected\n ? args.ctx.theme.fg(\"text\", text)\n : args.ctx.theme.fg(\"muted\", text);\n },\n hints(row, args) {\n if (row.field.disabled) return [];\n const { values, step } = row.field;\n if (values && values.length > 4)\n return [{ key: \"enter\", label: \"open list\" }];\n if (values && values.length > 0) {\n return [\n { key: \"enter/space\", label: \"cycle\" },\n { key: \"←/→\", label: \"prev/next\" },\n ];\n }\n if (step !== undefined) {\n return [\n { key: \"enter\", label: \"edit\" },\n { key: \"←/→\", label: \"step\" },\n ];\n }\n return (\n stringRenderer.hints as unknown as FieldRenderer<\n NumberField,\n number\n >[\"hints\"]\n )(row, args);\n },\n handleKey(row, data, args) {\n if (row.field.disabled) return {};\n const { values, step } = row.field;\n\n // Discrete values: cycle through (like enum) or open submenu\n if (values && values.length > 0) {\n if (\n matchesKey(data, \"enter\") ||\n matchesKey(data, \"return\") ||\n data === \" \"\n ) {\n if (values.length > 4) {\n return {\n consumed: true,\n submenu: makeNumberValuesSubmenu(\n values,\n row.value,\n getValueDesc(row.field),\n args.ctx,\n ),\n };\n }\n return { consumed: true, commit: nextValue(values, row.value) };\n }\n if (matchesKey(data, \"left\")) {\n return { consumed: true, commit: prevValue(values, row.value) };\n }\n if (matchesKey(data, \"right\")) {\n return { consumed: true, commit: nextValue(values, row.value) };\n }\n return {};\n }\n\n // Step-based: ←/→ fine-tune by step (only when not editing — while\n // editing those keys move the cursor). Everything else — Enter to\n // start editing, typing, backspace, escape — goes to the inline\n // string editor so editing mode is never a dead end.\n if (step !== undefined) {\n if (!args.isEditing) {\n if (matchesKey(data, \"left\")) {\n return {\n consumed: true,\n commit: stepDown(row.value, step, row.field.min, row.field.max),\n };\n }\n if (matchesKey(data, \"right\")) {\n return {\n consumed: true,\n commit: stepUp(row.value, step, row.field.min, row.field.max),\n };\n }\n }\n return handleStringLikeKey<number>(\n row.field.key,\n String(row.value),\n data,\n args,\n (buffer) => {\n const trimmed = buffer.trim();\n if (trimmed === \"\") throw new Error(\"Expected a number\");\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed))\n throw new Error(`Not a number: '${buffer}'`);\n if (row.field.integer && !Number.isInteger(parsed))\n throw new Error(\"Expected an integer\");\n if (typeof row.field.min === \"number\" && parsed < row.field.min)\n throw new Error(`Must be ≥ ${row.field.min}`);\n if (typeof row.field.max === \"number\" && parsed > row.field.max)\n throw new Error(`Must be ≤ ${row.field.max}`);\n return parsed;\n },\n );\n }\n\n // Plain number: inline edit (current behavior)\n return handleStringLikeKey<number>(\n row.field.key,\n String(row.value),\n data,\n args,\n (buffer) => {\n const trimmed = buffer.trim();\n if (trimmed === \"\") throw new Error(\"Expected a number\");\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed))\n throw new Error(`Not a number: '${buffer}'`);\n if (row.field.integer && !Number.isInteger(parsed))\n throw new Error(\"Expected an integer\");\n if (typeof row.field.min === \"number\" && parsed < row.field.min)\n throw new Error(`Must be ≥ ${row.field.min}`);\n if (typeof row.field.max === \"number\" && parsed > row.field.max)\n throw new Error(`Must be ≤ ${row.field.max}`);\n if (values && !values.includes(parsed))\n throw new Error(`Must be one of: ${values.join(\", \")}`);\n return parsed;\n },\n );\n },\n};\n\n// ─────────────────────────────────────────────────────────────────────\n// Shared edit-key state machine\n// ─────────────────────────────────────────────────────────────────────\n\ninterface StringLikeArgs {\n isEditing: boolean;\n ctx: unknown;\n setEditing: (v: boolean) => void;\n}\n\nfunction handleStringLikeKey<V>(\n key: string,\n initialBuffer: string,\n data: string,\n args: StringLikeArgs,\n parse: (buffer: string) => V,\n): FieldKeyResult<V> {\n // Defensive coercion: the caller may pass a non-string value (e.g. an\n // array from config with configFilename + scope tabs). We coerce here\n // so cursor/buffer arithmetic always works on a plain string.\n const initialStr = String(initialBuffer);\n\n if (!args.isEditing) {\n if (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) {\n // Begin editing — seed the buffer from the current value.\n setEditState(args, key, {\n buffer: initialStr,\n cursor: initialStr.length,\n });\n args.setEditing(true);\n return { consumed: true };\n }\n return {};\n }\n\n // Editing mode: Enter commits, Esc cancels.\n if (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) {\n const state = getEditState(args, key);\n if (!state) {\n args.setEditing(false);\n return { consumed: true };\n }\n try {\n const value = parse(state.buffer);\n setEditState(args, key, undefined);\n args.setEditing(false);\n return { consumed: true, commit: value };\n } catch (error) {\n // Re-throw so the modal can surface via ctx.ui.notify; keep\n // editing mode active so the user can correct the value.\n throw error;\n }\n }\n if (matchesKey(data, \"escape\")) {\n setEditState(args, key, undefined);\n args.setEditing(false);\n return { consumed: true };\n }\n\n const state = getEditState(args, key);\n if (!state) {\n // Defensive: if the registry got out of sync, fall back to a\n // fresh buffer so the user isn't stuck in editing mode with no\n // way to type.\n setEditState(args, key, { buffer: initialStr, cursor: initialStr.length });\n return { consumed: true };\n }\n if (handleInlineEditInput(state, data)) {\n return { consumed: true };\n }\n return { consumed: true }; // swallow stray keys while editing\n}\n","/**\n * Renderer for `type: \"text\"` rows — multiline string values.\n *\n * Editing opens a submenu with a full multiline `Editor`.\n * - Ctrl+S saves and closes.\n * - Escape cancels and closes.\n * - All other input (Enter, Shift+Enter, arrows, typing) is handled by\n * the Editor directly.\n */\n\nimport { Editor, type Component } from \"@earendil-works/pi-tui\";\nimport { getSelectListTheme } from \"@earendil-works/pi-coding-agent\";\nimport type { EditorTheme } from \"@earendil-works/pi-tui\";\nimport { truncateToWidth } from \"@earendil-works/pi-tui\";\nimport type {\n FieldRenderer,\n SubmenuFactory,\n TextField,\n FieldRenderContext,\n FieldKeyHint,\n} from \"../types\";\nimport { formatHintLine } from \"../frame\";\n\nexport const textRenderer: FieldRenderer<TextField, string> = {\n type: \"text\",\n renderValue(row, { selected, ctx }) {\n const display = formatTextPreview(row.value);\n if (row.field.disabled) {\n return ctx.theme.fg(\"muted\", display);\n }\n return ctx.theme.fg(selected ? \"accent\" : \"muted\", display);\n },\n hints(row): FieldKeyHint[] {\n if (row.field.disabled) return [];\n return [{ key: \"enter\", label: \"open editor\" }];\n },\n handleKey(row, data, { ctx }) {\n if (row.field.disabled) return {};\n if (data === \"\\r\" || data === \"\\n\") {\n return {\n consumed: true,\n submenu: makeTextSubmenu(row.value, ctx),\n };\n }\n return {};\n },\n};\n\nfunction formatTextPreview(value: string): string {\n const lineCount = value.split(\"\\n\").length;\n const preview = value.replace(/\\s+/g, \" \").trim();\n const quoted = preview ? JSON.stringify(preview) : '\"\"';\n const suffix = lineCount > 1 ? ` (${lineCount} lines)` : \"\";\n return `${truncateToWidth(quoted, 48, \"...\")}${suffix}`;\n}\n\nfunction makeTextSubmenu(\n current: string,\n ctx: FieldRenderContext,\n): SubmenuFactory<string> {\n return (done) => {\n const editor = new Editor(\n ctx.tui,\n {\n borderColor: (s: string) => ctx.theme.fg(\"muted\", s),\n selectList: getSelectListTheme(),\n } as EditorTheme,\n {\n paddingX: 0,\n },\n );\n editor.setText(current);\n editor.focused = true;\n editor.disableSubmit = true;\n editor.onChange = () => ctx.tui.requestRender();\n\n const component: Component = {\n render(_width: number): string[] {\n const lines = editor.render(80);\n lines.push(\"\");\n lines.push(\n ctx.theme.fg(\n \"dim\",\n formatHintLine(\n [\n { key: \"ctrl+s\", label: \"save\" },\n { key: \"esc\", label: \"cancel\" },\n ],\n ctx.theme,\n ),\n ),\n );\n return lines;\n },\n invalidate(): void {\n editor.invalidate();\n },\n handleInput(data: string): void {\n if (data === \"\\x13\") {\n // Ctrl+S\n done(editor.getExpandedText());\n return;\n }\n if (data === \"\\x1b\") {\n // Escape\n done();\n return;\n }\n editor.handleInput(data);\n ctx.tui.requestRender();\n },\n };\n return component;\n };\n}\n","/**\n * Built-in field renderers. The modal's `RENDERERS` lookup is\n * constructed from these so user-supplied `type: \"custom\"` fields can\n * coexist with built-ins without any registration ceremony.\n */\n\nimport type { Field, FieldRenderer } from \"../types\";\nimport { actionRenderer } from \"./action\";\nimport { booleanRenderer } from \"./boolean\";\nimport { customRenderer } from \"./custom\";\nimport { enumRenderer } from \"./enum\";\nimport { modelRenderer } from \"./model\";\nimport {\n numberRenderer,\n pathRenderer,\n secretRenderer,\n stringRenderer,\n} from \"./string\";\nimport { textRenderer } from \"./text\";\n\nexport {\n actionRenderer,\n booleanRenderer,\n customRenderer,\n enumRenderer,\n modelRenderer,\n numberRenderer,\n pathRenderer,\n secretRenderer,\n stringRenderer,\n textRenderer,\n};\n\n/** Map of field discriminator → renderer. */\nexport const RENDERERS: Record<Field[\"type\"], FieldRenderer<any, any>> = {\n boolean: booleanRenderer,\n enum: enumRenderer,\n string: stringRenderer,\n number: numberRenderer,\n secret: secretRenderer,\n path: pathRenderer,\n text: textRenderer,\n action: actionRenderer,\n model: modelRenderer,\n custom: customRenderer,\n};\n","/**\n * `SettingsModalBody` — the renderable+inputtable component that\n * `createSettingsModal` and `openSettingsModal` mount inside an\n * overlay. Owns:\n *\n * - Tab strip across the top (when `tabs` is non-empty).\n * - Optional fuzzy search bar (when `enableSearch` is true).\n * - The list of rows, with one focused at a time.\n * - Per-row inline-edit state (string/number/secret/path).\n * - Submenu mounting (enum long-list, model widget, custom openSubmenu).\n * - Auto-generated footer hint reflecting the focused row's keybindings.\n *\n * The modal is **stateless about disk** — it calls `onChange` on every\n * commit and lets the caller persist however they like. In buffered\n * mode (`options.mode === \"buffered\"`), the modal holds edits in\n * memory and persists only on explicit save via `options.onSave`.\n */\n\nimport type { ExtensionContext, Theme } from \"@earendil-works/pi-coding-agent\";\nimport {\n matchesKey,\n truncateToWidth,\n visibleWidth,\n type Component,\n type TUI,\n} from \"@earendil-works/pi-tui\";\nimport { loadConfig, getExtensionsDir } from \"../config.ts\";\nimport { validateFieldValue } from \"./validate-field.ts\";\nimport type {\n Field,\n FieldKeyHint,\n FieldRenderContext,\n SettingsModalOptions,\n Tab,\n VisibilityContext,\n} from \"./types\";\nimport { RENDERERS } from \"./fields/index\";\nimport {\n divider,\n formatHintLine,\n frame,\n frameContentWidth,\n pad,\n responsiveInnerRows,\n wrapLine,\n type FrameOptions,\n} from \"./frame\";\nimport { deleteWordBackward, type InlineEditState } from \"./inline-edit\";\n\nconst PREFERRED_INNER_ROWS = 30;\nconst LABEL_PAD_TARGET = 28;\n\ninterface InternalRow {\n field: Field;\n /** Live displayed value, written back through `onChange`. */\n value: unknown;\n globalValue?: unknown;\n projectValue?: unknown;\n /** Inline-edit toggle for editable types. */\n isEditing: boolean;\n /** Pre-computed lowercased search index string for fuzzy filtering. */\n searchIndex: string;\n /** Pre-computed truncated label text. */\n labelText: string;\n /** Pre-computed label padding. */\n labelPadding: string;\n}\n\ninterface ConfirmSubmenuState {\n selectedIndex: number;\n dirtyKeys: Set<string>;\n initialValues: Map<string, unknown>;\n}\n\ninterface ConfirmOption {\n label: string;\n action: \"save-global\" | \"save-project\" | \"discard\" | \"cancel\";\n}\n\nconst confirmOptions: ConfirmOption[] = [\n { label: \"Save to Global\", action: \"save-global\" },\n { label: \"Save to Project Local\", action: \"save-project\" },\n { label: \"Discard\", action: \"discard\" },\n { label: \"Cancel\", action: \"cancel\" },\n];\n\n/**\n * Build the body component. The factory is independent of overlay\n * lifecycle — `createSettingsModal` (in modal.ts) wraps it for the\n * `ctx.ui.custom` shape; advanced callers can mount the body directly.\n */\nexport function createSettingsModalBody<F extends Field>(\n options: SettingsModalOptions<F>,\n args: {\n tui: TUI;\n theme: Theme;\n ctx: ExtensionContext;\n /** Called when the user closes (Esc / ctrl+c / outer dismissal). */\n close: () => void;\n },\n): Component {\n const useScopeTabs = options.configFilename !== undefined;\n const tabs: Tab[] = useScopeTabs\n ? [\n { id: \"global\", label: \"Global\" },\n { id: \"project\", label: \"Project Local\" },\n ]\n : (options.tabs ?? []);\n const fields: Field[] = options.fields as Field[];\n const mode = options.mode ?? \"immediate\";\n const isBuffered = mode === \"buffered\";\n\n let globalConfig: Record<string, unknown> = {};\n let projectConfig: Record<string, unknown> = {};\n if (useScopeTabs && options.configFilename) {\n const fn = options.configFilename;\n const defs = options.defaults ?? {};\n const globalDir = options.globalConfigDir ?? getExtensionsDir();\n globalConfig = loadConfig(fn, defs, { configDir: globalDir });\n projectConfig = loadConfig(fn, defs, {\n cwd: args.ctx.cwd,\n configDir: globalDir,\n });\n }\n\n let activeTabId: string | undefined = options.initialTab ?? tabs[0]?.id;\n\n // Per-row state lives in this array, indexed parallel to a snapshot\n // of `fields`. We never reorder it — search filters use a separate\n // `filteredIndices` view.\n const rows: InternalRow[] = fields.map((field) => {\n let globalVal: unknown;\n let projectVal: unknown;\n\n if (useScopeTabs) {\n globalVal = getNestedValue(globalConfig, field.key);\n if (globalVal === undefined) {\n globalVal = getNestedValue(options.defaults ?? {}, field.key);\n }\n if (globalVal === undefined) {\n globalVal = extractInitialValue(field);\n }\n\n projectVal = getNestedValue(projectConfig, field.key);\n if (projectVal === undefined) {\n projectVal = globalVal;\n }\n } else {\n globalVal = extractInitialValue(field);\n projectVal = globalVal;\n }\n\n const labelText = truncateToWidth(field.label, LABEL_PAD_TARGET, \"…\");\n const labelPadding = \" \".repeat(\n Math.max(1, LABEL_PAD_TARGET - visibleWidth(labelText)),\n );\n\n return {\n field,\n get globalValue() {\n return globalVal;\n },\n set globalValue(v) {\n globalVal = v;\n },\n get projectValue() {\n return projectVal;\n },\n set projectValue(v) {\n projectVal = v;\n },\n get value() {\n return activeTabId === \"project\" ? projectVal : globalVal;\n },\n set value(v) {\n if (activeTabId === \"project\") {\n projectVal = v;\n } else {\n globalVal = v;\n }\n },\n isEditing: false,\n searchIndex:\n `${field.label}\\n${field.description ?? \"\"}\\n${field.key}`.toLowerCase(),\n labelText,\n labelPadding,\n };\n }) as unknown as InternalRow[];\n\n // Inline-edit state registry: keyed by field.key. Renderers reach\n // into this through `ctx.editStates` (see fields/string.ts).\n const editStates: Map<string, InlineEditState> = new Map();\n\n // Buffered mode: snapshot initial values and track dirty keys.\n const initialGlobalValues = new Map<string, unknown>();\n const initialProjectValues = new Map<string, unknown>();\n const dirtyGlobalKeys = new Set<string>();\n const dirtyProjectKeys = new Set<string>();\n\n if (isBuffered) {\n for (const row of rows) {\n const gVal = row.globalValue;\n initialGlobalValues.set(\n row.field.key,\n typeof gVal === \"object\" && gVal !== null\n ? JSON.parse(JSON.stringify(gVal))\n : gVal,\n );\n const pVal = row.projectValue;\n initialProjectValues.set(\n row.field.key,\n typeof pVal === \"object\" && pVal !== null\n ? JSON.parse(JSON.stringify(pVal))\n : pVal,\n );\n }\n }\n\n function getInitialValues() {\n return activeTabId === \"project\"\n ? initialProjectValues\n : initialGlobalValues;\n }\n\n function getDirtyKeys() {\n return activeTabId === \"project\" ? dirtyProjectKeys : dirtyGlobalKeys;\n }\n let search = \"\";\n let fieldSelected = 0;\n let scroll = 0;\n let tabActionFocus = -1;\n let submenu: Component | undefined;\n let submenuKey: string | undefined;\n let confirmState: ConfirmSubmenuState | undefined;\n let scopeActionConfirm:\n { action: \"reset\" | \"delete\"; selectedIndex: number } | undefined;\n // Scope default inferred once at mount via the extension's callback.\n const defaultScope: \"global\" | \"project\" = (options.inferDefaultScope?.() ??\n \"global\") as \"global\" | \"project\";\n\n const fieldRenderContext: FieldRenderContext & {\n editStates: Map<string, InlineEditState>;\n } = {\n theme: args.theme,\n tui: args.tui,\n ctx: args.ctx,\n requestRender: () => args.tui.requestRender(),\n editStates,\n };\n\n // Action rows (only visible at the bottom of scope tabs when callbacks are provided)\n const actionRows: { id: string; label: string; description: string }[] = [];\n if (useScopeTabs && (options.onResetScope || options.onDeleteScope)) {\n if (options.onResetScope) {\n actionRows.push({\n id: \"reset\",\n label: \"Reset to defaults\",\n description:\n \"Remove all config keys for this scope — values fall back to defaults.\",\n });\n }\n if (options.onDeleteScope) {\n actionRows.push({\n id: \"delete\",\n label: \"Delete config\",\n description: \"Remove the entire config file for this scope.\",\n });\n }\n }\n\n // Optimization: Cache the visible row indices list to avoid redundant array\n // allocations, lowercase conversions, and substring checks inside hot rendering\n // and search filtering loops.\n let cachedVisibleIndices: number[] = [];\n\n function buildVisibilityContext(\n _field: Field,\n scope: string,\n ): VisibilityContext {\n return {\n get: (key: string) => {\n const r = rows.find((rr) => rr.field.key === key);\n return r?.value;\n },\n getScoped: (key: string, targetScope?: string) => {\n const r = rows.find((rr) => rr.field.key === key);\n if (!r) return undefined;\n if (!targetScope || targetScope === scope) return r.value;\n return targetScope === \"project\" ? r.projectValue : r.globalValue;\n },\n scope,\n };\n }\n\n function totalVisibleItems(): number {\n return cachedVisibleIndices.length;\n }\n\n function updateVisibleIndices(): void {\n const query = search.trim().toLowerCase();\n const out: number[] = [];\n for (let i = 0; i < rows.length; i += 1) {\n const row = rows[i]!;\n if (activeTabId !== undefined && tabs.length > 0 && !useScopeTabs) {\n // When tabs are configured, fields without an explicit `tab` id\n // surface only on the first tab — same convention as a default\n // landing tab in browser-style chrome.\n const fallbackTab = tabs[0]!.id;\n const rowTab = row.field.tab ?? fallbackTab;\n if (rowTab !== activeTabId) continue;\n }\n // visibleWhen: fields can conditionally hide based on sibling values\n if (row.field.visibleWhen) {\n const scope = activeTabId ?? \"global\";\n if (!row.field.visibleWhen(buildVisibilityContext(row.field, scope)))\n continue;\n }\n if (!query) {\n out.push(i);\n continue;\n }\n if (row.searchIndex.includes(query)) out.push(i);\n }\n cachedVisibleIndices = out;\n }\n\n // Compute the initial visible indices.\n updateVisibleIndices();\n\n function visibleRowIndices(): number[] {\n return cachedVisibleIndices;\n }\n\n function clampSelection(visibleRows: number): void {\n const count = totalVisibleItems();\n fieldSelected = Math.max(\n 0,\n Math.min(fieldSelected, Math.max(0, count - 1)),\n );\n if (fieldSelected < scroll) scroll = fieldSelected;\n else if (fieldSelected >= scroll + visibleRows)\n scroll = fieldSelected - visibleRows + 1;\n scroll = Math.max(0, Math.min(scroll, Math.max(0, count - visibleRows)));\n }\n\n function focusedIndex(): number | undefined {\n const indices = visibleRowIndices();\n if (indices.length === 0) return undefined;\n const safe = Math.max(0, Math.min(fieldSelected, indices.length - 1));\n return indices[safe];\n }\n\n function focusedRow(): InternalRow | undefined {\n const idx = focusedIndex();\n return idx === undefined ? undefined : rows[idx];\n }\n\n function isDirty(): boolean {\n if (!isBuffered) return false;\n return dirtyGlobalKeys.size > 0 || dirtyProjectKeys.size > 0;\n }\n\n /** Update dirty state for a key by comparing current value against\n * the initial snapshot. Removes the key if the value has reverted\n * to its original; adds it otherwise. */\n function syncDirtyState(key: string): void {\n if (!isBuffered) return;\n const initial = getInitialValues().get(key);\n const current = rows.find((r) => r.field.key === key)?.value;\n const isClean =\n typeof initial === \"object\" && initial !== null\n ? JSON.stringify(current) === JSON.stringify(initial)\n : current === initial;\n if (isClean) {\n getDirtyKeys().delete(key);\n } else {\n getDirtyKeys().add(key);\n }\n }\n\n function commitValue(row: InternalRow, value: unknown): void {\n const previous = row.value;\n const key = row.field.key;\n\n row.value = value;\n if (isBuffered) {\n syncDirtyState(key);\n }\n\n try {\n const ret = options.onChange?.(\n row.field.key as never,\n value as never,\n row.field as never,\n );\n if (ret && typeof (ret as Promise<void>).then === \"function\") {\n // Async onChange: dirty state is already set above. On\n // rejection, roll the row back and re-sync dirty state.\n (ret as Promise<void>)\n .then(() => {\n if (isBuffered) {\n args.tui.requestRender();\n }\n })\n .catch((err) => {\n if (row.value === value) {\n row.value = previous;\n }\n if (isBuffered) {\n syncDirtyState(key);\n }\n notifyError(args.ctx, err);\n args.tui.requestRender();\n });\n }\n } catch (err) {\n row.value = previous;\n if (isBuffered) {\n syncDirtyState(key);\n }\n notifyError(args.ctx, err);\n args.tui.requestRender();\n }\n }\n\n function mountSubmenu(\n factory: NonNullable<\n ReturnType<(typeof RENDERERS)[Field[\"type\"]][\"handleKey\"]>[\"submenu\"]\n >,\n row: InternalRow,\n ): void {\n submenu = factory((value) => {\n submenu = undefined;\n submenuKey = undefined;\n if (value !== undefined) commitValue(row, value);\n args.tui.requestRender();\n });\n submenuKey = row.field.key;\n args.tui.requestRender();\n }\n\n function mountConfirmSubmenu(): void {\n const scopeToUse = useScopeTabs ? activeTabId : defaultScope;\n confirmState = {\n selectedIndex: scopeToUse === \"project\" ? 1 : 0,\n dirtyKeys: new Set(getDirtyKeys()),\n initialValues: new Map(getInitialValues()),\n };\n args.tui.requestRender();\n }\n\n function mountScopeActionConfirm(action: \"reset\" | \"delete\"): void {\n scopeActionConfirm = { action, selectedIndex: 0 };\n args.tui.requestRender();\n }\n\n function setEditing(row: InternalRow, value: boolean): void {\n row.isEditing = value;\n }\n\n function rendererFor(field: Field) {\n return RENDERERS[field.type];\n }\n\n function dispatchKey(data: string): void {\n const row = focusedRow();\n if (!row) return;\n const renderer = rendererFor(row.field);\n try {\n const result = renderer.handleKey(\n { field: row.field as never, value: row.value as never },\n data,\n {\n isEditing: row.isEditing,\n ctx: fieldRenderContext,\n setEditing: (v) => setEditing(row, v),\n },\n );\n if (result.commit !== undefined) commitValue(row, result.commit);\n if (result.submenu) mountSubmenu(result.submenu, row);\n } catch (err) {\n notifyError(args.ctx, err);\n }\n }\n\n /**\n * Apply an alt+↑ / alt+↓ reorder request originating from `handleInput`.\n *\n * Returns `true` when the reorder consumed the keystroke (success\n * or graceful no-op at an edge); `false` when the focused row isn't\n * `reorderable` and the modal should fall through to the default\n * alt-arrow handling (which is currently nothing — alt-arrows are\n * inert in non-reorderable contexts).\n *\n * Reorder is restricted to swaps with the immediate `reorderable`\n * neighbour in `visibleRowIndices` order. We do NOT skip over\n * intervening non-reorderable rows: callers are expected to group\n * reorderable rows contiguously, which keeps the visual behaviour\n * predictable.\n */\n function handleReorder(direction: -1 | 1): boolean {\n const focusedIdx = focusedIndex();\n if (focusedIdx === undefined) return false;\n const focusedRowInternal = rows[focusedIdx];\n if (!focusedRowInternal?.field.reorderable) return false;\n\n const indices = visibleRowIndices();\n const visiblePos = indices.indexOf(focusedIdx);\n const targetVisiblePos = visiblePos + direction;\n if (targetVisiblePos < 0 || targetVisiblePos >= indices.length) {\n // At the edge — still consume the keystroke so it doesn't bleed\n // into the bare up/down handler below.\n return true;\n }\n const targetIdx = indices[targetVisiblePos]!;\n const targetRow = rows[targetIdx];\n if (!targetRow?.field.reorderable) {\n // Adjacent neighbour isn't reorderable — treat as edge.\n return true;\n }\n\n // Compute the from/to indices counting ONLY reorderable peers so\n // callers that interleave non-reorderable rows (e.g. a Separator\n // field at the bottom of a Layout tab) still receive contiguous\n // 0..N-1 positions matching their own data structure.\n const reorderablePeerIdxs = indices.filter(\n (i) => rows[i]?.field.reorderable,\n );\n const fromPeerPos = reorderablePeerIdxs.indexOf(focusedIdx);\n const toPeerPos = reorderablePeerIdxs.indexOf(targetIdx);\n\n // Swap the two rows in-place.\n rows[focusedIdx] = targetRow;\n rows[targetIdx] = focusedRowInternal;\n\n // Update `fieldSelected` so focus follows the moved row.\n // `fieldSelected` indexes into the visible-rows view; the row\n // we swapped to `targetIdx` is at visible position\n // `targetVisiblePos`.\n fieldSelected = targetVisiblePos;\n\n // Recompute cached visible indices as the internal rows order has changed\n updateVisibleIndices();\n\n try {\n options.onReorder?.({\n fieldKey: focusedRowInternal.field.key,\n fromIndex: fromPeerPos,\n toIndex: toPeerPos,\n });\n } catch (err) {\n notifyError(args.ctx, err);\n }\n\n args.tui.requestRender();\n return true;\n }\n\n function allValues(scope?: \"global\" | \"project\"): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const row of rows) {\n if (useScopeTabs) {\n out[row.field.key] =\n scope === \"project\" ? row.projectValue : row.globalValue;\n } else {\n out[row.field.key] = row.value;\n }\n }\n return out;\n }\n\n async function performSave(scope: \"global\" | \"project\"): Promise<void> {\n if (!options.onSave) return;\n try {\n const result = options.onSave(allValues(scope), scope);\n // If onSave returned a thenable, await it; otherwise close\n // synchronously so synchronous callers (e.g. tests) don't need\n // to flush microtasks.\n const maybeThenable = result as unknown;\n if (\n maybeThenable &&\n typeof (maybeThenable as Promise<void>).then === \"function\"\n ) {\n await (maybeThenable as Promise<void>);\n }\n args.close();\n } catch (err) {\n notifyError(args.ctx, err);\n // Keep modal open on error — user can retry or cancel.\n }\n }\n\n function handleConfirmInput(data: string): void {\n if (!confirmState) return;\n if (matchesKey(data, \"up\")) {\n confirmState.selectedIndex = Math.max(0, confirmState.selectedIndex - 1);\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"down\")) {\n const count = confirmOptions.length;\n confirmState.selectedIndex = Math.min(\n count - 1,\n confirmState.selectedIndex + 1,\n );\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"escape\")) {\n // Cancel: unmount submenu, preserve edits.\n confirmState = undefined;\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) {\n const choice = confirmOptions[confirmState.selectedIndex];\n if (!choice) return;\n if (choice.action === \"save-global\") {\n void performSave(\"global\");\n } else if (choice.action === \"save-project\") {\n void performSave(\"project\");\n } else if (choice.action === \"discard\") {\n try {\n options.onCancel?.();\n } catch {\n // Caller-supplied onCancel must not break the confirm teardown.\n }\n args.close();\n } else {\n // cancel\n confirmState = undefined;\n args.tui.requestRender();\n }\n }\n }\n\n function renderConfirmSubmenu(_width: number): string[] {\n const lines: string[] = [];\n lines.push(\"\");\n lines.push(\" You have unsaved changes:\");\n lines.push(\"\");\n\n for (let i = 0; i < confirmOptions.length; i++) {\n const opt = confirmOptions[i]!;\n const isSelected = i === confirmState!.selectedIndex;\n const prefix = isSelected ? args.theme.fg(\"accent\", \"▌ \") : \" \";\n const label = isSelected\n ? args.theme.fg(\"text\", opt.label)\n : args.theme.fg(\"muted\", opt.label);\n lines.push(`${prefix}${label}`);\n }\n\n lines.push(\"\");\n const needsReload = Array.from(confirmState!.dirtyKeys).some((key) => {\n const row = rows.find((r) => r.field.key === key);\n return (\n (row?.field as { requiresReload?: boolean } | undefined)\n ?.requiresReload === true\n );\n });\n if (needsReload) {\n lines.push(\n args.theme.fg(\n \"muted\",\n \" Some changes require /reload to take effect.\",\n ),\n );\n }\n lines.push(\n args.theme.fg(\"muted\", \" ↑↓ select enter confirm esc cancel\"),\n );\n\n return lines;\n }\n\n function handleScopeActionConfirmInput(data: string): void {\n if (!scopeActionConfirm) return;\n if (matchesKey(data, \"up\")) {\n scopeActionConfirm.selectedIndex = Math.max(\n 0,\n scopeActionConfirm.selectedIndex - 1,\n );\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"down\")) {\n const max = 2; // global, project, cancel\n scopeActionConfirm.selectedIndex = Math.min(\n max,\n scopeActionConfirm.selectedIndex + 1,\n );\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"escape\")) {\n scopeActionConfirm = undefined;\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) {\n const act = scopeActionConfirm.action;\n const options = getScopeActionOptions(act);\n const choice = options[scopeActionConfirm.selectedIndex];\n scopeActionConfirm = undefined;\n if (choice && choice.scope !== null) {\n void handleScopeAction(act, choice.scope);\n } else {\n args.tui.requestRender();\n }\n }\n }\n\n function getScopeActionOptions(\n action: \"reset\" | \"delete\",\n ): Array<{ label: string; scope: \"global\" | \"project\" | null }> {\n const verb = action === \"reset\" ? \"Reset to defaults\" : \"Delete config\";\n return [\n // Cancel first — it is pre-selected (selectedIndex starts at 0), so\n // tabbing into the confirm can never trigger a destructive action\n // by accident.\n { label: \"Cancel\", scope: null },\n { label: `${verb} (global)`, scope: \"global\" },\n { label: `${verb} (project-local)`, scope: \"project\" },\n ];\n }\n\n function renderScopeActionConfirm(_width: number): string[] {\n const lines: string[] = [];\n const isReset = scopeActionConfirm!.action === \"reset\";\n const options = getScopeActionOptions(scopeActionConfirm!.action);\n lines.push(\"\");\n lines.push(isReset ? \" Reset config to defaults\" : \" Delete config file\");\n lines.push(\"\");\n // Destructive-action warning — warning color (yellow) so it is\n // visible before confirming.\n lines.push(\n args.theme.fg(\n \"warning\",\n isReset\n ? \" This will reset your config to defaults.\"\n : \" This will permanently delete your config file.\",\n ),\n );\n lines.push(\"\");\n lines.push(args.theme.fg(\"muted\", \" Select scope:\"));\n lines.push(\"\");\n\n for (let i = 0; i < options.length; i++) {\n const isSelected = i === scopeActionConfirm!.selectedIndex;\n const prefix = isSelected ? args.theme.fg(\"accent\", \"▌ \") : \" \";\n const label = isSelected\n ? args.theme.fg(\"text\", options[i]!.label)\n : args.theme.fg(\"muted\", options[i]!.label);\n lines.push(`${prefix}${label}`);\n }\n\n lines.push(\"\");\n lines.push(\n args.theme.fg(\"muted\", \" ↑↓ select enter confirm esc cancel\"),\n );\n return lines;\n }\n\n function handleInput(data: string): void {\n if (submenu) {\n submenu.handleInput?.(data);\n return;\n }\n if (confirmState) {\n handleConfirmInput(data);\n return;\n }\n if (scopeActionConfirm) {\n handleScopeActionConfirmInput(data);\n return;\n }\n const row = focusedRow();\n\n if (row?.isEditing && matchesKey(data, \"ctrl+c\")) {\n // ctrl+c always closes the modal, even mid-edit — otherwise a\n // stuck editing state leaves the user with no way out.\n if (isBuffered && isDirty()) {\n mountConfirmSubmenu();\n } else {\n args.close();\n }\n return;\n }\n\n if (row?.isEditing) {\n // While editing, only the renderer (and esc/enter) gets to see\n // input — cursor & nav keys are reserved for the inline editor.\n dispatchKey(data);\n args.tui.requestRender();\n return;\n }\n\n if (matchesKey(data, \"ctrl+s\")) {\n if (isBuffered && isDirty()) {\n mountConfirmSubmenu();\n } else if (isBuffered) {\n // No changes — save directly to the inferred default scope.\n // This lets users deploy a fresh config without editing anything.\n const scope: \"global\" | \"project\" = useScopeTabs\n ? ((activeTabId ?? defaultScope) as \"global\" | \"project\")\n : defaultScope;\n void performSave(scope);\n }\n return;\n }\n // ctrl+r: contextual — field-level reset when on field, scope reset when on action row\n if (matchesKey(data, \"ctrl+r\")) {\n if (tabActionFocus >= tabs.length && actionRows.length > 0) {\n // Action row focused → scope reset\n if (options.onResetScope) {\n mountScopeActionConfirm(\"reset\");\n }\n } else {\n // Field focused → field-level reset\n const row = focusedRow();\n if (row && !row.field.disabled && !row.isEditing) {\n const def = row.field.default;\n if (def !== undefined) {\n const clonedDef =\n typeof def === \"object\" && def !== null\n ? JSON.parse(JSON.stringify(def))\n : def;\n commitValue(row, clonedDef);\n }\n }\n }\n args.tui.requestRender();\n return;\n }\n // ctrl+d: field-level reset when on field, scope delete when on action row\n if (matchesKey(data, \"ctrl+d\")) {\n if (tabActionFocus >= tabs.length && actionRows.length > 0) {\n // Action row focused → scope delete\n if (options.onDeleteScope) {\n mountScopeActionConfirm(\"delete\");\n }\n } else {\n // Field focused → field-level reset (same as ctrl+r)\n const row = focusedRow();\n if (row && !row.field.disabled && !row.isEditing) {\n const def = row.field.default;\n if (def !== undefined) {\n const clonedDef =\n typeof def === \"object\" && def !== null\n ? JSON.parse(JSON.stringify(def))\n : def;\n commitValue(row, clonedDef);\n }\n }\n }\n args.tui.requestRender();\n return;\n }\n // ctrl+shift+r: always scope reset (from anywhere)\n if (matchesKey(data, \"ctrl+shift+r\")) {\n if (options.onResetScope) {\n mountScopeActionConfirm(\"reset\");\n }\n args.tui.requestRender();\n return;\n }\n // ctrl+shift+d: always scope delete (from anywhere)\n if (matchesKey(data, \"ctrl+shift+d\")) {\n if (options.onDeleteScope) {\n mountScopeActionConfirm(\"delete\");\n }\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"escape\")) {\n // If Tab focus is on action row/tab, first escape returns to field zone\n if (tabActionFocus >= 0) {\n tabActionFocus = -1;\n args.tui.requestRender();\n return;\n }\n if (options.enableSearch && search !== \"\") {\n search = \"\";\n fieldSelected = 0;\n updateVisibleIndices();\n args.tui.requestRender();\n return;\n }\n if (isBuffered && isDirty()) {\n mountConfirmSubmenu();\n } else {\n args.close();\n }\n return;\n }\n if (matchesKey(data, \"ctrl+c\")) {\n if (isBuffered && isDirty()) {\n mountConfirmSubmenu();\n } else {\n args.close();\n }\n return;\n }\n // Tab/Shift+Tab: cycle through tabs + action row\n if (matchesKey(data, \"tab\")) {\n const stopCount = tabs.length + actionRows.length;\n if (stopCount === 0) {\n args.tui.requestRender();\n return;\n }\n if (tabActionFocus === -1) {\n // Start from the next stop after the current active tab,\n // so Tab never \"rewinds\" to the first stop.\n const currentTabIdx = tabs.findIndex((t) => t.id === activeTabId);\n if (currentTabIdx >= 0) {\n tabActionFocus = (currentTabIdx + 1) % stopCount;\n } else {\n tabActionFocus = 0;\n }\n } else {\n tabActionFocus = (tabActionFocus + 1) % stopCount;\n }\n // Auto-switch active tab when a tab is focused\n if (tabActionFocus < tabs.length) {\n const tab = tabs[tabActionFocus];\n if (tab && tab.id !== activeTabId) {\n activeTabId = tab.id;\n fieldSelected = 0;\n scroll = 0;\n updateVisibleIndices();\n }\n }\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"shift+tab\")) {\n const stopCount = tabs.length + actionRows.length;\n if (stopCount === 0) {\n args.tui.requestRender();\n return;\n }\n if (tabActionFocus === -1) {\n // Start from the previous stop before the current active tab.\n const currentTabIdx = tabs.findIndex((t) => t.id === activeTabId);\n if (currentTabIdx >= 0) {\n tabActionFocus = (currentTabIdx - 1 + stopCount) % stopCount;\n } else {\n tabActionFocus = stopCount - 1;\n }\n } else {\n tabActionFocus = (tabActionFocus - 1 + stopCount) % stopCount;\n }\n if (tabActionFocus < tabs.length) {\n const tab = tabs[tabActionFocus];\n if (tab && tab.id !== activeTabId) {\n activeTabId = tab.id;\n fieldSelected = 0;\n scroll = 0;\n updateVisibleIndices();\n }\n }\n args.tui.requestRender();\n return;\n }\n // Alt+↑ / Alt+↓ reorders the focused row among its `reorderable`\n // peers. Has to run before the bare up/down handlers so the\n // modifier prefix is what dispatches — otherwise `matchesKey(data,\n // \"up\")` could match the alt-modified variant first depending on\n // the terminal's escape sequence.\n if (matchesKey(data, \"alt+up\")) {\n if (handleReorder(-1)) return;\n }\n if (matchesKey(data, \"alt+down\")) {\n if (handleReorder(1)) return;\n }\n if (matchesKey(data, \"alt+r\")) {\n const row = focusedRow();\n if (row && !row.field.disabled && !row.isEditing) {\n const def = row.field.default;\n if (def !== undefined) {\n const clonedDef =\n typeof def === \"object\" && def !== null\n ? JSON.parse(JSON.stringify(def))\n : def;\n commitValue(row, clonedDef);\n args.tui.requestRender();\n return;\n }\n }\n }\n // Arrow keys navigate fields only (field zone). They also switch\n // Tab focus back to the field zone.\n const totalCount = totalVisibleItems();\n const lastIndex = Math.max(0, totalCount - 1);\n if (\n matchesKey(data, \"up\") ||\n matchesKey(data, \"down\") ||\n matchesKey(data, \"pageUp\") ||\n matchesKey(data, \"pageDown\")\n ) {\n tabActionFocus = -1;\n }\n if (matchesKey(data, \"up\")) {\n fieldSelected = Math.max(0, fieldSelected - 1);\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"down\")) {\n fieldSelected = Math.min(lastIndex, fieldSelected + 1);\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"pageUp\")) {\n fieldSelected = Math.max(0, fieldSelected - 5);\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"pageDown\")) {\n fieldSelected = Math.min(lastIndex, fieldSelected + 5);\n args.tui.requestRender();\n return;\n }\n // Enter on a tab switches focus to field zone (tab already auto-switched).\n // Then lets Enter fall through to dispatchKey for field toggling/editing.\n // Enter on action row activates the focused action with confirmation.\n if (\n (matchesKey(data, \"enter\") || matchesKey(data, \"return\")) &&\n tabActionFocus >= 0\n ) {\n if (tabActionFocus < tabs.length) {\n // Tab focused — return to field zone, then let Enter fall through\n // to dispatchKey for field toggling/editing.\n tabActionFocus = -1;\n // Do NOT return — fall through to dispatchKey below\n } else if (actionRows.length > 0) {\n // Action row focused — determine which action by index\n const actionIdx = tabActionFocus - tabs.length;\n const action = actionRows[actionIdx];\n if (action) {\n const act = action.id === \"reset\" ? \"reset\" : \"delete\";\n const cb =\n act === \"reset\" ? options.onResetScope : options.onDeleteScope;\n if (cb) {\n mountScopeActionConfirm(act);\n }\n }\n args.tui.requestRender();\n return;\n }\n }\n\n if (options.enableSearch) {\n if (matchesKey(data, \"backspace\") || matchesKey(data, \"ctrl+h\")) {\n search = search.slice(0, -1);\n fieldSelected = 0;\n updateVisibleIndices();\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"ctrl+u\")) {\n search = \"\";\n fieldSelected = 0;\n updateVisibleIndices();\n args.tui.requestRender();\n return;\n }\n if (matchesKey(data, \"ctrl+w\")) {\n search = deleteWordBackward(search);\n fieldSelected = 0;\n updateVisibleIndices();\n args.tui.requestRender();\n return;\n }\n }\n\n // Enter / value-key falls through to the renderer.\n dispatchKey(data);\n if (\n options.enableSearch &&\n data.length === 1 &&\n data >= \" \" &&\n data !== \"\\x7f\" &&\n !row?.isEditing\n ) {\n // Plain printable input that the renderer didn't claim joins the\n // search query. Booleans / enums never claim it (their\n // handleKey returns `consumed:false` for non-Enter), so users\n // can still type to filter.\n // We detect \"renderer didn't claim it\" by checking the row state\n // didn't change to editing — a heuristic that works for every\n // built-in. Custom renderers that want to swallow letters should\n // mark the row as editing first.\n if (!row || !row.isEditing) {\n search += data;\n fieldSelected = 0;\n updateVisibleIndices();\n }\n }\n args.tui.requestRender();\n }\n\n function renderTabBar(width: number): string {\n if (tabs.length === 0) return \"\";\n const cells: string[] = [];\n for (const tab of tabs) {\n let label = tab.label;\n if (isBuffered) {\n const isTabDirty = useScopeTabs\n ? tab.id === \"project\"\n ? dirtyProjectKeys.size > 0\n : dirtyGlobalKeys.size > 0\n : Array.from(getDirtyKeys()).some((key) => {\n const row = rows.find((r) => r.field.key === key);\n const fallbackTab = tabs[0]?.id;\n const rowTab = row?.field.tab ?? fallbackTab;\n return rowTab === tab.id;\n });\n if (isTabDirty) {\n label += \" ● Unsaved\";\n }\n }\n if (tab.id === activeTabId) {\n const padded = ` ▸ ${label} `;\n cells.push(\n args.theme.fg(\"accent\", args.theme.inverse(args.theme.bold(padded))),\n );\n } else {\n const padded = ` ${label} `;\n cells.push(\n args.theme.bg(\"selectedBg\", args.theme.fg(\"accent\", padded)),\n );\n }\n }\n return pad(cells.join(\" \"), width);\n }\n\n function renderSearchBar(width: number, hasMatches = true): string {\n const cursor = args.theme.inverse(\" \");\n let text: string;\n if (search === \"\") {\n const placeholder = args.theme.fg(\"muted\", \"Search settings...\");\n text = ` > ${cursor}${placeholder}`;\n } else {\n if (!hasMatches) {\n text = ` > ${args.theme.fg(\"warning\", search)}${cursor}`;\n } else {\n text = ` > ${search}${cursor}`;\n }\n }\n return args.theme.bg(\"toolPendingBg\", pad(text, width));\n }\n\n function renderFooter(_width: number): string[] {\n const row = focusedRow();\n let rowHints: FieldKeyHint[] = [];\n if (row) {\n const renderer = rendererFor(row.field);\n rowHints = renderer.hints(\n { field: row.field as never, value: row.value as never },\n { isEditing: row.isEditing },\n );\n }\n\n // Always-present hints: nav, field-reset, save, search\n const line1: FieldKeyHint[] = [];\n if (tabs.length > 0 || actionRows.length > 0) {\n line1.push({ key: \"tab/shift+tab\", label: \"cycle\" });\n }\n line1.push({ key: \"↑↓\", label: \"move\" });\n if (!row?.isEditing && row?.field.reorderable) {\n line1.push({ key: \"alt+↑↓\", label: \"reorder\" });\n }\n const anyFieldHasDefault = fields.some(\n (f) => (f as { default?: unknown }).default !== undefined,\n );\n if (anyFieldHasDefault && !row?.isEditing) {\n line1.push({ key: \"ctrl+r\", label: \"reset field\" });\n line1.push({ key: \"ctrl+d\", label: \"reset field\" });\n }\n if (isBuffered) {\n line1.push({ key: \"ctrl+s\", label: \"save\" });\n }\n if (options.enableSearch && !row?.isEditing) {\n if (search === \"\") {\n line1.push({ key: \"type\", label: \"to search\" });\n } else {\n line1.push({ key: \"ctrl+u\", label: \"clear\" });\n }\n }\n\n // Line 2: field-specific hints + dismiss\n const line2: FieldKeyHint[] = [];\n line2.push(...rowHints);\n if (confirmState) {\n line2.push({ key: \"↑↓\", label: \"select\" });\n line2.push({ key: \"enter\", label: \"confirm\" });\n line2.push({ key: \"esc\", label: \"cancel\" });\n } else if (options.enableSearch && search !== \"\" && !row?.isEditing) {\n line2.push({ key: \"esc\", label: \"clear search\" });\n } else if (isBuffered && isDirty()) {\n line2.push({ key: \"esc\", label: \"confirm →\" });\n } else {\n line2.push({ key: \"esc\", label: \"close\" });\n }\n\n const lines: string[] = [formatHintLine(line1, args.theme)];\n if (line2.length > 1 || (line2.length === 1 && line2[0]!.key !== \"esc\")) {\n lines.push(formatHintLine(line2, args.theme));\n }\n return lines;\n }\n\n function renderRow(\n row: InternalRow,\n width: number,\n isSelected: boolean,\n ): string {\n const labelText = row.labelText;\n // Per-field `dim` overrides the default focus-based coloring. The\n // override is binary — fields that opt in are saying \"this row is\n // semantically active / inactive, color me regardless of focus\".\n // Selection background still applies on top either way, so a\n // focused dimmed row stays visibly highlighted via the prefix\n // chip + selectedBg, just with a muted label.\n const dimRaw = row.field.disabled ? true : row.field.dim;\n const dimFlag = typeof dimRaw === \"function\" ? dimRaw() : dimRaw;\n const labelColor =\n dimFlag === true\n ? \"muted\"\n : dimFlag === false\n ? \"text\"\n : isSelected\n ? \"text\"\n : \"muted\";\n const label = args.theme.fg(labelColor, labelText);\n const renderer = rendererFor(row.field);\n const valueText = renderer.renderValue(\n { field: row.field as never, value: row.value as never },\n {\n width: Math.max(1, width - LABEL_PAD_TARGET - 4),\n selected: isSelected,\n isEditing: row.isEditing,\n ctx: fieldRenderContext,\n },\n );\n const padding = row.labelPadding;\n const depthIndent = \" \".repeat(row.field.depth ?? 0);\n const prefix = isSelected\n ? args.theme.fg(\"accent\", `${depthIndent}▌ `)\n : `${depthIndent} `;\n\n // Scope note: when in a scope tab, show where the value originates\n // from (other scope or default). E.g. \"(Global: on)\" or \"(default: 10)\".\n let note = \"\";\n if (useScopeTabs && activeTabId) {\n const sn = scopeNoteFor(row, activeTabId);\n if (sn) note = ` ${args.theme.fg(\"dim\", sn)}`;\n }\n\n const composed = `${prefix}${label}${padding}${valueText}${note}`;\n if (isSelected) return args.theme.bg(\"selectedBg\", pad(composed, width));\n return truncateToWidth(composed, width, \"…\");\n }\n\n function scopeNoteFor(row: InternalRow, scope: string): string | undefined {\n if (!useScopeTabs || !options.defaults) return undefined;\n const defaultValue = (options.defaults as Record<string, unknown>)[\n row.field.key\n ];\n const gv = row.globalValue;\n const pv = row.projectValue;\n const format = (v: unknown): string => {\n if (v === undefined || v === null) return \"unset\";\n if (row.field.type === \"boolean\") return v ? \"on\" : \"off\";\n if (row.field.type === \"number\") return String(v);\n if (row.field.type === \"string\" || row.field.type === \"text\")\n return JSON.stringify(String(v));\n if (row.field.type === \"enum\") return String(v);\n return String(v);\n };\n if (scope === \"project\") {\n if (pv !== undefined) return undefined; // project has explicit value — no note needed\n if (gv !== undefined) return `(Global: ${format(gv)})`;\n return `(default: ${format(defaultValue)})`;\n }\n // Global tab\n if (gv !== undefined) return undefined; // global has explicit value\n return `(default: ${format(defaultValue)})`;\n }\n\n function renderBody(width: number, innerRows: number): string[] {\n const lines: string[] = [];\n if (tabs.length > 0) {\n lines.push(renderTabBar(width));\n }\n const indices = visibleRowIndices();\n if (options.enableSearch) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(renderSearchBar(width, indices.length > 0));\n }\n if (lines.length > 0) {\n lines.push(\"\");\n lines.push(divider(width, args.theme));\n }\n const visibleListRows = Math.max(\n 3,\n innerRows - lines.length - 2 - estimateDescriptionRows(),\n );\n clampSelection(visibleListRows);\n\n const fieldCount = indices.length;\n const slice = indices.slice(scroll, scroll + visibleListRows);\n if (slice.length === 0) {\n lines.push(\n args.theme.fg(\"muted\", \" No matching settings. (press esc to clear)\"),\n );\n } else {\n if (scroll > 0) lines.push(args.theme.fg(\"dim\", ` ↑ ${scroll} earlier`));\n for (const [visIdx, idx] of slice.entries()) {\n const realIdx = scroll + visIdx;\n const row = rows[idx]!;\n lines.push(renderRow(row, width, realIdx === fieldSelected));\n }\n const hidden = Math.max(0, fieldCount - (scroll + visibleListRows));\n if (hidden > 0) lines.push(args.theme.fg(\"dim\", ` ↓ ${hidden} more`));\n }\n\n // Description for the focused field\n const focused = focusedRow();\n if (focused) {\n renderFieldDesc(lines, width, focused);\n }\n\n // Pad to fill remaining space (footer and actions are added at frame level)\n while (lines.length < innerRows) lines.push(\"\");\n return lines;\n }\n\n function renderFieldDesc(\n lines: string[],\n width: number,\n focused: InternalRow,\n ): void {\n let desc = focused.field.description ?? \"\";\n const field = focused.field;\n if (field.type === \"number\") {\n const parts: string[] = [];\n if (field.values) {\n parts.push(`values: ${field.values.join(\", \")}`);\n } else {\n if (typeof field.min === \"number\" && typeof field.max === \"number\") {\n parts.push(`range: ${field.min} to ${field.max}`);\n } else if (typeof field.min === \"number\") {\n parts.push(`min: ${field.min}`);\n } else if (typeof field.max === \"number\") {\n parts.push(`max: ${field.max}`);\n }\n if (field.integer) parts.push(\"integer only\");\n }\n if (parts.length > 0) {\n const suffix = `(${parts.join(\", \")})`;\n desc = desc ? `${desc} ${suffix}` : suffix;\n }\n }\n\n if (desc) {\n lines.push(\"\");\n for (const line of wrapLine(desc, Math.max(1, width - 4))) {\n lines.push(args.theme.fg(\"muted\", ` ${line}`));\n }\n }\n\n // valueDescriptions: per-value help text for boolean/enum/number\n let vdText: string | undefined;\n if (field.type === \"boolean\") {\n const vd = field.valueDescriptions;\n if (vd) {\n const key = field.value ? \"on\" : \"off\";\n vdText = vd[key as \"on\" | \"off\"];\n }\n } else if (field.type === \"enum\") {\n const vd = field.valueDescriptions;\n if (vd) {\n vdText = vd[field.value];\n }\n } else if (field.type === \"number\") {\n const vd = field.valueDescriptions;\n if (vd) {\n vdText = vd[String(field.value)];\n }\n }\n if (vdText) {\n lines.push(\"\");\n for (const line of wrapLine(\n args.theme.fg(\"accent\", vdText),\n Math.max(1, width - 4),\n )) {\n lines.push(` ${line}`);\n }\n }\n\n // Validation warning: show when the focused row's current value\n // violates its type constraints (enum membership, number range, etc.).\n const warning = validateFieldValue(focused.field, focused.value);\n if (warning) {\n lines.push(\"\");\n for (const line of wrapLine(warning, Math.max(1, width - 4))) {\n lines.push(args.theme.fg(\"warning\", ` ${line}`));\n }\n }\n }\n\n /** Tiny heuristic so renderBody knows roughly how much room the\n * description block will eat. Real content is recomputed per render\n * but we want the list to start scrolling before that math kicks in. */\n function estimateDescriptionRows(): number {\n const focused = focusedRow();\n if (!focused) return 0;\n let estimate = 0;\n if (focused.field.description) estimate = 2;\n const field = focused.field;\n if (field.type === \"number\") {\n if (\n typeof field.min === \"number\" ||\n typeof field.max === \"number\" ||\n field.integer\n ) {\n estimate = Math.max(estimate, 2);\n }\n }\n // Validation warning\n const warning = validateFieldValue(focused.field, focused.value);\n if (warning) estimate = Math.max(estimate, 1);\n return estimate;\n }\n\n /** Handle reset/delete scope actions: call the callback and reload configs. */\n async function handleScopeAction(\n action: \"reset\" | \"delete\",\n scope: \"global\" | \"project\",\n ): Promise<void> {\n const cb =\n action === \"reset\" ? options.onResetScope : options.onDeleteScope;\n if (!cb) return;\n try {\n await cb(scope);\n } catch (err) {\n notifyError(args.ctx, err);\n return;\n }\n // Reload configs and update rows with fresh values\n if (useScopeTabs && options.configFilename) {\n const fn = options.configFilename;\n const defs = options.defaults ?? {};\n const freshGlobal = loadConfig<Record<string, unknown>>(fn, defs, {\n configDir: options.globalConfigDir ?? getExtensionsDir(),\n });\n const freshProject = loadConfig<Record<string, unknown>>(fn, defs, {\n cwd: args.ctx.cwd,\n configDir: options.globalConfigDir ?? getExtensionsDir(),\n });\n for (const rr of rows) {\n const gv = getNestedValue(freshGlobal, rr.field.key);\n rr.globalValue =\n gv !== undefined\n ? gv\n : (extractInitialValue(rr.field) ??\n (options.defaults as Record<string, unknown>)?.[rr.field.key]);\n const pv = getNestedValue(freshProject, rr.field.key);\n rr.projectValue = pv !== undefined ? pv : rr.globalValue;\n }\n }\n // Clear dirty state for the affected scope\n if (isBuffered) {\n const dk = scope === \"project\" ? dirtyProjectKeys : dirtyGlobalKeys;\n dk.clear();\n const iv =\n scope === \"project\" ? initialProjectValues : initialGlobalValues;\n for (const rr of rows) {\n const initVal = scope === \"project\" ? rr.projectValue : rr.globalValue;\n iv.set(\n rr.field.key,\n typeof initVal === \"object\" && initVal !== null\n ? JSON.parse(JSON.stringify(initVal))\n : initVal,\n );\n }\n }\n args.tui.requestRender();\n }\n\n return {\n render(width: number): string[] {\n const inner = responsiveInnerRows(\n args.tui.terminal.rows ?? 24,\n PREFERRED_INNER_ROWS,\n 14,\n );\n if (submenu) {\n // Render the submenu inside the same frame so the popup chrome\n // doesn't change shape mid-flow.\n const lines = submenu.render(frameContentWidth(width));\n const opts: FrameOptions = {\n title: submenuTitle(submenuKey),\n fixedInnerRows: inner,\n };\n return frame(lines, width, args.theme, opts);\n }\n if (confirmState) {\n const lines = renderConfirmSubmenu(frameContentWidth(width));\n const title = options.title\n ? `${options.title}${isBuffered && isDirty() ? \" \" + args.theme.fg(\"accent\", \"● Unsaved\") : \"\"} — Save changes?`\n : \"Save changes?\";\n const opts: FrameOptions = {\n title,\n fixedInnerRows: inner,\n };\n return frame(lines, width, args.theme, opts);\n }\n if (scopeActionConfirm) {\n const lines = renderScopeActionConfirm(frameContentWidth(width));\n const dialogTitle =\n scopeActionConfirm.action === \"reset\"\n ? \"Reset scope?\"\n : \"Delete config?\";\n const opts: FrameOptions = {\n title: options.title\n ? `${options.title} — ${dialogTitle}`\n : dialogTitle,\n fixedInnerRows: inner,\n };\n return frame(lines, width, args.theme, opts);\n }\n\n // Footer hints + action buttons are rendered OUTSIDE the frame\n // body truncation so they are ALWAYS visible at the bottom.\n const contentWidth = frameContentWidth(width);\n const footerRows = renderFooter(contentWidth);\n const footerSectionHeight = 1 + footerRows.length; // divider + hints\n const actionSectionHeight = actionRows.length > 0 ? 2 : 0;\n const bottomSectionHeight = footerSectionHeight + actionSectionHeight;\n const bodyInnerRows = inner - bottomSectionHeight;\n const bodyLines = renderBody(contentWidth, bodyInnerRows);\n\n const dirtyDot =\n isBuffered && isDirty()\n ? ` ${args.theme.fg(\"accent\", \"● Unsaved\")}`\n : \"\";\n const title = options.title\n ? `${options.title}${dirtyDot}`\n : options.title;\n\n const frameLines = frame(bodyLines, width, args.theme, {\n title,\n fixedInnerRows: bodyInnerRows,\n });\n\n // Replace the bottom padding + border with the fixed sections\n const bottomBorder = frameLines.pop()!;\n const bottomPadding = frameLines.pop()!;\n const borderAccent = (s: string) => args.theme.fg(\"borderAccent\", s);\n\n // Footer hint line\n const footDiv = `${borderAccent(\"│\")} ${args.theme.fg(\"dim\", \"─\".repeat(Math.max(1, contentWidth)))} ${borderAccent(\"│\")}`;\n frameLines.push(footDiv);\n for (const line of footerRows) {\n const paddedLine = ` ${line}`;\n frameLines.push(\n `${borderAccent(\"│\")}${pad(paddedLine, contentWidth + 4)}${borderAccent(\"│\")}`,\n );\n }\n\n // Action buttons — side by side on one line, styled like tabs.\n // Tab/Shift+Tab cycles through them as individual stops.\n if (actionRows.length > 0) {\n const actDiv = `${borderAccent(\"│\")} ${args.theme.fg(\"dim\", \"─\".repeat(Math.max(1, contentWidth)))} ${borderAccent(\"│\")}`;\n frameLines.push(actDiv);\n\n const cells: string[] = [];\n for (let ai = 0; ai < actionRows.length; ai++) {\n const isFocused =\n tabActionFocus >= tabs.length &&\n tabActionFocus - tabs.length === ai;\n const keyHint = ai === 0 ? \" [ctrl+shift+r]\" : \" [ctrl+shift+d]\";\n const padded = ` ${actionRows[ai]!.label}${keyHint} `;\n if (isFocused) {\n cells.push(\n args.theme.fg(\n \"accent\",\n args.theme.inverse(args.theme.bold(padded)),\n ),\n );\n } else {\n cells.push(\n args.theme.bg(\"selectedBg\", args.theme.fg(\"accent\", padded)),\n );\n }\n }\n const line = pad(cells.join(\" \"), contentWidth);\n frameLines.push(`${borderAccent(\"│\")} ${line} ${borderAccent(\"│\")}`);\n }\n\n // Restore bottom padding and border\n frameLines.push(bottomPadding);\n frameLines.push(bottomBorder);\n\n return frameLines;\n },\n invalidate(): void {\n submenu?.invalidate();\n },\n handleInput,\n };\n}\n\nfunction submenuTitle(key: string | undefined): string | undefined {\n return key ? `${key} →` : undefined;\n}\n\nfunction notifyError(ctx: ExtensionContext, err: unknown): void {\n const message = err instanceof Error ? err.message : String(err);\n try {\n ctx.ui.notify(message, \"error\");\n } catch {\n // Defensive: never let a bad notify call break the modal loop.\n }\n}\n\nfunction extractInitialValue(field: Field): unknown {\n if (field.type === \"action\") return undefined;\n return (field as { value: unknown }).value;\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n const parts = path.split(\".\");\n let current = obj;\n for (const part of parts) {\n if (\n current === null ||\n current === undefined ||\n typeof current !== \"object\"\n ) {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n","/**\n * `createSettingsModal` and `openSettingsModal` — the public modal\n * entry points. Both wrap `createSettingsModalBody` and shape it for\n * `ctx.ui.custom`.\n */\n\nimport { join } from \"node:path\";\nimport type { ExtensionContext, Theme } from \"@earendil-works/pi-coding-agent\";\nimport type {\n Component,\n KeybindingsManager,\n OverlayOptions,\n TUI,\n} from \"@earendil-works/pi-tui\";\nimport { createSettingsModalBody } from \"./body\";\nimport {\n getExtensionsDir,\n readConfig,\n writeConfig,\n deleteConfig,\n} from \"../config.ts\";\nimport type {\n Field,\n SettingsModalFactory,\n SettingsModalOptions,\n} from \"./types\";\n\nconst DEFAULT_OVERLAY: OverlayOptions = {\n anchor: \"center\",\n width: \"92%\",\n maxHeight: \"85%\",\n};\n\n// Singleton guard: track one open modal per ExtensionContext.\n// WeakMap so entries are GC'd when the context is no longer referenced.\nconst openModals = new WeakMap<ExtensionContext, (result: void) => void>();\n\n/**\n * Build a `ctx.ui.custom`-compatible factory for the settings modal.\n * Useful for callers that already manage their own overlay lifecycle.\n *\n * The returned factory captures `ctx` from `openSettingsModal`'s call\n * site — when used standalone, the caller is expected to invoke it via\n * `ctx.ui.custom(createSettingsModal(opts), …)`, and pi will pass the\n * tui/theme/keybindings/done arguments at mount time.\n */\nexport function createSettingsModal<F extends Field>(\n ctx: ExtensionContext,\n options: SettingsModalOptions<F>,\n): SettingsModalFactory<void> {\n return (\n tui: TUI,\n theme: Theme,\n _keybindings: KeybindingsManager,\n done: (result: void) => void,\n ): Component => {\n const close = (): void => {\n try {\n options.onClose?.();\n } catch {\n // Caller-supplied onClose must not break the modal teardown.\n }\n openModals.delete(ctx);\n done();\n };\n\n // Singleton guard: if a modal is already open on this ctx, close\n // it before opening the new one. This prevents two in-memory\n // buffers racing to write.\n const existing = openModals.get(ctx);\n if (existing) {\n try {\n existing(void 0);\n } catch {\n // Defensive: existing modal's close must not break the new one.\n }\n }\n openModals.set(ctx, close);\n\n // Auto-inject default scope action handlers when configFilename is\n // set but the callbacks are absent. This ensures that any modal using\n // scope tabs always has reset/delete actions without requiring every\n // caller to supply them explicitly.\n if (options.configFilename) {\n if (!options.onResetScope) {\n options.onResetScope = async (scope: \"global\" | \"project\") => {\n const dir =\n scope === \"project\"\n ? join(ctx.cwd, \".pi\")\n : (options.globalConfigDir ?? getExtensionsDir());\n const knownKeys = new Set(Object.keys(options.defaults ?? {}));\n const existing = readConfig<Record<string, unknown>>(\n options.configFilename!,\n dir,\n );\n const unknownKeys: Record<string, unknown> = {};\n if (existing && typeof existing === \"object\") {\n for (const [key, val] of Object.entries(existing)) {\n if (!knownKeys.has(key)) unknownKeys[key] = val;\n }\n }\n if (Object.keys(unknownKeys).length > 0) {\n writeConfig(options.configFilename!, unknownKeys, dir);\n } else {\n deleteConfig(options.configFilename!, dir);\n }\n };\n }\n if (!options.onDeleteScope) {\n options.onDeleteScope = async (scope: \"global\" | \"project\") => {\n const dir =\n scope === \"project\"\n ? join(ctx.cwd, \".pi\")\n : (options.globalConfigDir ?? getExtensionsDir());\n deleteConfig(options.configFilename!, dir);\n };\n }\n }\n\n return createSettingsModalBody<F>(options, { tui, theme, ctx, close });\n };\n}\n\n/**\n * Convenience: open a settings modal as a centered overlay and resolve\n * when the user closes it. This is the **happy-path** entry point most\n * callers want.\n *\n * Defaults: anchor center, width 92%, maxHeight 85%. Override via\n * `options.overlayOptions`.\n *\n * @example\n * ```ts\n * await openSettingsModal(ctx, {\n * title: \"@k0valik/pi-voice\",\n * fields: [\n * { key: \"muted\", type: \"boolean\", label: \"Muted\", value: cfg.muted },\n * ],\n * onChange: (key, value) => { cfg[key] = value; saveConfig(cfg); },\n * });\n * ```\n */\nexport async function openSettingsModal<F extends Field>(\n ctx: ExtensionContext,\n options: SettingsModalOptions<F>,\n): Promise<void> {\n const overlayOptions = options.overlayOptions ?? DEFAULT_OVERLAY;\n await ctx.ui.custom<void>(createSettingsModal(ctx, options), {\n overlay: true,\n overlayOptions,\n });\n}\n","/**\n * ConfigManager — declarative config management for pi extensions.\n *\n * Packages configure a single `ConfigManager<T>` with their config shape,\n * defaults, field definitions, optional validation, and optional env-var\n * overrides. The manager handles loading, saving, and modal wiring.\n */\n\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport {\n applyEnvOverrides as applyEnvOverridesGeneric,\n type EnvParser,\n} from \"../core/config-env.js\";\nexport type { EnvParser } from \"../core/config-env.js\";\nimport {\n loadConfig,\n writeConfig,\n readConfig,\n deleteConfig,\n getExtensionsDir,\n deepEqual,\n checkConfigFile,\n} from \"./config.ts\";\nimport { openSettingsModal } from \"./settings/index.ts\";\nimport { validateFieldValue } from \"./settings/validate-field.ts\";\nimport type { Field } from \"./settings/types.ts\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\nexport interface ConfigManagerOptions<T extends object = object> {\n /** Extension identifier — e.g. \"bash-timeout\" */\n id: string;\n /** Human-readable label shown in the UI */\n label: string;\n /** Config file name — e.g. \"bash-timeout-config.json\" */\n filename: string;\n /** Default config values (the complete object) */\n defaults: T;\n /** Build Field[] from current config values */\n fields: (config: T) => Field[];\n /**\n * Optional validator. Receives raw merged data and returns a fully\n * coerced config. If omitted, the manager does a simple spread merge.\n */\n validate?: (raw: Record<string, unknown>) => T;\n /**\n * Optional env-var overrides. Maps config keys to env var names.\n * Boolean types use `readBooleanEnv`, numeric types use `readPositiveIntEnv`.\n * For custom parsing, use a parser object with a `parse` function.\n */\n env?: Partial<Record<keyof T, string | EnvParser>>;\n}\n\nexport interface ConfigLoadWarning {\n /** Scope where the warning originated */\n scope: \"global\" | \"project\";\n /** Human-readable warning message */\n message: string;\n /** Config key involved (if applicable) */\n key?: string;\n}\n\nexport interface ConfigLoadResult<T> {\n /** Fully resolved config value */\n config: T;\n /** Non-fatal warnings discovered during loading (bad values, unknown keys, etc.) */\n warnings: ConfigLoadWarning[];\n}\n\n// ── ConfigManager ───────────────────────────────────────────────────────\n\nexport class ConfigManager<T extends object> {\n private opts: ConfigManagerOptions<T>;\n\n constructor(opts: ConfigManagerOptions<T>) {\n this.opts = opts;\n }\n\n /**\n * Load config with layered resolution:\n * defaults ← global file ← project file ← env overrides\n *\n * @param cwd Working directory for project-local override\n * @param configDir Global config directory (defaults to getExtensionsDir())\n */\n load(cwd?: string, configDir?: string): T {\n return this.loadWithWarnings(cwd, configDir).config;\n }\n\n /**\n * Load config with warnings. Same as `load()` but also returns per-field\n * validation warnings and unknown-key warnings discovered during loading.\n *\n * Extensions that open a modal can surface these warnings in the UI;\n * extensions that load config programmatically can log or inspect them.\n */\n loadWithWarnings(cwd?: string, configDir?: string): ConfigLoadResult<T> {\n const warnings: ConfigLoadWarning[] = [];\n\n const loaded = loadConfig(this.opts.filename, this.opts.defaults, {\n cwd,\n configDir,\n merge: \"deep\",\n });\n\n // Run validate if provided\n const config = this.opts.validate\n ? this.opts.validate(loaded as Record<string, unknown>)\n : (loaded as T);\n\n // Validate each field value and collect warnings\n try {\n const fields = this.opts.fields(config);\n const scope = \"global\";\n for (const field of fields) {\n if (field.type === \"action\" || field.type === \"custom\") continue;\n const warning = validateFieldValue(field, field.value);\n if (warning) {\n warnings.push({\n scope: scope as \"global\" | \"project\",\n key: String(field.key),\n message: `\"${field.label}\": ${warning}`,\n });\n }\n }\n } catch {\n // Fields function may fail for partial configs; skip validation\n }\n\n // Apply env overrides\n const final = this.applyEnvOverrides(config);\n\n return { config: final, warnings };\n }\n\n private applyEnvOverrides(config: T): T {\n const env = this.opts.env;\n if (!env) return config;\n return applyEnvOverridesGeneric(\n config,\n env as Record<string, EnvParser | string>,\n this.opts.defaults as Record<string, unknown>,\n );\n }\n\n /**\n * Save config scoped to global or project directory.\n *\n * Writes only the fields that differ from the existing file content\n * (diff-based save against the file). This means:\n *\n * - **First save** (no file exists): writes ALL fields — the file is\n * fully populated with every value the user confirmed.\n * - **Subsequent saves**: only the fields that actually changed in the\n * current session are written. Everything else stays untouched.\n * - **Unknown keys** (hand-edited extras outside the schema) are\n * automatically preserved by the read-patch-write cycle.\n * - **No automatic removal**: only explicit reset/delete removes keys\n * from the file.\n *\n * Reads the existing file, patches it with the deltas, and writes the\n * merged result. This prevents accidental overwrites of fields the user\n * never touched while keeping the file consistent with the UI.\n *\n * @param config Config to persist\n * @param scope Target scope\n * @param cwd Working directory (required for \"project\" scope)\n * @param configDir Override the global config dir (for tests)\n */\n save(\n config: T,\n scope: \"global\" | \"project\",\n cwd?: string,\n configDir?: string,\n ): void {\n if (scope === \"project\" && !cwd) {\n throw new Error(\"cwd is required for project-scoped config save\");\n }\n\n const dir =\n scope === \"project\" && cwd\n ? join(cwd, \".pi\")\n : (configDir ?? getExtensionsDir());\n const knownKeys = new Set(Object.keys(this.opts.defaults));\n\n // Read the existing file. If none exists, start from an empty object.\n const existing =\n readConfig<Record<string, unknown>>(this.opts.filename, dir) ?? {};\n\n // Build field map for validation\n const fieldMap = new Map<string, Field>();\n try {\n const fields = this.opts.fields(config);\n for (const f of fields) fieldMap.set(String(f.key), f);\n } catch {\n // Fields function may fail for partial configs; skip validation\n }\n\n // Compute diff: compare each known key's modal value against the\n // existing file value. Only fields that actually changed are written.\n const diff: Record<string, unknown> = {};\n let hasDiff = false;\n\n for (const key of Object.keys(this.opts.defaults) as (keyof T)[]) {\n const modalVal = config[key];\n const fileVal = existing[String(key)];\n\n if (deepEqual(modalVal, fileVal)) continue;\n\n // Validate before persisting — skip invalid values to repair\n // config files (invalid values fall back to defaults next load).\n const field = fieldMap.get(String(key));\n if (field && !(field.type === \"action\" || field.type === \"custom\")) {\n const warning = validateFieldValue(field, modalVal);\n if (warning) continue;\n }\n\n diff[String(key)] = modalVal;\n hasDiff = true;\n }\n\n // Preserve unknown keys from the existing file.\n for (const [key, val] of Object.entries(existing)) {\n if (!knownKeys.has(key)) {\n diff[key] = val;\n hasDiff = true;\n }\n }\n\n if (!hasDiff) return;\n\n // Merge: start from the existing file, overlay the diff. This keeps\n // every untouched key exactly where it was while updating only the\n // fields the user actually changed in this session.\n const merged = { ...existing, ...diff };\n const wrote = writeConfig(this.opts.filename, merged as Partial<T>, dir);\n if (!wrote) {\n throw new Error(\n `Failed to save ${this.opts.filename} — the config file may be read-only (e.g., managed by Nix). ` +\n `Runtime state was updated for this session only.`,\n );\n }\n }\n\n /**\n * Open the settings modal with scope tabs, auto-generated onSave, etc.\n *\n * Before opening the modal, checks global and project-local config files\n * for malformed JSON. If either is invalid, a warning notification is\n * shown so the user knows their config couldn't be fully loaded.\n *\n * @param ctx Extension context\n * @param cwd Working directory for project-local override\n * @param onSave Called with the validated config after the user saves\n * @param configDir Override the global config dir (for tests)\n */\n /**\n * Open the settings modal with scope tabs, auto-generated onSave, scope\n * actions (reset/delete), etc.\n *\n * Before opening the modal, checks global and project-local config files\n * for malformed JSON. If either is invalid, a warning notification is\n * shown so the user knows their config couldn't be fully loaded.\n *\n * @param ctx Extension context\n * @param cwd Working directory for project-local override\n * @param onSave Called with the validated config after the user saves\n * @param configDir Override the global config dir (for tests)\n * @param onChange Optional per-field change handler passed through to\n * the settings modal. Called synchronously when any\n * field value changes (including in buffered mode).\n */\n async openSettings(\n ctx: ExtensionContext,\n cwd: string,\n onSave: (updated: T) => void,\n configDir?: string,\n onChange?: (key: string, value: unknown) => void,\n ): Promise<void> {\n // Check for malformed config files before opening the modal\n this.warnOnMalformedConfig(ctx, cwd, configDir);\n\n const config = this.load(cwd, configDir);\n const fields = this.opts.fields(config);\n\n // Auto-populate field-level defaults from the config defaults so\n // field-level reset (ctrl+r/ctrl+d) works without every extension\n // manually setting `default` on each field definition.\n const configDefaults = this.opts.defaults as Record<string, unknown>;\n for (const field of fields) {\n if (field.type === \"action\" || field.type === \"custom\") continue;\n if (field.default === undefined) {\n const key = String(field.key);\n if (key in configDefaults) {\n (field as any).default = configDefaults[key];\n }\n }\n }\n\n // Validate loaded field values and warn about inconsistencies.\n // Per-field warnings are also shown inline in the modal UI.\n const loadWarnings: string[] = [];\n for (const field of fields) {\n if (field.type === \"action\" || field.type === \"custom\") continue;\n const warning = validateFieldValue(field, field.value);\n if (warning) loadWarnings.push(`\"${field.label}\": ${warning}`);\n }\n if (loadWarnings.length > 0) {\n const msg =\n loadWarnings.length === 1\n ? `Config warning: ${loadWarnings[0]}`\n : `Config has ${loadWarnings.length} warnings. First: ${loadWarnings[0]}`;\n ctx.ui.notify(msg, \"warning\");\n }\n\n await openSettingsModal(ctx, {\n title: this.opts.label,\n configFilename: this.opts.filename,\n mode: \"buffered\",\n // MUST match the dir used by load()/save() — without this the modal\n // initializes its rows from the wrong file (extensions dir fallback),\n // so an untouched field shows DEFAULTS and a save writes those\n // defaults over the real config.\n globalConfigDir: configDir,\n defaults: this.opts.defaults as unknown as Record<string, unknown>,\n inferDefaultScope: () =>\n existsSync(join(cwd, \".pi\", this.opts.filename)) ? \"project\" : \"global\",\n fields,\n onChange,\n onSave: async (\n values: Record<string, unknown>,\n scope: \"global\" | \"project\",\n ) => {\n const merged = { ...config, ...values };\n const updated = this.opts.validate\n ? this.opts.validate(merged as Record<string, unknown>)\n : (merged as T);\n this.save(updated, scope, cwd, configDir);\n onSave(updated);\n },\n onResetScope: async (scope) => {\n this.resetScope(scope, cwd, configDir);\n },\n onDeleteScope: async (scope) => {\n this.deleteScope(scope, cwd, configDir);\n },\n });\n }\n\n /**\n * Reset a scope's configuration to defaults. Known config keys\n * (those defined in the schema) are removed from the file; unknown\n * keys (from future versions or user additions) are preserved so\n * forward-compatibility is maintained. Next load will use defaults\n * for all known fields.\n *\n * After this call, the file contains only unknown keys. If no\n * unknown keys exist, the file is deleted entirely.\n */\n resetScope(\n scope: \"global\" | \"project\",\n cwd?: string,\n configDir?: string,\n ): void {\n if (scope === \"project\" && !cwd) {\n throw new Error(\"cwd is required for project-scoped config reset\");\n }\n const dir =\n scope === \"project\" && cwd\n ? join(cwd, \".pi\")\n : (configDir ?? getExtensionsDir());\n const knownKeys = new Set(Object.keys(this.opts.defaults));\n const existing = readConfig<Record<string, unknown>>(\n this.opts.filename,\n dir,\n );\n const unknownKeys: Record<string, unknown> = {};\n if (existing && typeof existing === \"object\") {\n for (const [key, val] of Object.entries(existing)) {\n if (!knownKeys.has(key)) unknownKeys[key] = val;\n }\n }\n if (Object.keys(unknownKeys).length > 0) {\n writeConfig(this.opts.filename, unknownKeys as T, dir);\n } else {\n deleteConfig(this.opts.filename, dir);\n }\n }\n\n /**\n * Delete the entire config file for a scope. Unlike `resetScope`,\n * this removes unknown keys as well — the file is completely gone.\n * Next load will use nothing but defaults.\n */\n deleteScope(\n scope: \"global\" | \"project\",\n cwd?: string,\n configDir?: string,\n ): void {\n if (scope === \"project\" && !cwd) {\n throw new Error(\"cwd is required for project-scoped config delete\");\n }\n const dir =\n scope === \"project\" && cwd\n ? join(cwd, \".pi\")\n : (configDir ?? getExtensionsDir());\n deleteConfig(this.opts.filename, dir);\n }\n\n /**\n * Check global and project-local config files for malformed JSON.\n * Warns via ctx.ui.notify if any are found.\n */\n private warnOnMalformedConfig(\n ctx: ExtensionContext,\n cwd: string,\n configDir?: string,\n ): void {\n const filename = this.opts.filename;\n\n const globalStatus = checkConfigFile(filename, configDir);\n if (globalStatus.exists && !globalStatus.valid) {\n ctx.ui.notify(\n `Config file \"${filename}\" is ${globalStatus.error}. Using defaults.`,\n \"warning\",\n );\n }\n\n const projectDir = join(cwd, \".pi\");\n const projectStatus = checkConfigFile(filename, projectDir);\n if (projectStatus.exists && !projectStatus.valid) {\n ctx.ui.notify(\n `Project config file \".pi/${filename}\" is ${projectStatus.error}. Using defaults.`,\n \"warning\",\n );\n }\n }\n}\n","/**\n * Blackhole settings — modal-based configuration via ConfigManager.\n *\n * Replaces the hand-rolled configure overlay (src/om/configure-overlay.ts)\n * with pi-base's ConfigManager + openSettingsModal.\n *\n * Env-var overrides are applied by ConfigManager after load + validate,\n * so they take effect for both the runtime path (loadUnifiedConfig) and\n * the modal path (config.load / config.openSettings).\n */\n\nimport { join } from \"node:path\";\nimport type { ExtensionContext } from \"@earendil-works/pi-coding-agent\";\nimport { ConfigManager } from \"../pi-base/config-manager.js\";\nimport { getPiAgentDir } from \"../pi-base/paths.js\";\nimport { DECLARATIVE_ENV_OVERRIDES } from \"../core/config-env.js\";\nimport { DEFAULTS, type UnifiedConfig } from \"../core/unified-config.js\";\n\nconst CONFIG_FILENAME = \"pi-blackhole-config.json\";\n\nexport const GLOBAL_CONFIG_DIR = join(getPiAgentDir(), \"pi-blackhole\");\n\n// ── Env-var parsers ──────────────────────────────────────────────────────────\n\nfunction parseCompactionEnv(\n raw: string,\n): \"auto\" | \"manual\" | \"off\" | undefined {\n const trimmed = raw.trim().toLowerCase();\n return [\"auto\", \"manual\", \"off\"].includes(trimmed)\n ? (trimmed as \"auto\" | \"manual\" | \"off\")\n : undefined;\n}\n\nfunction parseCompactionEngineEnv(\n raw: string,\n): \"blackhole\" | \"pi-default\" | undefined {\n const trimmed = raw.trim().toLowerCase();\n return [\"blackhole\", \"pi-default\"].includes(trimmed)\n ? (trimmed as \"blackhole\" | \"pi-default\")\n : undefined;\n}\n\n// ── ConfigManager instance ───────────────────────────────────────────────────\n\nexport const config = new ConfigManager<UnifiedConfig>({\n id: \"pi-blackhole\",\n label: \"pi-blackhole\",\n filename: CONFIG_FILENAME,\n defaults: DEFAULTS,\n\n fields: (cfg) => [\n // ── Compaction ──\n {\n key: \"compaction\",\n type: \"enum\",\n label: \"Compaction mode\",\n description:\n \"auto=trigger on threshold, manual=only /blackhole, off=auto:Pi handles, /blackhole:blackhole pipeline\",\n value: cfg.compaction,\n options: [\"auto\", \"manual\", \"off\"],\n optionLabels: {\n auto: \"auto — trigger on threshold\",\n manual: \"manual — only /blackhole\",\n off: \"off — auto:Pi handles, /blackhole:blackhole pipeline\",\n },\n },\n {\n key: \"compactionEngine\",\n type: \"enum\",\n label: \"Compaction engine\",\n description:\n \"blackhole=structured summary+OM, pi-default=built-in Pi summarization\",\n value: cfg.compactionEngine,\n options: [\"blackhole\", \"pi-default\"],\n optionLabels: {\n blackhole: \"blackhole — structured summary + OM\",\n \"pi-default\": \"pi-default — built-in Pi summarization\",\n },\n },\n {\n key: \"tailBehavior\",\n type: \"enum\",\n label: \"Visible tail\",\n description:\n \"minimal=keep last user message only (default), pi-default=keep Pi's preserved visible context\",\n value: cfg.tailBehavior,\n options: [\"minimal\", \"pi-default\"],\n optionLabels: {\n minimal: \"minimal — keep last user message only (default)\",\n \"pi-default\": \"pi-default — keep Pi's preserved visible context\",\n },\n },\n {\n key: \"midRunCompaction\",\n type: \"enum\",\n label: \"Mid-run compaction\",\n description:\n \"resume=compact at threshold during tool loops and continue (default), pause=compact and stop, off=only check when run ends\",\n value: cfg.midRunCompaction,\n options: [\"resume\", \"pause\", \"off\"],\n optionLabels: {\n resume: \"resume — compact and continue (default)\",\n pause: \"pause — compact and stop\",\n off: \"off — only check when run ends\",\n },\n },\n {\n key: \"compactAfterTokens\",\n type: \"number\",\n label: \"Auto-compact threshold\",\n description: \"Token count that triggers auto-compaction when reached\",\n value: cfg.compactAfterTokens,\n min: 1_000,\n max: 500_000,\n step: 1_000,\n },\n\n // ── Observational Memory ──\n {\n key: \"memory\",\n type: \"boolean\",\n label: \"Observational memory\",\n description:\n \"Enable OM workers (observer, reflector, dropper) and content injection\",\n value: cfg.memory,\n valueDescriptions: {\n on: \"Active — OM workers + content injection enabled\",\n off: \"Suspended — OM disabled\",\n },\n },\n {\n key: \"sessionFallback\",\n type: \"boolean\",\n label: \"Session model fallback\",\n description:\n \"off=skip stage when all OM models fail, instead of falling back to the main coding model\",\n value: cfg.sessionFallback ?? true,\n },\n {\n key: \"observeAfterTokens\",\n type: \"number\",\n label: \"Observer threshold\",\n description:\n \"Tokens accumulated since last observer run before triggering next observe\",\n value: cfg.observeAfterTokens,\n min: 1_000,\n max: 200_000,\n step: 1_000,\n },\n {\n key: \"reflectAfterTokens\",\n type: \"number\",\n label: \"Reflect + dropper threshold\",\n description:\n \"Tokens accumulated since last reflect before triggering reflector and dropper\",\n value: cfg.reflectAfterTokens,\n min: 1_000,\n max: 200_000,\n step: 1_000,\n },\n {\n key: \"observationsPoolMaxTokens\",\n type: \"number\",\n label: \"Observation pool max\",\n description:\n \"Max tokens in observation pool before dropper prunes (fold pressure)\",\n value: cfg.observationsPoolMaxTokens,\n min: 1_000,\n max: 200_000,\n step: 1_000,\n },\n {\n key: \"observationsPoolTargetTokens\",\n type: \"number\",\n label: \"Observation pool target\",\n description:\n \"Target tokens after dropper prunes (defaults to half of pool max)\",\n value: cfg.observationsPoolTargetTokens,\n min: 500,\n max: 200_000,\n step: 500,\n },\n {\n key: \"reflectorInputMaxTokens\",\n type: \"number\",\n label: \"Reflector input max\",\n description:\n \"Max prompt tokens for reflector model input (rolling window cap)\",\n value: cfg.reflectorInputMaxTokens,\n min: 1_000,\n max: 500_000,\n step: 1_000,\n },\n {\n key: \"dropperInputMaxTokens\",\n type: \"number\",\n label: \"Dropper input max\",\n description:\n \"Max prompt tokens for dropper model input (rolling window cap)\",\n value: cfg.dropperInputMaxTokens,\n min: 1_000,\n max: 500_000,\n step: 1_000,\n },\n {\n key: \"observerChunkMaxTokens\",\n type: \"number\",\n label: \"Observer chunk max\",\n description: \"Max source entry tokens sent to observer per chunk\",\n value: cfg.observerChunkMaxTokens,\n min: 1_000,\n max: 200_000,\n step: 1_000,\n },\n {\n key: \"observerPreambleMaxTokens\",\n type: \"number\",\n label: \"Observer preamble max\",\n description:\n \"Preamble budget in manual compaction mode (0=auto-compute 30% of chunk)\",\n value: cfg.observerPreambleMaxTokens,\n min: 0,\n max: 100_000,\n step: 500,\n },\n {\n key: \"dropperPressureThreshold\",\n type: \"number\",\n label: \"Dropper pressure threshold\",\n description:\n \"Fraction of reflectorInputMaxTokens that triggers pressure-driven dropper (0-1, default 0.70)\",\n value: cfg.dropperPressureThreshold,\n min: 0.01,\n max: 1,\n step: 0.01,\n },\n {\n key: \"dropperPoolFullnessThreshold\",\n type: \"number\",\n label: \"Dropper pool fullness threshold\",\n description:\n \"Min observation-pool fullness (fraction of pool max) before the dropper runs (0-1, default 0.10)\",\n value: cfg.dropperPoolFullnessThreshold,\n min: 0.01,\n max: 1,\n step: 0.01,\n },\n {\n key: \"agentMaxTurns\",\n type: \"number\",\n label: \"Max turns per agent\",\n description: \"Shared turn cap for background memory agents\",\n value: cfg.agentMaxTurns,\n min: 1,\n max: 100,\n step: 1,\n },\n {\n key: \"fullFoldAlways\",\n type: \"boolean\",\n label: \"Preserve OM on first compaction\",\n description:\n \"When true, early reflections/drops survive the first compaction in a fresh session\",\n value: cfg.fullFoldAlways,\n },\n\n // ── Debug ──\n {\n key: \"debug\",\n type: \"boolean\",\n label: \"Debug snapshots\",\n description:\n \"Write detailed debug snapshots to /tmp/pi-blackhole-debug.json\",\n value: cfg.debug,\n },\n {\n key: \"debugLog\",\n type: \"boolean\",\n label: \"Debug JSONL logging\",\n description: \"Write structured JSONL debug logs to agent directory\",\n value: cfg.debugLog,\n },\n ],\n\n /**\n * Validate raw loaded data, apply legacy migration, clamp numeric fields,\n * and apply all env-var overrides (both declarative env-map and legacy\n * passive/compaction env vars).\n */\n validate: (raw) => {\n const parsed = { ...raw } as Partial<UnifiedConfig>;\n\n // ── Migration: legacy keys → new surface ──\n if (\n parsed.compaction === undefined &&\n parsed.compactionEngine === undefined\n ) {\n if (parsed.passive === true) {\n parsed.compaction = \"off\";\n parsed.memory = false;\n } else if (parsed.noAutoCompact === true) {\n parsed.compaction = \"manual\";\n }\n if (parsed.overrideDefaultCompaction === true) {\n parsed.compactionEngine = \"blackhole\";\n if (parsed.tailBehavior === undefined) {\n parsed.tailBehavior = \"minimal\";\n }\n } else if (parsed.overrideDefaultCompaction === false) {\n parsed.compactionEngine = \"pi-default\";\n }\n delete (parsed as Record<string, unknown>).passive;\n delete (parsed as Record<string, unknown>).noAutoCompact;\n delete (parsed as Record<string, unknown>).overrideDefaultCompaction;\n }\n\n // ── Legacy passive env vars (Layer 4, highest priority) ──\n const envPassive =\n process.env.PI_BLACKHOLE_PASSIVE ??\n process.env.PI_VCC_OM_PASSIVE ??\n process.env.PI_OBSERVATIONAL_MEMORY_PASSIVE;\n if (envPassive !== undefined) {\n const v = envPassive.trim().toLowerCase();\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(v)) {\n parsed.compaction = \"off\";\n parsed.memory = false;\n } else if ([\"0\", \"false\", \"no\", \"off\"].includes(v)) {\n if (raw.passive === true) {\n delete parsed.compaction;\n delete (parsed as Record<string, unknown>).memory;\n }\n }\n }\n\n // ── New compaction env vars ──\n const envCompaction = process.env.PI_BLACKHOLE_COMPACTION;\n if (envCompaction !== undefined) {\n const parsedEnv = parseCompactionEnv(envCompaction);\n if (parsedEnv) {\n parsed.compaction = parsedEnv;\n } else {\n console.warn(\n `blackhole: invalid PI_BLACKHOLE_COMPACTION value \"${envCompaction}\"; ignoring`,\n );\n }\n }\n\n const envCompactionEngine = process.env.PI_BLACKHOLE_COMPACTION_ENGINE;\n if (envCompactionEngine !== undefined) {\n const parsedEnv = parseCompactionEngineEnv(envCompactionEngine);\n if (parsedEnv) {\n parsed.compactionEngine = parsedEnv;\n } else {\n console.warn(\n `blackhole: invalid PI_BLACKHOLE_COMPACTION_ENGINE value \"${envCompactionEngine}\"; ignoring`,\n );\n }\n }\n\n // ── Merge with defaults ──\n const merged = { ...DEFAULTS, ...parsed } as UnifiedConfig;\n\n // ── Numeric field validation ──\n const REQUIRED_NUMERIC_KEYS: readonly (keyof UnifiedConfig)[] = [\n \"observeAfterTokens\",\n \"reflectAfterTokens\",\n \"compactAfterTokens\",\n \"observationsPoolMaxTokens\",\n \"observationsPoolTargetTokens\",\n \"reflectorInputMaxTokens\",\n \"dropperInputMaxTokens\",\n \"observerChunkMaxTokens\",\n \"observerPreambleMaxTokens\",\n \"agentMaxTurns\",\n ];\n for (const k of REQUIRED_NUMERIC_KEYS) {\n const v = (merged as unknown as Record<string, unknown>)[k];\n const minVal = k === \"observerPreambleMaxTokens\" ? 0 : 1;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < minVal) {\n (merged as unknown as Record<string, unknown>)[k] = DEFAULTS[k];\n }\n }\n\n // dropperPressureThreshold — must be in (0, 1]\n const dpt = merged.dropperPressureThreshold;\n if (\n typeof dpt !== \"number\" ||\n !Number.isFinite(dpt) ||\n dpt <= 0 ||\n dpt > 1\n ) {\n merged.dropperPressureThreshold = DEFAULTS.dropperPressureThreshold;\n }\n\n // dropperPoolFullnessThreshold — must be in (0, 1]\n const dpf = merged.dropperPoolFullnessThreshold;\n if (\n typeof dpf !== \"number\" ||\n !Number.isFinite(dpf) ||\n dpf <= 0 ||\n dpf > 1\n ) {\n merged.dropperPoolFullnessThreshold =\n DEFAULTS.dropperPoolFullnessThreshold;\n }\n\n // observationsPoolTargetTokens — must be < max\n if (\n merged.observationsPoolTargetTokens === undefined ||\n merged.observationsPoolTargetTokens >= merged.observationsPoolMaxTokens\n ) {\n merged.observationsPoolTargetTokens = Math.floor(\n merged.observationsPoolMaxTokens / 2,\n );\n }\n\n return merged;\n },\n\n env: DECLARATIVE_ENV_OVERRIDES,\n});\n\n// ── Public entry point ───────────────────────────────────────────────────────\n\nexport async function openBlackholeSettings(\n ctx: ExtensionContext,\n): Promise<void> {\n await config.openSettings(\n ctx,\n ctx.cwd,\n (_updated) => {\n // onSave is called after the config is persisted; caller (pi-vcc.ts)\n // is responsible for reloading runtime.config from this instance.\n },\n GLOBAL_CONFIG_DIR,\n );\n}\n","/**\n * /pi-vcc command — triggers pi-vcc compaction.\n *\n * Upstream: https://github.com/sting8k/pi-vcc (src/commands/pi-vcc.ts)\n * Modified by pi-vcc-om:\n * - Flushes pending OM state (observations/reflections/dropped) when manual mode is active\n * before triggering compaction, so the compaction summary includes all accumulated memory.\n */\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport type { Runtime } from \"../om/runtime.js\";\nimport {\n PI_VCC_COMPACT_INSTRUCTION,\n notifyMigrationReminder,\n formatCompactionStats,\n} from \"../hooks/before-compact\";\nimport {\n readPendingState,\n clearPendingState,\n hasPendingData,\n} from \"../om/pending.js\";\nimport {\n OM_OBSERVATIONS_DROPPED,\n OM_OBSERVATIONS_RECORDED,\n OM_REFLECTIONS_RECORDED,\n} from \"../om/ledger/index.js\";\nimport { handleCleanup } from \"./cleanup.js\";\nimport {\n openBlackholeSettings,\n config,\n GLOBAL_CONFIG_DIR,\n} from \"../pi-base/blackhole-settings.js\";\n\nexport const registerPiVccCommand = (pi: ExtensionAPI, runtime: Runtime) => {\n const prefixMatch = (value: string, prefix: string): boolean => {\n return value.toLowerCase().startsWith(prefix.toLowerCase());\n };\n\n pi.registerCommand(\"blackhole\", {\n description:\n \"Manual compact with structural summary. Subcommands: [settings] config overlay, \" +\n \"[cleanup] remove orphaned files, [om-off]/[om-on] disable/enable observational memory.\",\n getArgumentCompletions: (prefix: string) => {\n const subcommands = [\n {\n value: \"settings\",\n label: \"Open configuration overlay [settings]\",\n },\n {\n value: \"cleanup\",\n label: \"Remove orphaned pending files [cleanup]\",\n },\n { value: \"om-off\", label: \"Disable observational memory [om-off]\" },\n { value: \"om-on\", label: \"Enable observational memory [om-on]\" },\n ];\n if (!prefix) return subcommands;\n // \"configure\" is an accepted alias for \"settings\" (routed by the\n // handler); surface the settings entry when the user types either.\n return subcommands.filter(\n (s) =>\n prefixMatch(s.value, prefix) ||\n (s.value === \"settings\" && prefixMatch(\"configure\", prefix)),\n );\n },\n handler: async (args, ctx) => {\n const sessionId = ctx.sessionManager.getSessionId();\n\n // Handle subcommands\n const trimmed = (typeof args === \"string\" ? args : \"\").trim();\n if (trimmed === \"configure\" || trimmed === \"settings\") {\n // Open the config overlay (\"configure\" kept as a hidden alias)\n await openBlackholeSettings(ctx);\n return;\n }\n if (trimmed === \"cleanup\") {\n await handleCleanup(ctx);\n return;\n }\n if (trimmed === \"om-off\") {\n try {\n config.save(\n { ...config.load(ctx.cwd, GLOBAL_CONFIG_DIR), memory: false },\n \"global\",\n ctx.cwd,\n GLOBAL_CONFIG_DIR,\n );\n runtime.config = config.loadWithWarnings(\n ctx.cwd,\n GLOBAL_CONFIG_DIR,\n ).config;\n ctx.ui.notify(\n \"Observational memory disabled. Use /blackhole om-on to re-enable.\",\n \"info\",\n );\n } catch {\n ctx.ui.notify(\n \"Failed to save config — the config file may be read-only (e.g., managed by Nix). \" +\n \"Runtime state updated for this session only.\",\n \"warning\",\n );\n }\n return;\n }\n if (trimmed === \"om-on\") {\n try {\n config.save(\n { ...config.load(ctx.cwd, GLOBAL_CONFIG_DIR), memory: true },\n \"global\",\n ctx.cwd,\n GLOBAL_CONFIG_DIR,\n );\n runtime.config = config.loadWithWarnings(\n ctx.cwd,\n GLOBAL_CONFIG_DIR,\n ).config;\n ctx.ui.notify(\"Observational memory enabled.\", \"info\");\n } catch {\n ctx.ui.notify(\n \"Failed to save config — the config file may be read-only (e.g., managed by Nix). \" +\n \"Runtime state updated for this session only.\",\n \"warning\",\n );\n }\n return;\n } // Warn if input starts with a known subcommand but isn't an exact match.\n // Prevents \"/blackhole configure foo\" from silently becoming a follow-up.\n const SUBCOMMAND_NAMES = [\n \"configure\",\n \"settings\",\n \"cleanup\",\n \"om-off\",\n \"om-on\",\n ];\n const nearMiss = SUBCOMMAND_NAMES.find(\n (name) =>\n trimmed.toLowerCase().startsWith(name.toLowerCase()) &&\n trimmed.length > name.length,\n );\n if (nearMiss) {\n ctx.ui.notify(\n `/blackhole ${nearMiss} accepts no arguments. Did you mean \\\"/blackhole ${nearMiss}\\\"?`,\n \"warning\",\n );\n return;\n }\n\n // Extract follow-up prompt: everything after the subcommand check\n // that isn't a known subcommand is treated as follow-up text.\n const followUpPrompt = trimmed ? trimmed : null;\n\n // If compaction is manual (or legacy noAutoCompact): flush pending OM entries\n // into the branch before compacting so the summary includes accumulated memory.\n if (runtime.config.compaction === \"manual\" && hasPendingData(sessionId)) {\n const pending = readPendingState(sessionId);\n // Write all accumulated observation batches (or latest single batch\n // as fallback for legacy pending.json without batch arrays).\n const obsBatches = pending.observationBatches?.length\n ? pending.observationBatches\n : pending.observation\n ? [pending.observation]\n : [];\n for (const batch of obsBatches) {\n pi.appendEntry(OM_OBSERVATIONS_RECORDED, batch.data);\n }\n // Write all accumulated reflection batches (or latest single batch\n // as fallback for legacy pending.json without batch arrays).\n const reflBatches = pending.reflectionBatches?.length\n ? pending.reflectionBatches\n : pending.reflection\n ? [pending.reflection]\n : [];\n for (const batch of reflBatches) {\n pi.appendEntry(OM_REFLECTIONS_RECORDED, batch.data);\n }\n // Write all accumulated dropper batches (or latest single batch\n // as fallback for legacy pending.json without batch arrays).\n const dropBatches = pending.droppedBatches?.length\n ? pending.droppedBatches\n : pending.dropped\n ? [pending.dropped]\n : [];\n for (const batch of dropBatches) {\n pi.appendEntry(OM_OBSERVATIONS_DROPPED, batch.data);\n }\n clearPendingState(sessionId);\n ctx.ui.notify(\"Observational memory: pending entries flushed\", \"info\");\n }\n\n ctx.compact({\n customInstructions: PI_VCC_COMPACT_INSTRUCTION,\n onComplete: () => {\n const stats = runtime.compactionStats;\n if (stats) {\n ctx.ui.notify(formatCompactionStats(stats), \"info\");\n } else {\n ctx.ui.notify(\"Compacted with blackhole\", \"info\");\n }\n notifyMigrationReminder(sessionId, (msg, level) =>\n ctx.ui.notify(msg, level as any),\n );\n\n // Fire follow-up prompt after compaction completes\n if (followUpPrompt) {\n try {\n void Promise.resolve(pi.sendUserMessage(followUpPrompt)).catch(\n () => {},\n );\n } catch {}\n }\n },\n onError: (err) => {\n if (\n err.message === \"Compaction cancelled\" ||\n err.message === \"Already compacted\"\n ) {\n ctx.ui.notify(\"Nothing to compact\", \"warning\");\n } else {\n ctx.ui.notify(`Compaction failed: ${err.message}`, \"error\");\n }\n },\n });\n },\n });\n};\n","import { spawn } from \"node:child_process\";\n\nexport interface ClipboardCommand {\n command: string;\n args: string[];\n}\n\nexport type ClipboardCommandRunner = (\n command: ClipboardCommand,\n text: string,\n) => Promise<boolean>;\n\nexport function getClipboardCommands(\n platform: NodeJS.Platform = process.platform,\n): ClipboardCommand[] {\n switch (platform) {\n case \"darwin\":\n return [{ command: \"pbcopy\", args: [] }];\n case \"win32\":\n return [{ command: \"clip\", args: [] }];\n default:\n return [\n { command: \"wl-copy\", args: [] },\n { command: \"xclip\", args: [\"-selection\", \"clipboard\"] },\n { command: \"xsel\", args: [\"--clipboard\", \"--input\"] },\n { command: \"termux-clipboard-set\", args: [] },\n ];\n }\n}\n\nexport async function copyTextToClipboard(\n text: string,\n runner: ClipboardCommandRunner = runClipboardCommand,\n commands: ClipboardCommand[] = getClipboardCommands(),\n): Promise<boolean> {\n for (const command of commands) {\n if (await runner(command, text)) return true;\n }\n return false;\n}\n\nexport function runClipboardCommand(\n command: ClipboardCommand,\n text: string,\n): Promise<boolean> {\n return new Promise((resolve) => {\n let settled = false;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n\n const finish = (ok: boolean) => {\n if (settled) return;\n settled = true;\n if (timeout) clearTimeout(timeout);\n resolve(ok);\n };\n\n const child = spawn(command.command, command.args, {\n stdio: [\"pipe\", \"ignore\", \"ignore\"],\n });\n\n timeout = setTimeout(() => {\n child.kill();\n finish(false);\n }, 2_000);\n\n child.on(\"error\", () => finish(false));\n child.on(\"close\", (code) => finish(code === 0));\n child.stdin.on(\"error\", () => undefined);\n child.stdin.end(text, \"utf8\");\n });\n}\n","/**\n * /blackhole-memory command — shows memory pipeline status and content.\n *\n * Created by pi-vcc-om. Replaces OM's standalone /om-status and /om-view.\n * Usage: /blackhole-memory [status|view|full]\n */\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { copyTextToClipboard } from \"../om/clipboard.js\";\nimport type { Runtime } from \"../om/runtime.js\";\nimport {\n diffProjection,\n entryIndexForId,\n foldLedger,\n fullProjection,\n observationToSummaryLine,\n rawTokensAfterIndex,\n rawTokensSinceDropCoverage,\n rawTokensSinceLastCompaction,\n rawTokensSinceObservationCoverage,\n rawTokensSinceReflectionCoverage,\n reflectionToSummaryLine,\n visibleProjection,\n type Entry,\n type Projection,\n} from \"../om/ledger/index.js\";\nimport { readPendingState } from \"../om/pending.js\";\nimport { isManualMode } from \"../core/unified-config.js\";\n\nfunction firstArg(args: unknown): string | undefined {\n if (Array.isArray(args))\n return typeof args[0] === \"string\" ? args[0] : undefined;\n if (typeof args === \"string\") return args.trim().split(/\\s+/)[0];\n if (args && typeof args === \"object\" && \"mode\" in args) {\n const mode = (args as { mode?: unknown }).mode;\n return typeof mode === \"string\" ? mode : undefined;\n }\n return undefined;\n}\n\nfunction pct(current: number, total: number): number {\n return total > 0 ? Math.round((current / total) * 100) : 0;\n}\n\nfunction tokenSum(items: { tokenCount: number }[]): number {\n return items.reduce((sum, item) => sum + item.tokenCount, 0);\n}\n\nfunction addedSuffix(count: number): string | undefined {\n return count > 0 ? `+${count.toLocaleString()}` : undefined;\n}\n\nfunction removedSuffix(count: number): string | undefined {\n return count > 0 ? `-${count.toLocaleString()}` : undefined;\n}\n\nfunction appendSuffixes(\n line: string,\n suffixes: (string | undefined)[],\n): string {\n const rendered = suffixes.filter((s): s is string => s !== undefined);\n return rendered.length > 0 ? `${line} ${rendered.join(\" \")}` : line;\n}\n\nfunction renderList<T>(\n items: T[],\n render: (item: T) => string,\n empty: string,\n): string {\n return items.length > 0 ? items.map(render).join(\"\\n\") : empty;\n}\n\nfunction renderContentOnlyProjection(\n projection: Projection,\n emptyScope: \"visible\" | \"recorded\",\n): string {\n return [\n \"── Reflections ──\",\n renderList(\n projection.reflections,\n reflectionToSummaryLine,\n `No ${emptyScope} reflections.`,\n ),\n \"\",\n \"── Observations ──\",\n renderList(\n projection.observations,\n observationToSummaryLine,\n `No ${emptyScope} observations.`,\n ),\n ].join(\"\\n\");\n}\n\nexport function registerMemoryCommand(\n pi: ExtensionAPI,\n runtime: Runtime,\n): void {\n pi.registerCommand(\"blackhole-memory\", {\n description:\n \"Show memory pipeline status & token counters. /blackhole-memory [view] visible observations & reflections, [full] complete recorded memory (copies to clipboard).\",\n handler: async (args, ctx) => {\n runtime.ensureConfig(ctx.cwd, (msg) => ctx.ui?.notify?.(msg, \"warning\"));\n const entries = ctx.sessionManager.getBranch() as Entry[];\n const sessionId = ctx.sessionManager.getSessionId();\n const mode = firstArg(args);\n\n // /blackhole-memory full — show full recorded memory + copy to clipboard\n if (mode === \"full\") {\n const projection = fullProjection(entries);\n const output = renderContentOnlyProjection(projection, \"recorded\");\n const copied = await copyTextToClipboard(output).catch(() => false);\n ctx.ui.notify(\n copied\n ? `${output}\\n\\nCopied to clipboard.`\n : `${output}\\n\\nFailed to copy to clipboard.`,\n \"info\",\n );\n return;\n }\n\n // /blackhole-memory view — show visible memory + copy to clipboard\n if (mode === \"view\") {\n const projection = visibleProjection(entries);\n const output = renderContentOnlyProjection(projection, \"visible\");\n const copied = await copyTextToClipboard(output).catch(() => false);\n ctx.ui.notify(\n copied\n ? `${output}\\n\\nCopied to clipboard.`\n : `${output}\\n\\nFailed to copy to clipboard.`,\n \"info\",\n );\n return;\n }\n\n // /blackhole-memory (no args) — show status\n if (mode && mode !== \"status\") {\n ctx.ui.notify(\"Usage: /blackhole-memory [status|view|full]\", \"info\");\n return;\n }\n\n const folded = foldLedger(entries);\n const visible = visibleProjection(entries);\n const full = fullProjection(entries);\n const drift = diffProjection(visible, full);\n\n const visibleObservationTokens = tokenSum(visible.observations);\n const visibleReflectionTokens = tokenSum(visible.reflections);\n const observationLine = appendSuffixes(\n `Observations: ${folded.observations.length} recorded / ${folded.droppedObservationIds.size} dropped / ${visible.observations.length} visible`,\n [\n addedSuffix(drift.observationsOnlyInFull.length),\n removedSuffix(drift.droppedOnlyInFull.length),\n ],\n );\n const reflectionLine = appendSuffixes(\n `Reflections: ${folded.reflections.length} recorded / ${visible.reflections.length} visible`,\n [addedSuffix(drift.reflectionsOnlyInFull.length)],\n );\n let obsProgress = rawTokensSinceObservationCoverage(entries);\n let reflectionProgress = rawTokensSinceReflectionCoverage(entries);\n let dropProgress = rawTokensSinceDropCoverage(entries);\n const compactionProgress = rawTokensSinceLastCompaction(entries);\n\n // In manual mode, pending coversUpToId entries act as virtual coverage markers\n // that aren't reflected in the branch. Adjust accumulated counts accordingly.\n if (isManualMode(runtime.config)) {\n const pending = readPendingState(sessionId);\n if (pending.observation?.coversUpToId) {\n const idx = entryIndexForId(\n entries,\n pending.observation.coversUpToId,\n );\n if (idx >= 0) obsProgress = rawTokensAfterIndex(entries, idx);\n }\n if (pending.reflection?.coversUpToId) {\n const idx = entryIndexForId(entries, pending.reflection.coversUpToId);\n if (idx >= 0) reflectionProgress = rawTokensAfterIndex(entries, idx);\n }\n if (pending.dropped?.coversUpToId) {\n const idx = entryIndexForId(entries, pending.dropped.coversUpToId);\n if (idx >= 0) dropProgress = rawTokensAfterIndex(entries, idx);\n }\n }\n\n const passiveLines =\n runtime.config.passive === true\n ? [\n \"── Mode ──\",\n \"Passive: automatic memory workers and auto-compaction disabled\",\n \"\",\n ]\n : [];\n\n const lines = [\n ...passiveLines,\n \"── Memory ──\",\n observationLine,\n reflectionLine,\n \"\",\n \"── Pipeline ──\",\n \"Transcript accumulated since last run. Triggers when exceeding threshold.\",\n `Observer: ~${obsProgress.toLocaleString()} tokens (triggers at ${runtime.config.observeAfterTokens.toLocaleString()})`,\n `Reflector: ~${reflectionProgress.toLocaleString()} tokens (triggers at ${runtime.config.reflectAfterTokens.toLocaleString()})`,\n `Dropper: pool ${pct(visibleObservationTokens, runtime.config.observationsPoolMaxTokens)}% — prunes at ≥${Math.round(runtime.config.dropperPoolFullnessThreshold * 100)}% pool (${dropProgress.toLocaleString()}/${runtime.config.reflectAfterTokens.toLocaleString()} new tokens)`,\n `Compaction: ~${compactionProgress.toLocaleString()} tokens` +\n (isManualMode(runtime.config)\n ? \" [manual]\"\n : ` (triggers at ${runtime.config.compactAfterTokens.toLocaleString()})`),\n `Obs pool: ~${visibleObservationTokens.toLocaleString()} / ${runtime.config.observationsPoolMaxTokens.toLocaleString()} tokens (${pct(visibleObservationTokens, runtime.config.observationsPoolMaxTokens)}%)`,\n `Reflect pool: ~${visibleReflectionTokens.toLocaleString()} tokens`,\n ];\n\n // Show pending data when manual mode is active\n if (isManualMode(runtime.config)) {\n const pending = readPendingState(sessionId);\n const hasObs = !!pending.observation;\n const hasRef = !!pending.reflection;\n const hasDrop = !!pending.dropped;\n if (hasObs || hasRef || hasDrop) {\n lines.push(\"\", \"── Pending (manual mode) ──\");\n if (hasObs) lines.push(\"Observation: waiting in pending.json\");\n if (hasRef) lines.push(\"Reflection: waiting in pending.json\");\n if (hasDrop) lines.push(\"Dropper: waiting in pending.json\");\n const preambleCap =\n runtime.config.observerPreambleMaxTokens > 0\n ? runtime.config.observerPreambleMaxTokens\n : Math.round(runtime.config.observerChunkMaxTokens * 0.3);\n const pctNote =\n runtime.config.observerPreambleMaxTokens > 0\n ? \"\"\n : ` (30% of ${runtime.config.observerChunkMaxTokens.toLocaleString()} chunk)`;\n lines.push(\n `Preamble cap: ${preambleCap.toLocaleString()} tokens for observations${pctNote}`,\n );\n lines.push(\"Run /blackhole to flush and compact.\");\n }\n }\n\n if (\n runtime.consolidationInFlight ||\n runtime.compactInFlight ||\n runtime.compactHookInFlight\n ) {\n lines.push(\"\", \"── In flight ──\");\n if (runtime.consolidationInFlight) {\n const phase = runtime.consolidationPhase\n ? ` (${runtime.consolidationPhase})`\n : \"\";\n lines.push(`Consolidation: running${phase}`);\n }\n if (runtime.compactInFlight) lines.push(\"Auto-compaction: running\");\n if (runtime.compactHookInFlight) lines.push(\"Compaction hook: running\");\n }\n\n if (\n runtime.lastObserverError ||\n runtime.lastReflectorError ||\n runtime.lastDropperError\n ) {\n lines.push(\"\", \"── Last error ──\");\n if (runtime.lastObserverError)\n lines.push(`Observer: ${runtime.lastObserverError}`);\n if (runtime.lastReflectorError)\n lines.push(`Reflector: ${runtime.lastReflectorError}`);\n if (runtime.lastDropperError)\n lines.push(`Dropper: ${runtime.lastDropperError}`);\n }\n\n ctx.ui.notify(lines.join(\"\\n\"), \"info\");\n },\n });\n}\n","import type { Message } from \"@earendil-works/pi-ai\";\nimport { clip, textOf } from \"./content\";\nimport { summarizeToolArgs } from \"./tool-args\";\nimport { extractPath } from \"./tool-args\";\n\n// Mirrors @earendil-works/pi-coding-agent's BashExecutionMessage (not re-exported from index)\ninterface LocalBashExec {\n role: \"bashExecution\";\n command: string;\n output: string;\n}\n\nexport interface RenderedEntry {\n index: number;\n id: string;\n role: string;\n summary: string;\n files?: string[];\n}\n\nconst toolCalls = (content: Message[\"content\"]): string => {\n if (!content || typeof content === \"string\") return \"\";\n return content\n .filter((c) => c.type === \"toolCall\")\n .map((c) => `${c.name}(${summarizeToolArgs(c.arguments)})`)\n .join(\", \");\n};\n\nconst extractFilesFromContent = (content: Message[\"content\"]): string[] => {\n if (!content || typeof content === \"string\") return [];\n return content\n .filter((c) => c.type === \"toolCall\")\n .map((c) => extractPath(c.arguments))\n .filter((p): p is string => p !== null);\n};\n\nexport const renderMessage = (\n msg: Message,\n index: number,\n id: string,\n full = false,\n): RenderedEntry => {\n if (msg.role === \"user\") {\n return {\n index,\n id,\n role: \"user\",\n summary: full ? textOf(msg.content) : clip(textOf(msg.content), 300),\n };\n }\n if (msg.role === \"toolResult\") {\n const prefix = msg.isError ? \"ERROR \" : \"\";\n const text = full ? textOf(msg.content) : clip(textOf(msg.content), 200);\n return {\n index,\n id,\n role: \"tool_result\",\n summary: `${prefix}[${msg.toolName}] ${text}`,\n };\n }\n // bashExecution has command+output instead of content\n if ((msg as any).role === \"bashExecution\") {\n const bashMsg = msg as unknown as LocalBashExec;\n const cmd = bashMsg.command ?? \"\";\n const out = bashMsg.output ?? \"\";\n const text = full ? `$ ${cmd}\\n${out}` : clip(`$ ${cmd}\\n${out}`, 300);\n return { index, id, role: \"bash\", summary: text };\n }\n const text = full ? textOf(msg.content) : clip(textOf(msg.content), 300);\n const tools = toolCalls(msg.content);\n const files = extractFilesFromContent(msg.content);\n const summary = tools ? `${tools}\\n${text}` : text;\n return {\n index,\n id,\n role: \"assistant\",\n summary,\n ...(files.length > 0 && { files }),\n };\n};\n","import { readFileSync, statSync } from \"fs\";\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport { renderMessage, type RenderedEntry } from \"./render-entries\";\n\nexport interface LoadedMessages {\n rendered: RenderedEntry[];\n rawMessages: Message[];\n entryIds: string[];\n}\n\n// ── Session-file cache (LRU, invalidated by mtime) ─────────────────────────\n\ninterface CacheEntry {\n result: LoadedMessages;\n mtimeMs: number;\n timestamp: number;\n}\n\nconst MAX_CACHE_SIZE = 3;\nconst CACHE_TTL_MS = 2_000;\nconst cache = new Map<string, CacheEntry>();\n\nfunction cacheKey(\n sessionFile: string,\n full: boolean,\n allowedEntryIds: Set<string> | undefined,\n): string {\n let hash = `${sessionFile}::${full}`;\n if (allowedEntryIds && allowedEntryIds.size > 0) {\n // Include the full set as sorted JSON for collision-free caching\n hash += `::${JSON.stringify([...allowedEntryIds].sort())}`;\n }\n return hash;\n}\n\nfunction getCached(\n sessionFile: string,\n full: boolean,\n allowedEntryIds?: Set<string>,\n): LoadedMessages | undefined {\n const key = cacheKey(sessionFile, full, allowedEntryIds);\n const entry = cache.get(key);\n if (!entry) return undefined;\n\n // Check TTL (mtime-based invalidation)\n if (Date.now() - entry.timestamp > CACHE_TTL_MS) {\n cache.delete(key);\n return undefined;\n }\n\n // Verify file mtime hasn't changed\n try {\n const mtimeMs = statSync(sessionFile).mtimeMs;\n if (mtimeMs !== entry.mtimeMs) {\n cache.delete(key);\n return undefined;\n }\n } catch {\n cache.delete(key);\n return undefined;\n }\n\n return entry.result;\n}\n\nfunction setCache(\n sessionFile: string,\n full: boolean,\n allowedEntryIds: Set<string> | undefined,\n result: LoadedMessages,\n): void {\n // Evict oldest if at capacity\n if (cache.size >= MAX_CACHE_SIZE) {\n const oldest = cache.entries().next();\n if (!oldest.done) cache.delete(oldest.value[0]);\n }\n\n try {\n const mtimeMs = statSync(sessionFile).mtimeMs;\n const key = cacheKey(sessionFile, full, allowedEntryIds);\n cache.set(key, { result, mtimeMs, timestamp: Date.now() });\n } catch {\n // Can't stat the file — don't cache\n }\n}\n\nexport const loadAllMessages = (\n sessionFile: string,\n full: boolean,\n allowedEntryIds?: Set<string>,\n): LoadedMessages => {\n // Check cache first (same sessionFile + full flag + lineage size — approximate)\n const cached = getCached(sessionFile, full, allowedEntryIds);\n if (cached) return cached;\n\n const content = readFileSync(sessionFile, \"utf-8\");\n const entries: any[] = [];\n let parseErrors = 0;\n for (const line of content.split(\"\\n\")) {\n if (!line.trim()) continue;\n try {\n entries.push(JSON.parse(line));\n } catch {\n parseErrors++;\n }\n }\n if (parseErrors > 0) {\n console.warn(\n `blackhole: ${parseErrors} malformed JSONL line(s) in ${sessionFile}`,\n );\n }\n const rendered: RenderedEntry[] = [];\n const rawMessages: Message[] = [];\n const entryIds: string[] = [];\n\n let messageIndex = 0;\n for (const e of entries) {\n const isMessage = e.type === \"message\" && e.message;\n if (!isMessage) continue;\n\n const allowed = !allowedEntryIds || allowedEntryIds.has(e.id);\n if (allowed) {\n const entryId = e.id != null ? String(e.id) : \"\";\n rendered.push(renderMessage(e.message, messageIndex, entryId, full));\n rawMessages.push(e.message);\n entryIds.push(entryId);\n }\n messageIndex++;\n }\n\n const result: LoadedMessages = { rendered, rawMessages, entryIds };\n setCache(sessionFile, full, allowedEntryIds, result);\n return result;\n};\n","/**\n * Search entries — BM25 + regex search over session history.\n *\n * Upstream: https://github.com/sting8k/pi-vcc (src/core/search-entries.ts)\n * Unmodified.\n */\nimport type { Message } from \"@earendil-works/pi-ai\";\nimport type { RenderedEntry } from \"./render-entries\";\nimport { textOf, toolCallArgsText, isContentBearing } from \"./content\";\nimport type { RecallMode } from \"./recall-scope\";\n\n// Mirrors @earendil-works/pi-coding-agent's BashExecutionMessage (not re-exported from index)\ninterface LocalBashExec {\n role: \"bashExecution\";\n command: string;\n output: string;\n}\n\nexport interface FileMatch {\n /** Name of the tool (write, edit, hex_edit) */\n toolName: string;\n /** File path from the tool call arguments */\n path: string;\n /** Number of lines in the content that matched the query */\n lineCount: number;\n /** First matching line snippet (only populated for top matches) */\n snippet?: string;\n}\n\n/** A file touched in one entry — used by mode:touched aggregation. */\nexport interface FileTouch {\n index: number;\n toolName: string;\n}\n\n/** Aggregated view of a file touched across multiple entries. */\nexport interface TouchedFile {\n path: string;\n entries: FileTouch[];\n}\n\nexport interface SearchHit extends RenderedEntry {\n /** Context snippet around the first matched term (only when query provided) */\n snippet?: string;\n /** Number of query terms matched (for ranking) */\n matchCount?: number;\n /** Per-file match indicators from content-bearing tool calls */\n fileMatches?: FileMatch[];\n}\n\nconst escapeRegex = (s: string): string =>\n s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n/** Try to compile as regex; fall back to escaped literal. */\nconst safeRegex = (pattern: string): RegExp => {\n try {\n return new RegExp(pattern, \"i\");\n } catch {\n return new RegExp(escapeRegex(pattern), \"i\");\n }\n};\n\n/** Detect if the query looks like a single regex pattern (contains regex metacharacters). */\nconst looksLikeRegex = (query: string): boolean =>\n /[|*+?{}()[\\]\\\\^$.]/.test(query);\n\n/** Build a regex for snippet highlighting — matches first available term. */\nconst snippetRegex = (terms: string[]): RegExp => {\n const alts = terms.map((t) => {\n try {\n // Validate that it's a valid regex\n new RegExp(t, \"i\");\n return t;\n } catch {\n return escapeRegex(t);\n }\n });\n return new RegExp(alts.join(\"|\"), \"i\");\n};\n\n// ── Stopwords for natural language queries ──\nconst STOPWORDS = new Set([\n // English\n \"the\",\n \"a\",\n \"an\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"be\",\n \"been\",\n \"being\",\n \"have\",\n \"has\",\n \"had\",\n \"do\",\n \"does\",\n \"did\",\n \"will\",\n \"would\",\n \"could\",\n \"should\",\n \"may\",\n \"might\",\n \"can\",\n \"shall\",\n \"of\",\n \"in\",\n \"to\",\n \"for\",\n \"with\",\n \"on\",\n \"at\",\n \"from\",\n \"by\",\n \"as\",\n \"into\",\n \"through\",\n \"during\",\n \"before\",\n \"after\",\n \"above\",\n \"below\",\n \"between\",\n \"out\",\n \"off\",\n \"over\",\n \"under\",\n \"again\",\n \"further\",\n \"then\",\n \"once\",\n \"here\",\n \"there\",\n \"when\",\n \"where\",\n \"why\",\n \"how\",\n \"all\",\n \"both\",\n \"each\",\n \"few\",\n \"more\",\n \"most\",\n \"other\",\n \"some\",\n \"such\",\n \"no\",\n \"nor\",\n \"not\",\n \"only\",\n \"own\",\n \"same\",\n \"so\",\n \"than\",\n \"too\",\n \"very\",\n \"just\",\n \"about\",\n \"it\",\n \"its\",\n \"that\",\n \"this\",\n \"what\",\n \"which\",\n \"who\",\n \"whom\",\n \"these\",\n \"those\",\n]);\n\n/** Remove stopwords, keep meaningful terms. */\nconst filterStopwords = (terms: string[]): string[] => {\n const meaningful = terms.filter(\n (t) => !STOPWORDS.has(t.toLowerCase()) && t.length > 1,\n );\n // If all terms were stopwords, return original (don't lose everything)\n return meaningful.length > 0 ? meaningful : terms;\n};\n\n/** Count how many distinct terms match the haystack. */\nconst countMatches = (hay: string, terms: string[]): number => {\n let count = 0;\n for (const t of terms) {\n if (safeRegex(t).test(hay)) count++;\n }\n return count;\n};\n\n// ── BM25-lite scoring ──\nconst BM25_K = 1.2;\nconst BM25_B = 0.75;\n\n/** Count occurrences of a regex pattern in text. */\nconst termFreq = (text: string, pattern: RegExp): number => {\n const matches = text.match(new RegExp(pattern.source, \"gi\"));\n return matches ? matches.length : 0;\n};\n\ninterface BM25Context {\n n: number; // total docs\n avgDl: number; // average doc length (words)\n df: Map<string, number>; // term -> number of docs containing it\n}\n\n/** Precompute IDF and avgDl across all docs. */\nconst buildBM25Context = (docs: string[], terms: string[]): BM25Context => {\n const n = docs.length;\n const df = new Map<string, number>();\n let totalLen = 0;\n\n for (const doc of docs) {\n totalLen += doc.split(/\\s+/).length;\n for (const t of terms) {\n if (safeRegex(t).test(doc)) {\n df.set(t, (df.get(t) ?? 0) + 1);\n }\n }\n }\n\n return { n, avgDl: totalLen / Math.max(n, 1), df };\n};\n\n/** BM25 score for a single doc against query terms. */\nconst bm25Score = (doc: string, terms: string[], ctx: BM25Context): number => {\n const dl = doc.split(/\\s+/).length;\n let score = 0;\n\n for (const t of terms) {\n const tf = termFreq(doc, safeRegex(t));\n if (tf === 0) continue;\n\n const docFreq = ctx.df.get(t) ?? 0;\n // IDF: log((N - df + 0.5) / (df + 0.5) + 1)\n const idf = Math.log((ctx.n - docFreq + 0.5) / (docFreq + 0.5) + 1);\n // TF saturation with length normalization\n const tfNorm =\n (tf * (BM25_K + 1)) /\n (tf + BM25_K * (1 - BM25_B + (BM25_B * dl) / ctx.avgDl));\n score += idf * tfNorm;\n }\n\n return score;\n};\n\n/** Line-based snippet: ±contextLines around first regex match. */\nconst lineSnippet = (\n text: string,\n regex: RegExp,\n contextLines = 2,\n): string | undefined => {\n const lines = text.split(\"\\n\");\n let matchIdx = -1;\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) {\n matchIdx = i;\n break;\n }\n }\n if (matchIdx === -1) return undefined;\n\n const start = Math.max(0, matchIdx - contextLines);\n const end = Math.min(lines.length, matchIdx + contextLines + 1);\n const slice = lines.slice(start, end);\n\n const parts: string[] = [];\n if (start > 0) parts.push(`...(${start} lines above)`);\n parts.push(...slice);\n if (end < lines.length) parts.push(`...(${lines.length - end} lines below)`);\n return parts.join(\"\\n\");\n};\n\n/** Build full searchable text for a message, optionally filtered by mode. */\nconst fullText = (msg: Message, mode?: RecallMode): string => {\n if ((msg as any).role === \"bashExecution\") {\n if (mode === \"file\") return \"\"; // bash is not file content\n const bashMsg = msg as unknown as LocalBashExec;\n return `${bashMsg.command ?? \"\"} ${bashMsg.output ?? \"\"}`;\n }\n if (mode === \"file\") {\n return toolCallArgsText(msg.content);\n }\n // hybrid (default): both transcript text + tool call args\n const text = textOf(msg.content);\n const toolArgs = toolCallArgsText(msg.content);\n return toolArgs ? `${text}\\n${toolArgs}` : text;\n};\n\n/**\n * Extract searchable text from tool call arguments (content, edits, oldText, newText).\n */\nfunction extractToolCallText(args: Record<string, unknown>): string {\n let text = \"\";\n if (typeof args.content === \"string\") text += args.content + \"\\n\";\n if (Array.isArray(args.edits)) {\n for (const edit of args.edits) {\n if (edit && typeof edit === \"object\") {\n if (typeof edit.oldText === \"string\") text += edit.oldText + \"\\n\";\n if (typeof edit.newText === \"string\") text += edit.newText + \"\\n\";\n }\n }\n }\n if (typeof args.oldText === \"string\" && !Array.isArray(args.edits))\n text += args.oldText + \"\\n\";\n if (typeof args.newText === \"string\" && !Array.isArray(args.edits))\n text += args.newText + \"\\n\";\n return text;\n}\n\n/**\n * Compute file indicators from a message (no query — counts total lines per file).\n */\nexport function getFileIndicators(msg: Message): FileMatch[] {\n if (!msg?.content || typeof msg.content === \"string\") return [];\n const fileMatches: FileMatch[] = [];\n for (const part of msg.content) {\n if (!part || typeof part !== \"object\" || part.type !== \"toolCall\") continue;\n const args = part.arguments as Record<string, unknown>;\n if (!isContentBearing(args)) continue;\n\n const path = [\"path\", \"filePath\", \"file_path\", \"file\"]\n .map((k) => args[k])\n .find((v): v is string => typeof v === \"string\")!;\n\n const totalText = extractToolCallText(args);\n const nonEmpty = totalText.split(\"\\n\").filter((l) => l.trim().length > 0);\n fileMatches.push({\n toolName: part.name || \"\",\n path,\n lineCount: nonEmpty.length,\n });\n }\n return fileMatches;\n}\n\nfunction computeFileMatches(\n msg: Message | undefined,\n query: string,\n): FileMatch[] {\n if (!msg?.content || typeof msg.content === \"string\") return [];\n const rawQuery = query.trim();\n const hasQuery = rawQuery.length > 0;\n if (!hasQuery) return getFileIndicators(msg as Message);\n const regex = looksLikeRegex(rawQuery)\n ? safeRegex(rawQuery)\n : snippetRegex(rawQuery.split(/\\s+/));\n const fileMatches: FileMatch[] = [];\n\n for (const part of msg.content) {\n if (!part || typeof part !== \"object\" || part.type !== \"toolCall\") continue;\n const args = part.arguments as Record<string, unknown>;\n if (!isContentBearing(args)) continue;\n\n // Path is guaranteed by isContentBearing check\n const path = [\"path\", \"filePath\", \"file_path\", \"file\"]\n .map((k) => args[k])\n .find((v): v is string => typeof v === \"string\")!;\n\n const searchText = extractToolCallText(args);\n if (!searchText) continue;\n\n const lines = searchText.split(\"\\n\");\n const matchingLines = lines.filter((line) => regex.test(line));\n if (matchingLines.length > 0) {\n fileMatches.push({\n toolName: part.name || \"\",\n path,\n lineCount: matchingLines.length,\n snippet: matchingLines[0],\n });\n }\n }\n\n return fileMatches;\n}\n\n/** Aggregate file operations across all entries for mode:touched. */\nexport function getTouchedFiles(\n messages: Message[],\n rendered: RenderedEntry[],\n): TouchedFile[] {\n const map = new Map<string, TouchedFile>();\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n const indicators = getFileIndicators(msg);\n for (const fm of indicators) {\n const index = rendered[i]?.index ?? i;\n if (!map.has(fm.path)) {\n map.set(fm.path, { path: fm.path, entries: [] });\n }\n map.get(fm.path)!.entries.push({ index, toolName: fm.toolName });\n }\n }\n return Array.from(map.values());\n}\n\nexport const searchEntries = (\n entries: RenderedEntry[],\n messages: Message[],\n query?: string,\n _page?: number,\n mode?: RecallMode,\n): SearchHit[] => {\n if (!query?.trim()) return entries;\n\n const rawQuery = query.trim();\n\n // If query looks like a single regex pattern (contains metacharacters),\n // treat the whole thing as one pattern — don't split into terms\n if (looksLikeRegex(rawQuery)) {\n const regex = safeRegex(rawQuery);\n const hits: SearchHit[] = [];\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i];\n const msg = messages[i];\n const text = msg ? fullText(msg, mode) : e.summary;\n const filePart = e.files?.join(\" \") ?? \"\";\n const hay = `${e.role} ${text} ${filePart}`;\n if (regex.test(hay)) {\n const snip = lineSnippet(text, regex);\n const fileMatches = computeFileMatches(msg, rawQuery);\n const extra = fileMatches.length > 0 ? { fileMatches } : {};\n hits.push({ ...e, snippet: snip, matchCount: 1, ...extra });\n }\n }\n return hits;\n }\n\n // Natural language / multi-word query: BM25 scoring\n const rawTerms = rawQuery.split(/\\s+/);\n const terms = filterStopwords(rawTerms);\n const snipRe = snippetRegex(terms);\n\n // Build all docs for BM25 context (cache fullText to avoid recomputing)\n const docs: string[] = [];\n const fullTextCache: string[] = [];\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i];\n const msg = messages[i];\n const text = msg ? fullText(msg, mode) : e.summary;\n fullTextCache.push(text);\n const filePart = e.files?.join(\" \") ?? \"\";\n docs.push(`${e.role} ${text} ${filePart}`);\n }\n\n const ctx = buildBM25Context(docs, terms);\n\n const scored: Array<{ hit: SearchHit; score: number }> = [];\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i];\n const hay = docs[i];\n const mc = countMatches(hay, terms);\n if (mc === 0) continue;\n const score = bm25Score(hay, terms, ctx);\n const text = fullTextCache[i];\n const snip = lineSnippet(text, snipRe);\n const fileMatches = computeFileMatches(messages[i], rawQuery);\n const extra = fileMatches.length > 0 ? { fileMatches } : {};\n scored.push({\n hit: { ...e, snippet: snip, matchCount: mc, ...extra },\n score,\n });\n }\n\n // Sort by BM25 score desc\n scored.sort((a, b) => b.score - a.score);\n return scored.map((s) => s.hit);\n};\n","import type { SearchHit, FileMatch, TouchedFile } from \"./search-entries\";\n\n// ── Path shortening ───────────────────────────────────────────────────────\n\nconst CWD = process.cwd();\n\n/**\n * Shorten an absolute file path for display:\n * - If within cwd, return `./relative/path`\n * - Otherwise, show last 3 path components with `.../` prefix\n * - Short paths (≤3 components) returned as-is\n */\nexport function shortPath(fullPath: string): string {\n // Normalize backslashes to forward slashes for cross-platform path handling\n const normalized = fullPath.replace(/\\\\/g, \"/\");\n const cwdNormalized = CWD.replace(/\\\\/g, \"/\");\n if (normalized.startsWith(cwdNormalized + \"/\")) {\n return \".\" + normalized.slice(cwdNormalized.length);\n }\n const parts = normalized.split(\"/\");\n if (parts.length > 3) {\n return \".../\" + parts.slice(-3).join(\"/\");\n }\n return normalized;\n}\n\n// ── File indicator formatting ─────────────────────────────────────────────\n\n/** Render one file indicator line with shortened path. */\nfunction formatFileMatch(\n fm: FileMatch,\n index: number,\n isQuery: boolean,\n): string {\n const label = isQuery\n ? fm.lineCount === 1\n ? \"match\"\n : \"matches\"\n : fm.lineCount === 1\n ? \"line\"\n : \"lines\";\n const displayPath = shortPath(fm.path);\n let line = ` [${fm.toolName}] ${displayPath} — ${fm.lineCount} ${label} use #${index}:${fm.path}`;\n if (fm.snippet) {\n line += `\\n | ${fm.snippet}`;\n }\n return line;\n}\n\n// ── Touched file output ───────────────────────────────────────────────────\n\nconst TOUCHED_PAGE_SIZE = 5;\n\n/**\n * Format aggregated \"files touched\" output.\n */\nexport function formatTouchedOutput(\n touched: TouchedFile[],\n page?: number,\n pageSize?: number,\n): string {\n if (touched.length === 0) {\n return \"No file operations found in session history.\";\n }\n\n const ps = pageSize ?? TOUCHED_PAGE_SIZE;\n const totalPages = Math.ceil(touched.length / ps);\n const currentPage = Math.max(1, page ?? 1);\n const start = (currentPage - 1) * ps;\n const pageFiles = touched.slice(start, start + ps);\n\n const header =\n totalPages > 1\n ? `Page ${currentPage}/${totalPages} (${touched.length} total files)`\n : `${touched.length} files touched`;\n\n const lines = pageFiles.map((tf) => {\n const displayPath = shortPath(tf.path);\n const indices = tf.entries\n .map((e) => `#${e.index} (${e.toolName})`)\n .join(\", \");\n return ` ${displayPath} ${indices}`;\n });\n\n let result = `${header}:\\n\\n${lines.join(\"\\n\")}`;\n\n if (currentPage < totalPages) {\n result += `\\n\\n--- Use page:${currentPage + 1} for more results ---`;\n }\n\n return result;\n}\n\nexport const formatRecallOutput = (\n entries: SearchHit[],\n query?: string,\n headerOverride?: string,\n): string => {\n if (entries.length === 0) {\n return query\n ? `No matches for \"${query}\" in session history.`\n : \"No entries in session history.\";\n }\n\n const header = headerOverride\n ? `${headerOverride} for \"${query}\":`\n : query\n ? `Found ${entries.length} matches for \"${query}\":`\n : `Session history (${entries.length} entries):`;\n\n const lines = entries.map((e) => {\n const body = query && e.snippet ? e.snippet : e.summary;\n let line = `#${e.index} [${e.role}]`;\n\n // Entry text on next line if it's long or has fileMatches\n if (e.fileMatches?.length) {\n line += `\\n ${body}`;\n // Only show top 3 file matches\n const isQuery = Boolean(query);\n const topFileMatches = e.fileMatches.slice(0, 3);\n for (const fm of topFileMatches) {\n line += `\\n${formatFileMatch(fm, e.index, isQuery)}`;\n }\n if (e.fileMatches.length > 3) {\n line += `\\n ...(${e.fileMatches.length - 3} more file matches)`;\n }\n } else if (e.files?.length) {\n // Fallback: entries without fileMatches (e.g. expand-only path) still have\n // the legacy .files array from renderMessage — show it in old format.\n const fileSuffix = ` files:[${e.files.join(\", \")}]`;\n line += `${fileSuffix} ${body}`;\n } else {\n line += ` ${body}`;\n }\n\n return line;\n });\n\n return `${header}\\n\\n${lines.join(\"\\n\\n\")}`;\n};\n","export interface LineageEntryLike {\n id?: string;\n}\n\nexport interface LineageSessionManagerLike {\n getBranch: () => LineageEntryLike[];\n getEntries?: () => LineageEntryLike[];\n}\n\nexport const getActiveLineageEntryIds = (\n sessionManager: LineageSessionManagerLike,\n): Set<string> => {\n try {\n const branch = sessionManager.getBranch() ?? [];\n if (branch.length > 0) {\n return new Set(\n branch.map((e) => e.id).filter((id): id is string => Boolean(id)),\n );\n }\n } catch {\n // fall through to defensive fallback\n }\n\n try {\n const all = sessionManager.getEntries?.() ?? [];\n return new Set(\n all.map((e) => e.id).filter((id): id is string => Boolean(id)),\n );\n } catch {\n return new Set();\n }\n};\n","export type RecallScope = \"lineage\" | \"all\";\nexport type RecallMode = \"hybrid\" | \"file\" | \"touched\";\n\nconst SCOPE_RE = /\\bscope:(lineage|all)\\b/i;\nconst MODE_RE = /\\bmode:(hybrid|file|touched)\\b/i;\n\nconst VALID_MODES = new Set([\"hybrid\", \"file\", \"touched\"]);\n\nexport const normalizeRecallScope = (scope?: unknown): RecallScope =>\n typeof scope === \"string\" && scope.toLowerCase() === \"all\"\n ? \"all\"\n : \"lineage\";\n\nexport const normalizeRecallMode = (mode?: unknown): RecallMode =>\n typeof mode === \"string\" && VALID_MODES.has(mode.toLowerCase())\n ? (mode.toLowerCase() as RecallMode)\n : \"hybrid\";\n\nexport const parseRecallScope = (\n text: string,\n): { scope: RecallScope; mode: RecallMode; text: string } => {\n const scopeMatch = text.match(SCOPE_RE);\n const modeMatch = text.match(MODE_RE);\n return {\n scope: normalizeRecallScope(scopeMatch?.[1]),\n mode: normalizeRecallMode(modeMatch?.[1]),\n text: text\n .replace(SCOPE_RE, \"\")\n .replace(MODE_RE, \"\")\n .replace(/\\s+/g, \" \")\n .trim(),\n };\n};\n","/**\n * Reverse recall — given session entry IDs, find related OM observations/reflections.\n *\n * This is the vcc→OM direction: when expanding session entries, look up\n * observations whose sourceEntryIds contain those entry IDs.\n */\nimport { indexLedger, type Entry } from \"./ledger/recall.js\";\nimport { type RenderedEntry } from \"../core/render-entries.js\";\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\nexport interface RelatedObservation {\n memoryId: string;\n content: string;\n timestamp: string;\n relevance: string;\n status: \"active\" | \"dropped\";\n matchedEntryIds: string[];\n}\n\nexport interface RelatedReflection {\n memoryId: string;\n content: string;\n}\n\n// ── Lookup ────────────────────────────────────────────────────────────────\n\nexport function findObservationsForEntryIds(\n entries: Entry[],\n targetEntryIds: string[],\n): RelatedObservation[] {\n if (targetEntryIds.length === 0) return [];\n const { observations, droppedIds } = indexLedger(entries);\n const targetSet = new Set(targetEntryIds);\n\n const result: RelatedObservation[] = [];\n for (const indexed of observations) {\n const matched = indexed.observation.sourceEntryIds.filter((id) =>\n targetSet.has(id),\n );\n if (matched.length > 0) {\n result.push({\n memoryId: indexed.observation.id,\n content: indexed.observation.content,\n timestamp: indexed.observation.timestamp,\n relevance: indexed.observation.relevance,\n status: droppedIds.has(indexed.observation.id) ? \"dropped\" : \"active\",\n matchedEntryIds: matched,\n });\n }\n }\n return result;\n}\n\nexport function findReflectionsForEntryIds(\n entries: Entry[],\n targetEntryIds: string[],\n): RelatedReflection[] {\n if (targetEntryIds.length === 0) return [];\n const { reflections, observations } = indexLedger(entries);\n // Reflections don't directly reference entry IDs — they reference observation IDs.\n // So we only match indirectly: first find observations for these entry IDs,\n // then find reflections that support those observations.\n const targetSet = new Set(targetEntryIds);\n const matchingObsIds = new Set<string>();\n for (const indexed of observations) {\n if (indexed.observation.sourceEntryIds.some((id) => targetSet.has(id))) {\n matchingObsIds.add(indexed.observation.id);\n }\n }\n if (matchingObsIds.size === 0) return [];\n return reflections\n .filter((r) =>\n r.reflection.supportingObservationIds.some((id) =>\n matchingObsIds.has(id),\n ),\n )\n .map((r) => ({\n memoryId: r.reflection.id,\n content: r.reflection.content,\n }));\n}\n\n// ── Formatters ────────────────────────────────────────────────────────────\n\nexport function formatRelatedObservations(\n observations: RelatedObservation[],\n reflections: RelatedReflection[],\n): string {\n const parts: string[] = [];\n\n if (observations.length > 0) {\n parts.push(\"Related observations:\");\n for (const obs of observations) {\n const dropped = obs.status === \"dropped\" ? \" [dropped]\" : \"\";\n const entryRefs =\n obs.matchedEntryIds.length > 0\n ? ` (${obs.matchedEntryIds.join(\", \")})`\n : \"\";\n parts.push(\n ` [${obs.memoryId}]${dropped} ${obs.timestamp} [${obs.relevance}] ${obs.content}${entryRefs}`,\n );\n }\n }\n\n if (reflections.length > 0) {\n if (parts.length > 0) parts.push(\"\");\n parts.push(\"Related reflections:\");\n for (const ref of reflections) {\n parts.push(` [${ref.memoryId}] ${ref.content}`);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\n/**\n * Build a session-entry-id → message-index map from RenderedEntry[].\n * Used to annotate source entries with their #N indices.\n */\nexport function buildIndexMap(rendered: RenderedEntry[]): Map<string, number> {\n const map = new Map<string, number>();\n for (const entry of rendered) {\n if (entry.id && !map.has(entry.id)) {\n map.set(entry.id, entry.index);\n }\n }\n return map;\n}\n\nexport function formatEntryIndexAnnotation(\n sourceEntryIds: string[],\n idToIndex: Map<string, number>,\n): string {\n const indices: number[] = [];\n for (const id of sourceEntryIds) {\n const idx = idToIndex.get(id);\n if (idx !== undefined) indices.push(idx);\n }\n if (indices.length === 0) return \"\";\n indices.sort((a, b) => a - b);\n return `(at index #${indices.join(\", #\")})`;\n}\n","/**\n * /blackhole-recall command — search session history.\n *\n * Upstream: https://github.com/sting8k/pi-vcc (src/commands/vcc-recall.ts)\n * Ported and renamed to /blackhole-recall for blackhole.\n */\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { loadAllMessages } from \"../core/load-messages.js\";\nimport { searchEntries, getTouchedFiles } from \"../core/search-entries.js\";\nimport {\n formatRecallOutput,\n formatTouchedOutput,\n} from \"../core/format-recall.js\";\nimport { getActiveLineageEntryIds } from \"../core/lineage.js\";\nimport { parseRecallScope } from \"../core/recall-scope.js\";\nimport {\n findObservationsForEntryIds,\n findReflectionsForEntryIds,\n formatRelatedObservations,\n} from \"../om/reverse-recall.js\";\nimport type { Entry } from \"../om/ledger/recall.js\";\n\nconst PAGE_SIZE = 5;\nconst DEFAULT_RECENT = 25;\n\nasync function augmentWithObservations(\n output: string,\n rendered: { id: string }[],\n ctx: any,\n): Promise<string> {\n const ids = rendered.map((e) => e.id).filter(Boolean);\n if (ids.length === 0) return output;\n try {\n const branchEntries = ctx.sessionManager.getBranch() as Entry[];\n const obs = findObservationsForEntryIds(branchEntries, ids);\n const refs = findReflectionsForEntryIds(branchEntries, ids);\n if (obs.length > 0 || refs.length > 0) {\n return output + \"\\n\\n\" + formatRelatedObservations(obs, refs);\n }\n } catch {\n /* branch may not be available */\n }\n return output;\n}\n\nexport const registerVccRecallCommand = (pi: ExtensionAPI) => {\n pi.registerCommand(\"blackhole-recall\", {\n description:\n \"Search session history. Defaults to active lineage. Usage: /blackhole-recall <query> [page:N] [scope:all] [mode:file|touched]\",\n handler: async (args: string, ctx) => {\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (!sessionFile) {\n ctx.ui.notify(\"No session file available.\", \"error\");\n return;\n }\n\n const raw = args.trim();\n const parsed = parseRecallScope(raw);\n const lineageEntryIds =\n parsed.scope === \"lineage\"\n ? getActiveLineageEntryIds(ctx.sessionManager)\n : undefined;\n const mode = parsed.mode;\n\n if (mode === \"touched\") {\n const pageMatch = raw.match(/\\bpage:(\\d+)\\b/i);\n const page = pageMatch ? Math.max(1, parseInt(pageMatch[1], 10)) : 1;\n const { rendered, rawMessages } = loadAllMessages(\n sessionFile,\n false,\n lineageEntryIds,\n );\n const touched = getTouchedFiles(rawMessages, rendered);\n const text = formatTouchedOutput(touched, page);\n pi.sendMessage(\n { customType: \"blackhole-recall\", content: text, display: true },\n { triggerTurn: true },\n );\n return;\n }\n\n if (!parsed.text) {\n // No query: show recent entries\n const { rendered } = loadAllMessages(\n sessionFile,\n false,\n lineageEntryIds,\n );\n const recent = rendered.slice(-DEFAULT_RECENT);\n const base =\n (parsed.scope === \"all\" ? \"Scope: all\\n\\n\" : \"\") +\n formatRecallOutput(recent);\n const output = await augmentWithObservations(base, recent, ctx);\n pi.sendMessage(\n { customType: \"blackhole-recall\", content: output, display: true },\n { triggerTurn: true },\n );\n return;\n }\n\n // Parse page:N from args\n const pageMatch = parsed.text.match(/\\bpage:(\\d+)\\b/i);\n const page = pageMatch ? Math.max(1, parseInt(pageMatch[1], 10)) : 1;\n const query = parsed.text.replace(/\\bpage:\\d+\\b/i, \"\").trim();\n\n if (!query) {\n const { rendered } = loadAllMessages(\n sessionFile,\n false,\n lineageEntryIds,\n );\n const recent = rendered.slice(-DEFAULT_RECENT);\n const base =\n (parsed.scope === \"all\" ? \"Scope: all\\n\\n\" : \"\") +\n formatRecallOutput(recent);\n const output = await augmentWithObservations(base, recent, ctx);\n pi.sendMessage(\n { customType: \"blackhole-recall\", content: output, display: true },\n { triggerTurn: true },\n );\n return;\n }\n\n const { rendered, rawMessages } = loadAllMessages(\n sessionFile,\n false,\n lineageEntryIds,\n );\n const allResults = searchEntries(\n rendered,\n rawMessages,\n query,\n undefined,\n mode,\n );\n\n const start = (page - 1) * PAGE_SIZE;\n const pageResults = allResults.slice(start, start + PAGE_SIZE);\n const totalPages = Math.ceil(allResults.length / PAGE_SIZE);\n const scopeSuffix = parsed.scope === \"all\" ? \" (scope: all)\" : \"\";\n const header =\n totalPages > 1\n ? `Page ${page}/${totalPages} (${allResults.length} total matches${scopeSuffix})`\n : `${allResults.length} matches${scopeSuffix}`;\n const footer =\n page < totalPages\n ? `\\n--- /blackhole-recall ${query}${parsed.scope === \"all\" ? \" scope:all\" : \"\"} page:${page + 1} ---`\n : \"\";\n const base = formatRecallOutput(pageResults, query, header) + footer;\n const output = await augmentWithObservations(base, pageResults, ctx);\n pi.sendMessage(\n { customType: \"blackhole-recall\", content: output, display: true },\n { triggerTurn: true },\n );\n },\n });\n};\n","/**\n * Bridge streamSimple to support custom providers via global Symbol.for().\n *\n * When a custom provider is registered (via index.ts at startup), its stream\n * function is stored under a shared global symbol. This module provides the\n * bridge logic so all OM agents (observer, reflector, dropper) use the same\n * custom-provider resolution instead of each duplicating the 15-line function.\n */\ninterface RegisteredProviderConfig {\n api?: string;\n streamSimple?: Function;\n}\n\ninterface ProviderRegistry {\n getRegisteredProviderIds?: () => readonly string[];\n getRegisteredProviderConfig?: (\n providerId: string,\n ) => RegisteredProviderConfig | undefined;\n registeredProviders?: Map<string, RegisteredProviderConfig>;\n}\n\nexport function captureRegisteredProviderStreams(\n registry: ProviderRegistry,\n providerStreams: Map<string, Function>,\n): void {\n if (\n registry.getRegisteredProviderIds &&\n registry.getRegisteredProviderConfig\n ) {\n for (const providerId of registry.getRegisteredProviderIds()) {\n const config = registry.getRegisteredProviderConfig(providerId);\n if (\n config?.streamSimple &&\n config.api &&\n !providerStreams.has(config.api)\n ) {\n providerStreams.set(config.api, config.streamSimple);\n }\n }\n return;\n }\n\n registry.registeredProviders?.forEach((config) => {\n if (config.streamSimple && config.api && !providerStreams.has(config.api)) {\n providerStreams.set(config.api, config.streamSimple);\n }\n });\n}\n\nexport function createBridgeStreamFn(streamSimple: any) {\n const PROVIDER_STREAMS_KEY = Symbol.for(\"pi-blackhole:provider-streams\");\n return (model: any, ctx: any, opts: any) => {\n const providerStreams: Map<string, Function> | undefined = (\n globalThis as any\n )[PROVIDER_STREAMS_KEY];\n if (!providerStreams) return streamSimple(model, ctx, opts);\n const customFn = model?.api ? providerStreams.get(model.api) : undefined;\n return customFn\n ? customFn(model, ctx, opts)\n : streamSimple(model, ctx, opts);\n };\n}\n","import type { Model } from \"@earendil-works/pi-ai\";\nimport type { OmModelConfig } from \"../core/unified-config.js\";\n\nexport const AGENT_LOOP_MAX_TOKENS = 32_000;\n\nexport function boundedMaxTokens(\n model: Model<any>,\n requested: number = AGENT_LOOP_MAX_TOKENS,\n): number {\n return typeof model.maxTokens === \"number\" && model.maxTokens > 0\n ? Math.min(model.maxTokens, requested)\n : requested;\n}\n\n/**\n * Get the effective context window for a resolved model.\n *\n * Resolution order:\n * 1. Config override on the model config (OmModelConfig.contextWindow)\n * 2. Pi's model registry value (model.contextWindow)\n * 3. Fallback default (128000)\n */\nexport function effectiveContextWindow(\n resolvedModel: Model<any>,\n modelConfig?: OmModelConfig,\n): number {\n if (\n modelConfig?.contextWindow !== undefined &&\n modelConfig.contextWindow > 0\n ) {\n return modelConfig.contextWindow;\n }\n if (\n resolvedModel &&\n typeof resolvedModel.contextWindow === \"number\" &&\n resolvedModel.contextWindow > 0\n ) {\n return resolvedModel.contextWindow;\n }\n return 128_000;\n}\n","export const DROPPER_SYSTEM = `You are the dropper agent for a coding assistant.\n\nThese records are the ONLY information the assistant will have about past interactions once the raw conversation is compacted out of context. Dropping the wrong observation can make future work repeat, contradict, or misremember the user. Take this seriously.\n\nYour job is to identify only the safest active observations to remove from compacted memory by calling drop_observations with their ids. Default action is KEEP. When uncertain, keep the observation.\n\nActive-memory framing. Dropping an observation removes it from active compacted memory; it does not erase the ledger history or source evidence. Still, future compressed context will no longer show the observation, so only drop it when its durable meaning is safely captured elsewhere or it is genuinely low-signal and carries no unique future value.\n\nThe user message includes the active observation pool target and \"Maximum drops allowed this run\". The maximum is a hard upper bound sized to move the pool toward the target if every proposed drop is clearly safe. It is not a target. Do not try to fill it. Drop fewer or none when fewer observations are safely removable. When the active pool is far over target, make a thorough pass over safe candidates rather than stopping after a few obvious examples.\n\nWhat to drop, in priority order:\n- Redundant observations whose durable meaning is already captured by current reflections with equivalent fidelity.\n- Superseded observations where a later observation clearly replaces the older state.\n- Repeated routine tool acknowledgements or low-signal progress updates that do not carry decisions, constraints, exact errors, or user-specific facts.\n- Older observations that no longer carry working context and are covered by a reflection or a newer observation.\n\nAge-gradient rule. Recent observations carry working context the assistant may still need; older observations have usually been summarized elsewhere or are no longer load-bearing. Prefer older safe drops before newer working context, but age alone is not enough to drop important or uniquely load-bearing observations.\n\nReflection coverage guidance. Each observation line includes [coverage: none|partial|strong]. Coverage is evidence, not an automatic decision:\n- none: no current reflection cites this observation id. Be cautious, especially for high or critical observations.\n- partial: one current reflection cites this observation id. Compare the observation to the reflection before dropping.\n- strong: two or more current reflections cite this observation id. This is stronger evidence that the durable meaning is preserved, but you must still keep uniquely load-bearing or uncertain observations.\n\nRelevance guidance. Relevance is importance/resistance, not an absolute keep/drop lock:\n- low: consider first, but drop only when it carries no unique detail, decision, state, error, identifier, or user-specific fact.\n- medium: drop when redundant with reflections or other observations, or when the work state is clearly obsolete.\n- high: drop only when clearly superseded or already captured by a reflection with equivalent fidelity.\n- critical: highest importance and strongest resistance. Do not drop fresh or uniquely load-bearing critical observations. Critical observations may be dropped only with strong semantic evidence such as age plus partial/strong reflection coverage, supersession by newer memory, redundancy, or clear obsolescence.\n\nUser assertions and concrete completions must be preserved unless a current reflection or newer observation preserves the exact assertion/completion and its important details with equivalent fidelity.\n\nPreservation floor. Regardless of relevance label, budget pressure, coverage, or age, do not drop observations that uniquely carry any of the following:\n- User preferences, constraints, corrections, or identity/role facts.\n- Concrete completions that future runs must not redo.\n- Named identifiers, file paths, function names, package names, tickets, commit SHAs, handles, or exact commands.\n- Exact error messages, diagnostic output, or test failure names.\n- Architectural or technical decisions and their rationale.\n- Dates of specific events, deadlines, meetings, migrations, or incidents.\n- Current unresolved blockers, TODOs, partial work, or decisions waiting on the user.\n- Non-standard user terminology or unusual phrasing needed for future recognition.\n\nWhat you cannot do:\n- You cannot merge observations.\n- You cannot rewrite or edit observations.\n- You cannot add new observations or reflections.\n- You can only call drop_observations with ids from the current observations list.\n\nDo not force drops you do not believe in. If no observations are safe to drop, do not call the tool and reply briefly. Hitting the budget or maximum count is less important than preserving load-bearing memory.`;\n","import type { Observation, Reflection } from \"../../ledger/index.js\";\n\nexport const REFLECTION_COVERAGE_TIERS = [\"none\", \"partial\", \"strong\"] as const;\nexport type ReflectionCoverageTier = (typeof REFLECTION_COVERAGE_TIERS)[number];\n\ntype Relevance = Observation[\"relevance\"];\n\ntype CoverageBucket = Record<\n ReflectionCoverageTier,\n { count: number; tokens: number }\n>;\nexport type CoverageSummaryByRelevance = Record<Relevance, CoverageBucket>;\nexport type CoverageTransitionSummaryByRelevance = Record<\n Relevance,\n Record<string, { count: number; tokens: number }>\n>;\n\nexport const REFLECTION_COVERAGE_DROP_RANK: Record<\n ReflectionCoverageTier,\n number\n> = {\n strong: 0,\n partial: 1,\n none: 2,\n};\n\nexport function reflectionSupportCounts(\n reflections: readonly Reflection[],\n): Map<string, number> {\n const counts = new Map<string, number>();\n for (const reflection of reflections) {\n const uniqueIds = new Set(reflection.supportingObservationIds);\n for (const id of uniqueIds) counts.set(id, (counts.get(id) ?? 0) + 1);\n }\n return counts;\n}\n\nexport function reflectionCoverageTierForCount(\n count: number,\n): ReflectionCoverageTier {\n if (count <= 0) return \"none\";\n if (count === 1) return \"partial\";\n return \"strong\";\n}\n\nexport function reflectionCoverageMap(\n observations: readonly Observation[],\n reflections: readonly Reflection[],\n): Map<string, ReflectionCoverageTier> {\n const counts = reflectionSupportCounts(reflections);\n return new Map(\n observations.map((observation) => [\n observation.id,\n reflectionCoverageTierForCount(counts.get(observation.id) ?? 0),\n ]),\n );\n}\n\nfunction emptyCoverageBucket(): CoverageBucket {\n return {\n none: { count: 0, tokens: 0 },\n partial: { count: 0, tokens: 0 },\n strong: { count: 0, tokens: 0 },\n };\n}\n\nexport function emptyCoverageSummaryByRelevance(): CoverageSummaryByRelevance {\n return {\n low: emptyCoverageBucket(),\n medium: emptyCoverageBucket(),\n high: emptyCoverageBucket(),\n critical: emptyCoverageBucket(),\n };\n}\n\nexport function summarizeCoverageByRelevance(\n observations: readonly Observation[],\n coverageById: ReadonlyMap<string, ReflectionCoverageTier>,\n): CoverageSummaryByRelevance {\n const summary = emptyCoverageSummaryByRelevance();\n for (const observation of observations) {\n const tier = coverageById.get(observation.id) ?? \"none\";\n const bucket = summary[observation.relevance][tier];\n bucket.count++;\n bucket.tokens += observation.tokenCount;\n }\n return summary;\n}\n\nexport function summarizeCoverageByRelevanceForIds(\n ids: readonly string[],\n observations: readonly Observation[],\n coverageById: ReadonlyMap<string, ReflectionCoverageTier>,\n): CoverageSummaryByRelevance {\n const byId = new Map(\n observations.map((observation) => [observation.id, observation]),\n );\n const selected = ids.flatMap((id) => {\n const observation = byId.get(id);\n return observation ? [observation] : [];\n });\n return summarizeCoverageByRelevance(selected, coverageById);\n}\n\nexport function emptyCoverageTransitionSummaryByRelevance(): CoverageTransitionSummaryByRelevance {\n return {\n low: {},\n medium: {},\n high: {},\n critical: {},\n };\n}\n\nexport function summarizeCoverageTransitionsByRelevance(\n observations: readonly Observation[],\n beforeCoverageById: ReadonlyMap<string, ReflectionCoverageTier>,\n afterCoverageById: ReadonlyMap<string, ReflectionCoverageTier>,\n): CoverageTransitionSummaryByRelevance {\n const summary = emptyCoverageTransitionSummaryByRelevance();\n for (const observation of observations) {\n const before = beforeCoverageById.get(observation.id) ?? \"none\";\n const after = afterCoverageById.get(observation.id) ?? \"none\";\n if (before === after) continue;\n const key = `${before}->${after}`;\n const bucket = summary[observation.relevance][key] ?? {\n count: 0,\n tokens: 0,\n };\n bucket.count++;\n bucket.tokens += observation.tokenCount;\n summary[observation.relevance][key] = bucket;\n }\n return summary;\n}\n\nexport function observationToDropperLine(\n observation: Observation,\n coverage: ReflectionCoverageTier,\n): string {\n return `[${observation.id}] ${observation.timestamp} [${observation.relevance}] [coverage: ${coverage}] ${observation.content}`;\n}\n\nexport function coverageTierForObservation(\n observation: Observation,\n coverageById: ReadonlyMap<string, ReflectionCoverageTier>,\n): ReflectionCoverageTier {\n return coverageById.get(observation.id) ?? \"none\";\n}\n","/**\n * Dropper agent — uses agentLoop to propose prunable observations.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/agents/dropper/agent.ts)\n * Modified by pi-vcc-om: detects agent_end stopReason=\"error\" in the stream\n * and throws if the API errored without collecting any drop candidates.\n */\nimport {\n agentLoop,\n type AgentContext,\n type AgentLoopConfig,\n type AgentTool,\n} from \"@earendil-works/pi-agent-core\";\nimport type { Message, Model, ModelThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { createBridgeStreamFn } from \"../../provider-stream.js\";\nimport { streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { Type } from \"typebox\";\nimport type { Static } from \"typebox\";\nimport { debugLog } from \"../../debug-log.js\";\nimport { AGENT_LOOP_MAX_TOKENS, boundedMaxTokens } from \"../../model-budget.js\";\nimport {\n reflectionToSummaryLine,\n type Observation,\n type Reflection,\n} from \"../../ledger/index.js\";\nimport { DROPPER_SYSTEM } from \"./prompts.js\";\nimport {\n REFLECTION_COVERAGE_DROP_RANK,\n coverageTierForObservation,\n observationToDropperLine,\n reflectionCoverageMap,\n summarizeCoverageByRelevance,\n summarizeCoverageByRelevanceForIds,\n} from \"./coverage.js\";\n\ninterface RunDropperArgs {\n model: Model<any>;\n apiKey: string;\n headers?: Record<string, string>;\n reflections: Reflection[];\n observations: Observation[];\n /** Compact summary of existing active observations for context. */\n existingObservationsSummary?: string;\n budgetTokens: number;\n /** Minimum pool fullness (fraction of budget) before dropping is allowed.\n * Defaults to DROP_SKIP_FULLNESS (0.1) when unset. */\n skipFullness?: number;\n signal?: AbortSignal;\n agentLoop?: typeof agentLoop;\n /** Optional custom stream function bypassing agentLoop's default streamSimple.\n * Used by the Symbol.for bridge to access native pi-ai provider registrations\n * from jiti-loaded consolidation agents. */\n streamFn?: (model: any, context: any, options: any) => any;\n maxTurns?: number;\n thinkingLevel?: ModelThinkingLevel;\n}\n\nconst DROP_SKIP_FULLNESS = 0.1;\nconst DROP_LOW_URGENCY_FULLNESS = 0.3;\nconst DROP_MEDIUM_URGENCY_FULLNESS = 0.6;\nconst DROP_MAX_FULLNESS = 1.0;\nconst DROP_MIN_RATIO = 0.1;\nconst DROP_MAX_RATIO = 0.5;\n\nexport type DropUrgency = \"low\" | \"medium\" | \"high\";\n\nconst RELEVANCE_DROP_RANK: Record<Observation[\"relevance\"], number> = {\n low: 0,\n medium: 1,\n high: 2,\n critical: 3,\n};\n\nconst DropObservationsSchema = Type.Object({\n ids: Type.Array(Type.String({ minLength: 1 }), { minItems: 1 }),\n reason: Type.Optional(Type.String()),\n});\n\ntype DropObservationsArgs = Static<typeof DropObservationsSchema>;\n\nfunction joinOrEmpty(items: string[]): string {\n return items.length ? items.join(\"\\n\") : \"(none yet)\";\n}\n\nexport function observationPoolFullness(\n observationTokens: number,\n budgetTokens: number,\n): number {\n if (!Number.isFinite(observationTokens) || observationTokens <= 0) return 0;\n if (!Number.isFinite(budgetTokens) || budgetTokens <= 0) return 0;\n return observationTokens / budgetTokens;\n}\n\nexport function dropUrgencyForFullness(fullness: number): DropUrgency {\n if (fullness < DROP_LOW_URGENCY_FULLNESS) return \"low\";\n if (fullness < DROP_MEDIUM_URGENCY_FULLNESS) return \"medium\";\n return \"high\";\n}\n\nexport function maxDropCountForPool(\n observations: readonly Observation[],\n observationTokens: number,\n budgetTokens: number,\n skipFullness: number = DROP_SKIP_FULLNESS,\n): number {\n const droppableCount = observations.filter(\n (observation) => observation.relevance !== \"critical\",\n ).length;\n if (droppableCount === 0) return 0;\n\n const fullness = observationPoolFullness(observationTokens, budgetTokens);\n if (fullness < skipFullness) return 0;\n\n const cappedFullness = Math.min(\n DROP_MAX_FULLNESS,\n Math.max(skipFullness, fullness),\n );\n const dropRatio =\n DROP_MIN_RATIO +\n ((cappedFullness - skipFullness) / (DROP_MAX_FULLNESS - skipFullness)) *\n (DROP_MAX_RATIO - DROP_MIN_RATIO);\n return Math.max(1, Math.floor(droppableCount * dropRatio));\n}\n\nfunction relevanceCounts(\n observations: readonly Observation[],\n): Record<Observation[\"relevance\"], number> {\n return observations.reduce<Record<Observation[\"relevance\"], number>>(\n (counts, observation) => {\n if (observation.relevance in counts) counts[observation.relevance]++;\n return counts;\n },\n { low: 0, medium: 0, high: 0, critical: 0 },\n );\n}\n\nexport function normalizeDropObservationIds(\n ids: readonly string[] | undefined,\n observations: readonly Observation[],\n): string[] | undefined {\n if (!ids || ids.length === 0) return undefined;\n const allowed = new Map(\n observations.map((observation) => [observation.id, observation]),\n );\n const result: string[] = [];\n const seen = new Set<string>();\n for (const id of ids) {\n const observation = allowed.get(id);\n if (!observation) continue;\n if (seen.has(id)) continue;\n seen.add(id);\n result.push(id);\n }\n return result.length > 0 ? result : undefined;\n}\n\nfunction timestampRank(timestamp: string): number {\n const parsed = Date.parse(timestamp);\n return Number.isFinite(parsed) ? parsed : Number.POSITIVE_INFINITY;\n}\n\nexport function selectDropCandidates(\n ids: readonly string[],\n observations: readonly Observation[],\n maxDrops: number,\n reflections: readonly Reflection[] = [],\n): string[] {\n if (maxDrops <= 0 || ids.length === 0) return [];\n\n const byId = new Map(\n observations.map((observation) => [observation.id, observation]),\n );\n const coverageById = reflectionCoverageMap(observations, reflections);\n const firstProposalIndex = new Map<string, number>();\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i];\n if (!firstProposalIndex.has(id)) firstProposalIndex.set(id, i);\n }\n\n return Array.from(firstProposalIndex.entries())\n .map(([id, index]) => ({ id, index, observation: byId.get(id) }))\n .filter(\n (\n candidate,\n ): candidate is { id: string; index: number; observation: Observation } =>\n candidate.observation !== undefined,\n )\n .sort((a, b) => {\n const coverageDelta =\n REFLECTION_COVERAGE_DROP_RANK[\n coverageTierForObservation(a.observation, coverageById)\n ] -\n REFLECTION_COVERAGE_DROP_RANK[\n coverageTierForObservation(b.observation, coverageById)\n ];\n const relevanceDelta =\n RELEVANCE_DROP_RANK[a.observation.relevance] -\n RELEVANCE_DROP_RANK[b.observation.relevance];\n const aAge = timestampRank(a.observation.timestamp);\n const bAge = timestampRank(b.observation.timestamp);\n const ageDelta = aAge === bAge ? 0 : aAge - bAge;\n return coverageDelta || relevanceDelta || ageDelta || a.index - b.index;\n })\n .slice(0, maxDrops)\n .map((candidate) => candidate.id);\n}\n\nexport async function runDropper(\n args: RunDropperArgs,\n): Promise<string[] | undefined> {\n const {\n model,\n apiKey,\n headers,\n reflections,\n observations,\n budgetTokens,\n skipFullness,\n signal,\n } = args;\n if (observations.length === 0) return undefined;\n\n const observationTokens = observations.reduce(\n (sum, observation) => sum + observation.tokenCount,\n 0,\n );\n const fullness = observationPoolFullness(observationTokens, budgetTokens);\n const urgency = dropUrgencyForFullness(fullness);\n const maxDropsAllowed = maxDropCountForPool(\n observations,\n observationTokens,\n budgetTokens,\n skipFullness,\n );\n const coverageById = reflectionCoverageMap(observations, reflections);\n const coverageSummaryByRelevance = summarizeCoverageByRelevance(\n observations,\n coverageById,\n );\n debugLog(\"dropper.agent_start\", {\n activeObservationCount: observations.length,\n reflectionCount: reflections.length,\n observationTokens,\n budgetTokens,\n fullness,\n urgency,\n maxDropsAllowed,\n relevanceCounts: relevanceCounts(observations),\n coverageSummaryByRelevance,\n });\n if (maxDropsAllowed <= 0) {\n debugLog(\"dropper.result\", {\n reason: \"not_over_target\",\n toolCallCount: 0,\n rawRequestedIdsCount: 0,\n acceptedCandidateCount: 0,\n selectedDropsCount: 0,\n selectedDropTokens: 0,\n selectedCoverageSummaryByRelevance: summarizeCoverageByRelevanceForIds(\n [],\n observations,\n coverageById,\n ),\n maxDropsAllowed,\n });\n return undefined;\n }\n\n const proposedDropIds: string[] = [];\n const proposed = new Set<string>();\n const allowed = new Map(\n observations.map((observation) => [observation.id, observation]),\n );\n let toolCallCount = 0;\n let rawRequestedIdsCount = 0;\n let missingIdsCount = 0;\n let criticalCandidateIdsCount = 0;\n let duplicateInRequestCount = 0;\n let duplicateInRunCount = 0;\n\n const dropObservations: AgentTool<typeof DropObservationsSchema> = {\n name: \"drop_observations\",\n label: \"Drop observations\",\n description:\n \"Propose active observation ids that are safe to remove from compacted memory.\",\n parameters: DropObservationsSchema,\n execute: async (_id, params: DropObservationsArgs) => {\n toolCallCount++;\n rawRequestedIdsCount += params.ids.length;\n const seenInRequest = new Set<string>();\n let added = 0;\n let requestMissingIds = 0;\n let requestCriticalCandidateIds = 0;\n let requestDuplicateIds = 0;\n let requestDuplicateInRunIds = 0;\n for (const id of params.ids) {\n const observation = allowed.get(id);\n if (!observation) {\n missingIdsCount++;\n requestMissingIds++;\n continue;\n }\n if (seenInRequest.has(id)) {\n duplicateInRequestCount++;\n requestDuplicateIds++;\n continue;\n }\n seenInRequest.add(id);\n if (proposed.has(id)) {\n duplicateInRunCount++;\n requestDuplicateInRunIds++;\n continue;\n }\n proposed.add(id);\n proposedDropIds.push(id);\n if (observation.relevance === \"critical\") {\n criticalCandidateIdsCount++;\n requestCriticalCandidateIds++;\n }\n added++;\n }\n debugLog(\"dropper.tool_call\", {\n toolCallCount,\n rawRequestedIdsCount: params.ids.length,\n acceptedIdsCount: added,\n missingIdsCount: requestMissingIds,\n criticalCandidateIdsCount: requestCriticalCandidateIds,\n duplicateInRequestCount: requestDuplicateIds,\n duplicateInRunCount: requestDuplicateInRunIds,\n totalCandidates: proposedDropIds.length,\n maxDropsAllowed,\n });\n return {\n content: [\n {\n type: \"text\",\n text: `Queued ${added} drop candidate${added === 1 ? \"\" : \"s\"}. Candidates this run: ${proposedDropIds.length}. Maximum drops allowed: ${maxDropsAllowed}.`,\n },\n ],\n details: {\n added,\n totalCandidates: proposedDropIds.length,\n maxDropsAllowed,\n },\n };\n },\n };\n\n const fullnessPercent = Math.round(fullness * 100);\n const existingObservationsContext = args.existingObservationsSummary\n ? `EXISTING ACTIVE OBSERVATIONS (for context only — these are NOT candidates for dropping):\\n${args.existingObservationsSummary}\\n\\n`\n : \"\";\n\n const userText = `CURRENT REFLECTIONS:\\n${joinOrEmpty(reflections.map(reflectionToSummaryLine))}\\n\\n${existingObservationsContext}NEW OBSERVATIONS TO EVALUATE FOR DROPPING:\\n${joinOrEmpty(observations.map((observation) => observationToDropperLine(observation, coverageTierForObservation(observation, coverageById))))}\\n\\nObservation pool pressure: ~${observationTokens.toLocaleString()} tokens; target budget: ~${budgetTokens.toLocaleString()} tokens; fullness: ~${fullnessPercent.toLocaleString()}%.\\nDrop urgency: ${urgency}.\\nMaximum drops allowed this run: ${maxDropsAllowed.toLocaleString()} observation${maxDropsAllowed === 1 ? \"\" : \"s\"}.\\nThis maximum is a hard upper bound, not a target. Drop fewer or none if fewer observations are clearly safe.`;\n const prompts: Message[] = [\n {\n role: \"user\",\n content: [{ type: \"text\", text: userText }],\n timestamp: Date.now(),\n },\n ];\n const context: AgentContext = {\n systemPrompt: DROPPER_SYSTEM,\n messages: [],\n tools: [dropObservations as AgentTool<any>],\n };\n const reasoning = (model as { reasoning?: unknown }).reasoning;\n const thinkingLevel = args.thinkingLevel ?? \"low\";\n const effectiveMaxTurns =\n args.maxTurns && args.maxTurns > 0 ? args.maxTurns : undefined;\n let turnCount = 0;\n const config: AgentLoopConfig = {\n model,\n apiKey,\n headers,\n maxTokens: boundedMaxTokens(model, AGENT_LOOP_MAX_TOKENS),\n convertToLlm: (msgs) => msgs as Message[],\n toolExecution: \"sequential\",\n ...(reasoning && thinkingLevel !== \"off\"\n ? { reasoning: thinkingLevel }\n : {}),\n ...(effectiveMaxTurns !== undefined\n ? { shouldStopAfterTurn: () => ++turnCount >= effectiveMaxTurns }\n : {}),\n };\n\n const loop = args.agentLoop ?? agentLoop;\n // ── Bridge stream function ──\n const bridgeStreamFn = createBridgeStreamFn(streamSimple);\n const streamFn = args.streamFn ?? bridgeStreamFn;\n const stream = loop(prompts, context, config, signal, streamFn);\n let agentError: string | undefined;\n for await (const event of stream) {\n // Tool execution collects candidate ids.\n if (event.type === \"agent_end\") {\n const msgs = ((event as any).messages || []) as Array<{\n stopReason?: string;\n errorMessage?: string;\n }>;\n const lastMsg = msgs[msgs.length - 1];\n if (lastMsg?.stopReason === \"error\") {\n agentError = lastMsg.errorMessage ?? \"Unknown API error\";\n }\n }\n }\n await stream.result();\n if (agentError && proposedDropIds.length === 0)\n throw new Error(`Dropper API error: ${agentError}`);\n const droppedIds = selectDropCandidates(\n proposedDropIds,\n observations,\n maxDropsAllowed,\n reflections,\n );\n const reason =\n droppedIds.length > 0\n ? \"selected_nonempty\"\n : toolCallCount === 0\n ? \"no_tool_call\"\n : proposedDropIds.length === 0\n ? \"all_filtered\"\n : \"selected_empty\";\n const selectedDropTokens = droppedIds.reduce(\n (sum, id) => sum + (allowed.get(id)?.tokenCount ?? 0),\n 0,\n );\n debugLog(\"dropper.result\", {\n reason,\n toolCallCount,\n rawRequestedIdsCount,\n missingIdsCount,\n criticalCandidateIdsCount,\n duplicateInRequestCount,\n duplicateInRunCount,\n acceptedCandidateCount: proposedDropIds.length,\n selectedDropsCount: droppedIds.length,\n selectedDropTokens,\n selectedCoverageSummaryByRelevance: summarizeCoverageByRelevanceForIds(\n droppedIds,\n observations,\n coverageById,\n ),\n maxDropsAllowed,\n });\n return droppedIds.length > 0 ? droppedIds : undefined;\n}\n","import { createHash } from \"node:crypto\";\n\nexport function hashId(content: string): string {\n return createHash(\"sha256\").update(content).digest(\"hex\").slice(0, 12);\n}\n","export const OBSERVER_SYSTEM = `You are the observation agent for a coding assistant.\n\nThese records are the ONLY information the assistant will have about past interactions once the raw conversation is compacted out of context. Anything you do not capture here will be forgotten. Anything you distort here will be remembered wrong. Take this seriously.\n\nYour job is to compress a chunk of recent conversation into timestamped, rated observations by calling the record_observations tool. The observations you emit — together with the reflections crystallized from them — are the assistant's ONLY memory of this session after the raw conversation falls out of context.\n\nYou receive:\n- Current reflections (long-lived facts already crystallized).\n- Current observations (already-recorded observations, each shown as \"[id] YYYY-MM-DD HH:MM [relevance] content\").\n- A new chunk of conversation with source entry labels and inline message timestamps. Each source block starts with \"[Source entry id: <id>]\" followed by content formatted as \"[User @ YYYY-MM-DD HH:MM]:\", \"[Assistant @ ...]:\", \"[Tool result for <name> @ ...]:\", custom messages, or branch summaries.\n- A current local time fallback for observations that have no obvious message timestamp.\n\nHow you work:\n1. Read reflections and current observations so you know what is already captured.\n2. Read the conversation chunk and identify what new information it contains.\n3. Call record_observations with a batch covering part (or all) of the chunk.\n4. Read the progress receipt. If content remains uncovered, call again. You may call the tool many times.\n5. When the chunk is fully covered, STOP calling the tool and reply with a brief plain-text confirmation (one short sentence). That ends the run.\n\nWhat to emit:\n- Produce NEW observations for the new chunk only. Do not restate facts already present in reflections or current observations unless something has materially changed.\n- Use the timestamp from the relevant conversation message. Fall back to current local time ONLY when no message timestamp applies.\n- For every observation, include sourceEntryIds: the smallest exact set of \"[Source entry id: ...]\" ids that directly support the observation.\n- Never invent source entry ids. Use only ids printed in the chunk. If an observation spans multiple turns or tool results, include every supporting source entry id.\n- Observations with missing, empty, or invalid sourceEntryIds will be rejected and not recorded, so do not call record_observations until you can cite valid source ids.\n- Group repeated similar tool calls into a single observation rather than one per call.\n- Skip routine, low-information events. It is fine to emit zero observations if the chunk carries no new information — in that case, simply do not call the tool and end with a plain-text confirmation.\n\nObservation content rules:\n\nFormat.\n- Single line of plain prose. No markdown, no bullets, no code fences, no XML/HTML tags, no emojis.\n- Do NOT include the timestamp or relevance inside the content string — those are separate fields.\n- No structured fields embedded in the text (no \"key: value\" lines, no JSON).\n\nPreserve user assertions exactly.\nWhen the user TELLS you something about themselves, their project, or their environment, capture it as an assertion. When the user ASKS something, capture it as a question. Assertions are authoritative — a later question on the same topic does not invalidate them.\n BAD: User wondered if they have two kids.\n GOOD: User stated they have two kids.\n BAD: User discussed auth middleware.\n GOOD: User asked how to configure JWT auth middleware.\nWhy this matters: if the user says \"I use Postgres\" and later asks \"what db am I on?\", downstream agents must treat the assertion as the answer, not the question.\n\nPreserve unusual phrasing.\nWhen the user uses non-standard terminology, quote their exact words so future runs can recognize the term.\n BAD: User exercised yesterday.\n GOOD: User stated they did a \"movement session\" (their term) yesterday.\n\nUse precise action verbs. Replace vague verbs with ones that clarify the nature of the action.\n BAD: User got a new subscription.\n GOOD: User subscribed to the Pro plan.\n BAD: User stopped getting the newsletter.\n GOOD: User unsubscribed from the newsletter.\n BAD: User got the library.\n GOOD: User installed the zod package via pnpm.\n\nFrame state changes as supersession so the old state is explicit.\n BAD: User prefers React Query now.\n GOOD: User will use React Query (switching from SWR).\nWhy this matters: without supersession framing, the reflector may crystallize both the old and the new as equally valid preferences.\n\nMark concrete completions explicitly.\nUse \"completed:\", \"resolved:\", \"confirmed working\", or similar phrasing so future runs know not to redo the work.\n BAD: Wrote the login handler.\n GOOD: completed: implemented login handler at src/auth/login.ts; user confirmed tests pass.\nWhy this matters: without a completion marker, a later assistant may re-implement work that is already done, wasting the user's time and risking regressions.\n\nSplit compound statements into separate observations.\nIf a single message contains multiple independent facts, intents, or events, emit one observation per fact. One observation per line is what enables downstream retrieval and dropping to operate at fact granularity.\n BAD: User will visit their parents this weekend and needs to clean the garage.\n GOOD: User will visit their parents this weekend. + User stated they need to clean the garage this weekend.\n BAD: User started a new job and is moving to a new apartment next week.\n GOOD: User started a new job. + User will move to a new apartment next week.\n BAD: Assistant recommended Lucia, NextAuth, and Clerk for auth, and user chose Lucia.\n GOOD: Assistant recommended auth libraries: Lucia (session-based, minimal), NextAuth (OAuth-heavy, Next-native), Clerk (hosted, paid). + User chose Lucia.\nWhy this matters: a future query like \"which auth library did the user pick?\" can match a single-fact observation cleanly; a compound observation hides the decision inside a recommendation list.\n\nGroup repeated similar tool calls into a single observation rather than one per call.\n BAD: Agent viewed src/auth.ts. Agent viewed src/users.ts. Agent viewed src/routes.ts.\n GOOD: Agent surveyed auth-related files (src/auth.ts, src/users.ts, src/routes.ts) and located token validation in src/auth.ts:45.\n\nDetail preservation. When an observation references specific things, preserve the distinguishing details so future queries can still find them:\n\n- File/location: full path + line number when relevant (src/auth.ts:45, not \"the auth file\").\n- Identifiers and names: package names, function names, variable names, handles, ticket ids, commit SHAs, error codes. Keep them verbatim.\n- Error messages: quote verbatim.\n BAD: Build failed with a type error.\n GOOD: Build failed: TS2322: Type 'string | undefined' is not assignable to type 'string' at src/auth.ts:47.\n- Numerical results: exact values, units, and direction.\n BAD: Optimization made it faster.\n GOOD: Optimization reduced p95 latency from 420ms to 180ms (57% faster).\n- Quantities and counts: \"3 failing tests (auth.test.ts, users.test.ts, routes.test.ts)\" not \"some failing tests\".\n- Recommendation or decision lists: preserve the distinguishing attribute per item.\n BAD: Assistant recommended 3 auth libraries.\n GOOD: Assistant recommended auth libraries: Lucia (session-based, minimal), NextAuth (OAuth-heavy, Next-native), Clerk (hosted, paid).\n- Role / participation: capture the user's role at an event, not just attendance.\n BAD: User worked on the migration.\n GOOD: User led the migration from MySQL to Postgres.\n\nIf a detail is non-obvious from the code or git history, it belongs in the observation. If it is trivially re-derivable, it does not.\n\nRelevance levels (pick one per observation; this field drives future dropping):\n\n- critical: user assertions about identity, role, or persistent preferences; explicit corrections (\"no, don't do X\"); concrete completions that future runs MUST NOT redo. These are highest-resistance, load-bearing observations and require the strongest evidence before leaving active memory. Why this matters: if a \"critical\" item is lost, the assistant may redo finished work, contradict a correction, or misrepresent who the user is.\n- high: non-trivial technical decisions, architectural direction, unresolved blockers, key constraints. Worth keeping across many compactions.\n- medium: task-level context that helps within the current work but isn't durable. The default when you are unsure between medium and high.\n- low: routine tool-call acks, repetitive status updates, content trivially re-derivable from recent messages. The dropper will drop these first.\n\nDo NOT default to \"critical\" or \"high\". Most observations are medium or low. Reserve \"critical\" for things that would cause real damage if forgotten.\n\n BAD: relevance=critical for \"Agent ran tests and they passed.\"\n GOOD: relevance=low for \"Agent ran tests and they passed.\" (routine; captured by a completion observation if it matters)\n\n BAD: relevance=medium for \"User said they are colorblind; red/green indicators do not work for them.\"\n GOOD: relevance=critical for \"User said they are colorblind; red/green indicators do not work for them.\" (persistent constraint; forgetting it causes real harm)\n\nTimestamp format: \"YYYY-MM-DD HH:MM\" (local time, 24-hour, to the minute). This goes in the timestamp field, not the content.\n\nRemember: these observations are the assistant's ONLY memory of this chunk once the raw messages fall out of context. Make them count.`;\n","/**\n * Serialize branch entries and render source-addressed chunks.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/serialize.ts)\n * Unmodified.\n */\nimport type {\n Message,\n TextContent,\n ToolResultMessage,\n} from \"@earendil-works/pi-ai\";\n\nfunction pad(n: number): string {\n return n.toString().padStart(2, \"0\");\n}\n\nfunction fmtLocal(d: Date): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\nfunction formatTimestamp(v: number | string | undefined): string {\n if (v === undefined) return \"????-??-?? ??:??\";\n const d = new Date(v);\n return Number.isNaN(d.getTime()) ? \"????-??-?? ??:??\" : fmtLocal(d);\n}\n\nfunction formatRecallTimestamp(\n ...values: Array<number | string | undefined>\n): string {\n for (const v of values) {\n if (v === undefined) continue;\n const d = new Date(v);\n if (!Number.isNaN(d.getTime())) return fmtLocal(d);\n }\n return \"Unknown time\";\n}\n\nfunction textAndPlaceholders(\n content: unknown,\n options: { omitRedactedThinking?: boolean; includeThinking?: boolean } = {},\n): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"[non-text content omitted]\";\n\n const parts: string[] = [];\n for (const block of content as Array<Record<string, unknown>>) {\n if (!block || typeof block !== \"object\") {\n parts.push(\"[non-text content omitted]\");\n continue;\n }\n if (block.type === \"text\" && typeof block.text === \"string\") {\n parts.push(block.text);\n continue;\n }\n if (block.type === \"thinking\") {\n if (options.omitRedactedThinking && block.redacted === true) continue;\n if (options.includeThinking && typeof block.thinking === \"string\") {\n parts.push(`[thinking: ${block.thinking}]`);\n continue;\n }\n parts.push(\"[non-text content omitted]\");\n continue;\n }\n if (block.type === \"toolCall\" && typeof block.name === \"string\") {\n parts.push(`[${block.name}(${JSON.stringify(block.arguments ?? {})})]`);\n continue;\n }\n parts.push(\"[non-text content omitted]\");\n }\n return parts.join(\"\\n\");\n}\n\nfunction textOnly(content: unknown): string {\n if (content == null) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .filter(\n (b): b is TextContent => b?.type === \"text\" && typeof b.text === \"string\",\n )\n .map((b) => b.text)\n .join(\"\\n\");\n}\n\nexport function serializeConversation(messages: Message[]): string {\n return messages\n .map((msg): string | null => {\n const time = formatTimestamp(msg.timestamp);\n if (msg.role === \"user\") {\n const text = textOnly(msg.content);\n return `[User @ ${time}]: ${text}`;\n }\n if (msg.role === \"assistant\") {\n const body = textAndPlaceholders(msg.content, {\n includeThinking: true,\n omitRedactedThinking: true,\n })\n .split(\"\\n\")\n .filter(Boolean)\n .join(\"\\n\");\n if (!body) return null;\n return `[Assistant @ ${time}]: ${body}`;\n }\n const text = textOnly(msg.content);\n return `[Tool result for ${(msg as ToolResultMessage).toolName} @ ${time}]: ${text}`;\n })\n .filter((line): line is string => line !== null)\n .join(\"\\n\\n\");\n}\n\nexport function nowTimestamp(): string {\n return fmtLocal(new Date());\n}\n\nexport const MAX_RECORD_CONTENT_CHARS = 10_000;\n\nexport function truncateRecordContent(content: string): string {\n if (content.length <= MAX_RECORD_CONTENT_CHARS) return content;\n const head = content.slice(0, MAX_RECORD_CONTENT_CHARS);\n const dropped = content.length - MAX_RECORD_CONTENT_CHARS;\n return `${head} … [truncated ${dropped} chars]`;\n}\n\nexport type RenderableEntry = {\n type: string;\n id?: string;\n timestamp?: string;\n message?: unknown;\n customType?: string;\n content?: unknown;\n summary?: unknown;\n};\n\nfunction renderCustomMessage(\n entry: RenderableEntry,\n options: { recallFormat: boolean },\n): string {\n const time = options.recallFormat\n ? formatRecallTimestamp(entry.timestamp)\n : formatTimestamp(entry.timestamp);\n const text = options.recallFormat\n ? textAndPlaceholders(entry.content)\n : typeof entry.content === \"string\"\n ? entry.content\n : Array.isArray(entry.content)\n ? (entry.content as Array<{ type?: string; text?: string }>)\n .filter((b) => b?.type === \"text\" && typeof b.text === \"string\")\n .map((b) => b.text as string)\n .join(\"\\n\")\n : \"\";\n if (options.recallFormat) {\n const origin = entry.customType\n ? `Custom message (${entry.customType})`\n : \"Custom message\";\n return `[${origin} @ ${time}]: ${text}`;\n }\n const tag = entry.customType ? `Custom (${entry.customType})` : \"Custom\";\n return `[${tag} @ ${time}]: ${text}`;\n}\n\nexport function serializeBranchEntries(entries: RenderableEntry[]): string {\n const blocks: string[] = [];\n for (const entry of entries) {\n if (entry.type === \"message\" && entry.message) {\n const part = serializeConversation([entry.message as Message]);\n if (part) blocks.push(part);\n continue;\n }\n if (entry.type === \"custom_message\") {\n blocks.push(renderCustomMessage(entry, { recallFormat: false }));\n continue;\n }\n if (entry.type === \"branch_summary\" && typeof entry.summary === \"string\") {\n const time = formatTimestamp(entry.timestamp);\n blocks.push(`[Branch summary @ ${time}]: ${entry.summary}`);\n }\n }\n return blocks.join(\"\\n\\n\");\n}\n\nexport type SourceAddressedSerialization = {\n text: string;\n sourceEntryIds: string[];\n};\n\nfunction isSourceRenderableEntry(entry: RenderableEntry): boolean {\n return (\n entry.type === \"message\" ||\n entry.type === \"custom_message\" ||\n entry.type === \"branch_summary\"\n );\n}\n\nexport function serializeSourceAddressedBranchEntries(\n entries: RenderableEntry[],\n): SourceAddressedSerialization {\n const blocks: string[] = [];\n const sourceEntryIds: string[] = [];\n for (const entry of entries) {\n if (!entry.id || !isSourceRenderableEntry(entry)) continue;\n const rendered = serializeBranchEntries([entry]);\n if (!rendered.trim()) continue;\n sourceEntryIds.push(entry.id);\n blocks.push(`[Source entry id: ${entry.id}]\\n${rendered}`);\n }\n return { text: blocks.join(\"\\n\\n\"), sourceEntryIds };\n}\n\nfunction renderRecallMessage(entry: RenderableEntry): string | null {\n if (!entry.message || typeof entry.message !== \"object\") return null;\n const msg = entry.message as Message;\n const time = formatRecallTimestamp(msg.timestamp, entry.timestamp);\n if (msg.role === \"user\") {\n return `[User @ ${time}]: ${textAndPlaceholders(msg.content)}`;\n }\n if (msg.role === \"assistant\") {\n const body = textAndPlaceholders(msg.content, {\n includeThinking: true,\n omitRedactedThinking: true,\n })\n .split(\"\\n\")\n .filter(Boolean)\n .join(\"\\n\");\n if (!body) return null;\n return `[Assistant @ ${time}]: ${body}`;\n }\n return `[Tool result: ${(msg as ToolResultMessage).toolName} @ ${time}]: ${textAndPlaceholders(msg.content)}`;\n}\n\nexport function renderRecallSourceEntry(entry: RenderableEntry): string | null {\n if (entry.type === \"message\") return renderRecallMessage(entry);\n if (entry.type === \"custom_message\")\n return renderCustomMessage(entry, { recallFormat: true });\n if (entry.type === \"branch_summary\" && typeof entry.summary === \"string\") {\n const time = formatRecallTimestamp(entry.timestamp);\n return `[Branch summary @ ${time}]: ${entry.summary}`;\n }\n return null;\n}\n\nexport function renderRecallSourceEntries(entries: RenderableEntry[]): string {\n return entries\n .map(renderRecallSourceEntry)\n .filter(\n (block): block is string => block !== null && block.trim().length > 0,\n )\n .join(\"\\n\\n\");\n}\n","/**\n * Observer agent — uses agentLoop to distill conversation chunks into observations.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/agents/observer/agent.ts)\n * Modified by pi-vcc-om: detects agent_end stopReason=\"error\" in the stream\n * and throws if the API errored without collecting any tool results.\n * This allows the consolidation pipeline to fall back to alternative models.\n */\nimport {\n agentLoop,\n type AgentContext,\n type AgentLoopConfig,\n type AgentTool,\n} from \"@earendil-works/pi-agent-core\";\nimport type { Message, Model, ModelThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { createBridgeStreamFn } from \"../../provider-stream.js\";\nimport { streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { Type } from \"typebox\";\nimport type { Static } from \"typebox\";\nimport { hashId } from \"../../ids.js\";\nimport { AGENT_LOOP_MAX_TOKENS, boundedMaxTokens } from \"../../model-budget.js\";\nimport { OBSERVER_SYSTEM } from \"./prompts.js\";\nimport { nowTimestamp, truncateRecordContent } from \"../../serialize.js\";\nimport type { Observation, Relevance } from \"../../ledger/index.js\";\nimport { estimateStringTokens } from \"../../tokens.js\";\n\ninterface RunObserverArgs {\n model: Model<any>;\n apiKey: string;\n headers?: Record<string, string>;\n priorReflections: string[];\n priorObservations: string[];\n chunk: string;\n allowedSourceEntryIds: string[];\n signal?: AbortSignal;\n agentLoop?: typeof agentLoop;\n /** Optional custom stream function bypassing agentLoop's default streamSimple.\n * Used by the Symbol.for bridge to access native pi-ai provider registrations\n * from jiti-loaded consolidation agents. */\n streamFn?: (model: any, context: any, options: any) => any;\n maxTurns?: number;\n thinkingLevel?: ModelThinkingLevel;\n}\n\nconst RelevanceSchema = Type.Union([\n Type.Literal(\"low\"),\n Type.Literal(\"medium\"),\n Type.Literal(\"high\"),\n Type.Literal(\"critical\"),\n]);\n\nexport const OBSERVATION_TIMESTAMP_PATTERN =\n \"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$\";\n\nconst RecordObservationsSchema = Type.Object({\n observations: Type.Array(\n Type.Object({\n timestamp: Type.String({\n pattern: OBSERVATION_TIMESTAMP_PATTERN,\n description: \"Observation time in local 'YYYY-MM-DD HH:MM' format.\",\n }),\n content: Type.String({\n minLength: 1,\n description:\n \"Single-line plain prose. No markdown, no tags, no embedded timestamp.\",\n }),\n relevance: RelevanceSchema,\n sourceEntryIds: Type.Array(Type.String({ minLength: 1 }), {\n minItems: 1,\n description:\n \"Exact source entry ids from the chunk that directly support this observation. \" +\n \"Use only ids shown in '[Source entry id: ...]' labels; never invent ids.\",\n }),\n }),\n {\n description:\n \"Batch of new observations. May be empty only if the tool is not called at all.\",\n },\n ),\n});\n\ntype RecordObservationsArgs = Static<typeof RecordObservationsSchema>;\n\nfunction joinOrEmpty(items: string[]): string {\n return items.length ? items.join(\"\\n\") : \"(none yet)\";\n}\n\nexport function normalizeSourceEntryIds(\n sourceEntryIds: readonly string[] | undefined,\n allowedSourceEntryIds: readonly string[],\n): string[] | undefined {\n if (!sourceEntryIds || sourceEntryIds.length === 0) return undefined;\n const allowedOrder = new Map<string, number>();\n for (let i = 0; i < allowedSourceEntryIds.length; i++)\n allowedOrder.set(allowedSourceEntryIds[i], i);\n\n // Filter out invalid/unknown IDs instead of rejecting the entire batch.\n // Matches the dropper's normalizeDropObservationIds pattern: one hallucinated\n // ID from the LLM should not discard valid observations.\n const seen = new Set<string>();\n const valid: string[] = [];\n for (const id of sourceEntryIds) {\n if (!allowedOrder.has(id)) continue;\n if (seen.has(id)) continue;\n seen.add(id);\n valid.push(id);\n }\n if (valid.length === 0) return undefined;\n return valid.sort(\n (a, b) => (allowedOrder.get(a) ?? 0) - (allowedOrder.get(b) ?? 0),\n );\n}\n\n/** Result returned by runObserver when no observations are recorded. */\nexport type ObserverEmptyReason =\n | { kind: \"no_new_content\" } // model ran but nothing worth recording\n | { kind: \"tool_not_called\" } // model didn't call record_observations at all\n | { kind: \"all_rejected\"; count: number } // tool called but all sourceEntryIds invalid\n | { kind: \"all_duplicates\"; count: number } // tool called but all already seen\n | { kind: \"empty_array\"; count: number }; // tool called but returned empty observations array\n\nexport interface ObserverResult {\n observations: Observation[] | undefined;\n emptyReason?: ObserverEmptyReason;\n}\n\nexport async function runObserver(\n args: RunObserverArgs,\n): Promise<ObserverResult> {\n const {\n model,\n apiKey,\n headers,\n priorReflections,\n priorObservations,\n chunk,\n allowedSourceEntryIds,\n signal,\n } = args;\n const conversation = chunk.trim();\n if (!conversation) return { observations: undefined };\n\n const accumulated = new Map<string, Observation>();\n let toolCalled = false;\n let totalAdded = 0;\n let totalDuplicates = 0;\n let totalRejected = 0;\n let totalProposed = 0;\n\n const recordObservations: AgentTool<typeof RecordObservationsSchema> = {\n name: \"record_observations\",\n label: \"Record observations\",\n description:\n \"Record a batch of new observations distilled from the conversation chunk. \" +\n \"Call this multiple times as you work through the chunk. Stop calling when coverage is complete, \" +\n \"then emit a short plain-text confirmation to end the run.\",\n parameters: RecordObservationsSchema,\n execute: async (_id, params: RecordObservationsArgs) => {\n toolCalled = true;\n let added = 0;\n let duplicates = 0;\n let rejected = 0;\n for (const obs of params.observations) {\n totalProposed++;\n const sourceEntryIds = normalizeSourceEntryIds(\n obs.sourceEntryIds,\n allowedSourceEntryIds,\n );\n if (!sourceEntryIds) {\n rejected++;\n continue;\n }\n const content = truncateRecordContent(obs.content);\n const id = hashId(content);\n if (accumulated.has(id)) {\n duplicates++;\n continue;\n }\n accumulated.set(id, {\n id,\n content,\n timestamp: obs.timestamp,\n relevance: obs.relevance as Relevance,\n sourceEntryIds,\n tokenCount: estimateStringTokens(content),\n });\n added++;\n }\n totalAdded += added;\n totalDuplicates += duplicates;\n totalRejected += rejected;\n const rejectedPart =\n rejected > 0\n ? ` ${rejected} observation${rejected === 1 ? \"\" : \"s\"} rejected for missing or invalid sourceEntryIds.`\n : \"\";\n const ack =\n `Recorded ${added} new observation${added === 1 ? \"\" : \"s\"} ` +\n (duplicates > 0\n ? `(${duplicates} duplicate${duplicates === 1 ? \"\" : \"s\"} skipped).`\n : \".\") +\n rejectedPart +\n ` Total so far this run: ${accumulated.size}. ` +\n `Continue if the chunk still has uncovered content; otherwise stop calling the tool and emit a short plain-text confirmation.`;\n return {\n content: [{ type: \"text\", text: ack }],\n details: { added, duplicates, rejected, total: accumulated.size },\n };\n },\n };\n\n const now = nowTimestamp();\n const userText = `Current local time: ${now}\n\nCURRENT REFLECTIONS:\n${joinOrEmpty(priorReflections)}\n\nCURRENT OBSERVATIONS:\n${joinOrEmpty(priorObservations)}\n\nCompress the following new conversation chunk into observations by calling record_observations one or more times. Do not restate facts already present in current reflections or current observations. Prefer inline conversation timestamps when assigning times; fall back to the current local time above only if no message timestamp applies. Stop calling the tool and reply with a short plain-text confirmation once the chunk is fully covered.\n\nNEW CONVERSATION CHUNK:\n${conversation}`;\n\n const prompts: Message[] = [\n {\n role: \"user\",\n content: [{ type: \"text\", text: userText }],\n timestamp: Date.now(),\n },\n ];\n\n const context: AgentContext = {\n systemPrompt: OBSERVER_SYSTEM,\n messages: [],\n tools: [recordObservations as AgentTool<any>],\n };\n\n const reasoning = (model as { reasoning?: unknown }).reasoning;\n const thinkingLevel = args.thinkingLevel ?? \"low\";\n const effectiveMaxTurns =\n args.maxTurns && args.maxTurns > 0 ? args.maxTurns : undefined;\n let turnCount = 0;\n const config: AgentLoopConfig = {\n model,\n apiKey,\n headers,\n maxTokens: boundedMaxTokens(model, AGENT_LOOP_MAX_TOKENS),\n convertToLlm: (msgs) => msgs as Message[],\n toolExecution: \"sequential\",\n ...(reasoning && thinkingLevel !== \"off\"\n ? { reasoning: thinkingLevel }\n : {}),\n ...(effectiveMaxTurns !== undefined\n ? {\n shouldStopAfterTurn: () => {\n turnCount++;\n return turnCount >= effectiveMaxTurns;\n },\n }\n : {}),\n };\n\n const loop = args.agentLoop ?? agentLoop;\n // ── Bridge stream function ──\n // Consolidation agents run via jiti (moduleCache: false) which creates a separate\n // pi-ai instance whose apiProviderRegistry lacks custom providers registered by\n // other extensions (e.g., claude-bridge). The bridge looks up streamSimple functions\n const bridgeStreamFn = createBridgeStreamFn(streamSimple);\n const streamFn = args.streamFn ?? bridgeStreamFn;\n const stream = loop(prompts, context, config, signal, streamFn);\n let agentError: string | undefined;\n for await (const event of stream) {\n // Drain events; the tool's execute already collects records.\n if (event.type === \"agent_end\") {\n const msgs = ((event as any).messages || []) as Array<{\n stopReason?: string;\n errorMessage?: string;\n }>;\n const lastMsg = msgs[msgs.length - 1];\n if (lastMsg?.stopReason === \"error\") {\n agentError = lastMsg.errorMessage ?? \"Unknown API error\";\n }\n }\n }\n await stream.result();\n\n if (agentError && accumulated.size === 0) {\n throw new Error(`Observer API error: ${agentError}`);\n }\n\n if (accumulated.size === 0) {\n // Determine why no observations were recorded\n let emptyReason: ObserverEmptyReason;\n if (!toolCalled) {\n emptyReason = { kind: \"tool_not_called\" };\n } else if (totalRejected > 0 && totalAdded === 0) {\n emptyReason = { kind: \"all_rejected\", count: totalRejected };\n } else if (totalDuplicates > 0 && totalAdded === 0) {\n emptyReason = { kind: \"all_duplicates\", count: totalDuplicates };\n } else if (totalProposed === 0) {\n emptyReason = { kind: \"empty_array\", count: 0 };\n } else {\n emptyReason = { kind: \"no_new_content\" };\n }\n return { observations: undefined, emptyReason };\n }\n\n return { observations: Array.from(accumulated.values()) };\n}\n","export const REFLECTOR_SYSTEM = `You are the reflection agent for a coding assistant.\n\nThese records are the ONLY information the assistant will have about past interactions once the raw conversation is compacted out of context. Anything you fail to preserve may be forgotten. Anything you distort may be remembered wrong. Take this seriously. Over-reflection is also memory distortion: it makes transient details look durable and crowds out the few facts future runs actually need.\n\nYour task is different from the observer's: you are not recording events, you are distilling stable, long-lived facts and patterns from active observations into new reflections by calling record_reflections. Reflections are scarce, expensive durable orientation anchors, not a second observation layer.\n\nYou receive:\n- Current reflections: durable facts already crystallized.\n- Current observations: active timestamped evidence lines, each shown as \"[id] YYYY-MM-DD HH:MM [relevance] [coverage: none|partial|strong] content\".\n- Coverage tiers are review context: none means no current reflection supports the observation id, partial means exactly one current reflection supports it, and strong means two or more current reflections support it. Coverage is not a quota, target, priority score, or instruction to emit reflections.\n\nWhat to emit:\n- Emit only new durable reflections not already present in current reflections.\n- A good reflection captures meaning that should survive after individual observations are dropped from active compacted memory.\n- High and critical observations deserve careful review, not automatic reflection. Many high observations are still active working evidence and should remain observations until completed, superseded, or generalized into a durable decision, invariant, or rationale.\n- Ignore low observations unless a repeated pattern across many low observations is itself significant.\n- Do not lightly reword existing reflections. Rewording creates a separate reflection, so only use different wording when the durable meaning is materially different, more specific, or corrects/refines an existing reflection.\n- Do not emit update-style records or provenance metadata. Reflections are plain durable facts, not patches.\n- It is fine to emit zero reflections when nothing new is stable enough; in that case do not call the tool and reply briefly.\n\nDecision procedure:\n1. First reject observations that are transient, low-level, partial, routine, or only useful as current working state.\n2. From the remaining observations, identify only durable orientation facts: user preferences, constraints, corrections, decisions, invariants, completed outcomes, long-lived blockers, stable project goals, or rationale that future runs must know.\n3. Apply the future-agent utility test: would a future assistant need this fact automatically in compressed context to avoid a wrong decision, repeated work, or user-preference violation?\n4. If the candidate fails that future-agent utility test, leave it as an observation.\n5. If unsure, emit no reflection.\n\nAbstraction gate:\n- Do not turn each observation into a reflection. Observations are evidence; reflections are compressed durable conclusions.\n- A reflection should usually do at least one of these: combine multiple observations into one durable pattern, preserve a user preference/constraint/correction/decision, record a completed outcome future runs must not redo, or capture durable rationale that explains why a decision was made.\n- Single-observation reflections are allowed when the observation itself contains a durable user preference, constraint, correction, decision, invariant, completed outcome, or long-lived blocker.\n- Do not copy or lightly paraphrase observation lines just because they are high or critical. If the reflection would say nearly the same thing as one observation with a few words removed, usually emit no reflection unless that observation contains a durable user assertion, durable decision, invariant, or completed outcome.\n- Most transient task-log observations, tool status, one-off attempts, files inspected, commands run, failed attempts, partial implementation, and current working state should not become reflections. Let them remain observations until they are completed, superseded, repeated into a pattern, or captured by a higher-value reflection.\n- Prefer fewer, higher-value reflections. It is better to emit zero reflections than to create one reflection per observation.\n\nFocus on:\n- User identity, role, preferences, constraints, and durable corrections.\n- Project goals, architecture, technical decisions, and the rationale behind them.\n- Recurring user behavior or preferences that will matter in future turns.\n- Completed outcomes future runs must not redo.\n- Durable blockers, invariants, and open decisions that should survive compaction.\n\nSupport ids and coverage stewardship:\n- Every reflection must include supportingObservationIds from the current observations list.\n- First decide whether the reflection content passes the durable-value bar. Then audit support ids for that already-worthy reflection.\n- supportingObservationIds are a coverage/provenance set and downstream dropper coverage evidence: include all current observation ids whose durable meaning is preserved by the reflection with equivalent fidelity and can later be treated as redundant active-memory detail.\n- supportingObservationIds are not a checklist to cover every observation. Do not add ids merely to improve coverage counts, maximize support ids, maximize strong coverage, or unlock the dropper.\n- False or inflated support ids can cause unsafe downstream dropper pruning, including removal of high-resistance active observations whose meaning was not actually preserved.\n- Include additional observation ids only when the reflection preserves their durable meaning with equivalent fidelity.\n- Leave observations unsupported when their details are still active working state, too specific to compress safely, or not yet durable enough.\n- Do not include observations whose unique exact detail, current task state, user correction, user constraint, or concrete completion is not captured by the reflection.\n- If no candidate reflection passes the durable-value bar, emit zero reflections even when observations have coverage: none.\n- Never invent observation ids. Proposals with missing, empty, or invalid supportingObservationIds are rejected.\n\nUser assertions are authoritative. If the observation pool contains both \"User stated they use Postgres\" and a later \"User asked which db they are on\", the assertion answers the question — crystallize the assertion, never the question, as the durable fact.\n\nReflection content rules:\n- Single line of plain prose. No markdown, no bullets, no code fences, no XML/HTML tags, no emojis.\n- No timestamp, no priority marker, no bracketed tags, no \"key: value\" fields, no JSON.\n- Lead with the fact or pattern; include the reason or mechanism when known so future readers can judge edge cases.\n- Preserve user assertions exactly. Use the user's exact words when non-standard.\n- Preserve named identifiers, paths, commands, package names, error codes, dates, decisions, constraints, and rationale when those details are part of the durable meaning.\n\nExamples:\n- BAD: User discussed databases.\n- GOOD: User stated they use Postgres for the project database.\n- BAD: User asked about database setup.\n- GOOD: User stated they use Postgres for the project database.\n- BAD: User ran npm test and it failed.\n- GOOD: The test suite currently fails because auth middleware rejects expired JWT fixtures.\n- BAD: User prefers React Query.\n- BAD: User switched from SWR.\n- GOOD: User chose React Query over SWR for server-state caching.\n- BAD: completed: edited src/hooks/reflect-drop-trigger.ts.\n- GOOD: completed: V3 reflect/drop coverage now uses raw progress watermarks, so same-turn reflection entries are no longer used as drop progress markers.\n- BAD: npm test passed.\n- GOOD: completed: V3 package namespace migration passed full tests and typecheck.\n- BAD: Observation aaaaaaaaaaaa says the user likes short answers.\n- GOOD: User prefers short answers without generic summaries.\n- ZERO REFLECTIONS: The only new observations are files inspected, commands run, failed attempts, partial implementation, transient debugging, or current working state with no durable conclusion yet.\n- ZERO REFLECTIONS: The only new observations are routine command outputs, transient debugging attempts, or partial work with no durable conclusion yet.`;\n","/**\n * Reflector agent — uses agentLoop to synthesize reflections from observations.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/agents/reflector/agent.ts)\n * Modified by pi-vcc-om: detects agent_end stopReason=\"error\" in the stream\n * and throws if the API errored without collecting any tool results.\n */\nimport {\n agentLoop,\n type AgentContext,\n type AgentLoopConfig,\n type AgentTool,\n} from \"@earendil-works/pi-agent-core\";\nimport type { Message, Model, ModelThinkingLevel } from \"@earendil-works/pi-ai\";\nimport { createBridgeStreamFn } from \"../../provider-stream.js\";\nimport { streamSimple } from \"@earendil-works/pi-ai/compat\";\nimport { Type } from \"typebox\";\nimport type { Static } from \"typebox\";\nimport { hashId } from \"../../ids.js\";\nimport { AGENT_LOOP_MAX_TOKENS, boundedMaxTokens } from \"../../model-budget.js\";\nimport { truncateRecordContent } from \"../../serialize.js\";\nimport { REFLECTOR_SYSTEM } from \"./prompts.js\";\nimport { estimateStringTokens } from \"../../tokens.js\";\nimport {\n observationToSummaryLine,\n reflectionToSummaryLine,\n type Observation,\n type Reflection,\n} from \"../../ledger/index.js\";\nimport type { ReflectionCoverageTier } from \"../dropper/coverage.js\";\n\ninterface RunReflectorArgs {\n model: Model<any>;\n apiKey: string;\n headers?: Record<string, string>;\n reflections: Reflection[];\n observations: Observation[];\n /** Compact summary of existing reflections for context (not to re-process). */\n existingReflectionsSummary?: string;\n /** Compact summary of existing observations for context (not to re-process). */\n existingObservationsSummary?: string;\n signal?: AbortSignal;\n agentLoop?: typeof agentLoop;\n /** Optional custom stream function bypassing agentLoop's default streamSimple.\n * Used by the Symbol.for bridge to access native pi-ai provider registrations\n * from jiti-loaded consolidation agents. */\n streamFn?: (model: any, context: any, options: any) => any;\n maxTurns?: number;\n thinkingLevel?: ModelThinkingLevel;\n}\n\nconst RecordReflectionsSchema = Type.Object({\n reflections: Type.Array(\n Type.Object({\n content: Type.String({ minLength: 1 }),\n supportingObservationIds: Type.Array(Type.String({ minLength: 1 }), {\n minItems: 1,\n }),\n }),\n { minItems: 1 },\n ),\n});\n\ntype RecordReflectionsArgs = Static<typeof RecordReflectionsSchema>;\n\nfunction joinOrEmpty(items: string[]): string {\n return items.length ? items.join(\"\\n\") : \"(none yet)\";\n}\n\nexport function normalizeSupportingObservationIds(\n supportingObservationIds: readonly string[] | undefined,\n allowedObservationIds: readonly string[],\n): string[] | undefined {\n if (!supportingObservationIds || supportingObservationIds.length === 0)\n return undefined;\n const allowedOrder = new Map<string, number>();\n for (let i = 0; i < allowedObservationIds.length; i++) {\n if (!allowedOrder.has(allowedObservationIds[i]))\n allowedOrder.set(allowedObservationIds[i], i);\n }\n\n const seen = new Set<string>();\n for (const id of supportingObservationIds) {\n if (!allowedOrder.has(id)) return undefined;\n seen.add(id);\n }\n if (seen.size === 0) return undefined;\n return Array.from(seen).sort(\n (a, b) => (allowedOrder.get(a) ?? 0) - (allowedOrder.get(b) ?? 0),\n );\n}\n\nfunction normalizeReflectionContent(content: string): string | undefined {\n const normalized = truncateRecordContent(content.trim());\n if (!normalized || /\\r|\\n/.test(normalized)) return undefined;\n return normalized;\n}\n\nexport async function runReflector(\n args: RunReflectorArgs,\n): Promise<Reflection[] | undefined> {\n const { model, apiKey, headers, reflections, observations, signal } = args;\n if (observations.length === 0) return undefined;\n\n const allowedObservationIds = observations.map(\n (observation) => observation.id,\n );\n const existingReflectionIds = new Set(\n reflections.map((reflection) => reflection.id),\n );\n const accumulated = new Map<string, Reflection>();\n\n const recordReflections: AgentTool<typeof RecordReflectionsSchema> = {\n name: \"record_reflections\",\n label: \"Record reflections\",\n description:\n \"Record new durable reflections with supporting observation ids.\",\n parameters: RecordReflectionsSchema,\n execute: async (_id, params: RecordReflectionsArgs) => {\n let added = 0;\n let duplicates = 0;\n let rejected = 0;\n for (const proposal of params.reflections) {\n const content = normalizeReflectionContent(proposal.content);\n const supportingObservationIds = normalizeSupportingObservationIds(\n proposal.supportingObservationIds,\n allowedObservationIds,\n );\n if (!content || !supportingObservationIds) {\n rejected++;\n continue;\n }\n const id = hashId(content);\n if (existingReflectionIds.has(id) || accumulated.has(id)) {\n duplicates++;\n continue;\n }\n accumulated.set(id, {\n id,\n content,\n supportingObservationIds,\n tokenCount: estimateStringTokens(content),\n });\n added++;\n }\n return {\n content: [\n {\n type: \"text\",\n text: `Recorded ${added} reflection${added === 1 ? \"\" : \"s\"}; ${duplicates} duplicate${duplicates === 1 ? \"\" : \"s\"}; ${rejected} rejected. Total this run: ${accumulated.size}.`,\n },\n ],\n details: { added, duplicates, rejected, total: accumulated.size },\n };\n },\n };\n\n const existingReflectionsContext = args.existingReflectionsSummary\n ? `EXISTING REFLECTIONS (for context only — do NOT re-process these):\\n${args.existingReflectionsSummary}\\n\\n`\n : \"\";\n const existingObservationsContext = args.existingObservationsSummary\n ? `EXISTING OBSERVATIONS (for context only — do NOT re-process these):\\n${args.existingObservationsSummary}\\n\\n`\n : \"\";\n\n const userText = `${existingReflectionsContext}${existingObservationsContext}NEW REFLECTIONS TO PROCESS:\\n${joinOrEmpty(reflections.map(reflectionToSummaryLine))}\\n\\nNEW OBSERVATIONS TO PROCESS:\\n${joinOrEmpty(observations.map(observationToSummaryLine))}\\n\\nCrystallize any missing durable facts or patterns into new reflections. If nothing is stable enough, do not call the tool.`;\n const prompts: Message[] = [\n {\n role: \"user\",\n content: [{ type: \"text\", text: userText }],\n timestamp: Date.now(),\n },\n ];\n const context: AgentContext = {\n systemPrompt: REFLECTOR_SYSTEM,\n messages: [],\n tools: [recordReflections as AgentTool<any>],\n };\n const reasoning = (model as { reasoning?: unknown }).reasoning;\n const thinkingLevel = args.thinkingLevel ?? \"low\";\n const effectiveMaxTurns =\n args.maxTurns && args.maxTurns > 0 ? args.maxTurns : undefined;\n let turnCount = 0;\n const config: AgentLoopConfig = {\n model,\n apiKey,\n headers,\n maxTokens: boundedMaxTokens(model, AGENT_LOOP_MAX_TOKENS),\n convertToLlm: (msgs) => msgs as Message[],\n toolExecution: \"sequential\",\n ...(reasoning && thinkingLevel !== \"off\"\n ? { reasoning: thinkingLevel }\n : {}),\n ...(effectiveMaxTurns !== undefined\n ? { shouldStopAfterTurn: () => ++turnCount >= effectiveMaxTurns }\n : {}),\n };\n\n const loop = args.agentLoop ?? agentLoop;\n // ── Bridge stream function ──\n const bridgeStreamFn = createBridgeStreamFn(streamSimple);\n const streamFn = args.streamFn ?? bridgeStreamFn;\n const stream = loop(prompts, context, config, signal, streamFn);\n let agentError: string | undefined;\n for await (const event of stream) {\n // Tool execution collects records.\n if (event.type === \"agent_end\") {\n const msgs = ((event as any).messages || []) as Array<{\n stopReason?: string;\n errorMessage?: string;\n }>;\n const lastMsg = msgs[msgs.length - 1];\n if (lastMsg?.stopReason === \"error\") {\n agentError = lastMsg.errorMessage ?? \"Unknown API error\";\n }\n }\n }\n await stream.result();\n if (agentError && accumulated.size === 0)\n throw new Error(`Reflector API error: ${agentError}`);\n return accumulated.size > 0 ? Array.from(accumulated.values()) : undefined;\n}\n\nexport function observationToReflectorLine(\n observation: Observation,\n coverage: ReflectionCoverageTier,\n): string {\n return `[${observation.id}] ${observation.timestamp} [${observation.relevance}] [coverage: ${coverage}] ${observation.content}`;\n}\n\nexport function summarizeSupportIdCounts(reflections: readonly Reflection[]): {\n reflectionCount: number;\n totalSupportIds: number;\n minSupportIds: number;\n maxSupportIds: number;\n averageSupportIds: number;\n histogram: Record<string, number>;\n} {\n if (reflections.length === 0) {\n return {\n reflectionCount: 0,\n totalSupportIds: 0,\n minSupportIds: 0,\n maxSupportIds: 0,\n averageSupportIds: 0,\n histogram: {},\n };\n }\n const supportIdCounts = reflections.map(\n (r) => r.supportingObservationIds.length,\n );\n const total = supportIdCounts.reduce((sum, c) => sum + c, 0);\n const histogram: Record<string, number> = {};\n for (const count of supportIdCounts) {\n histogram[String(count)] = (histogram[String(count)] || 0) + 1;\n }\n return {\n reflectionCount: reflections.length,\n totalSupportIds: total,\n minSupportIds: Math.min(...supportIdCounts),\n maxSupportIds: Math.max(...supportIdCounts),\n averageSupportIds: total / reflections.length,\n histogram,\n };\n}\n","/**\n * Shared retryable-error regex and detection function.\n *\n * Extracted from compaction-trigger.ts and cooldown.ts which had diverging\n * copies of the same logic. This is the single source of truth.\n *\n * Now also re-exports Pi's context-overflow detection from @earendil-works/pi-ai,\n * avoiding the need to duplicate 20+ provider-specific overflow patterns.\n */\n\n/** Regex matching retryable API error messages. */\nexport const RETRYABLE_ERROR_RE =\n /overloaded|provider.?returned.?error|rate.?limit|too many requests|429|500|502|503|504|service.?unavailable|server.?error|internal.?error|network.?error|connection.?error|connection.?refused|connection.?lost|websocket.?closed|websocket.?error|other side closed|fetch failed|upstream.?connect|reset before headers|socket hang up|ended without|http2 request did not get a response|timed? out|timeout|terminated|retry delay/i;\n\n/** Check whether an error string or Error indicates a retryable error. */\nexport function isRetryableError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error || \"\");\n return RETRYABLE_ERROR_RE.test(message);\n}\n\n/** Detect Pi's \"extension ctx is stale\" error from session replacement/reload.\n * These are not model errors and must not be recorded as cooldowns. */\nexport function isStaleExtensionContextError(error: unknown): boolean {\n let message: string;\n if (error instanceof Error) {\n message = error.message;\n } else if (error && typeof error === \"object\" && \"message\" in error) {\n message = String((error as { message: unknown }).message);\n } else {\n message = String(error || \"\");\n }\n return (\n message.includes(\"extension ctx is stale\") ||\n message.includes(\"ctx is stale\")\n );\n}\n","/**\n * Consolidation pipeline — observer → reflector → dropper with fallback retry.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/hooks/consolidation-trigger.ts)\n * Modified by pi-vcc-om:\n * - Each stage retries through fallback models when any error occurs.\n * - All errors record cooldown (so the failed model is skipped next iteration).\n * - 30s retry gate prevents repeated failed runs (isConsolidationRetryGated).\n */\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { runDropper } from \"./agents/dropper/agent.js\";\nimport { runObserver } from \"./agents/observer/agent.js\";\nimport { runReflector } from \"./agents/reflector/agent.js\";\nimport type { ModelThinkingLevel } from \"@earendil-works/pi-ai\";\nimport type { ConfiguredModel } from \"./config.js\";\nimport { debugLog, withDebugLogContext } from \"./debug-log.js\";\nimport { type ResolveResult, type Runtime } from \"./runtime.js\";\nimport {\n isRetryableError,\n isStaleExtensionContextError,\n} from \"./retryable-error.js\";\nimport { effectiveContextWindow } from \"./model-budget.js\";\nimport { serializeSourceAddressedBranchEntries } from \"./serialize.js\";\n\n/** Fixed overhead for system prompt, tool definitions, and turn scaffold in context window pre-check. */\nconst AGENT_LOOP_RESERVE = 8_000;\nimport {\n readPendingState,\n savePendingObservation,\n savePendingReflection,\n savePendingDropped,\n isObservationChunkPending,\n PendingOMState,\n} from \"./pending.js\";\nimport { isManualMode } from \"../core/unified-config.js\";\nimport {\n OM_OBSERVATIONS_DROPPED,\n OM_OBSERVATIONS_RECORDED,\n OM_REFLECTIONS_RECORDED,\n buildExistingObservationsSummary,\n buildExistingReflectionsSummary,\n buildObservationsDroppedData,\n buildObservationsRecordedData,\n buildReflectionsRecordedData,\n earlierCoverageMarkerId,\n entryIndexForId,\n foldLedger,\n findLastCompactionIndex,\n fullProjection,\n isSourceEntry,\n latestCoverageIndex,\n latestCoverageMarkerId,\n observationsCreatedAfterIndex,\n observationToSummaryLine,\n rawTokensAfterIndex,\n rawTokensSinceDropCoverage,\n rawTokensSinceObservationCoverage,\n rawTokensSinceReflectionCoverage,\n reflectionToSummaryLine,\n reflectionsCreatedAfterIndex,\n selectPriorObservations,\n type Entry,\n type Observation,\n type Reflection,\n} from \"./ledger/index.js\";\n\nexport type ResolvedModel = Extract<ResolveResult, { ok: true }>;\n\nexport type ConsolidationCtx = {\n cwd: string;\n hasUI: boolean;\n ui?: {\n notify: (message: string, type?: \"warning\" | \"info\" | \"error\") => void;\n };\n model: unknown;\n modelRegistry: any;\n sessionManager: { getBranch: () => unknown; getSessionId: () => string };\n};\n\ntype StageOutcome = \"continue\" | \"abort\";\n\ntype ReflectorStageResult = {\n outcome: StageOutcome;\n sameRunReflections: Reflection[];\n effectiveReflectionCoverageId?: string;\n};\n\n// Max attempts per stage (primary + all fallbacks the runtime will try internally).\n// Each call to resolveModel tries all non-cooldown candidates. If the agent throws\n// a retryable error, we record cooldown and call resolveModel again (up to this many times).\nconst MAX_STAGE_ATTEMPTS = 10;\n\nfunction sourceEntriesAfter(entries: Entry[], index: number): Entry[] {\n return entries.slice(index + 1).filter(isSourceEntry);\n}\n\n/**\n * Cap source entries to maxTokens by keeping newest entries first,\n * walking backwards until the token budget is exceeded.\n * Uses a conservative chars/4 heuristic for token estimation.\n */\nfunction capSourceEntriesToTokens(\n entries: Entry[],\n maxTokens: number,\n): Entry[] {\n let totalTokens = 0;\n const kept: Entry[] = [];\n for (let i = entries.length - 1; i >= 0; i--) {\n const entry = entries[i];\n let chars = 0;\n // Tokenize all entry types, not just \"message\": custom_message and\n // branch_summary entries also consume observer context window.\n if (entry.type === \"message\" && entry.message) {\n const msg = entry.message as any;\n if (typeof msg.content === \"string\") chars = msg.content.length;\n else if (Array.isArray(msg.content)) {\n for (const block of msg.content) {\n if (block.text) chars += block.text.length;\n }\n }\n } else if (\n entry.type === \"custom\" &&\n (entry.customType === OM_OBSERVATIONS_RECORDED ||\n entry.customType === OM_REFLECTIONS_RECORDED ||\n entry.customType === OM_OBSERVATIONS_DROPPED)\n ) {\n // Custom entries carry structured data — estimate from JSON serialization\n chars = String(JSON.stringify(entry.data ?? {})).length;\n } else if (entry.summary) {\n chars = String(entry.summary).length;\n }\n const estTokens = Math.ceil(chars / 4);\n if (totalTokens + estTokens > maxTokens && kept.length > 0) break;\n // Remove the `kept.length > 0` guard? No — keep the guard but allow\n // the first entry to be dropped only if it exceeds maxTokens alone.\n // (The guard against empty kept list prevents dropping the first entry\n // when later entries are small; but a single oversized entry should\n // still be included to avoid losing the newest data entirely.)\n if (totalTokens + estTokens > maxTokens && kept.length === 0) {\n // First (newest) entry exceeds maxTokens alone — include it anyway\n // to avoid data loss, but don't add more.\n kept.unshift(entry);\n break;\n }\n kept.unshift(entry);\n totalTokens += estTokens;\n }\n return kept;\n}\n\nfunction appendEntry(\n pi: ExtensionAPI,\n customType: string,\n data: unknown,\n): void {\n pi.appendEntry(customType, data);\n}\n\nfunction mergeReflections(\n existing: Reflection[],\n additional: Reflection[],\n): Reflection[] {\n const seen = new Set(existing.map((reflection) => reflection.id));\n const merged = [...existing];\n for (const reflection of additional) {\n if (seen.has(reflection.id)) continue;\n seen.add(reflection.id);\n merged.push(reflection);\n }\n return merged;\n}\n\n/**\n * Extract all pending observations from accumulated batches that were recorded\n * after a given coverage ID (e.g., the last reflection or drop coverage ID).\n * This is needed in manual mode (pending-based) because the reflector/dropper may skip\n * a pipeline cycle, leaving unprocessed batches in observationBatches that\n * should still be served as \"new\" on subsequent runs.\n */\nfunction pendingObservationsCreatedAfter(\n pending: PendingOMState,\n entries: Entry[],\n afterCoversUpToId: string | undefined,\n): Observation[] {\n const batches = pending.observationBatches ?? [];\n if (!afterCoversUpToId || entryIndexForId(entries, afterCoversUpToId) < 0) {\n return batches.flatMap((b: any) => (b.data as any)?.observations ?? []);\n }\n const afterIdx = entryIndexForId(entries, afterCoversUpToId);\n const newObs: Observation[] = [];\n for (const batch of batches) {\n const batchIdx = entryIndexForId(entries, batch.coversUpToId);\n if (batchIdx >= 0 && batchIdx > afterIdx) {\n newObs.push(...((batch.data as any)?.observations ?? []));\n }\n }\n return newObs;\n}\n\n/** Cursor-aware stage-due check. Uses cursors when available; falls back to\n * legacy coverage markers when cursors are absent (cold start, fork recovery).\n *\n * In compaction: \"manual\" mode, the branch has no OM markers — observations\n * live in the per‑session pending file. `pending` provides the pool fullness\n * and new‑data visibility that the reflector/dropper checks need. */\nexport function anyStageDue(\n entries: Entry[],\n runtime: Runtime,\n pending?: PendingOMState,\n): boolean {\n const config = runtime.config;\n const cursors = runtime.cursors ?? {};\n\n // ── Observer ──────────────────────────────────────────────────────────\n const observerDue = (() => {\n const cursor = cursors.observer;\n if (!cursor) {\n return (\n rawTokensSinceObservationCoverage(entries) >= config.observeAfterTokens\n );\n }\n const idx = entryIndexForId(entries, cursor.entryId);\n const tokensSince =\n idx >= 0\n ? rawTokensAfterIndex(entries, idx)\n : rawTokensSinceObservationCoverage(entries);\n return tokensSince >= config.observeAfterTokens;\n })();\n\n // ── Reflector ─────────────────────────────────────────────────────────\n const reflectorDue = (() => {\n const cursor = cursors.reflector;\n if (!cursor) {\n return (\n rawTokensSinceReflectionCoverage(entries) >= config.reflectAfterTokens\n );\n }\n const idx = entryIndexForId(entries, cursor.entryId);\n if (idx < 0) {\n return (\n rawTokensSinceReflectionCoverage(entries) >= config.reflectAfterTokens\n );\n }\n // Must have enough accumulated tokens before considering reflector\n const tokensSince = rawTokensAfterIndex(entries, idx);\n if (tokensSince < config.reflectAfterTokens) {\n return false;\n }\n // Check for new observation batches after the cursor\n for (let i = idx + 1; i < entries.length; i++) {\n const e = entries[i];\n if (e.type === \"custom\" && e.customType === OM_OBSERVATIONS_RECORDED) {\n // Skip if this marker's coversUpToId is at or before the cursor\n // — data it covers was already processed.\n const markerCoversUpTo: string | undefined = (e as any).data\n ?.coversUpToId;\n if (markerCoversUpTo) {\n const markerCoversIdx = entryIndexForId(entries, markerCoversUpTo);\n if (markerCoversIdx >= 0 && markerCoversIdx <= idx) continue;\n }\n return true;\n }\n }\n // In manual mode, also check pending observation batches that arrived\n // after the cursor (since branch has no OM markers).\n if (pending) {\n const pendingBatches = pending.observationBatches ?? [];\n for (const batch of pendingBatches) {\n if (batch.coversUpToId) {\n const batchIdx = entryIndexForId(entries, batch.coversUpToId);\n if (batchIdx >= 0 && batchIdx > idx) return true;\n }\n }\n }\n return false;\n })();\n\n // ── Dropper ───────────────────────────────────────────────────────────\n // Short‑circuit: only compute dropperDue when observer and reflector are\n // both not due — if either is due, the pipeline launches anyway.\n const dropperDue =\n observerDue || reflectorDue\n ? false\n : (() => {\n // Compute active observation pool tokens (branch + pending in manual mode)\n const folded = foldLedger(entries);\n let poolTokens = folded.activeObservations.reduce(\n (s: number, o: Observation) => s + (o.tokenCount ?? 0),\n 0,\n );\n // In manual mode, include pending observation batches\n if (pending) {\n const pendingBatches = pending.observationBatches ?? [];\n for (const batch of pendingBatches) {\n poolTokens += ((batch.data as any)?.observations ?? []).reduce(\n (s: number, o: any) => s + (o.tokenCount ?? 0),\n 0,\n );\n }\n }\n const fullnessVsPool =\n config.observationsPoolMaxTokens > 0\n ? poolTokens / config.observationsPoolMaxTokens\n : 0;\n\n // Must have at least dropperPoolFullnessThreshold fullness to consider dropper\n if (fullnessVsPool < (config.dropperPoolFullnessThreshold ?? 0.1))\n return false;\n\n // Pressure check: pool ≥ threshold × reflectorInputMaxTokens\n const pressure =\n poolTokens >=\n config.dropperPressureThreshold * config.reflectorInputMaxTokens;\n if (pressure) return true;\n\n // New data check: new obs or ref batches after dropper cursor\n const cursor = cursors.dropper;\n if (!cursor) {\n // In manual mode, pending batches are the only source of new‑data\n // visibility (branch has no OM markers).\n const hasPendingNewData = pending\n ? (pending.observationBatches?.length ?? 0) > 0 ||\n (pending.reflectionBatches?.length ?? 0) > 0\n : false;\n if (hasPendingNewData) return true;\n return (\n rawTokensSinceDropCoverage(entries) >= config.reflectAfterTokens\n );\n }\n const idx = entryIndexForId(entries, cursor.entryId);\n if (idx < 0) {\n return (\n rawTokensSinceDropCoverage(entries) >= config.reflectAfterTokens\n );\n }\n // Must have enough accumulated tokens before considering dropper\n const tokensSince = rawTokensAfterIndex(entries, idx);\n if (tokensSince < config.reflectAfterTokens) {\n return false;\n }\n for (let i = idx + 1; i < entries.length; i++) {\n const e = entries[i];\n if (\n e.type === \"custom\" &&\n (e.customType === OM_OBSERVATIONS_RECORDED ||\n e.customType === OM_REFLECTIONS_RECORDED)\n ) {\n const markerCoversUpTo: string | undefined = (e as any).data\n ?.coversUpToId;\n if (markerCoversUpTo) {\n const markerCoversIdx = entryIndexForId(\n entries,\n markerCoversUpTo,\n );\n if (markerCoversIdx >= 0 && markerCoversIdx <= idx) continue;\n }\n return true;\n }\n }\n // In manual mode, also check pending batches after the cursor\n if (pending) {\n const pendingObs = pending.observationBatches ?? [];\n const pendingRef = pending.reflectionBatches ?? [];\n for (const batch of [...pendingObs, ...pendingRef]) {\n if (batch.coversUpToId) {\n const batchIdx = entryIndexForId(entries, batch.coversUpToId);\n if (batchIdx >= 0 && batchIdx > idx) return true;\n }\n }\n }\n return false;\n })();\n\n return observerDue || reflectorDue || dropperDue;\n}\n\nfunction stageModelConfig(\n runtime: Runtime,\n stage: \"observer\" | \"reflector\" | \"dropper\",\n): ConfiguredModel | undefined {\n if (stage === \"observer\") return runtime.config.observerModel;\n if (stage === \"reflector\") return runtime.config.reflectorModel;\n return runtime.config.dropperModel;\n}\n\nfunction stageFallbackModels(\n runtime: Runtime,\n stage: \"observer\" | \"reflector\" | \"dropper\",\n): ConfiguredModel[] {\n if (stage === \"observer\") return runtime.config.observerFallbackModels ?? [];\n if (stage === \"reflector\")\n return runtime.config.reflectorFallbackModels ?? [];\n return runtime.config.dropperFallbackModels ?? [];\n}\n\nfunction stageThinkingLevel(\n runtime: Runtime,\n stage: \"observer\" | \"reflector\" | \"dropper\",\n modelConfig?: ConfiguredModel,\n): ModelThinkingLevel {\n const stageModel = modelConfig ?? stageModelConfig(runtime, stage);\n return stageModel?.thinking ?? runtime.config.model?.thinking ?? \"low\";\n}\n\nexport function makeModelResolver(\n runtime: Runtime,\n ctx: ConsolidationCtx,\n): (\n stage: \"observer\" | \"reflector\" | \"dropper\",\n) => Promise<ResolvedModel | undefined> {\n return async (stage) => {\n const stageFallbacks = stageFallbackModels(runtime, stage);\n const resolved = await runtime.resolveModel({\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n stageModel: stageModelConfig(runtime, stage),\n stageFallbacks,\n });\n if (resolved.ok) {\n runtime.resolveFailureNotified = false;\n return resolved;\n }\n debugLog(`${stage}.model_unavailable`, { reason: resolved.reason });\n if (!runtime.resolveFailureNotified && ctx.hasUI && ctx.ui) {\n if (\n runtime.failedInCycle.size > 0 &&\n resolved.reason.includes(\"all candidates exhausted\")\n ) {\n const fallbackMsg =\n stageFallbacks.length === 0\n ? \"no fallbacks configured\"\n : \"no available fallbacks\";\n runtime.tryEmitInfo(\n true,\n ctx.ui,\n `Observational memory: ${stage} skipped — model unavailable (cooldown set to 0, ${fallbackMsg}, will retry next run)`,\n );\n } else {\n ctx.ui.notify(\n `Observational memory: ${stage} skipped — ${resolved.reason}`,\n \"warning\",\n );\n }\n runtime.resolveFailureNotified = true;\n }\n return undefined;\n };\n}\n\n// ── Trigger registration ────────────────────────────────────────────────────\n\nexport function registerConsolidationTrigger(\n pi: ExtensionAPI,\n runtime: Runtime,\n): void {\n const launch = (_event: unknown, ctx: ConsolidationCtx) => {\n maybeLaunchConsolidation(pi, runtime, ctx);\n };\n pi.on(\"agent_start\", launch);\n pi.on(\"turn_end\", launch);\n}\n\n/** Validate cursors against the current branch. If a cursor's entry ID no longer\n * exists in the branch (fork, navigation, compaction), fall back to the best\n * available coverage marker for that stage. */\nfunction validateCursors(entries: Entry[], runtime: Runtime): void {\n const cursors = runtime.cursors ?? {};\n\n // Observer: fall back to latest OM_OBSERVATIONS_RECORDED marker\n if (\n cursors.observer &&\n entryIndexForId(entries, cursors.observer.entryId) < 0\n ) {\n const markerId = latestCoverageMarkerId(entries, OM_OBSERVATIONS_RECORDED);\n if (markerId) {\n cursors.observer = { entryId: markerId, state: \"initial\" };\n } else {\n delete cursors.observer;\n }\n }\n\n // Reflector: fall back to latest OM_REFLECTIONS_RECORDED marker\n if (\n cursors.reflector &&\n entryIndexForId(entries, cursors.reflector.entryId) < 0\n ) {\n const markerId = latestCoverageMarkerId(entries, OM_REFLECTIONS_RECORDED);\n if (markerId) {\n cursors.reflector = { entryId: markerId, state: \"initial\" };\n } else {\n delete cursors.reflector;\n }\n }\n\n // Dropper: fall back to latest OM_OBSERVATIONS_DROPPED marker\n if (\n cursors.dropper &&\n entryIndexForId(entries, cursors.dropper.entryId) < 0\n ) {\n const markerId = latestCoverageMarkerId(entries, OM_OBSERVATIONS_DROPPED);\n if (markerId) {\n cursors.dropper = { entryId: markerId, state: \"initial\" };\n } else {\n delete cursors.dropper;\n }\n }\n}\n\nfunction maybeLaunchConsolidation(\n pi: ExtensionAPI,\n runtime: Runtime,\n ctx: ConsolidationCtx,\n): void {\n runtime.ensureConfig(ctx.cwd, (msg) => ctx.ui?.notify?.(msg, \"warning\"));\n if (runtime.config.memory === false) return;\n\n // LEGACY: passive check — only applies when new keys are absent (unmigrated config)\n if (\n runtime.config.compaction === undefined &&\n runtime.config.compactionEngine === undefined\n ) {\n if (runtime.config.passive === true) return;\n }\n if (runtime.consolidationInFlight) return;\n if (runtime.isConsolidationRetryGated()) return;\n\n // Load and validate cursors from pending file (once per session; re-load on fork)\n let sessionId: string;\n try {\n sessionId = ctx.sessionManager.getSessionId();\n } catch (error) {\n if (isStaleExtensionContextError(error)) return;\n throw error;\n }\n if (runtime.cursorsLoadedSessionId !== sessionId) {\n if (typeof runtime.loadCursorsFromPending === \"function\") {\n runtime.loadCursorsFromPending(sessionId);\n }\n let entries: Entry[];\n try {\n entries = ctx.sessionManager.getBranch() as Entry[];\n } catch (error) {\n if (isStaleExtensionContextError(error)) return;\n throw error;\n }\n validateCursors(entries, runtime);\n runtime.cursorsLoadedSessionId = sessionId;\n const c = runtime.cursors ?? {};\n debugLog(\"cursor.loaded\", {\n observer: c.observer ?? null,\n reflector: c.reflector ?? null,\n dropper: c.dropper ?? null,\n });\n }\n\n let entries: Entry[];\n try {\n entries = ctx.sessionManager.getBranch() as Entry[];\n } catch (error) {\n if (isStaleExtensionContextError(error)) return;\n throw error;\n }\n // In manual mode, the branch has no OM markers — pending state provides\n // pool fullness and new‑data visibility for reflector/dropper checks.\n const pending = isManualMode(runtime.config)\n ? readPendingState(sessionId)\n : undefined;\n if (!anyStageDue(entries, runtime, pending)) return;\n\n const runId = `consolidation-${Date.now().toString(36)}-${Math.random().toString(16).slice(2, 8)}`;\n const consolidationCtx: ConsolidationCtx = {\n cwd: ctx.cwd,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n sessionManager: ctx.sessionManager,\n };\n\n void runtime.launchConsolidationTask(ctx, async () =>\n withDebugLogContext(\n { enabled: runtime.config.debugLog === true, cwd: ctx.cwd, runId },\n async () => {\n await runConsolidationPipeline(pi, runtime, consolidationCtx);\n },\n ),\n );\n}\n\n// ── Pipeline ─────────────────────────────────────────────────────────────────\n\nexport async function runConsolidationPipeline(\n pi: ExtensionAPI,\n runtime: Runtime,\n ctx: ConsolidationCtx,\n): Promise<void> {\n const resolveModel = makeModelResolver(runtime, ctx);\n\n runtime.consolidationPhase = \"observer\";\n runtime.failedInCycle.clear();\n runtime.resolveFailureNotified = false;\n try {\n const observerOutcome = await runObserverStage(\n pi,\n runtime,\n ctx,\n resolveModel,\n );\n if (observerOutcome === \"abort\") return;\n } catch (error) {\n debugLog(\"observer.error\", {\n errorMessage: runtime.recordConsolidationStageError(\n ctx,\n \"observer\",\n error,\n ),\n });\n return;\n }\n\n runtime.consolidationPhase = \"reflector\";\n runtime.failedInCycle.clear();\n runtime.resolveFailureNotified = false;\n let reflectorResult: ReflectorStageResult;\n try {\n reflectorResult = await runReflectorStage(pi, runtime, ctx, resolveModel);\n if (reflectorResult.outcome === \"abort\") return;\n } catch (error) {\n debugLog(\"reflector.error\", {\n errorMessage: runtime.recordConsolidationStageError(\n ctx,\n \"reflector\",\n error,\n ),\n });\n return;\n }\n\n runtime.consolidationPhase = \"dropper\";\n runtime.failedInCycle.clear();\n runtime.resolveFailureNotified = false;\n try {\n await runDropperStage(\n pi,\n runtime,\n ctx,\n resolveModel,\n reflectorResult.sameRunReflections,\n reflectorResult.effectiveReflectionCoverageId,\n );\n } catch (error) {\n debugLog(\"dropper.error\", {\n errorMessage: runtime.recordConsolidationStageError(\n ctx,\n \"dropper\",\n error,\n ),\n });\n }\n\n // Flush cursors to pending file after all stages complete (non‑blocking)\n let sessionId: string;\n try {\n sessionId = ctx.sessionManager.getSessionId();\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n debugLog(\"pipeline.stale_ctx\", { error: String(error) });\n return;\n }\n throw error;\n }\n runtime.scheduleCursorFlush(sessionId);\n const c = runtime.cursors ?? {};\n debugLog(\"cursor.saved\", {\n observer: c.observer ?? null,\n reflector: c.reflector ?? null,\n dropper: c.dropper ?? null,\n });\n}\n\n// ── Observer stage (with fallback) ──────────────────────────────────────────\n\nasync function runObserverStage(\n pi: ExtensionAPI,\n runtime: Runtime,\n ctx: ConsolidationCtx,\n resolveModel: (stage: \"observer\") => Promise<ResolvedModel | undefined>,\n): Promise<StageOutcome> {\n let entries: Entry[];\n let sessionId: string;\n try {\n entries = ctx.sessionManager.getBranch() as Entry[];\n sessionId = ctx.sessionManager.getSessionId();\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n debugLog(\"observer.stale_ctx\", { error: String(error) });\n return \"abort\";\n }\n throw error;\n }\n\n // Determine start index: cursor takes priority, fall back to coverage markers\n const observerCursor = runtime.getCursor(\"observer\");\n let effectiveStart: number;\n if (observerCursor) {\n const cursorIdx = entryIndexForId(entries, observerCursor.entryId);\n effectiveStart =\n cursorIdx >= 0\n ? cursorIdx\n : latestCoverageIndex(entries, OM_OBSERVATIONS_RECORDED);\n } else {\n const lastCoverageIdx = latestCoverageIndex(\n entries,\n OM_OBSERVATIONS_RECORDED,\n );\n effectiveStart =\n lastCoverageIdx >= 0 ? lastCoverageIdx : findLastCompactionIndex(entries);\n }\n\n const tokens =\n effectiveStart >= 0 ? rawTokensAfterIndex(entries, effectiveStart) : 0;\n if (tokens < runtime.config.observeAfterTokens) {\n // Not due — advance cursor to last source entry so we don't re-check immediately\n const lastSourceId = [...entries]\n .reverse()\n .find((e: Entry) => isSourceEntry(e))?.id;\n if (lastSourceId)\n runtime.advanceCursor(\"observer\", lastSourceId, \"not_due\");\n return \"continue\";\n }\n\n let chunkEntries = sourceEntriesAfter(entries, effectiveStart);\n\n // Cap observer input to observerChunkMaxTokens (newest-to-oldest)\n const maxChunkTokens = runtime.config.observerChunkMaxTokens;\n if (tokens > maxChunkTokens) {\n chunkEntries = capSourceEntriesToTokens(chunkEntries, maxChunkTokens);\n }\n\n // coversUpToId must point to the LAST entry AFTER capping, not before\n const coversUpToId = chunkEntries.at(-1)?.id;\n if (!coversUpToId) return \"continue\";\n\n const { text: chunk, sourceEntryIds } =\n serializeSourceAddressedBranchEntries(chunkEntries);\n if (!chunk.trim() || sourceEntryIds.length === 0) return \"continue\";\n const chunkTokens = Math.ceil(chunk.length / 4);\n\n const memory = fullProjection(entries);\n let priorReflections = memory.reflections.map(reflectionToSummaryLine);\n let priorObservations = memory.observations.map(observationToSummaryLine);\n\n // In manual mode, append accumulated batch history to whatever\n // fullProjection found in the branch (preserving pre-switch markers\n // when transitioning from autoCompact to manual mode mid-session).\n // The preamble is capped via observerPreambleMaxTokens so accumulated\n // observations don't grow unbounded across turns.\n if (isManualMode(runtime.config)) {\n const pendingCtx = readPendingState(sessionId);\n const accumulatedReflections = (pendingCtx.reflectionBatches ?? []).flatMap(\n (b) => (b.data as any).reflections ?? [],\n );\n const accumulatedObservations = (\n pendingCtx.observationBatches ?? []\n ).flatMap((b) => (b.data as any).observations ?? []);\n\n // Capped preamble: high always kept, medium/low scored by relevance + recency\n const preambleMaxTokens =\n runtime.config.observerPreambleMaxTokens > 0\n ? runtime.config.observerPreambleMaxTokens\n : Math.round(runtime.config.observerChunkMaxTokens * 0.3);\n const allObservations = [\n ...memory.observations,\n ...accumulatedObservations,\n ];\n priorObservations = selectPriorObservations(\n allObservations,\n preambleMaxTokens,\n ).map(observationToSummaryLine);\n\n // Reflections are never trimmed — rare and always kept\n priorReflections = [\n ...priorReflections,\n ...accumulatedReflections.map(reflectionToSummaryLine),\n ];\n }\n\n // If manual mode: skip if this exact chunk was already processed\n if (\n isManualMode(runtime.config) &&\n isObservationChunkPending(sessionId, coversUpToId)\n ) {\n debugLog(\"observer.pending_skip\", { coversUpToId, sessionId });\n return \"continue\";\n }\n\n for (let attempt = 0; attempt < MAX_STAGE_ATTEMPTS; attempt++) {\n const resolved = await resolveModel(\"observer\");\n if (!resolved) return \"abort\";\n\n // Adjust accumulated for pending coverage in manual mode\n let effectiveTokens = tokens;\n if (isManualMode(runtime.config)) {\n const pending = readPendingState(sessionId);\n if (pending.observation?.coversUpToId) {\n const idx = entryIndexForId(entries, pending.observation.coversUpToId);\n if (idx >= 0) effectiveTokens = rawTokensAfterIndex(entries, idx);\n }\n }\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: observer running on ~${chunkTokens.toLocaleString()}-token chunk (of ${effectiveTokens.toLocaleString()} accumulated)`,\n );\n debugLog(\"observer.start\", {\n tokens,\n coversUpToId,\n sourceEntryIds,\n sourceEntryCount: sourceEntryIds.length,\n priorReflections: priorReflections.length,\n priorObservations: priorObservations.length,\n });\n\n // Resolve thinking level for the specific model (fallbacks may have their own thinking config)\n const stageModelForThinking = runtime.findCandidateConfig(resolved.model, {\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n stageModel: stageModelConfig(runtime, \"observer\"),\n stageFallbacks: stageFallbackModels(runtime, \"observer\"),\n });\n\n // Check if estimated input fits in model's context window\n // Use actual chunk tokens (already computed) instead of the configured cap\n const effectiveObsCtx = effectiveContextWindow(\n resolved.model as any,\n stageModelForThinking,\n );\n const observerEstimatedInput = chunkTokens + AGENT_LOOP_RESERVE;\n if (observerEstimatedInput > effectiveObsCtx) {\n debugLog(\"observer.context_window_exceeded\", {\n estimatedInput: observerEstimatedInput,\n effectiveCtx: effectiveObsCtx,\n model: `${(resolved.model as any).provider}/${(resolved.model as any).id}`,\n });\n runtime.recordRetryableError(\n stageModelForThinking,\n new Error(\n `context window ${effectiveObsCtx} too small for estimated input ${observerEstimatedInput}`,\n ),\n \"observer\",\n );\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: observer skipping ${(resolved.model as any).provider}/${(resolved.model as any).id} (context window ${effectiveObsCtx.toLocaleString()} too small for ~${observerEstimatedInput.toLocaleString()}-token input)`,\n );\n continue;\n }\n\n try {\n const result = await runObserver({\n model: resolved.model as any,\n apiKey: resolved.apiKey,\n headers: resolved.headers,\n priorReflections,\n priorObservations,\n chunk,\n allowedSourceEntryIds: sourceEntryIds,\n maxTurns: runtime.config.agentMaxTurns,\n thinkingLevel: stageThinkingLevel(\n runtime,\n \"observer\",\n stageModelForThinking,\n ),\n });\n\n if (result.observations && result.observations.length > 0) {\n const data = buildObservationsRecordedData(\n result.observations,\n coversUpToId,\n );\n if (!data) {\n runtime.advanceCursor(\"observer\", coversUpToId, \"empty\");\n return \"continue\";\n }\n debugLog(\"observer.records\", {\n count: result.observations.length,\n observationTokens: result.observations.reduce(\n (s: number, o: any) => s + o.tokenCount,\n 0,\n ),\n coversUpToId,\n });\n if (isManualMode(runtime.config)) {\n savePendingObservation(sessionId, { coversUpToId, data });\n debugLog(\"observer.pending\", {\n count: result.observations.length,\n coversUpToId,\n sessionId,\n });\n } else {\n appendEntry(pi, OM_OBSERVATIONS_RECORDED, data);\n debugLog(\"observer.appended\", {\n count: result.observations.length,\n coversUpToId,\n });\n }\n runtime.advanceCursor(\"observer\", coversUpToId, \"recorded\");\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: ${result.observations.length} observation${result.observations.length === 1 ? \"\" : \"s\"} recorded`,\n );\n return \"continue\";\n }\n\n // No observations — diagnose the reason for the warning\n const reason = result.emptyReason;\n const reasonLabel = reason\n ? reason.kind === \"tool_not_called\"\n ? \"model did not call the observation tool\"\n : reason.kind === \"all_rejected\"\n ? `${reason.count} observation(s) rejected for invalid sourceEntryIds`\n : reason.kind === \"all_duplicates\"\n ? `${reason.count} observation(s) were duplicates of already-recorded entries`\n : reason.kind === \"empty_array\"\n ? \"model called the tool but submitted an empty observations array\"\n : \"nothing new to record\"\n : \"unknown reason\";\n const reasonLevel: \"info\" | \"warning\" = reason\n ? reason.kind === \"no_new_content\" || reason.kind === \"all_duplicates\"\n ? \"info\"\n : \"warning\"\n : \"warning\";\n debugLog(\"observer.empty\", { coversUpToId, reason: reason?.kind });\n runtime.advanceCursor(\"observer\", coversUpToId, \"empty\");\n if (reasonLevel === \"warning\") {\n if (ctx.hasUI)\n ctx.ui?.notify(\n `Observational memory: no observations — ${reasonLabel}`,\n \"warning\",\n );\n } else {\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: no observations — ${reasonLabel}`,\n );\n }\n return \"continue\";\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n debugLog(\"observer.stale_ctx\", { error: String(error) });\n return \"abort\";\n }\n // Always try next fallback — don't abort pipeline for a single model failure.\n // Record cooldown so resolveModel skips this model in the next iteration.\n const candidateConfig = runtime.findCandidateConfig(resolved.model, {\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n stageModel: stageModelConfig(runtime, \"observer\"),\n stageFallbacks: stageFallbackModels(runtime, \"observer\"),\n });\n runtime.recordRetryableError(candidateConfig, error, \"observer\");\n debugLog(\"observer.error\", {\n error: String(error),\n retryable: isRetryableError(error),\n });\n // Continue loop — resolveModel will skip the cooled-down model\n continue;\n }\n }\n\n // All attempts exhausted\n runtime.recordConsolidationStageError(\n ctx,\n \"observer\",\n new Error(\"Observer: all model candidates exhausted\"),\n );\n return \"abort\";\n}\n\n// ── Reflector stage (with fallback) ─────────────────────────────────────────\n\nasync function runReflectorStage(\n pi: ExtensionAPI,\n runtime: Runtime,\n ctx: ConsolidationCtx,\n resolveModel: (stage: \"reflector\") => Promise<ResolvedModel | undefined>,\n): Promise<ReflectorStageResult> {\n let entries: Entry[];\n let sessionId: string;\n try {\n entries = ctx.sessionManager.getBranch() as Entry[];\n sessionId = ctx.sessionManager.getSessionId();\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n debugLog(\"reflector.stale_ctx\", { error: String(error) });\n return { outcome: \"abort\", sameRunReflections: [] };\n }\n throw error;\n }\n let reflectionTokens = 0;\n let observationCoverageId: string | undefined;\n if (isManualMode(runtime.config)) {\n const pending = readPendingState(sessionId);\n // Check any accumulated batch for unprocessed observations, not just the latest\n const hasPendingObs = (pending.observationBatches ?? []).some(\n (b: any) => (b.data as any)?.observations?.length,\n );\n if (!hasPendingObs) {\n runtime.advanceCursor(\n \"reflector\",\n entries.at(-1)?.id ?? \"unknown\",\n \"skipped\",\n );\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n observationCoverageId = pending.observation?.coversUpToId;\n if (pending.reflection?.coversUpToId) {\n const obsIdx = entryIndexForId(\n entries,\n pending.observation?.coversUpToId ?? \"\",\n );\n const refIdx = entryIndexForId(entries, pending.reflection.coversUpToId);\n if (obsIdx >= 0 && refIdx >= 0 && obsIdx <= refIdx) {\n runtime.advanceCursor(\n \"reflector\",\n pending.reflection.coversUpToId,\n \"skipped\",\n );\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n if (refIdx >= 0) {\n reflectionTokens = rawTokensAfterIndex(entries, refIdx);\n if (reflectionTokens < runtime.config.reflectAfterTokens) {\n runtime.advanceCursor(\n \"reflector\",\n pending.reflection.coversUpToId,\n \"not_due\",\n );\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n } else {\n reflectionTokens = rawTokensSinceObservationCoverage(entries);\n }\n } else {\n reflectionTokens = rawTokensSinceObservationCoverage(entries);\n }\n } else {\n reflectionTokens = rawTokensSinceReflectionCoverage(entries);\n if (reflectionTokens < runtime.config.reflectAfterTokens) {\n runtime.advanceCursor(\n \"reflector\",\n entries.at(-1)?.id ?? \"unknown\",\n \"not_due\",\n );\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n observationCoverageId = latestCoverageMarkerId(\n entries,\n OM_OBSERVATIONS_RECORDED,\n );\n if (!observationCoverageId) {\n runtime.advanceCursor(\n \"reflector\",\n entries.at(-1)?.id ?? \"unknown\",\n \"skipped\",\n );\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n }\n\n for (let attempt = 0; attempt < MAX_STAGE_ATTEMPTS; attempt++) {\n const resolved = await resolveModel(\"reflector\");\n if (!resolved) return { outcome: \"abort\", sameRunReflections: [] };\n\n // Compute ahead for an accurate notification\n const folded = foldLedger(entries);\n const pending = isManualMode(runtime.config)\n ? readPendingState(sessionId)\n : undefined;\n const lastReflectionIdx = pending\n ? -1\n : latestCoverageIndex(entries, OM_REFLECTIONS_RECORDED);\n const newObservations = pending\n ? pendingObservationsCreatedAfter(\n pending,\n entries,\n pending.reflection?.coversUpToId,\n )\n : observationsCreatedAfterIndex(entries, lastReflectionIdx);\n const newReflections = pending\n ? []\n : reflectionsCreatedAfterIndex(entries, lastReflectionIdx);\n const newItemsTokens = Math.ceil(\n (newObservations.reduce((s: number, o: any) => s + o.content.length, 0) +\n newReflections.reduce((s: number, r: any) => s + r.content.length, 0)) /\n 4,\n );\n const summaryBudget =\n Math.floor(runtime.config.reflectorInputMaxTokens * 0.15) * 2;\n const reflectorInputTokens = Math.min(\n newItemsTokens + summaryBudget,\n runtime.config.reflectorInputMaxTokens,\n );\n // Adjust accumulated for pending coverage in manual mode\n let effectiveReflectionTokens = reflectionTokens;\n if (isManualMode(runtime.config)) {\n if (pending?.reflection?.coversUpToId) {\n const idx = entryIndexForId(entries, pending.reflection.coversUpToId);\n if (idx >= 0)\n effectiveReflectionTokens = rawTokensAfterIndex(entries, idx);\n }\n }\n debugLog(\"reflector.start\", {\n tokens: effectiveReflectionTokens,\n inputTokens: reflectorInputTokens,\n newObsCount: newObservations.length,\n newRefCount: newReflections.length,\n });\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: reflector running (~${effectiveReflectionTokens.toLocaleString()} tokens accumulated, ~${reflectorInputTokens.toLocaleString()}-token input)`,\n );\n\n // Resolve thinking level for the specific model (fallbacks may have their own thinking config)\n const stageModelForThinking = runtime.findCandidateConfig(resolved.model, {\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n stageModel: stageModelConfig(runtime, \"reflector\"),\n stageFallbacks: stageFallbackModels(runtime, \"reflector\"),\n });\n\n // Check if estimated input fits in model's context window\n // Use actual computed input size (new items + summary budget) instead of cap\n const effectiveRefCtx = effectiveContextWindow(\n resolved.model as any,\n stageModelForThinking,\n );\n const reflectorEstimatedInput = reflectorInputTokens + AGENT_LOOP_RESERVE;\n if (reflectorEstimatedInput > effectiveRefCtx) {\n debugLog(\"reflector.context_window_exceeded\", {\n estimatedInput: reflectorEstimatedInput,\n effectiveCtx: effectiveRefCtx,\n model: `${(resolved.model as any).provider}/${(resolved.model as any).id}`,\n });\n runtime.recordRetryableError(\n stageModelForThinking,\n new Error(\n `context window ${effectiveRefCtx} too small for estimated input ${reflectorEstimatedInput}`,\n ),\n \"reflector\",\n );\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: reflector skipping ${(resolved.model as any).provider}/${(resolved.model as any).id} (context window ${effectiveRefCtx.toLocaleString()} too small for ~${reflectorEstimatedInput.toLocaleString()}-token input)`,\n );\n continue;\n }\n\n try {\n // Existing memory summaries for context (capped).\n // In manual mode, merge accumulated pending batches with\n // branch data (preserving pre-switch markers).\n const sourceReflections = pending\n ? [\n ...folded.reflections,\n ...(pending.reflectionBatches ?? []).flatMap(\n (b: any) => (b.data as any)?.reflections ?? [],\n ),\n ]\n : folded.reflections;\n const sourceObservations = pending\n ? [\n ...folded.activeObservations,\n ...(pending.observationBatches ?? []).flatMap(\n (b: any) => (b.data as any)?.observations ?? [],\n ),\n ]\n : folded.activeObservations;\n const existingReflectionsSummary = buildExistingReflectionsSummary(\n sourceReflections,\n Math.floor(runtime.config.reflectorInputMaxTokens * 0.15),\n );\n const existingObservationsSummary = buildExistingObservationsSummary(\n sourceObservations.filter(\n (o: any) => !newObservations.some((no: any) => no.id === o.id),\n ),\n Math.floor(runtime.config.reflectorInputMaxTokens * 0.15),\n );\n\n const reflections = await runReflector({\n model: resolved.model as any,\n apiKey: resolved.apiKey,\n headers: resolved.headers,\n reflections: newReflections,\n observations: newObservations,\n existingReflectionsSummary: existingReflectionsSummary || undefined,\n existingObservationsSummary: existingObservationsSummary || undefined,\n maxTurns: runtime.config.agentMaxTurns,\n thinkingLevel: stageThinkingLevel(\n runtime,\n \"reflector\",\n stageModelForThinking,\n ),\n });\n\n if (!reflections || reflections.length === 0) {\n runtime.advanceCursor(\n \"reflector\",\n observationCoverageId ?? entries.at(-1)?.id ?? \"unknown\",\n \"empty\",\n );\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n if (!observationCoverageId) {\n runtime.advanceCursor(\n \"reflector\",\n entries.at(-1)?.id ?? \"unknown\",\n \"empty\",\n );\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n\n const data = buildReflectionsRecordedData(\n reflections,\n observationCoverageId,\n );\n if (!data) {\n runtime.advanceCursor(\"reflector\", observationCoverageId, \"empty\");\n return { outcome: \"continue\", sameRunReflections: [] };\n }\n if (isManualMode(runtime.config)) {\n savePendingReflection(sessionId, {\n coversUpToId: data.coversUpToId,\n data,\n });\n } else {\n appendEntry(pi, OM_REFLECTIONS_RECORDED, data);\n }\n runtime.advanceCursor(\"reflector\", data.coversUpToId, \"recorded\");\n return {\n outcome: \"continue\",\n sameRunReflections: reflections,\n effectiveReflectionCoverageId: data.coversUpToId,\n };\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n debugLog(\"reflector.stale_ctx\", { error: String(error) });\n return { outcome: \"abort\", sameRunReflections: [] };\n }\n const candidateConfig = runtime.findCandidateConfig(resolved.model, {\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n stageModel: stageModelConfig(runtime, \"reflector\"),\n stageFallbacks: stageFallbackModels(runtime, \"reflector\"),\n });\n runtime.recordRetryableError(candidateConfig, error, \"reflector\");\n debugLog(\"reflector.error\", {\n error: String(error),\n retryable: isRetryableError(error),\n });\n continue;\n }\n }\n\n runtime.recordConsolidationStageError(\n ctx,\n \"reflector\",\n new Error(\"Reflector: all model candidates exhausted\"),\n );\n return { outcome: \"abort\", sameRunReflections: [] };\n}\n\n// ── Dropper stage (with fallback) ───────────────────────────────────────────\n\nasync function runDropperStage(\n pi: ExtensionAPI,\n runtime: Runtime,\n ctx: ConsolidationCtx,\n resolveModel: (stage: \"dropper\") => Promise<ResolvedModel | undefined>,\n sameRunReflections: Reflection[],\n sameRunReflectionCoverageId: string | undefined,\n): Promise<StageOutcome> {\n let entries: Entry[];\n let sessionId: string;\n try {\n entries = ctx.sessionManager.getBranch() as Entry[];\n sessionId = ctx.sessionManager.getSessionId();\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n debugLog(\"dropper.stale_ctx\", { error: String(error) });\n return \"abort\";\n }\n throw error;\n }\n let dropTokens = 0;\n let observationCoverageId: string | undefined;\n if (isManualMode(runtime.config)) {\n const pending = readPendingState(sessionId);\n // Check any accumulated batch for unprocessed observations, not just the latest\n const hasPendingObs = (pending.observationBatches ?? []).some(\n (b: any) => (b.data as any)?.observations?.length,\n );\n if (!hasPendingObs) {\n runtime.advanceCursor(\n \"dropper\",\n entries.at(-1)?.id ?? \"unknown\",\n \"skipped\",\n );\n return \"continue\";\n }\n observationCoverageId = pending.observation?.coversUpToId;\n if (pending.dropped?.coversUpToId) {\n const obsIdx = entryIndexForId(\n entries,\n pending.observation?.coversUpToId ?? \"\",\n );\n const dropIdx = entryIndexForId(entries, pending.dropped.coversUpToId);\n if (obsIdx >= 0 && dropIdx >= 0 && obsIdx <= dropIdx) {\n runtime.advanceCursor(\n \"dropper\",\n pending.dropped.coversUpToId,\n \"skipped\",\n );\n return \"continue\";\n }\n if (dropIdx >= 0) {\n dropTokens = rawTokensAfterIndex(entries, dropIdx);\n if (dropTokens < runtime.config.reflectAfterTokens) {\n runtime.advanceCursor(\n \"dropper\",\n pending.dropped.coversUpToId,\n \"not_due\",\n );\n return \"continue\";\n }\n } else {\n dropTokens = rawTokensSinceDropCoverage(entries);\n }\n } else {\n dropTokens = rawTokensSinceDropCoverage(entries);\n }\n } else {\n dropTokens = rawTokensSinceDropCoverage(entries);\n if (dropTokens < runtime.config.reflectAfterTokens) {\n runtime.advanceCursor(\n \"dropper\",\n entries.at(-1)?.id ?? \"unknown\",\n \"not_due\",\n );\n return \"continue\";\n }\n observationCoverageId = latestCoverageMarkerId(\n entries,\n OM_OBSERVATIONS_RECORDED,\n );\n if (!observationCoverageId) {\n runtime.advanceCursor(\n \"dropper\",\n entries.at(-1)?.id ?? \"unknown\",\n \"skipped\",\n );\n return \"continue\";\n }\n }\n\n for (let attempt = 0; attempt < MAX_STAGE_ATTEMPTS; attempt++) {\n const resolved = await resolveModel(\"dropper\");\n if (!resolved) return \"abort\";\n\n // Compute ahead for an accurate notification\n const folded = foldLedger(entries);\n const pending = isManualMode(runtime.config)\n ? readPendingState(sessionId)\n : undefined;\n const lastDropIdx = pending\n ? -1\n : latestCoverageIndex(entries, OM_OBSERVATIONS_DROPPED);\n const newObservations = pending\n ? pendingObservationsCreatedAfter(\n pending,\n entries,\n pending.dropped?.coversUpToId,\n )\n : observationsCreatedAfterIndex(entries, lastDropIdx);\n const dropperNewObsTokens = Math.ceil(\n newObservations.reduce((s: number, o: any) => s + o.content.length, 0) /\n 4,\n );\n const dropperSummaryBudget = Math.floor(\n runtime.config.dropperInputMaxTokens * 0.2,\n );\n const dropperInputTokens = Math.min(\n dropperNewObsTokens + dropperSummaryBudget,\n runtime.config.dropperInputMaxTokens,\n );\n // Adjust accumulated for pending coverage in manual mode\n let effectiveDropTokens = dropTokens;\n if (isManualMode(runtime.config)) {\n if (pending?.dropped?.coversUpToId) {\n const idx = entryIndexForId(entries, pending.dropped.coversUpToId);\n if (idx >= 0) effectiveDropTokens = rawTokensAfterIndex(entries, idx);\n }\n }\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: dropper running (~${effectiveDropTokens.toLocaleString()} tokens accumulated, ~${dropperInputTokens.toLocaleString()}-token input)`,\n );\n\n try {\n // Existing active observations summary for context (capped).\n // In manual mode, merge accumulated pending batches with\n // branch data (preserving pre-switch markers).\n const sourceObsForDropper = pending\n ? [\n ...folded.activeObservations,\n ...(pending.observationBatches ?? []).flatMap(\n (b: any) => (b.data as any)?.observations ?? [],\n ),\n ]\n : folded.activeObservations;\n const existingObservationsSummary = buildExistingObservationsSummary(\n sourceObsForDropper.filter(\n (o: any) => !newObservations.some((no: any) => no.id === o.id),\n ),\n Math.floor(runtime.config.dropperInputMaxTokens * 0.2),\n );\n // In manual mode, merge accumulated reflection batches with\n // branch data (preserving pre-switch markers), matching the\n // dropper's full autoCompact context.\n const pendingReflections = pending\n ? [\n ...folded.reflections,\n ...(pending.reflectionBatches ?? []).flatMap(\n (b: any) => (b.data as any)?.reflections ?? [],\n ),\n ]\n : folded.reflections;\n const reflectionsForDropper = mergeReflections(\n pendingReflections,\n sameRunReflections,\n );\n\n // Resolve thinking level for the specific model (fallbacks may have their own thinking config)\n const stageModelForThinking = runtime.findCandidateConfig(\n resolved.model,\n {\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n stageModel: stageModelConfig(runtime, \"dropper\"),\n stageFallbacks: stageFallbackModels(runtime, \"dropper\"),\n },\n );\n\n // Check if estimated input fits in model's context window\n // Use actual computed input size (new observations + summary budget) instead of cap\n const effectiveDropCtx = effectiveContextWindow(\n resolved.model as any,\n stageModelForThinking,\n );\n const dropperEstimatedInput = dropperInputTokens + AGENT_LOOP_RESERVE;\n if (dropperEstimatedInput > effectiveDropCtx) {\n debugLog(\"dropper.context_window_exceeded\", {\n estimatedInput: dropperEstimatedInput,\n effectiveCtx: effectiveDropCtx,\n model: `${(resolved.model as any).provider}/${(resolved.model as any).id}`,\n });\n runtime.recordRetryableError(\n stageModelForThinking,\n new Error(\n `context window ${effectiveDropCtx} too small for estimated input ${dropperEstimatedInput}`,\n ),\n \"dropper\",\n );\n runtime.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: dropper skipping ${(resolved.model as any).provider}/${(resolved.model as any).id} (context window ${effectiveDropCtx.toLocaleString()} too small for ~${dropperEstimatedInput.toLocaleString()}-token input)`,\n );\n continue;\n }\n\n const droppedIds = await runDropper({\n model: resolved.model as any,\n apiKey: resolved.apiKey,\n headers: resolved.headers,\n reflections: reflectionsForDropper,\n observations: newObservations,\n existingObservationsSummary: existingObservationsSummary || undefined,\n budgetTokens: runtime.config.observationsPoolMaxTokens,\n skipFullness: runtime.config.dropperPoolFullnessThreshold,\n maxTurns: runtime.config.agentMaxTurns,\n thinkingLevel: stageThinkingLevel(\n runtime,\n \"dropper\",\n stageModelForThinking,\n ),\n });\n const latestReflectionCoverageId = isManualMode(runtime.config)\n ? pending?.reflection?.coversUpToId\n : latestCoverageMarkerId(entries, OM_REFLECTIONS_RECORDED);\n const effectiveReflectionCoverageId =\n sameRunReflectionCoverageId ?? latestReflectionCoverageId;\n const coversUpToId = earlierCoverageMarkerId(\n entries,\n observationCoverageId,\n effectiveReflectionCoverageId,\n );\n const data =\n coversUpToId && droppedIds\n ? buildObservationsDroppedData(droppedIds, coversUpToId)\n : undefined;\n if (data && coversUpToId) {\n if (isManualMode(runtime.config)) {\n savePendingDropped(sessionId, { coversUpToId, data });\n } else {\n appendEntry(pi, OM_OBSERVATIONS_DROPPED, data);\n }\n runtime.advanceCursor(\"dropper\", coversUpToId, \"recorded\");\n } else {\n // No drops selected (maxDropsAllowed=0 or LLM returned no candidates)\n runtime.advanceCursor(\n \"dropper\",\n coversUpToId ??\n observationCoverageId ??\n entries.at(-1)?.id ??\n \"unknown\",\n \"empty\",\n );\n }\n return \"continue\";\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n debugLog(\"dropper.stale_ctx\", { error: String(error) });\n return \"abort\";\n }\n const candidateConfig = runtime.findCandidateConfig(resolved.model, {\n model: ctx.model,\n modelRegistry: ctx.modelRegistry,\n hasUI: ctx.hasUI,\n ui: ctx.ui,\n stageModel: stageModelConfig(runtime, \"dropper\"),\n stageFallbacks: stageFallbackModels(runtime, \"dropper\"),\n });\n runtime.recordRetryableError(candidateConfig, error, \"dropper\");\n debugLog(\"dropper.error\", {\n error: String(error),\n retryable: isRetryableError(error),\n });\n continue;\n }\n }\n\n runtime.recordConsolidationStageError(\n ctx,\n \"dropper\",\n new Error(\"Dropper: all model candidates exhausted\"),\n );\n return \"abort\";\n}\n","import type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { rawTokensSinceLastCompaction, type Entry } from \"./ledger/index.js\";\nimport type { Runtime } from \"./runtime.js\";\nimport { debugLog } from \"./debug-log.js\";\nimport { RETRYABLE_ERROR_RE } from \"./retryable-error.js\";\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (error && typeof error === \"object\" && \"message\" in error) {\n return String((error as { message: unknown }).message);\n }\n return String(error);\n}\n\nfunction isStaleExtensionContextError(error: unknown): boolean {\n const message = getErrorMessage(error);\n return (\n message.includes(\"extension ctx is stale\") ||\n message.includes(\"ctx is stale\")\n );\n}\n\nfunction notifySafely(\n hasUI: boolean,\n ui: any,\n message: string,\n level: \"info\" | \"warning\" | \"error\",\n): void {\n if (!hasUI) return;\n try {\n ui?.notify(message, level);\n } catch (error) {\n if (!isStaleExtensionContextError(error)) throw error;\n }\n}\n\n/**\n * Message injected after a mid-run compaction so the agent resumes the task\n * instead of stopping (ctx.compact() aborts the in-flight run and Pi does not\n * auto-continue).\n */\nexport const MID_RUN_RESUME_CUSTOM_TYPE = \"blackhole-resume\";\nexport const MID_RUN_RESUME_MESSAGE =\n \"Context was auto-compacted mid-task to stay under the token threshold. \" +\n \"The summary above preserves prior progress. Continue the task from where you left off.\";\n\n/**\n * Shared config gating for auto-compaction (agent_end and turn_end paths).\n * Returns null when compaction may proceed, or a skip reason string.\n */\nfunction autoCompactionSkipReason(runtime: Runtime): string | null {\n if (runtime.config.compaction === \"off\") return \"compaction_off\";\n if (runtime.config.compaction === \"manual\") return \"compaction_manual\";\n if (runtime.config.compactionEngine === \"pi-default\")\n return \"compactionEngine_pi_default\";\n // NOTE: memory does not gate compaction — memory:false + compaction:auto = compact without OM\n\n // LEGACY: old config key guards — only apply when new keys are absent (unmigrated config)\n if (\n runtime.config.compaction === undefined &&\n runtime.config.compactionEngine === undefined\n ) {\n if (runtime.config.passive === true) return \"passive\";\n if (runtime.config.noAutoCompact === true) return \"manual\";\n // Don't force Pi to compact unless the user explicitly opted into blackhole's pipeline.\n if (runtime.config.overrideDefaultCompaction === false)\n return \"overrideDefaultCompaction_false\";\n }\n return null;\n}\n\nexport function registerCompactionTrigger(\n pi: ExtensionAPI,\n runtime: Runtime,\n): void {\n pi.on(\"agent_start\", () => {\n // Reset the info gate — allow one info notification during the new turn.\n runtime.resetInfoGate();\n\n // A new turn is starting — abort any pending auto-compaction wait.\n // The new turn's own agent_end will re-evaluate the threshold and\n // schedule a fresh wait if compaction is still needed.\n if (runtime.autoCompactionController) {\n runtime.autoCompactionController.abort();\n runtime.autoCompactionController = null;\n runtime.compactInFlight = false;\n }\n });\n\n pi.on(\"agent_end\", (event: any, ctx: any) => {\n try {\n handleAgentEnd(event, ctx, runtime);\n } catch (error) {\n if (isStaleExtensionContextError(error)) return;\n throw error;\n }\n });\n\n // Mid-run trigger: turn_end fires after every assistant-message + tool-execution\n // cycle while the agent is still working. agent_end only fires when the run\n // exits, so during long tool loops the threshold would otherwise never be\n // evaluated (the configured compactAfterTokens could be exceeded many times\n // over before compaction had a chance to run).\n pi.on(\"turn_end\", (_event: any, ctx: any) => {\n try {\n handleTurnEnd(ctx, runtime, pi);\n } catch (error) {\n if (isStaleExtensionContextError(error)) return;\n throw error;\n }\n });\n}\n\nfunction handleTurnEnd(ctx: any, runtime: Runtime, pi: ExtensionAPI): void {\n runtime.ensureConfig(ctx.cwd, (msg) => ctx.ui?.notify?.(msg, \"warning\"));\n const dbg = (ev: string, d?: Record<string, unknown>) =>\n debugLog(ev, d, runtime.config.debugLog === true);\n\n const mode = runtime.config.midRunCompaction ?? \"off\";\n if (mode === \"off\") {\n dbg(\"compaction_trigger.turn_end.skip\", { reason: \"midRunCompaction_off\" });\n return;\n }\n const skipReason = autoCompactionSkipReason(runtime);\n if (skipReason) {\n dbg(\"compaction_trigger.turn_end.skip\", { reason: skipReason });\n return;\n }\n if (runtime.compactInFlight) {\n dbg(\"compaction_trigger.turn_end.skip\", { reason: \"compactInFlight\" });\n return;\n }\n\n const entries = ctx.sessionManager.getBranch() as Entry[];\n const tokens = rawTokensSinceLastCompaction(entries);\n if (tokens < runtime.config.compactAfterTokens) {\n // Pressure relieved (a compaction ran) — lift any failure suspension.\n runtime.midRunCompactionSuspended = false;\n return;\n }\n if (runtime.midRunCompactionSuspended) {\n // A previous mid-run attempt failed/cancelled at this pressure level.\n // Re-triggering every turn would thrash (each attempt aborts the run).\n // Stay suspended until a compaction lowers pressure below the threshold.\n dbg(\"compaction_trigger.turn_end.skip\", {\n reason: \"suspended_after_failure\",\n tokens,\n });\n return;\n }\n\n const hasUI = ctx.hasUI;\n const ui = ctx.ui;\n dbg(\"compaction_trigger.turn_end.threshold_reached\", {\n tokens,\n threshold: runtime.config.compactAfterTokens,\n mode,\n });\n runtime.tryEmitInfo(\n hasUI,\n ui,\n `Observational memory: compaction threshold reached mid-run (~${tokens.toLocaleString()} tokens); compacting${mode === \"resume\" ? \" and resuming\" : \"\"}`,\n );\n\n // ctx.compact() aborts the in-flight agent run before compacting — that is\n // the intended trade: turn_end is a clean boundary (tool results are already\n // persisted; at most one just-started LLM call is wasted).\n runtime.compactInFlight = true;\n ctx.compact({\n onComplete: (_result: any) => {\n runtime.compactInFlight = false;\n dbg(\"compaction_trigger.turn_end.onComplete\", { mode });\n if (mode === \"resume\") {\n try {\n pi.sendMessage(\n {\n customType: MID_RUN_RESUME_CUSTOM_TYPE,\n content: MID_RUN_RESUME_MESSAGE,\n display: true,\n },\n { triggerTurn: true },\n );\n } catch (error) {\n if (!isStaleExtensionContextError(error)) throw error;\n }\n }\n runtime.tryEmitInfo(\n hasUI,\n ui,\n \"Observational memory: mid-run compaction complete\",\n );\n },\n onError: (error: { message: string }) => {\n runtime.compactInFlight = false;\n // Don't retry at this pressure level — the next attempt would abort the\n // run again just to fail the same way. Cleared when pressure drops.\n runtime.midRunCompactionSuspended = true;\n dbg(\"compaction_trigger.turn_end.onError\", {\n message: error?.message ?? String(error),\n });\n if (error.message !== \"Compaction cancelled\") {\n notifySafely(\n hasUI,\n ui,\n `Observational memory: mid-run compaction failed: ${error.message}`,\n \"error\",\n );\n }\n // ctx.compact() already aborted the run. In resume mode the agent must\n // continue regardless of the failed compaction — otherwise it stalls\n // mid-task with no one at the wheel.\n if (mode === \"resume\") {\n try {\n pi.sendMessage(\n {\n customType: MID_RUN_RESUME_CUSTOM_TYPE,\n content: MID_RUN_RESUME_MESSAGE,\n display: true,\n },\n { triggerTurn: true },\n );\n } catch (sendError) {\n if (!isStaleExtensionContextError(sendError)) throw sendError;\n }\n }\n },\n });\n}\n\nfunction handleAgentEnd(event: any, ctx: any, runtime: Runtime): void {\n runtime.ensureConfig(ctx.cwd, (msg) => ctx.ui?.notify?.(msg, \"warning\"));\n // Reset the info gate — allow one notification during agent_end.\n runtime.resetInfoGate();\n\n // Pass the config flag explicitly — this handler runs outside ALS context\n // (agent_end events don't flow through consolidation's withDebugLogContext),\n // and the setTimeout callback would lose ALS context anyway.\n const dbg = (ev: string, d?: Record<string, unknown>) =>\n debugLog(ev, d, runtime.config.debugLog === true);\n\n dbg(\"compaction_trigger.agent_end\", {\n passive: runtime.config.passive,\n memory: runtime.config.memory,\n manualMode:\n runtime.config.compaction === \"manual\" ||\n runtime.config.noAutoCompact === true,\n overrideDefaultCompaction: runtime.config.overrideDefaultCompaction,\n compactInFlight: runtime.compactInFlight,\n compactAfterTokens: runtime.config.compactAfterTokens,\n });\n\n // Unified + legacy compaction guards (shared with the turn_end path)\n const skipReason = autoCompactionSkipReason(runtime);\n if (skipReason) {\n dbg(\"compaction_trigger.skip\", { reason: skipReason });\n return;\n }\n if (runtime.compactInFlight) {\n dbg(\"compaction_trigger.skip\", { reason: \"compactInFlight\" });\n return;\n }\n\n // Don't trigger compaction if Pi will auto-retry — the agent hasn't truly finished.\n // Pi emits agent_end before its own retry check, so we must detect this ourselves.\n // The next agent_end (after retry succeeds or exhausts attempts) will re-evaluate.\n const lastAssistant = [...event.messages]\n .reverse()\n .find(\n (m): m is Extract<typeof m, { role: \"assistant\" }> =>\n m.role === \"assistant\",\n );\n if (\n lastAssistant &&\n lastAssistant.stopReason === \"error\" &&\n lastAssistant.errorMessage &&\n RETRYABLE_ERROR_RE.test(lastAssistant.errorMessage)\n ) {\n return;\n }\n\n const entries = ctx.sessionManager.getBranch() as Entry[];\n dbg(\"compaction_trigger.branch_check\", {\n branchLength: entries.length,\n hasLastEntry: entries.length > 0,\n lastEntryType:\n entries.length > 0 ? entries[entries.length - 1].type : \"none\",\n });\n\n const tokens = rawTokensSinceLastCompaction(entries);\n dbg(\"compaction_trigger.tokens\", {\n tokens,\n compactAfterTokens: runtime.config.compactAfterTokens,\n branchLength: entries.length,\n });\n if (tokens < runtime.config.compactAfterTokens) {\n dbg(\"compaction_trigger.skip\", {\n reason: \"below_threshold\",\n tokens,\n threshold: runtime.config.compactAfterTokens,\n });\n return;\n }\n\n // Capture ctx properties synchronously — the deferred callback below\n // may outlive the extension ctx (stale after session replacement/reload).\n const hasUI = ctx.hasUI;\n const ui = ctx.ui;\n const sessionId = ctx.sessionManager.getSessionId();\n\n dbg(\"compaction_trigger.threshold_reached\", { tokens, sessionId, hasUI });\n\n runtime.tryEmitInfo(\n hasUI,\n ui,\n `Observational memory: compaction threshold reached (~${tokens.toLocaleString()} tokens); triggering compaction`,\n );\n\n runtime.compactInFlight = true;\n const controller = new AbortController();\n runtime.autoCompactionController = controller;\n const signal = controller.signal;\n dbg(\"compaction_trigger.scheduled\", {\n compactInFlight: runtime.compactInFlight,\n });\n\n // Issue #31: keep waiting for the agent to become idle instead of bailing\n // after the first non-idle check. The agent may need a few hundred ms to\n // finish async work from other extension handlers (e.g. pi-rewind's\n // checkpoint I/O) before it is truly idle. The only legitimate cancellation\n // is the agent_start handler above aborting the controller.\n void (async () => {\n try {\n // Yield to the event loop first — matches the historical\n // setTimeout(0) deferral that lets other agent_end listeners run.\n await new Promise((resolve) => setTimeout(resolve, 0));\n\n // Poll isIdle() every 200ms until it returns true. No max-retries\n // cap: the user can be reading the response for arbitrarily long.\n // ctx.compact() itself aborts any in-flight agent operation, so we\n // must wait until the agent is truly idle.\n let isIdle = false;\n while (!isIdle) {\n if (signal.aborted) {\n dbg(\"compaction_trigger.microtask.bail\", {\n reason: \"aborted_agent_start\",\n });\n return;\n }\n\n // Validate session identity — bail if the session was replaced/reloaded.\n let currentSessionId: string;\n try {\n currentSessionId = ctx.sessionManager.getSessionId();\n } catch (error) {\n if (isStaleExtensionContextError(error)) {\n runtime.compactInFlight = false;\n runtime.autoCompactionController = null;\n dbg(\"compaction_trigger.microtask.bail\", { reason: \"stale_ctx\" });\n return;\n }\n throw error;\n }\n dbg(\"compaction_trigger.microtask.session_check\", {\n currentSessionId,\n expectedSessionId: sessionId,\n match: currentSessionId === sessionId,\n });\n if (currentSessionId !== sessionId) {\n runtime.compactInFlight = false;\n runtime.autoCompactionController = null;\n dbg(\"compaction_trigger.microtask.bail\", {\n reason: \"session_changed\",\n });\n runtime.tryEmitInfo(\n hasUI,\n ui,\n \"Observational memory: compaction cancelled — session changed before compaction\",\n );\n return;\n }\n\n isIdle = ctx.isIdle();\n dbg(\"compaction_trigger.microtask.idle_check\", { isIdle });\n if (!isIdle) {\n // Sleep in 50ms slices so agent_start aborts are noticed quickly.\n // A single 200ms await would let the loop run for 200ms after\n // the user typed — too long, since we want compaction to wait\n // only for the agent to settle, not for a full tick.\n const sliceMs = 50;\n const end = Date.now() + 200;\n while (Date.now() < end) {\n if (signal.aborted) {\n dbg(\"compaction_trigger.microtask.bail\", {\n reason: \"aborted_agent_start\",\n });\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, sliceMs));\n }\n }\n }\n\n if (signal.aborted) {\n dbg(\"compaction_trigger.microtask.bail\", {\n reason: \"aborted_agent_start\",\n });\n return;\n }\n\n const currentEntries = ctx.sessionManager.getBranch() as Entry[];\n const currentTokens = rawTokensSinceLastCompaction(currentEntries);\n dbg(\"compaction_trigger.microtask.recheck_tokens\", {\n currentTokens,\n threshold: runtime.config.compactAfterTokens,\n ok: currentTokens >= runtime.config.compactAfterTokens,\n });\n if (currentTokens < runtime.config.compactAfterTokens) {\n runtime.compactInFlight = false;\n runtime.autoCompactionController = null;\n dbg(\"compaction_trigger.microtask.bail\", {\n reason: \"pressure_relieved\",\n currentTokens,\n threshold: runtime.config.compactAfterTokens,\n });\n runtime.tryEmitInfo(\n hasUI,\n ui,\n \"Observational memory: compaction skipped — another compaction already ran before deferred compaction\",\n );\n return;\n }\n\n dbg(\"compaction_trigger.microtask.calling_compact\", {});\n // Compaction is now actually starting — clear the controller so\n // agent_start doesn't abort an in-progress compact.\n runtime.autoCompactionController = null;\n ctx.compact({\n onComplete: (result: any) => {\n runtime.compactInFlight = false;\n dbg(\"compaction_trigger.onComplete\", { result: !!result });\n runtime.tryEmitInfo(\n hasUI,\n ui,\n \"Observational memory: compaction complete\",\n );\n },\n onError: (error: { message: string }) => {\n runtime.compactInFlight = false;\n dbg(\"compaction_trigger.onError\", {\n message: error?.message ?? String(error),\n });\n if (error.message === \"Compaction cancelled\") {\n // We already notified the user with the real reason before returning { cancel: true }.\n return;\n }\n notifySafely(\n hasUI,\n ui,\n `Observational memory: ${error.message}`,\n \"error\",\n );\n },\n });\n } catch (error) {\n runtime.compactInFlight = false;\n runtime.autoCompactionController = null;\n const msg = getErrorMessage(error);\n if (isStaleExtensionContextError(error)) {\n dbg(\"compaction_trigger.microtask.bail\", {\n reason: \"stale_ctx\",\n message: msg,\n });\n return;\n }\n dbg(\"compaction_trigger.microtask.error\", { message: msg });\n notifySafely(\n hasUI,\n ui,\n `Observational memory: compact threw: ${msg}`,\n \"error\",\n );\n }\n })();\n}\n","/**\n * Drill-down: resolve #N:path syntax to tool call file content.\n *\n * Phase 3 of recall-progressive-discovery.\n * Supports: #42:auth.ts (preview), #42:auth.ts:full (full content), #42:file (auto-select).\n *\n * Path matching notes:\n * - The regex uses $ anchor so lazy .+? consumes the full path — spaces, dots, and\n * Windows drive-letter colons (C:\\) all work correctly.\n * - One edge case: a file path literally ending in \":full\" (e.g. C:\\file:full)\n * would be misinterpreted as the :full flag. This is extremely unlikely.\n * - Inline queries like \"check #42:auth.ts\" are NOT drill-down — the ^ anchor\n * requires the entire query to be the drill-down pattern.\n */\nimport { isContentBearing } from \"./content.js\";\nimport { extractPath } from \"./tool-args.js\";\nimport { loadAllMessages } from \"./load-messages.js\";\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\ninterface ContentBearingCall {\n name: string;\n path: string;\n content?: string;\n oldText?: string;\n newText?: string;\n edits?: Array<{ oldText?: string; newText?: string }>;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\n/**\n * Find content-bearing tool calls that have a `path` argument and at least\n * one content field (content, edits, oldText, newText).\n * Uses the shared isContentBearing() heuristic from content.ts.\n */\nfunction findContentBearingCalls(content: unknown[]): ContentBearingCall[] {\n if (!Array.isArray(content)) return [];\n const results: ContentBearingCall[] = [];\n for (const part of content) {\n if (!part || (part as any).type !== \"toolCall\") continue;\n const args = (part as any).arguments ?? {};\n if (!isContentBearing(args)) continue;\n const path = extractPath(args);\n if (!path) continue;\n const entry: ContentBearingCall = { name: (part as any).name ?? \"\", path };\n if (typeof args.content === \"string\") entry.content = args.content;\n if (Array.isArray(args.edits)) {\n entry.edits = args.edits.filter(\n (e: unknown): e is { oldText?: string; newText?: string } =>\n e !== null && typeof e === \"object\",\n );\n }\n if (typeof args.oldText === \"string\" && !Array.isArray(args.edits))\n entry.oldText = args.oldText;\n if (typeof args.newText === \"string\" && !Array.isArray(args.edits))\n entry.newText = args.newText;\n results.push(entry);\n }\n return results;\n}\n\n/** Format content for display with optional offset/limit slicing.\n *\n * When full=true, shows everything ignoring offset/limit.\n * When offset/limit given, shows a window with \"Lines X-Y (of Z)\" header.\n * When neither, shows preview (first 30 lines) with truncation hint.\n */\nfunction formatToolCallContent(\n tc: ContentBearingCall,\n entryIndex: number,\n options?: { full?: boolean; offset?: number; limit?: number },\n): string {\n let body: string;\n if (tc.content) {\n body = tc.content;\n } else if (tc.edits) {\n body = tc.edits\n .map(\n (e, i) =>\n `--- edit ${i + 1} ---\\n${e.oldText ?? \"\"}\\n--- becomes ---\\n${e.newText ?? \"\"}`,\n )\n .join(\"\\n\\n\");\n } else if (tc.oldText && tc.newText) {\n body = `--- old ---\\n${tc.oldText}\\n--- new ---\\n${tc.newText}`;\n } else {\n body = \"(no file content found in tool call arguments)\";\n }\n\n const full = options?.full ?? false;\n const offset = options?.offset;\n const limit = options?.limit;\n const allLines = body.split(\"\\n\");\n const totalLines = allLines.length;\n const previewLimit = 30;\n const MAX_FULL_BYTES = 50 * 1024;\n\n if (full) {\n // Full content: capped at 50KB\n if (Buffer.byteLength(body, \"utf8\") > MAX_FULL_BYTES) {\n const truncated = body.slice(0, MAX_FULL_BYTES);\n return `File: ${tc.path}\nTool: ${tc.name}\n\n${truncated}\n\n... (${Buffer.byteLength(body, \"utf8\") - MAX_FULL_BYTES} more bytes — file exceeds 50KB display limit. Use #${entryIndex}:${tc.path}:${previewLimit} for next page.)`;\n }\n return `File: ${tc.path}\nTool: ${tc.name}\n\n${body}`;\n }\n\n if (offset !== undefined) {\n // Offset-based window: show slice\n const startLine = Math.max(0, offset);\n const maxLines = limit ?? 30;\n const endLine = Math.min(startLine + maxLines, totalLines);\n const visible = allLines.slice(startLine, endLine);\n const displayStart = startLine + 1; // 1-indexed for user display\n\n if (visible.length === 0) {\n return `Offset ${startLine} is beyond file length ${totalLines}. Use #${entryIndex}:${tc.path} for the first ${previewLimit} lines.`;\n }\n\n let result = `File: ${tc.path}\nTool: ${tc.name}\nLines ${displayStart}-${endLine} (of ${totalLines}):\n\n`;\n result += visible.join(\"\\n\");\n\n if (endLine < totalLines) {\n result += `\\n\\n--- Use #${entryIndex}:${tc.path}:${endLine} or #${entryIndex}:${tc.path}:${endLine}:${maxLines} for next ${maxLines} lines, #${entryIndex}:${tc.path}:full for complete ---`;\n } else if (offset > 0) {\n result += `\\n\\n(End of file)`;\n }\n\n return result;\n }\n\n // Default preview mode: first ${previewLimit} lines\n if (totalLines > previewLimit) {\n const preview = allLines.slice(0, previewLimit).join(\"\\n\");\n return `File: ${tc.path}\nTool: ${tc.name}\n\n${preview}\n\n...(${totalLines - previewLimit} more lines — use #${entryIndex}:${tc.path}:full for complete content, or #${entryIndex}:${tc.path}:${previewLimit} for next ${previewLimit} lines)`;\n }\n\n return `File: ${tc.path}\nTool: ${tc.name}\n\n${body}`;\n}\n\n// ── Parse drill-down query ────────────────────────────────────────────────\n\n/**\n * Pattern: #N:path, #N:path:full, #N:path:offset, or #N:path:offset:limit\n * Group 1: index number\n * Group 2: path (consumed lazily, expanded until suffix can match)\n * Group 3: suffix — \"full\", a number (offset), or \"offset:limit\"\n */\nconst DRILLDOWN_PATTERN = /^#(\\d+):(.+?)(?::(full|\\d+(?::\\d+)?))?$/;\n\n/**\n * Parse a drill-down query like #42:auth.ts or #42:auth.ts:full.\n * Returns null if the query doesn't match the drill-down pattern.\n *\n * Suffixes:\n * :full → full content (no truncation)\n * :30 → offset 30 lines, default limit (30)\n * :30:20 → offset 30 lines, limit 20 lines\n * (none) → preview first 30 lines\n */\nexport function parseDrillDown(query: string): {\n index: number;\n pathPattern: string;\n full: boolean;\n offset?: number;\n limit?: number;\n} | null {\n const match = query.match(DRILLDOWN_PATTERN);\n if (!match) return null;\n const index = parseInt(match[1], 10);\n const pathPattern = match[2];\n const suffix = match[3];\n\n if (suffix === \"full\") {\n return {\n index,\n pathPattern,\n full: true,\n offset: undefined,\n limit: undefined,\n };\n }\n\n if (suffix !== undefined) {\n // Parse \"offset\" or \"offset:limit\"\n const parts = suffix.split(\":\");\n const offset = parseInt(parts[0], 10);\n const limit = parts[1] !== undefined ? parseInt(parts[1], 10) : undefined;\n if (!Number.isNaN(offset)) {\n return { index, pathPattern, full: false, offset, limit };\n }\n }\n\n return {\n index,\n pathPattern,\n full: false,\n offset: undefined,\n limit: undefined,\n };\n}\n\n// ── Main export ───────────────────────────────────────────────────────────\n\n/**\n * Expand a drill-down query (#N:path) to tool call content.\n *\n * Offset/limit let you page through file content incrementally (like pi's read tool):\n * #42:auth.ts → first 30 lines (preview)\n * #42:auth.ts:full → all content\n * #42:auth.ts:30 → lines 31-60 (default limit 30)\n * #42:auth.ts:30:20 → lines 31-50 (custom limit 20)\n *\n * @param sessionFile - Path to the JSONL session file\n * @param entryIndex - The message index (#N)\n * @param pathPattern - File path substring to match (or \"file\" keyword)\n * @param full - If true, return complete content without truncation\n * @param offset - Line offset (0-indexed) for windowed content\n * @param limit - Max lines to show (default 30 for windowed, ignored if full=true)\n * @returns Formatted content string\n */\nexport function expandEntryFile(\n sessionFile: string,\n entryIndex: number,\n pathPattern: string,\n full = false,\n offset?: number,\n limit?: number,\n): string {\n const { rawMessages } = loadAllMessages(sessionFile, true);\n\n if (entryIndex < 0 || entryIndex >= rawMessages.length) {\n return `Entry #${entryIndex} not found in session history.`;\n }\n\n const msg = rawMessages[entryIndex];\n const content = msg.content as unknown[];\n const calls = findContentBearingCalls(content);\n\n // Special case: #42:file keyword\n if (pathPattern === \"file\") {\n if (calls.length === 0) {\n return `No file content found in entry #${entryIndex}.`;\n }\n if (calls.length === 1) {\n return formatToolCallContent(calls[0], entryIndex, {\n full,\n offset,\n limit,\n });\n }\n // Multiple content-bearing calls — list them\n const items = calls.map(\n (tc) => ` [#${entryIndex}:${tc.path}] ${tc.name}(${tc.path})`,\n );\n return `Entry #${entryIndex} has ${calls.length} file operations:\\n${items.join(\"\\n\")}\\n\\nUse #${entryIndex}:path to drill into a specific file.`;\n }\n\n const matched = calls.filter((tc) => tc.path.includes(pathPattern));\n\n if (matched.length === 0) {\n return `No file content found in entry #${entryIndex} for \"${pathPattern}\".`;\n }\n\n if (matched.length > 1) {\n // Ambiguous match — list options instead of silently picking the first\n const items = matched.map(\n (tc) => ` [#${entryIndex}:${tc.path}] ${tc.name}(${tc.path})`,\n );\n return `Entry #${entryIndex} has ${matched.length} file operations matching \"${pathPattern}\":\n${items.join(\"\\n\")}\n\nUse #${entryIndex}:<more-specific-path> to drill into a specific file.`;\n }\n\n return formatToolCallContent(matched[0], entryIndex, { full, offset, limit });\n}\n","/**\n * Unified recall tool — handles #N transcript indices, 12-char hex om memory ids,\n * and free-text search (BM25 + regex).\n *\n * Created by pi-vcc-om. Replaces pi-vcc's vcc_recall and OM's standalone recall-observation.\n */\nimport { Type } from \"typebox\";\nimport { StringEnum } from \"@earendil-works/pi-ai\";\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { loadAllMessages } from \"../core/load-messages\";\nimport {\n searchEntries,\n getFileIndicators,\n getTouchedFiles,\n} from \"../core/search-entries\";\nimport type { RenderedEntry } from \"../core/render-entries\";\nimport type { SearchHit } from \"../core/search-entries\";\nimport { formatRecallOutput, formatTouchedOutput } from \"../core/format-recall\";\nimport { getActiveLineageEntryIds } from \"../core/lineage\";\nimport {\n normalizeRecallScope,\n normalizeRecallMode,\n} from \"../core/recall-scope\";\nimport { parseDrillDown, expandEntryFile } from \"../core/drill-down.js\";\nimport { recallMemorySources, type Entry } from \"../om/ledger/recall.js\";\nimport { renderRecallSourceEntries } from \"../om/serialize.js\";\nimport {\n findObservationsForEntryIds,\n findReflectionsForEntryIds,\n formatRelatedObservations,\n buildIndexMap,\n formatEntryIndexAnnotation,\n} from \"../om/reverse-recall.js\";\n\n// ── Pi-vcc recall logic ──────────────────────────────────────────────────\n\nconst DEFAULT_RECENT = 25;\nconst PAGE_SIZE = 5;\n\nexport const invalidExpandIndices = (\n requested: number[],\n available: Set<number>,\n): number[] =>\n requested.filter((i) => !Number.isInteger(i) || !available.has(i));\n\n/**\n * Merge expanded (full-content) entries into search results.\n * Overlapping entries get their summary replaced with full content.\n * Non-overlapping expanded entries are appended. Results are sorted by index.\n */\nexport function mergeExpandedIntoSearchResults(\n searchResults: SearchHit[],\n expandedEntries: RenderedEntry[],\n): SearchHit[] {\n if (expandedEntries.length === 0) return searchResults;\n\n const expandedByIndex = new Map(expandedEntries.map((e) => [e.index, e]));\n\n // Replace truncated summaries with full content for expanded indices\n const merged = searchResults.map((r) => {\n const full = expandedByIndex.get(r.index);\n return full ? { ...r, summary: full.summary } : r;\n });\n\n // Append expand-only entries not already in search results\n for (const fe of expandedEntries) {\n if (!merged.some((r) => r.index === fe.index)) {\n merged.push(fe as SearchHit);\n }\n }\n\n // Maintain natural order by index\n merged.sort((a, b) => a.index - b.index);\n return merged;\n}\n\nasync function vccRecall(\n params: {\n query?: string;\n expand?: number[];\n page?: number;\n scope?: \"lineage\" | \"all\";\n mode?: string;\n },\n ctx: any,\n) {\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (!sessionFile) {\n return {\n content: [{ type: \"text\" as const, text: \"No session file available.\" }],\n details: undefined,\n };\n }\n const scope = normalizeRecallScope(params.scope);\n const mode = normalizeRecallMode(params.mode);\n const lineageEntryIds =\n scope === \"lineage\"\n ? getActiveLineageEntryIds(ctx.sessionManager)\n : undefined;\n\n // ── \"touched\" mode: aggregate file operations ──\n if (mode === \"touched\") {\n const { rendered, rawMessages } = loadAllMessages(\n sessionFile,\n false,\n lineageEntryIds,\n );\n const touched = getTouchedFiles(rawMessages, rendered);\n const text = formatTouchedOutput(touched, params.page);\n return { content: [{ type: \"text\" as const, text }], details: undefined };\n }\n\n const expandSet = new Set(params.expand ?? []);\n const hasExpand = expandSet.size > 0;\n\n // ── Pre-load full messages if expand is requested ──\n let expandedFullEntries: RenderedEntry[] | undefined;\n if (hasExpand) {\n const { rendered: fullMsgs } = loadAllMessages(\n sessionFile,\n true,\n lineageEntryIds,\n );\n const requested = [...expandSet];\n const byIndex = new Map(fullMsgs.map((m) => [m.index, m]));\n const invalid = invalidExpandIndices(requested, new Set(byIndex.keys()));\n if (invalid.length > 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Cannot expand indices outside ${scope === \"all\" ? \"session history\" : \"active lineage\"}: ${invalid.join(\", \")}`,\n },\n ],\n details: undefined,\n };\n }\n expandedFullEntries = requested\n .map((i) => byIndex.get(i))\n .filter((m): m is NonNullable<typeof m> => Boolean(m));\n\n // Expand-only path (no query): return expanded entries immediately\n if (!params.query) {\n let output =\n (scope === \"all\" ? \"Scope: all\\n\\n\" : \"\") +\n formatRecallOutput(expandedFullEntries);\n\n // Coupling: look up related OM observations\n const expandedIds = expandedFullEntries.map((e) => e.id).filter(Boolean);\n if (expandedIds.length > 0) {\n try {\n const branchEntries = ctx.sessionManager.getBranch() as Entry[];\n const obs = findObservationsForEntryIds(branchEntries, expandedIds);\n const refs = findReflectionsForEntryIds(branchEntries, expandedIds);\n if (obs.length > 0 || refs.length > 0) {\n output += \"\\n\\n\" + formatRelatedObservations(obs, refs);\n }\n } catch {\n /* branch may not be available */\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: output }],\n details: undefined,\n };\n }\n // With query: fall through to search, then merge expanded entries into results\n }\n\n const { rendered: msgs, rawMessages } = loadAllMessages(\n sessionFile,\n false,\n lineageEntryIds,\n );\n let allResults: SearchHit[] = params.query?.trim()\n ? searchEntries(msgs, rawMessages, params.query, undefined, mode)\n : msgs.slice(-DEFAULT_RECENT).map((entry, i) => {\n const msgIndex = Math.max(0, msgs.length - DEFAULT_RECENT) + i;\n const msg = rawMessages[msgIndex];\n if (msg) {\n const indicators = getFileIndicators(msg);\n if (indicators.length > 0) {\n return { ...entry, fileMatches: indicators };\n }\n }\n return entry;\n });\n\n // Merge expanded entries into full result set BEFORE pagination\n // so pagination counts and positioning stay consistent\n let appendedExpandCount = 0;\n if (expandedFullEntries) {\n // Track expand-only entries that don't match the query so the header can distinguish them\n const existingIndices = new Set(allResults.map((r) => r.index));\n appendedExpandCount = expandedFullEntries.filter(\n (fe) => !existingIndices.has(fe.index),\n ).length;\n allResults = mergeExpandedIntoSearchResults(\n allResults,\n expandedFullEntries,\n );\n }\n\n if (params.query?.trim()) {\n const page = Math.max(1, params.page ?? 1);\n const start = (page - 1) * PAGE_SIZE;\n const pageResults: SearchHit[] = allResults.slice(start, start + PAGE_SIZE);\n const totalPages = Math.ceil(allResults.length / PAGE_SIZE);\n const scopeSuffix = scope === \"all\" ? \" (scope: all)\" : \"\";\n const matchCount = allResults.length - appendedExpandCount;\n const header =\n totalPages > 1\n ? `Page ${page}/${totalPages} (${matchCount} matches${appendedExpandCount > 0 ? ` + ${appendedExpandCount} expanded` : \"\"}${scopeSuffix})`\n : `${matchCount} matches${appendedExpandCount > 0 ? ` (+ ${appendedExpandCount} expanded)` : \"\"}${scopeSuffix}`;\n const footer =\n page < totalPages\n ? `\\n--- Use page:${page + 1}${scope === \"all\" ? \" with scope:'all'\" : \"\"} for more results ---`\n : \"\";\n\n let output = formatRecallOutput(pageResults, params.query, header) + footer;\n\n // Coupling: augment search results with related observations\n const pageResultIds = pageResults.map((r) => r.id).filter(Boolean);\n if (pageResultIds.length > 0) {\n try {\n const branchEntries = ctx.sessionManager.getBranch() as Entry[];\n const obs = findObservationsForEntryIds(branchEntries, pageResultIds);\n const refs = findReflectionsForEntryIds(branchEntries, pageResultIds);\n if (obs.length > 0 || refs.length > 0) {\n output += \"\\n\\n\" + formatRelatedObservations(obs, refs);\n }\n } catch {\n /* branch may not be available */\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: output }],\n details: undefined,\n };\n }\n\n // No query: show recent entries (expand already merged above)\n const output =\n (scope === \"all\" ? \"Scope: all\\n\\n\" : \"\") +\n formatRecallOutput(allResults, params.query);\n return {\n content: [{ type: \"text\" as const, text: output }],\n details: undefined,\n };\n}\n\n// ── Observational-memory recall logic ─────────────────────────────────────\n\nconst MEMORY_ID_PATTERN = /^[a-f0-9]{12}$/;\nconst VCC_ENTRY_PATTERN = /^#(\\d+)$/;\n\nasync function omRecall(memoryId: string, ctx: any) {\n if (!MEMORY_ID_PATTERN.test(memoryId)) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Memory id must be 12 lowercase hex characters. Received: ${memoryId}`,\n },\n ],\n details: undefined,\n };\n }\n const branchEntries = ctx.sessionManager.getBranch() as Entry[];\n const result = recallMemorySources(branchEntries, memoryId);\n if (result.status === \"not_found\") {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No observation or reflection with id ${memoryId} was found on the current branch.`,\n },\n ],\n details: undefined,\n };\n }\n const lines: string[] = [];\n if (result.collision)\n lines.push(`ID ${result.memoryId} matched multiple items.`);\n for (const ref of result.reflections) {\n lines.push(`[${ref.reflection.id}] ${ref.reflection.content}`);\n }\n for (const obs of result.observations) {\n const dropped = obs.status === \"dropped\" ? \" [dropped]\" : \"\";\n lines.push(\n `[${obs.observation.id}]${dropped} ${obs.observation.timestamp} [${obs.observation.relevance}] ${obs.observation.content}`,\n );\n }\n if (result.sourceEntries.length > 0) {\n lines.push(\"\");\n lines.push(\"Sources:\");\n // Cross-format nav: annotate source entries with #N indices\n try {\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (sessionFile) {\n const { rendered } = await Promise.resolve(\n loadAllMessages(sessionFile, false),\n );\n const idToIndex = buildIndexMap(rendered);\n const indexAnnotation = formatEntryIndexAnnotation(\n result.observations.flatMap((o) => o.sourceEntryIds),\n idToIndex,\n );\n if (indexAnnotation) lines.push(indexAnnotation);\n }\n } catch {\n /* ignore errors from index mapping */\n }\n lines.push(renderRecallSourceEntries(result.sourceEntries));\n }\n const text =\n lines.join(\"\\n\") || `Memory ${memoryId} found, but no evidence rendered.`;\n return { content: [{ type: \"text\" as const, text }], details: undefined };\n}\n\n// ── Unified recall tool ──────────────────────────────────────────────────\n\nexport function registerRecallTool(pi: ExtensionAPI): void {\n pi.registerTool({\n name: \"recall\",\n label: \"Recall\",\n description:\n \"Search session history and earlier lines omitted, file write/edit content by text/regex. \" +\n \"Expand entries (#N), drill-down file content (#N:path) with paging, or aggregate touched files (mode:touched).\",\n promptSnippet:\n \"Search session history + file write/edit content by text/regex. #N expand, #N:path drill-down with optional :offset:limit or :full, mode:file/touched.\",\n promptGuidelines: [\n \"Use recall — literal text/regex search across session history and file write/edit content. #N expands an entry; #N:path with optional :offset:limit or :full drills down into file content; 12-char hex ids recover observation/reflection sources. mode:file for file-content-only, mode:touched for aggregated files-by-path. scope:'all' to search the full session. If no results, try fewer terms or a regex pattern.\",\n \"Use recall — when a drill-down path matches multiple files, options are listed. Narrow with a more specific path substring. Only full-file writes are indexed for text search (edit diffs are not).\",\n ],\n parameters: Type.Object({\n query: Type.Optional(\n Type.String({\n description:\n \"Text/regex search; #N expands entry; #N:path drills file (#N:file auto-selects); #N:path:full all lines; #N:path:offset:limit range; 12-char hex for observations. Only full-file writes indexed.\",\n }),\n ),\n expand: Type.Optional(\n Type.Array(Type.Number(), {\n description:\n \"Entry indices to return full untruncated content for. Standalone or with query.\",\n }),\n ),\n page: Type.Optional(\n Type.Number({\n description:\n \"Page number (1-based) for paginated results. Default: 1.\",\n }),\n ),\n scope: Type.Optional(\n StringEnum([\"lineage\", \"all\"] as const, {\n description:\n \"Search scope. lineage = active lineage (default), all = entire session.\",\n }),\n ),\n mode: Type.Optional(\n StringEnum([\"hybrid\", \"file\", \"touched\"] as const, {\n description:\n \"What content to search. hybrid (default) = all session content. file = file content only. touched = files-by-path summary with entry indices.\",\n }),\n ),\n }),\n async execute(_toolCallId, params, _signal, _onUpdate, ctx) {\n const q = params.query?.trim();\n // Dispatch by format\n if (q && parseDrillDown(q)) {\n const parsed = parseDrillDown(q)!;\n const sessionFile = ctx.sessionManager.getSessionFile();\n if (!sessionFile) {\n return {\n content: [\n { type: \"text\" as const, text: \"No session file available.\" },\n ],\n details: undefined,\n };\n }\n const text = expandEntryFile(\n sessionFile,\n parsed.index,\n parsed.pathPattern,\n parsed.full,\n parsed.offset,\n parsed.limit,\n );\n return {\n content: [{ type: \"text\" as const, text }],\n details: undefined,\n };\n }\n if (q && VCC_ENTRY_PATTERN.test(q)) {\n // #N → expand entry indices\n const match = q.match(VCC_ENTRY_PATTERN);\n const index = match ? parseInt(match[1], 10) : NaN;\n if (!Number.isNaN(index)) {\n return vccRecall({ query: \"\", expand: [index] }, ctx);\n }\n }\n if (q && MEMORY_ID_PATTERN.test(q)) {\n return omRecall(q, ctx);\n }\n // Default: pi-vcc search\n return vccRecall(params, ctx);\n },\n });\n}\n","/**\n * Observational memory config — thin re-export from unified-config.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/config.ts)\n * Modified: re-exports unified types instead of standalone config.\n */\nimport type { ModelThinkingLevel } from \"@earendil-works/pi-ai\";\nimport {\n loadUnifiedConfig,\n DEFAULTS as UNIFIED_DEFAULTS,\n type OmModelConfig,\n type UnifiedConfig,\n} from \"../core/unified-config.js\";\n\nexport type ConfiguredModel = OmModelConfig;\nexport type Config = UnifiedConfig;\n\nexport { loadUnifiedConfig as loadConfig };\n\nexport const DEFAULTS: Config = UNIFIED_DEFAULTS;\n\nexport const THINKING_LEVEL_VALUES: readonly ModelThinkingLevel[] = [\n \"off\",\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n] as const;\n","/**\n * Model cooldown persistence.\n *\n * When a model returns a retryable error (429, 5xx, timeout),\n * we record a cooldown so it won't be retried for the configured duration.\n * Cooldowns are persisted to `~/.pi/agent/pi-blackhole/pi-blackhole-cooldown.json`.\n */\n\n/**\n * Cooldown persistence for retryable API errors.\n *\n * Created by pi-vcc-om. Records per-model cooldowns to disk so rate-limited\n * or down models are skipped until their cooldown window expires.\n *\n * Key design:\n * - isCooldownActive reads from disk every call (no in-memory cache needed).\n * - recordCooldown writes to disk synchronously.\n * - Cooldowns survive pi restarts via pi-blackhole/pi-blackhole-cooldown.json.\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { getAgentDir } from \"@earendil-works/pi-coding-agent\";\nimport type { OmModelConfig } from \"../core/unified-config.js\";\n\n// ── Persistence ─────────────────────────────────────────────────────────────\n\nconst CONFIG_DIR = \"pi-blackhole\";\nconst COOLDOWN_FILE = \"pi-blackhole-cooldown.json\";\n\nfunction cooldownPath(): string {\n return join(getAgentDir(), CONFIG_DIR, COOLDOWN_FILE);\n}\n\nexport interface CooldownEntry {\n until: string; // ISO 8601 timestamp\n reason: string;\n stage: string; // \"observer\" | \"reflector\" | \"dropper\"\n}\n\ntype CooldownMap = Record<string, CooldownEntry>;\n\n/** Provider/id key for cooldown lookup. */\nexport function modelKey(model: OmModelConfig): string {\n return `${model.provider}/${model.id}`;\n}\n\n// ── Load / save ─────────────────────────────────────────────────────────────\n\nfunction readCooldownMap(): CooldownMap {\n const path = cooldownPath();\n if (!existsSync(path)) return {};\n try {\n return JSON.parse(readFileSync(path, \"utf-8\"));\n } catch {\n return {};\n }\n}\n\nfunction writeCooldownMap(map: CooldownMap): void {\n try {\n const path = cooldownPath();\n const dir = dirname(path);\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n writeFileSync(path, `${JSON.stringify(map, null, 2)}\\n`);\n } catch {\n // Best-effort: cooldowns are advisory. Losing them means a rate-limited\n // model might be retried before its cooldown window expires — slightly\n // more API traffic, no data loss. This also prevents a process crash\n // on read-only filesystems.\n }\n}\n\n// ── API ─────────────────────────────────────────────────────────────────────\n\n/**\n * Check whether a model is currently cooled down.\n * Expired entries are cleaned up lazily.\n *\n * When cooldownHours is explicitly 0, cooldown is disabled — always returns false.\n */\nexport function isCooldownActive(\n model: OmModelConfig,\n now: Date = new Date(),\n): boolean {\n return getCooldownEntry(model, now) !== undefined;\n}\n\n/**\n * Returns the active cooldown entry for a model, or undefined if not cooled down.\n * Expired entries are cleaned up lazily.\n */\nexport function getCooldownEntry(\n model: OmModelConfig,\n now: Date = new Date(),\n): CooldownEntry | undefined {\n // cooldownHours === 0 means cooldown disabled\n if (model.cooldownHours === 0) return undefined;\n\n const map = readCooldownMap();\n const key = modelKey(model);\n const entry = map[key];\n if (!entry) return undefined;\n\n const until = new Date(entry.until);\n if (isNaN(until.getTime())) return undefined;\n\n if (now >= until) {\n // Expired — clean up\n delete map[key];\n writeCooldownMap(map);\n return undefined;\n }\n return entry;\n}\n\n/**\n * Record a cooldown for a model after a retryable error.\n *\n * When cooldownHours is explicitly 0, cooldown is disabled — no-op.\n *\n * @param model The model that failed.\n * @param reason Human-readable error reason (e.g. \"429 Too Many Requests\").\n * @param stage Which pipeline stage failed (\"observer\" | \"reflector\" | \"dropper\").\n */\nexport function recordCooldown(\n model: OmModelConfig,\n reason: string,\n stage: string,\n): void {\n // cooldownHours === 0 means cooldown disabled\n if (model.cooldownHours === 0) return;\n\n const hours = model.cooldownHours ?? 1;\n const until = new Date(Date.now() + hours * 3_600_000).toISOString();\n const map = readCooldownMap();\n map[modelKey(model)] = { until, reason, stage };\n writeCooldownMap(map);\n}\n\n/**\n * Expire all cooldowns whose duration has passed.\n * Call on session_start or config reload to clean up.\n */\nexport function expireCooldowns(): void {\n const map = readCooldownMap();\n const now = new Date();\n let changed = false;\n for (const [key, entry] of Object.entries(map)) {\n const until = new Date(entry.until);\n if (isNaN(until.getTime()) || now >= until) {\n delete map[key];\n changed = true;\n }\n }\n if (changed) writeCooldownMap(map);\n}\n\nimport { isRetryableError } from \"./retryable-error.js\";\n\nexport { isRetryableError };\n","/**\n * Observational memory runtime — model resolution, consolidation lifecycle,\n * cooldown integration, error tracking.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/runtime.ts)\n * Modified by pi-vcc-om:\n * - resolveModel iterates fallback chain (stage → fallbacks → base → session).\n * - Skips cooled-down models (cooldown.ts).\n * - recordRetryableError persists cooldown on API errors.\n * - markConsolidationError sets 30s retry gate for failed runs.\n */\nimport {\n type Config,\n type ConfiguredModel,\n DEFAULTS,\n loadConfig,\n} from \"./config.js\";\nimport type { CompactionStats } from \"../hooks/before-compact.js\";\nimport {\n isCooldownActive,\n getCooldownEntry,\n recordCooldown,\n expireCooldowns,\n modelKey,\n} from \"./cooldown.js\";\nimport { readPendingCursors, writePendingCursors } from \"./pending.js\";\nimport type { PendingOMState } from \"./pending.js\";\n\nexport type ResolveResult =\n | {\n ok: true;\n model: any;\n apiKey: string;\n headers?: Record<string, string>;\n cooldownApplied?: boolean;\n }\n | { ok: false; reason: string };\n\ntype NotifyLevel = \"warning\" | \"info\" | \"error\";\ntype Notify = (message: string, type?: NotifyLevel) => void;\nexport type ConsolidationPhase = \"observer\" | \"reflector\" | \"dropper\";\n\nexport type CursorState =\n \"initial\" | \"recorded\" | \"empty\" | \"error\" | \"skipped\" | \"not_due\";\n\nexport interface PipelineCursor {\n entryId: string;\n state: CursorState;\n}\n\nexport interface PipelineCursors {\n observer?: PipelineCursor;\n reflector?: PipelineCursor;\n dropper?: PipelineCursor;\n}\n\nexport interface ResolveCtx {\n model: unknown;\n modelRegistry: any;\n hasUI: boolean;\n ui?: { notify: Notify };\n /** Primary stage model (from config). */\n stageModel?: ConfiguredModel;\n /** Fallback models for this stage (from config). */\n stageFallbacks?: ConfiguredModel[];\n}\n\nexport interface LaunchCtx {\n hasUI: boolean;\n ui?: { notify: Notify };\n}\n\n/** Default cooldown interval between failed consolidation runs (ms). */\nconst CONSOLIDATION_RETRY_COOLDOWN_MS = 30_000;\n\nexport class Runtime {\n config: Config = { ...DEFAULTS };\n configLoaded = false;\n consolidationInFlight = false;\n consolidationPromise: Promise<void> | null = null;\n consolidationPhase: ConsolidationPhase | undefined;\n /**\n * Models that failed in the current consolidation stage (in-memory only).\n * Used when cooldownHours is 0 — avoids disk writes while still letting\n * the retry loop advance past the failed model within this stage.\n * Cleared between stages at the pipeline level.\n */\n failedInCycle: Set<string> = new Set();\n compactInFlight = false;\n compactHookInFlight = false;\n /** AbortController for the pending auto-compaction wait loop, or null if none.\n * Set when handleAgentEnd schedules a wait; cleared on abort, success, or terminal bail.\n * agent_start handlers read this to abort the pending wait when a new turn starts. */\n autoCompactionController: AbortController | null = null;\n /** Mid-run (turn_end) compaction is suspended after a failed/cancelled attempt\n * at the current pressure level. Cleared when accumulated tokens drop below\n * the threshold again (i.e. a compaction ran). Prevents abort/cancel thrash. */\n midRunCompactionSuspended = false;\n resolveFailureNotified = false;\n lastObserverError: string | undefined;\n lastReflectorError: string | undefined;\n lastDropperError: string | undefined;\n /** Epoch ms of the last failed consolidation run (any stage). */\n lastConsolidationErrorAt: number | undefined;\n /** Stats from the most recent compaction run (session-scoped via handler closure). */\n compactionStats: CompactionStats | null = null;\n /** Whether the most recent compaction was triggered by /blackhole (vs auto-compact). */\n compactWasPiVcc = false;\n /** In‑memory pipeline cursors — authoritative copy for gating decisions. */\n cursors: PipelineCursors = {};\n /** Session ID for which cursors have been loaded/validated. Undefined until first load. */\n cursorsLoadedSessionId: string | undefined = undefined;\n /** Info-notification gate: only the first info-level notification per turn/phase is emitted. */\n hasEmittedInfoThisTurn = false;\n\n /**\n * Emit an info-level notification if none has been emitted this turn/phase yet.\n * Returns true if emitted, false if suppressed (already emitted earlier).\n */\n tryEmitInfo(\n hasUI: boolean,\n ui: { notify: Notify } | undefined,\n message: string,\n ): boolean {\n if (!hasUI || !ui || typeof ui.notify !== \"function\") return false;\n if (this.hasEmittedInfoThisTurn) return false;\n this.hasEmittedInfoThisTurn = true;\n try {\n ui.notify(message, \"info\");\n } catch {\n // Stale extension context — harmless.\n }\n return true;\n }\n\n /** Reset the info gate — call at agent_start and agent_end to allow one\n * notification per phase. */\n resetInfoGate(): void {\n this.hasEmittedInfoThisTurn = false;\n }\n\n ensureConfig(cwd: string, warn?: (message: string) => void): void {\n if (this.configLoaded) return;\n this.config = loadConfig(cwd, warn);\n this.configLoaded = true;\n expireCooldowns();\n }\n\n /**\n * Force reload config from disk, discarding cached values.\n * Call this after external config changes (e.g., overlay save, manual edit).\n */\n reloadConfig(cwd: string, warn?: (message: string) => void): void {\n this.configLoaded = false;\n this.ensureConfig(cwd, warn);\n }\n\n /**\n * Build the ordered model candidate list for a stage:\n * 1. Primary stage model (observerModel, reflectorModel, dropperModel)\n * 2. Stage fallbacks (observerFallbackModels, etc.)\n * 3. Base config.model\n *\n * Session model (ctx.model) is only used as the last resort inside resolveModel.\n */\n private buildCandidateList(\n stageModel?: ConfiguredModel,\n stageFallbacks?: ConfiguredModel[],\n ): ConfiguredModel[] {\n const candidates: ConfiguredModel[] = [];\n if (stageModel) candidates.push(stageModel);\n if (stageFallbacks) candidates.push(...stageFallbacks);\n if (this.config.model) candidates.push(this.config.model);\n return candidates;\n }\n\n /**\n * Resolve a model for a consolidation stage.\n *\n * Tries the candidate list in order:\n * 1. Primary stage model → 2. Stage fallbacks → 3. Base config.model → 4. Session model.\n *\n * Session model fallback can be disabled via config.sessionFallback: false.\n * When disabled, returns { ok: false } instead of using the session model,\n * allowing the stage to be skipped entirely when all configured OM models fail.\n *\n * Skips models that are currently in a cooldown window.\n * On retryable error (after the agent runs), the model that failed is cooled down\n * and the next candidate is tried. The caller must call `recordRetryableError`\n * after the API attempt to mark the failed model.\n *\n * Returns `ok: true` with the resolved model, or `ok: false` with a reason\n * if all candidates (including session model, if enabled) are exhausted or unavailable.\n */\n async resolveModel(ctx: ResolveCtx): Promise<ResolveResult> {\n const candidates = this.buildCandidateList(\n ctx.stageModel,\n ctx.stageFallbacks,\n );\n const stageName = this.consolidationPhase ?? \"unknown\";\n\n // Try configured candidates\n for (const candidate of candidates) {\n const key = modelKey(candidate);\n\n // In-memory skip: model failed earlier in this stage with cooldownHours 0\n if (this.failedInCycle.has(key)) {\n this.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: ${stageName} skipping ${key} (failed this cycle, cooldown disabled)`,\n );\n continue;\n }\n\n if (isCooldownActive(candidate)) {\n const entry = getCooldownEntry(candidate);\n const reason = entry ? `: ${entry.reason}` : \"\";\n this.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: ${stageName} skipping ${key} (cooldown${reason} — details in cooldown log)`,\n );\n continue;\n }\n\n const configured = ctx.modelRegistry.find(\n candidate.provider,\n candidate.id,\n );\n if (!configured) {\n if (ctx.hasUI && ctx.ui) {\n ctx.ui.notify(\n `Observational memory: ${stageName} model ${candidate.provider}/${candidate.id} not found`,\n \"warning\",\n );\n }\n continue;\n }\n\n const auth = await ctx.modelRegistry.getApiKeyAndHeaders(configured);\n const hasAuth = ctx.modelRegistry.hasConfiguredAuth?.(configured) ?? true;\n if (!auth.ok || !hasAuth) {\n if (ctx.hasUI && ctx.ui) {\n ctx.ui.notify(\n `Observational memory: ${stageName} no auth for ${candidate.provider}`,\n \"warning\",\n );\n }\n continue;\n }\n\n return {\n ok: true,\n model: configured,\n apiKey: (auth.apiKey as string) ?? \"\",\n headers: auth.headers as Record<string, string> | undefined,\n cooldownApplied: false,\n };\n }\n\n // Fall back to session model (if enabled)\n if (this.config.sessionFallback !== false) {\n const sessionModel = ctx.model;\n if (!sessionModel) {\n return {\n ok: false,\n reason: `no model available for ${stageName} (all candidates exhausted, no session model)`,\n };\n }\n\n const auth = await ctx.modelRegistry.getApiKeyAndHeaders(sessionModel);\n const hasAuth =\n ctx.modelRegistry.hasConfiguredAuth?.(sessionModel) ?? true;\n if (!auth.ok || !hasAuth) {\n const provider =\n (sessionModel as { provider?: string }).provider ?? \"unknown\";\n return {\n ok: false,\n reason: `no auth for session model provider \"${provider}\"`,\n };\n }\n\n return {\n ok: true,\n model: sessionModel,\n apiKey: (auth.apiKey as string) ?? \"\",\n headers: auth.headers as Record<string, string> | undefined,\n cooldownApplied: false,\n };\n }\n\n // All configured candidates exhausted and session fallback disabled —\n // skip the stage entirely.\n this.tryEmitInfo(\n ctx.hasUI,\n ctx.ui,\n `Observational memory: ${stageName} skipped — all candidates failed (sessionFallback disabled, won't use main model)`,\n );\n this.resolveFailureNotified = true;\n\n return {\n ok: false,\n reason: `no model available for ${stageName} (all candidates exhausted, sessionFallback disabled)`,\n };\n }\n\n /**\n * Get the model config for the currently resolved model (used for cooldown recording).\n * Returns the candidate config if the model was from the candidate list,\n * or undefined if it's the session model.\n */\n findCandidateConfig(\n resolvedModel: unknown,\n ctx: ResolveCtx,\n ): ConfiguredModel | undefined {\n const candidates = this.buildCandidateList(\n ctx.stageModel,\n ctx.stageFallbacks,\n );\n const model = resolvedModel as { provider?: string; id?: string };\n if (!model.provider || !model.id) return undefined;\n return (\n candidates.find(\n (c) => c.provider === model.provider && c.id === model.id,\n ) ??\n (this.config.model?.provider === model.provider &&\n this.config.model?.id === model.id\n ? this.config.model\n : undefined)\n );\n }\n\n /**\n * Record a retryable error for a model. The model must be one of the candidates\n * (not the session model). If it's the session model we don't cool it down.\n *\n * When cooldownHours is explicitly 0, the model is tracked in-memory for the\n * current consolidation stage (no disk writes). Otherwise a persisted cooldown\n * is recorded.\n */\n recordRetryableError(\n modelConfig: ConfiguredModel | undefined,\n error: unknown,\n stage: ConsolidationPhase,\n ): void {\n if (!modelConfig) return;\n if (modelConfig.cooldownHours === 0) {\n // In-memory only: skip this model for the rest of this stage.\n // No disk writes, no persistent cooldown.\n this.failedInCycle.add(modelKey(modelConfig));\n return;\n }\n const rawReason =\n error instanceof Error ? error.message : String(error || \"unknown error\");\n // Strip trailing JSON body from API error messages for display cleanliness.\n // To avoid stripping non-JSON braces like \"{host}\", only strip if the text\n // after the brace pair consists solely of whitespace (i.e. JSON is at end).\n // The full rawReason is NOT stored in the cooldown log — only this brief form.\n const brief = rawReason.replace(/\\s*\\{[\\s\\S]*?\\}\\s*$/, \"\").trim();\n recordCooldown(modelConfig, brief, stage);\n }\n\n /**\n * Record that a consolidation stage error occurred.\n * Sets the retry-gate timestamp so the next trigger is delayed.\n */\n markConsolidationError(): void {\n this.lastConsolidationErrorAt = Date.now();\n }\n\n /** Check if the consolidation retry gate is active (too soon after last error). */\n isConsolidationRetryGated(): boolean {\n if (!this.lastConsolidationErrorAt) return false;\n return (\n Date.now() - this.lastConsolidationErrorAt <\n CONSOLIDATION_RETRY_COOLDOWN_MS\n );\n }\n\n /** Get the current cursor for a pipeline stage. */\n getCursor(stage: ConsolidationPhase): PipelineCursor | undefined {\n return this.cursors[stage];\n }\n\n /** Advance a stage's cursor to a new entry ID with the given state. */\n advanceCursor(\n stage: ConsolidationPhase,\n entryId: string,\n state: CursorState,\n ): void {\n this.cursors[stage] = { entryId, state };\n }\n\n /** Load cursors from the per‑session pending file into the in‑memory map. */\n loadCursorsFromPending(sessionId: string): void {\n try {\n const stored = readPendingCursors(sessionId);\n if (!stored) return;\n if (stored.observer?.entryId && stored.observer?.state) {\n this.cursors.observer = {\n entryId: stored.observer.entryId,\n state: stored.observer.state as CursorState,\n };\n }\n if (stored.reflector?.entryId && stored.reflector?.state) {\n this.cursors.reflector = {\n entryId: stored.reflector.entryId,\n state: stored.reflector.state as CursorState,\n };\n }\n if (stored.dropper?.entryId && stored.dropper?.state) {\n this.cursors.dropper = {\n entryId: stored.dropper.entryId,\n state: stored.dropper.state as CursorState,\n };\n }\n } catch {\n // Best‑effort: missing or corrupt files are harmless.\n }\n }\n\n /** Save in‑memory cursors to the per‑session pending file (synchronous, for tests). */\n saveCursorsToPending(sessionId: string): void {\n try {\n writePendingCursors(sessionId, this.cursors as PendingOMState[\"cursors\"]);\n } catch {\n // Best‑effort: graceful degradation on read‑only filesystems.\n }\n }\n\n /** Schedule an async flush of cursors to the pending file.\n * Uses a micro‑task to avoid blocking the pipeline. */\n scheduleCursorFlush(sessionId: string): void {\n const cursors = { ...this.cursors };\n queueMicrotask(() => {\n try {\n writePendingCursors(sessionId, cursors as PendingOMState[\"cursors\"]);\n } catch {\n // Best‑effort: graceful degradation.\n }\n });\n }\n\n launchConsolidationTask(\n ctx: LaunchCtx,\n work: () => Promise<void>,\n ): Promise<void> {\n this.consolidationInFlight = true;\n this.consolidationPhase = undefined;\n const promise = this.launchTrackedTask(ctx, \"consolidation\", work, () => {\n this.consolidationInFlight = false;\n this.consolidationPhase = undefined;\n if (this.consolidationPromise === promise)\n this.consolidationPromise = null;\n });\n this.consolidationPromise = promise;\n return promise;\n }\n\n recordConsolidationStageError(\n ctx: LaunchCtx,\n phase: ConsolidationPhase,\n error: unknown,\n ): string {\n const message = error instanceof Error ? error.message : String(error);\n if (phase === \"observer\") this.lastObserverError = message;\n if (phase === \"reflector\") this.lastReflectorError = message;\n if (phase === \"dropper\") this.lastDropperError = message;\n if (ctx.hasUI && ctx.ui) {\n try {\n ctx.ui.notify(\n `Observational memory: ${phase} failed: ${message}`,\n \"warning\",\n );\n } catch {\n // Stale extension context — harmless.\n }\n }\n this.markConsolidationError();\n return message;\n }\n\n private launchTrackedTask(\n ctx: LaunchCtx,\n label: string,\n work: () => Promise<void>,\n onFinally: (error: string | undefined) => void,\n ): Promise<void> {\n const hasUI = ctx.hasUI;\n const ui = ctx.ui;\n return (async () => {\n let errorMessage: string | undefined;\n try {\n await work();\n } catch (error) {\n errorMessage = error instanceof Error ? error.message : String(error);\n if (hasUI && ui) {\n try {\n ui.notify(\n `Observational memory: ${label} failed: ${errorMessage}`,\n \"warning\",\n );\n } catch {\n // Stale extension context — harmless.\n }\n }\n } finally {\n onFinally(errorMessage);\n }\n })();\n }\n}\n","/**\n * Unified entry point. Registers all pi-vcc + observational-memory\n * commands, hooks, and tools.\n *\n * Upstream: https://github.com/elpapi42/pi-observational-memory (src/index.ts)\n * https://github.com/sting8k/pi-vcc (index.ts)\n * Merged and extended by pi-vcc-om.\n */\nimport type { ExtensionAPI } from \"@earendil-works/pi-coding-agent\";\nimport { scaffoldSettings } from \"./src/core/settings\";\nimport { registerBeforeCompactHook } from \"./src/hooks/before-compact\";\nimport { registerPiVccCommand } from \"./src/commands/pi-vcc\";\nimport { registerMemoryCommand } from \"./src/commands/memory\";\nimport { registerVccRecallCommand } from \"./src/commands/vcc-recall\";\nimport { registerConsolidationTrigger } from \"./src/om/consolidation.js\";\nimport { registerCompactionTrigger } from \"./src/om/compaction-trigger.js\";\nimport { registerRecallTool } from \"./src/tools/recall\";\nimport { Runtime } from \"./src/om/runtime.js\";\nimport { captureRegisteredProviderStreams } from \"./src/om/provider-stream.js\";\n\nexport default (pi: ExtensionAPI) => {\n // ── Bridge: capture custom provider stream functions for jiti-loaded agents ──\n // pi-blackhole's consolidation agents are loaded via jiti with moduleCache: false,\n // which creates a separate pi-ai instance whose apiProviderRegistry lacks custom\n // providers (e.g., claude-bridge registered by other extensions). This bridge stores\n // streamSimple functions in a Symbol.for() global so agents can access them without\n // going through pi-ai's registry.\n //\n // Capture custom provider streams from Pi's model registry before each run.\n // This works regardless of extension load order and includes providers added\n // after startup.\n const PROVIDER_STREAMS_KEY = Symbol.for(\"pi-blackhole:provider-streams\");\n const providerStreams: Map<string, Function> = ((globalThis as any)[\n PROVIDER_STREAMS_KEY\n ] ??= new Map());\n pi.on(\"agent_start\", (_event: unknown, ctx: any) => {\n captureRegisteredProviderStreams(ctx.modelRegistry, providerStreams);\n });\n\n scaffoldSettings();\n\n const omRuntime = new Runtime();\n\n // Observational memory: background consolidation pipeline\n registerConsolidationTrigger(pi, omRuntime); // agent_start + turn_end → observer/reflector/dropper\n registerCompactionTrigger(pi, omRuntime); // agent_end → auto-compaction\n\n // Pi-vcc: compaction + om injection\n registerBeforeCompactHook(pi, omRuntime); // session_before_compact → pi-vcc + om content\n\n // Commands\n registerPiVccCommand(pi, omRuntime); // /pi-vcc (needs runtime for noAutoCompact flush)\n registerMemoryCommand(pi, omRuntime); // /blackhole-memory [status|view|full]\n registerVccRecallCommand(pi); // /blackhole-recall <query>\n\n // Tools\n registerRecallTool(pi); // unified recall (#N + [12char])\n};\n"]}
|