@wrongstack/core 0.51.3 → 0.54.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/{agent-bridge-CjbD-i7-.d.ts → agent-bridge-Dnhw4tnM.d.ts} +1 -1
  2. package/dist/{agent-subagent-runner-DfvlBx5N.d.ts → agent-subagent-runner-By7jruZ_.d.ts} +3 -3
  3. package/dist/{compactor-D1RHFRmF.d.ts → compactor-Duhsf0ge.d.ts} +1 -1
  4. package/dist/{config-ZRCf7sTu.d.ts → config-bht0txXS.d.ts} +33 -2
  5. package/dist/{context-7u93AcGD.d.ts → context-DtPKqKYV.d.ts} +1 -0
  6. package/dist/coordination/index.d.ts +12 -12
  7. package/dist/coordination/index.js.map +1 -1
  8. package/dist/defaults/index.d.ts +22 -22
  9. package/dist/defaults/index.js +31 -16
  10. package/dist/defaults/index.js.map +1 -1
  11. package/dist/{events-Bt44ikPN.d.ts → events-CbHTS4ZZ.d.ts} +1 -1
  12. package/dist/execution/index.d.ts +14 -14
  13. package/dist/execution/index.js.map +1 -1
  14. package/dist/extension/index.d.ts +6 -6
  15. package/dist/{goal-store-BeRsj7YX.d.ts → goal-store-DwcTDDiX.d.ts} +1 -1
  16. package/dist/{index-mAWBdLyJ.d.ts → index-CI271MjL.d.ts} +5 -5
  17. package/dist/{index-OzA1XjHL.d.ts → index-ge5F2dnc.d.ts} +8 -8
  18. package/dist/index.d.ts +33 -33
  19. package/dist/index.js +116 -64
  20. package/dist/index.js.map +1 -1
  21. package/dist/infrastructure/index.d.ts +6 -6
  22. package/dist/kernel/index.d.ts +9 -9
  23. package/dist/{mcp-servers-DONdo-XM.d.ts → mcp-servers-DE6gzBry.d.ts} +3 -3
  24. package/dist/models/index.d.ts +3 -3
  25. package/dist/models/index.js +31 -16
  26. package/dist/models/index.js.map +1 -1
  27. package/dist/{models-registry-gwMAo6E3.d.ts → models-registry-Cuq1C8V9.d.ts} +7 -0
  28. package/dist/{multi-agent-Ba9Ni2hC.d.ts → multi-agent-BmC_xiog.d.ts} +2 -2
  29. package/dist/{multi-agent-coordinator-BuKq0q89.d.ts → multi-agent-coordinator-CjNX4uBD.d.ts} +2 -2
  30. package/dist/{null-fleet-bus-C0xd73YP.d.ts → null-fleet-bus-BNiSlTna.d.ts} +7 -7
  31. package/dist/observability/index.d.ts +2 -2
  32. package/dist/{path-resolver-nkmdiFgi.d.ts → path-resolver-Bax85amb.d.ts} +2 -2
  33. package/dist/{permission-B6sldrSp.d.ts → permission-Drm7LpPo.d.ts} +1 -1
  34. package/dist/{permission-policy-CtNscWOA.d.ts → permission-policy-CU6sqWxF.d.ts} +2 -2
  35. package/dist/{plan-templates-BmDdJ7UL.d.ts → plan-templates-CLRcurWN.d.ts} +4 -4
  36. package/dist/{provider-runner-BGro2qQB.d.ts → provider-runner-BikCxGCx.d.ts} +3 -3
  37. package/dist/{retry-policy-KF18W4dg.d.ts → retry-policy-Chtlvr5b.d.ts} +1 -1
  38. package/dist/sdd/index.d.ts +8 -8
  39. package/dist/sdd/index.js.map +1 -1
  40. package/dist/security/index.d.ts +3 -3
  41. package/dist/{selector-DmXxpFyM.d.ts → selector-BvSPdJj6.d.ts} +1 -1
  42. package/dist/{session-reader-bfgsy2a0.d.ts → session-reader-BGhzMir4.d.ts} +1 -1
  43. package/dist/storage/index.d.ts +6 -6
  44. package/dist/storage/index.js +57 -37
  45. package/dist/storage/index.js.map +1 -1
  46. package/dist/{system-prompt-CM6zOhd2.d.ts → system-prompt-dtzV_mLm.d.ts} +1 -1
  47. package/dist/{tool-executor-p4tP9tGF.d.ts → tool-executor-CgU0yWpB.d.ts} +4 -4
  48. package/dist/types/index.d.ts +15 -15
  49. package/dist/types/index.js +31 -16
  50. package/dist/types/index.js.map +1 -1
  51. package/dist/utils/index.d.ts +14 -2
  52. package/dist/utils/index.js +18 -1
  53. package/dist/utils/index.js.map +1 -1
  54. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/atomic-write.ts","../../src/utils/message-invariants.ts","../../src/storage/session-store.ts","../../src/storage/queue-store.ts","../../src/storage/attachment-store.ts","../../src/storage/memory-store.ts","../../src/storage/config-store.ts","../../src/security/config-secrets.ts","../../src/types/context-window.ts","../../src/utils/safe-json.ts","../../src/types/default-config.ts","../../src/storage/config-loader.ts","../../src/storage/config-migration.ts","../../src/storage/recovery-lock.ts","../../src/utils/regex-guard.ts","../../src/storage/session-reader.ts","../../src/storage/annotations-store.ts","../../src/replay/hash.ts","../../src/storage/replay-log-store.ts","../../src/storage/session-recovery.ts","../../src/storage/tool-audit-log.ts","../../src/storage/session-analyzer.ts","../../src/storage/session-rewinder.ts","../../src/storage/todos-checkpoint.ts","../../src/storage/plan-store.ts","../../src/storage/plan-templates.ts","../../src/storage/director-state.ts","../../src/types/errors.ts","../../src/storage/goal-store.ts","../../src/storage/prompt-store.ts","../../src/storage/cloud-sync.ts","../../src/storage/session-event-bridge.ts"],"names":["path","fs","stat","resolve","path2","randomBytes","path3","fsp2","fsp3","path4","fs2","path5","fs3","path6","fsp4","randomUUID","path7","fs4","fs5","path8","fs6","path9","createHash","stableStringify","path10","fs7","sortKeys","fsp5","fsp6","fsp7","fsp8","lock","path12","os2","fsp9","fs8","path13","path14","fs9"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus } from '../kernel/events.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\nimport type {\n ResumedSession,\n SessionData,\n SessionEvent,\n SessionMetadata,\n SessionStore,\n SessionSummary,\n SessionWriter,\n} from '../types/session.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\nexport interface SessionStoreOptions {\n dir: string;\n /** Optional EventBus for emitting session diagnostics. */\n events?: EventBus;\n /**\n * Optional secret scrubber. When set, `user_input` and `llm_response` event\n * content is scrubbed before being persisted to the JSONL log and the\n * summary sidecar — so a secret a user pastes or the model echoes does not\n * sit in cleartext on disk (and does not ride along in history cloud-sync).\n * Tool output is already scrubbed upstream by the executor; this closes the\n * conversation-turn gap (finding F-06).\n */\n secretScrubber?: SecretScrubber;\n}\n\nexport class DefaultSessionStore implements SessionStore {\n private readonly dir: string;\n private readonly events?: EventBus;\n private readonly secretScrubber?: SecretScrubber;\n\n constructor(opts: SessionStoreOptions) {\n this.dir = opts.dir;\n this.events = opts.events;\n this.secretScrubber = opts.secretScrubber;\n }\n\n /** Join session ID to its absolute path within the store directory. */\n private sessionPath(id: string, ext: '.jsonl' | '.summary.json'): string {\n return path.join(this.dir, `${id}${ext}`);\n }\n\n private async ensureShardDir(_id: string): Promise<string> {\n await ensureDir(this.dir);\n return this.dir;\n }\n\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\n const startedAt = new Date().toISOString();\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\n const shardDir = await this.ensureShardDir(id);\n const file = path.join(shardDir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session file: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n try {\n return new FileSessionWriter(id, handle, startedAt, meta, this.events, {\n dir: shardDir,\n filePath: file,\n secretScrubber: this.secretScrubber,\n });\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async resume(id: string): Promise<ResumedSession> {\n const file = this.sessionPath(id, '.jsonl');\n const data = await this.load(id);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n try {\n const writer = new FileSessionWriter(\n id,\n handle,\n new Date().toISOString(),\n {\n id,\n model: data.metadata.model,\n provider: data.metadata.provider,\n },\n this.events,\n { resumed: true, dir: this.dir, filePath: file, secretScrubber: this.secretScrubber },\n );\n return { writer, data };\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async load(id: string): Promise<SessionData> {\n const file = this.sessionPath(id, '.jsonl');\n const raw = await fsp.readFile(file, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.trim());\n const events: SessionEvent[] = [];\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string' &&\n typeof (parsed as { ts?: unknown }).ts === 'string'\n ) {\n events.push(parsed as SessionEvent);\n }\n } catch {\n // skip malformed JSON\n }\n }\n const meta = this.metaFromEvents(id, events);\n const { messages, usage } = this.replay(events, id);\n return { metadata: meta, events, messages, usage };\n }\n\n async list(limit = 20): Promise<SessionSummary[]> {\n try {\n await ensureDir(this.dir);\n const ids = await this.collectSessionIds(this.dir);\n const sessions = await Promise.all(ids.map((id) => this.summaryFor(id).catch(() => null)));\n const out = sessions.filter((s): s is SessionSummary => s !== null);\n out.sort((a, b) => {\n if (a.startedAt < b.startedAt) return 1;\n if (a.startedAt > b.startedAt) return -1;\n return a.id.localeCompare(b.id);\n });\n return out.slice(0, limit);\n } catch {\n return [];\n }\n }\n\n /** Recursively collect all session IDs from shard subdirectories. */\n private async collectSessionIds(dir: string): Promise<string[]> {\n const ids: string[] = [];\n const entries = await fsp.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n ids.push(...(await this.collectSessionIds(full)));\n } else if (entry.isFile() && entry.name.endsWith('.jsonl')) {\n ids.push(entry.name.replace(/\\.jsonl$/, ''));\n }\n }\n return ids;\n }\n\n private async summaryFor(id: string): Promise<SessionSummary> {\n const manifest = this.sessionPath(id, '.summary.json');\n try {\n const raw = await fsp.readFile(manifest, 'utf8');\n return JSON.parse(raw) as SessionSummary;\n } catch {\n const full = this.sessionPath(id, '.jsonl');\n const stat = await fsp.stat(full);\n const summary = await this.summarize(id, stat.mtime.toISOString());\n await atomicWrite(manifest, JSON.stringify(summary), { mode: 0o600 }).catch((err) => {\n console.warn(\n `[session-store] Failed to write manifest for \"${id}\":`,\n err instanceof Error ? err.message : String(err),\n );\n });\n return summary;\n }\n }\n\n async delete(id: string): Promise<void> {\n await fsp.unlink(this.sessionPath(id, '.jsonl'));\n await fsp.unlink(this.sessionPath(id, '.summary.json')).catch(() => undefined);\n }\n\n async clearHistory(id: string): Promise<void> {\n await this.ensureShardDir(id);\n const file = this.sessionPath(id, '.jsonl');\n const meta = this.sessionPath(id, '.summary.json');\n const record = `${JSON.stringify({\n type: 'session_start',\n ts: new Date().toISOString(),\n id,\n model: 'unknown',\n provider: 'unknown',\n })}\\n`;\n await fsp.writeFile(file, record, 'utf8');\n await fsp.unlink(meta).catch(() => undefined);\n }\n\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\n try {\n const data = await this.load(id);\n const firstUser = data.events.find((e) => e.type === 'user_input');\n const title =\n firstUser && firstUser.type === 'user_input'\n ? userInputTitle(firstUser.content)\n : '(empty session)';\n return {\n id,\n title,\n startedAt: data.metadata.startedAt,\n model: data.metadata.model ?? 'unknown',\n provider: data.metadata.provider ?? 'unknown',\n tokenTotal: data.usage.input + data.usage.output,\n };\n } catch {\n return {\n id,\n title: '(damaged)',\n startedAt: mtime,\n model: 'unknown',\n provider: 'unknown',\n tokenTotal: 0,\n };\n }\n }\n\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\n const start = events.find((e) => e.type === 'session_start');\n const end = events.find((e) => e.type === 'session_end');\n return {\n id,\n startedAt: start?.ts ?? new Date(0).toISOString(),\n endedAt: end?.ts,\n model: start?.model,\n provider: start?.provider,\n pendingToolUses: end?.pendingToolUses,\n };\n }\n\n private replay(\n events: SessionEvent[],\n sessionId = 'unknown',\n ): { messages: Message[]; usage: SessionData['usage'] } {\n const messages: Message[] = [];\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n const openToolUses = new Set<string>();\n for (const e of events) {\n if (e.type === 'user_input') {\n openToolUses.clear();\n messages.push({ role: 'user', content: e.content });\n } else if (e.type === 'llm_response') {\n messages.push({ role: 'assistant', content: e.content });\n for (const b of e.content) {\n if (b.type === 'tool_use') openToolUses.add(b.id);\n }\n usage = {\n input: usage.input + (e.usage.input ?? 0),\n output: usage.output + (e.usage.output ?? 0),\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\n };\n } else if (e.type === 'tool_result') {\n if (!openToolUses.has(e.id)) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\n });\n continue;\n }\n openToolUses.delete(e.id);\n const content: ContentBlock[] = [\n {\n type: 'tool_result',\n tool_use_id: e.id,\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\n is_error: e.isError,\n },\n ];\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n if (Array.isArray(last.content)) {\n last.content.push(...content);\n } else if (typeof last.content === 'string') {\n last.content = [{ type: 'text', text: last.content }, ...content];\n } else {\n messages.push({ role: 'user', content });\n }\n } else {\n messages.push({ role: 'user', content });\n }\n }\n }\n if (openToolUses.size > 0) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `${openToolUses.size} tool_use blocks without matching results - replay repaired`,\n });\n }\n const repaired = repairToolUseAdjacency(messages);\n if (repaired.report.changed) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail:\n `Repaired replay adjacency: removed ${repaired.report.removedToolUses.length} tool_use, ` +\n `${repaired.report.removedToolResults.length} tool_result, ` +\n `${repaired.report.removedMessages} empty messages`,\n });\n }\n return { messages: repaired.messages, usage };\n }\n}\n\nclass FileSessionWriter implements SessionWriter {\n private closed = false;\n private closing = false;\n private manifestFile: string;\n private summary: SessionSummary;\n private tokenIn = 0;\n private tokenOut = 0;\n private readonly filePath: string;\n get transcriptPath(): string | undefined {\n return this.filePath || undefined;\n }\n private initDone = false;\n private readonly resumed: boolean;\n private appendFailCount = 0;\n private lastAppendWarnAt = 0;\n private readonly secretScrubber?: SecretScrubber;\n\n /**\n * Scrub secrets out of conversation-turn events before they are observed\n * for the summary, written to the JSONL log, or surfaced on resume. Only\n * `user_input` / `llm_response` carry free-form user/model text; other event\n * types either have no secret-bearing content or are already scrubbed\n * upstream (tool results). Returns the event unchanged when no scrubber is\n * configured.\n */\n private scrubEvent(event: SessionEvent): SessionEvent {\n const s = this.secretScrubber;\n if (!s) return event;\n if (event.type === 'user_input') {\n return {\n ...event,\n content:\n typeof event.content === 'string' ? s.scrub(event.content) : s.scrubObject(event.content),\n };\n }\n if (event.type === 'llm_response') {\n return { ...event, content: s.scrubObject(event.content) };\n }\n return event;\n }\n\n private pendingFileSnapshots: Array<{\n path: string;\n action: 'created' | 'modified' | 'deleted';\n before: string | null;\n after: string | null;\n }> = [];\n /** Tracks open tool_use IDs during the current run to serialize on close for resume. */\n private openToolUses = new Set<string>();\n\n recordFileChange(input: {\n path: string;\n action: 'created' | 'modified' | 'deleted';\n before: string | null;\n after: string | null;\n }): void {\n this.pendingFileSnapshots.push(input);\n }\n\n constructor(\n public readonly id: string,\n private handle: fsp.FileHandle,\n private readonly startedAt: string,\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\n private readonly events?: EventBus,\n opts: {\n resumed?: boolean;\n dir?: string;\n filePath?: string;\n secretScrubber?: SecretScrubber;\n } = {},\n ) {\n this.resumed = opts.resumed ?? false;\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\n this.filePath = opts.filePath ?? '';\n this.secretScrubber = opts.secretScrubber;\n this.summary = {\n id,\n title: '(empty session)',\n startedAt,\n model: meta.model ?? 'unknown',\n provider: meta.provider ?? 'unknown',\n tokenTotal: 0,\n };\n }\n\n get pendingToolUses(): string[] {\n return Array.from(this.openToolUses);\n }\n\n private async writeSessionStartLazy(): Promise<void> {\n const record = `${JSON.stringify({\n type: this.resumed ? 'session_resumed' : 'session_start',\n ts: this.startedAt,\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n try {\n if (this.filePath) {\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\n }\n } catch {\n // best-effort\n }\n }\n\n async append(event: SessionEvent): Promise<void> {\n if (this.closed) return;\n if (!this.initDone) {\n this.initDone = true;\n await this.writeSessionStartLazy();\n }\n // Scrub before observing (the summary title is derived from user_input\n // content) and before writing, so neither the JSONL nor the sidecar holds\n // a cleartext secret.\n const scrubbed = this.scrubEvent(event);\n this.observeForSummary(scrubbed);\n try {\n await this.handle.appendFile(`${JSON.stringify(scrubbed)}\\n`, 'utf8');\n } catch (err) {\n this.appendFailCount++;\n const now = Date.now();\n if (now - this.lastAppendWarnAt > 5000) {\n const suppressed = this.appendFailCount - 1;\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\n console.warn(\n '[session] append failed:',\n err instanceof Error ? err.message : String(err),\n tail,\n );\n this.lastAppendWarnAt = now;\n this.appendFailCount = 0;\n }\n }\n }\n\n private observeForSummary(event: SessionEvent): void {\n // Track open tool uses so we can serialize them on close for resume.\n if (event.type === 'tool_use') {\n this.openToolUses.add(event.id);\n } else if (event.type === 'tool_result') {\n this.openToolUses.delete(event.id);\n }\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\n } else if (event.type === 'llm_response') {\n this.tokenIn += event.usage.input;\n this.tokenOut += event.usage.output;\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\n } else if (event.type === 'session_end') {\n const total = event.usage.input + event.usage.output;\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\n }\n }\n\n async close(): Promise<void> {\n if (this.closing) return;\n this.closing = true;\n this.closed = true;\n if (this.manifestFile) {\n try {\n await atomicWrite(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\n } catch {\n // manifest write is best-effort\n }\n }\n try {\n await this.handle.close();\n } catch {\n // ignore\n }\n }\n\n async writeCheckpoint(promptIndex: number, promptPreview: string): Promise<void> {\n const fileCount = this.pendingFileSnapshots.length;\n if (fileCount > 0) {\n await this.writeFileSnapshot(promptIndex, [...this.pendingFileSnapshots]);\n this.pendingFileSnapshots = [];\n }\n await this.append({\n type: 'checkpoint',\n ts: new Date().toISOString(),\n promptIndex,\n promptPreview,\n });\n this.events?.emit('checkpoint.written', {\n promptIndex,\n promptPreview,\n ts: new Date().toISOString(),\n fileCount,\n });\n }\n\n async writeFileSnapshot(\n promptIndex: number,\n files: import('../types/session.js').FileSnapshot[],\n ): Promise<void> {\n await this.append({\n type: 'file_snapshot',\n ts: new Date().toISOString(),\n promptIndex,\n files,\n });\n }\n\n async truncateToCheckpoint(targetPromptIndex: number): Promise<number> {\n if (!this.filePath) return 0;\n const raw = await fsp.readFile(this.filePath, 'utf8');\n const lines = raw.split('\\n');\n const kept: string[] = [];\n let removedCount = 0;\n\n let targetCheckpointLine = -1;\n let afterTarget = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (!line.trim()) continue;\n\n let event: { type?: string; promptIndex?: number };\n try {\n event = JSON.parse(line);\n } catch {\n kept.push(line);\n continue;\n }\n\n if (event.type === 'checkpoint') {\n if ((event as { promptIndex: number }).promptIndex === targetPromptIndex) {\n targetCheckpointLine = kept.length;\n afterTarget = true;\n } else if ((event as { promptIndex: number }).promptIndex > targetPromptIndex) {\n afterTarget = true;\n }\n }\n\n if (event.promptIndex !== undefined && event.promptIndex > targetPromptIndex) {\n removedCount++;\n } else if (event.promptIndex === undefined) {\n if (!afterTarget || targetCheckpointLine === -1) {\n kept.push(line);\n } else {\n removedCount++;\n }\n } else {\n kept.push(line);\n }\n }\n\n const truncated = kept.join('\\n');\n // Windows EPERM fix: close the append-mode handle, write via temp file\n // and rename, then reopen. This is needed because rename() fails on\n // Windows when the target has an open file handle.\n const tmpPath = `${this.filePath}.rewind.tmp`;\n await fsp.writeFile(tmpPath, truncated + '\\n', 'utf8');\n try {\n await this.handle.close();\n await fsp.rename(tmpPath, this.filePath);\n // Re-open in append mode for continued use of this file.\n this.handle = await fsp.open(this.filePath, 'a', 0o600);\n } catch (err) {\n await fsp.unlink(tmpPath).catch(() => undefined);\n throw err;\n }\n\n await this.append({\n type: 'rewound',\n ts: new Date().toISOString(),\n toPromptIndex: targetPromptIndex,\n revertedFiles: [],\n });\n\n this.events?.emit('session.rewound', {\n toPromptIndex: targetPromptIndex,\n revertedFiles: [],\n removedEvents: removedCount,\n });\n\n return removedCount;\n }\n\n async clearSession(): Promise<void> {\n if (!this.filePath) return;\n const record = `${JSON.stringify({\n type: 'session_start',\n ts: new Date().toISOString(),\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n await fsp.writeFile(this.filePath, record, 'utf8');\n }\n\n /**\n * Idea #1 — write an in-flight marker. The agent loop should call\n * this at the start of each long-running operation; a matching\n * `clearInFlightMarker` follows on clean exit. A stale marker\n * (no end) is what `SessionRecovery.detectStale` looks for.\n */\n async writeInFlightMarker(context: string): Promise<void> {\n if (!context || context.length > 500) {\n throw new Error('In-flight context must be 1..500 chars');\n }\n await this.append({\n type: 'in_flight_start',\n ts: new Date().toISOString(),\n context,\n });\n this.events?.emit('in_flight.started', { context, ts: new Date().toISOString() });\n }\n\n /**\n * Idea #1 — close the in-flight marker. Idempotent in spirit\n * (you can call it after a successful iteration even if you\n * didn't open one this round) — but the session log records\n * every call so postmortem tooling can see \"the agent finished\n * cleanly X times, then died without finishing Y\".\n */\n async clearInFlightMarker(reason: 'clean' | 'aborted' | 'recovered'): Promise<void> {\n await this.append({\n type: 'in_flight_end',\n ts: new Date().toISOString(),\n reason,\n });\n this.events?.emit('in_flight.ended', { reason, ts: new Date().toISOString() });\n }\n}\n\nfunction userInputTitle(content: string | ContentBlock[]): string {\n const text =\n typeof content === 'string'\n ? content\n : content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join(' ');\n return (text || '(non-text input)').slice(0, 60);\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * The persisted form of a single queued user message. The TUI's\n * in-memory QueueItem has a render id; that's pure UI bookkeeping, so\n * we drop it when serializing — fresh ids are assigned on rehydrate.\n */\nexport interface PersistedQueueItem {\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/**\n * Side-file storage for a session's pending input queue. Lives at\n * `<sessionDir>/queue.json` next to the attachment spool. Reads are\n * tolerant (missing/malformed file → empty array); writes are atomic\n * (tmp + rename) so a crash mid-write can never leave a partial file\n * the next launch would choke on.\n *\n * The contract is \"snapshot replacement\": every mutation hands the\n * full queue and we rewrite the file. The queue is small (rarely more\n * than a handful of messages), so this is cheaper than delta logging\n * and avoids the replay complexity.\n */\nexport class QueueStore {\n private readonly file: string;\n\n constructor(opts: { dir: string }) {\n this.file = path.join(opts.dir, 'queue.json');\n }\n\n async write(items: PersistedQueueItem[]): Promise<void> {\n if (items.length === 0) {\n // Empty queue → remove the file rather than write `[]`. Keeps\n // a clean idle state on disk and makes `read()` cheaper.\n await this.clear();\n return;\n }\n await atomicWrite(this.file, JSON.stringify(items), { mode: 0o600 });\n }\n\n async read(): Promise<PersistedQueueItem[]> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return [];\n console.warn(`[QueueStore] failed to read queue file \"${this.file}\":`, err instanceof Error ? err.message : String(err));\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PersistedQueueItem[] = [];\n for (const v of parsed) {\n if (isPersistedQueueItem(v)) out.push(v);\n }\n return out;\n }\n\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n // Best-effort: a permission/lock error during clear is rare and\n // the queue slash command is non-critical. Warn so it's observable\n // but don't throw so the slash command doesn't crash.\n console.warn(`QueueStore.clear() failed for ${this.file}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction isPersistedQueueItem(v: unknown): v is PersistedQueueItem {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o['displayText'] === 'string' && Array.isArray(o['blocks']);\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport type {\n AddAttachmentInput,\n Attachment,\n AttachmentKind,\n AttachmentRef,\n AttachmentStore,\n} from '../types/attachment.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\nexport interface AttachmentStoreOptions {\n /**\n * Directory for spooling payloads larger than `spoolThresholdBytes`.\n * When omitted, all payloads stay in memory.\n */\n spoolDir?: string;\n spoolThresholdBytes?: number;\n}\n\nconst DEFAULT_SPOOL_THRESHOLD = 256 * 1024; // 256 KB\n// Two placeholder shapes:\n// - seq-keyed `[<kind> #<seq>…]` — kind is `pasted` / `image` / `file`. A\n// cosmetic suffix after the seq (e.g. `, 123 lines`) is tolerated so the\n// TUI can render `[pasted #1, 123 lines]` while still resolving by seq.\n// - path-keyed `[file:<path>]` — resolves to the most recent file ref whose\n// stored path matches, so the TUI can show a human-readable file chip.\nconst PLACEHOLDER_RE = /\\[(pasted|image|file) #(\\d+)[^\\]]*\\]|\\[file:([^\\]]+)\\]/g;\n\n/**\n * In-memory attachment store with optional disk spool. Placeholder syntax\n * is `[<kind> #<seq>]` (seq-keyed) or `[file:<path>]` (path-keyed) where kind\n * is `pasted` / `image` / `file`. Unknown placeholders are passed through\n * as-is so users can write that literal text without losing it.\n */\nexport class DefaultAttachmentStore implements AttachmentStore {\n private readonly items = new Map<string, Attachment>();\n private readonly refs: AttachmentRef[] = [];\n private nextSeq: Record<AttachmentKind, number> = { text: 0, image: 0, file: 0 };\n private readonly spoolDir: string | undefined;\n private readonly spoolThreshold: number;\n\n constructor(opts: AttachmentStoreOptions = {}) {\n this.spoolDir = opts.spoolDir;\n this.spoolThreshold = opts.spoolThresholdBytes ?? DEFAULT_SPOOL_THRESHOLD;\n }\n\n async add(input: AddAttachmentInput): Promise<AttachmentRef> {\n const seq = ++this.nextSeq[input.kind];\n const id = `${kindPrefix(input.kind)}-${seq}-${randomBytes(3).toString('hex')}`;\n const bytes = Buffer.byteLength(input.data, input.kind === 'image' ? 'base64' : 'utf8');\n let spooledPath: string | undefined;\n let data: string | undefined = input.data;\n if (this.spoolDir && bytes >= this.spoolThreshold) {\n await fsp.mkdir(this.spoolDir, { recursive: true });\n spooledPath = path.join(this.spoolDir, `${id}.bin`);\n // atomicWrite: torn spool would silently corrupt the attachment;\n // the user would see garbled output the next time it's expanded.\n await atomicWrite(spooledPath, input.data, {\n encoding: input.kind === 'image' ? 'base64' : 'utf8',\n });\n data = undefined;\n }\n const att: Attachment = {\n id,\n kind: input.kind,\n meta: input.meta ?? {},\n data,\n path: spooledPath,\n bytes,\n createdAt: new Date().toISOString(),\n };\n this.items.set(id, att);\n const ref: AttachmentRef = { id, kind: input.kind, seq, meta: att.meta };\n this.refs.push(ref);\n return ref;\n }\n\n async get(id: string): Promise<Attachment | undefined> {\n return this.items.get(id);\n }\n\n list(): AttachmentRef[] {\n return [...this.refs];\n }\n\n async expand(text: string): Promise<ContentBlock[]> {\n const matches = [...text.matchAll(PLACEHOLDER_RE)];\n if (matches.length === 0) return text ? [{ type: 'text', text }] : [];\n const blocks: ContentBlock[] = [];\n let lastIndex = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n const before = text.slice(lastIndex, idx);\n if (before) blocks.push({ type: 'text', text: before });\n let ref: AttachmentRef | undefined;\n if (m[3] !== undefined) {\n // Path-keyed `[file:<path>]` — most recent matching file ref wins.\n const wantPath = m[3];\n ref = findLast(this.refs, (r) => r.kind === 'file' && refPath(r) === wantPath);\n } else {\n const kind = prefixToKind(m[1] as string);\n const seq = Number(m[2]);\n ref = this.refs.find((r) => r.kind === kind && r.seq === seq);\n }\n const att = ref ? this.items.get(ref.id) : undefined;\n if (!att) {\n blocks.push({ type: 'text', text: m[0] });\n } else {\n blocks.push(await this.toBlock(att));\n }\n lastIndex = idx + m[0].length;\n }\n const tail = text.slice(lastIndex);\n if (tail) blocks.push({ type: 'text', text: tail });\n return mergeAdjacentText(blocks);\n }\n\n async clear(): Promise<void> {\n // Unlink any spooled files so we don't leak disk space.\n if (this.spoolDir) {\n const toDelete: string[] = [];\n for (const att of this.items.values()) {\n if (att.path) toDelete.push(att.path);\n }\n await Promise.all(toDelete.map((p) => fsp.unlink(p).catch(() => undefined)));\n }\n this.items.clear();\n this.refs.length = 0;\n this.nextSeq = { text: 0, image: 0, file: 0 };\n }\n\n private async toBlock(att: Attachment): Promise<ContentBlock> {\n if (att.kind === 'image') {\n const data =\n att.data ?? (att.path ? await fsp.readFile(att.path, { encoding: 'base64' }) : '');\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: att.meta.mediaType ?? 'image/png',\n data,\n },\n };\n }\n const raw = att.data ?? (att.path ? await fsp.readFile(att.path, 'utf8') : '');\n const label = att.meta.filename ? `<file path=\"${att.meta.filename}\">` : '<pasted>';\n const close = att.meta.filename ? '</file>' : '</pasted>';\n return { type: 'text', text: `${label}\\n${raw}\\n${close}` };\n }\n}\n\nfunction kindPrefix(kind: AttachmentKind): string {\n return kind === 'text' ? 'pasted' : kind;\n}\n\nfunction prefixToKind(prefix: string): AttachmentKind {\n if (prefix === 'pasted') return 'text';\n if (prefix === 'image') return 'image';\n return 'file';\n}\n\n/** Path a file ref was registered under, for `[file:<path>]` lookup. */\nfunction refPath(ref: AttachmentRef): string | undefined {\n return ref.meta.filename ?? ref.meta.label;\n}\n\n/** Last element matching the predicate (Node < 20 lacks Array.findLast). */\nfunction findLast<T>(arr: readonly T[], pred: (v: T) => boolean): T | undefined {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (pred(arr[i] as T)) return arr[i];\n }\n return undefined;\n}\n\nfunction mergeAdjacentText(blocks: ContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n const prev = out[out.length - 1];\n if (b.type === 'text' && prev && prev.type === 'text') {\n prev.text += b.text;\n } else {\n out.push(b);\n }\n }\n return out;\n}\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MemoryScope, MemoryStore } from '../types/memory.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nconst MAX_BYTES_TOTAL = 32_000; // ~8K tokens\n\nexport interface MemoryStoreOptions {\n paths: WstackPaths;\n}\n\n/**\n * Three scopes:\n * project-agents → <project>/.wrongstack/AGENTS.md (committed)\n * project-memory → ~/.wrongstack/projects/<hash>/memory.md (per-project agent notes)\n * user-memory → ~/.wrongstack/memory.md (global personal memory)\n */\nexport class DefaultMemoryStore implements MemoryStore {\n private readonly files: Record<MemoryScope, string>;\n /**\n * Per-scope serialization queue. `remember` / `forget` / `consolidate` /\n * `clear` are read-modify-write against a single file; without a lock,\n * two concurrent calls on the same scope can read the same baseline and\n * the later write silently drops the earlier entry. We chain each\n * mutation onto the prior promise for the same scope so they run in\n * issue order. Different scopes still proceed in parallel.\n *\n * The chain tracks only the last pending write. If a write fails, its\n * error is caught and swallowed so the chain stays alive for subsequent\n * calls. The error is stored in `writeErrors` so callers can learn about\n * it on the next read operation.\n */\n private readonly writeChain = new Map<MemoryScope, Promise<unknown>>();\n /** Last write error per scope — surfaced as warnings on the next readAll(). */\n private readonly writeErrors = new Map<MemoryScope, Error>();\n\n constructor(opts: MemoryStoreOptions) {\n this.files = {\n 'project-agents': opts.paths.inProjectAgentsFile,\n 'project-memory': opts.paths.projectMemory,\n 'user-memory': opts.paths.globalMemory,\n };\n }\n\n private async runSerialized<T>(scope: MemoryScope, work: () => Promise<T>): Promise<T> {\n const prior = this.writeChain.get(scope) ?? Promise.resolve();\n // Capture prior error so we can surface it, but don't block the chain.\n prior.catch((err) => {\n this.writeErrors.set(scope, err as Error);\n });\n const next = prior.catch(() => undefined).then(work);\n this.writeChain.set(scope, next as Promise<unknown>);\n try {\n return await next;\n } catch (err) {\n this.writeErrors.set(scope, err as Error);\n throw err;\n } finally {\n if (this.writeChain.get(scope) === next) {\n this.writeChain.delete(scope);\n }\n }\n }\n\n async readAll(): Promise<string> {\n const parts: string[] = [];\n for (const scope of ['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]) {\n const writeErr = this.writeErrors.get(scope);\n if (writeErr) {\n parts.push(`> ⚠️ Memory write error (${labelOf(scope)}): ${writeErr.message}`);\n }\n const body = await this.read(scope);\n if (body.trim()) parts.push(`## ${labelOf(scope)}\\n\\n${body.trim()}`);\n }\n return parts.join('\\n\\n');\n }\n\n async read(scope: MemoryScope): Promise<string> {\n try {\n return await fs.readFile(this.files[scope], 'utf8');\n } catch {\n return '';\n }\n }\n\n async remember(text: string, scope: MemoryScope = 'project-memory'): Promise<void> {\n return this.runSerialized(scope, async () => {\n const file = this.files[scope];\n await ensureDir(path.dirname(file));\n let existing = '';\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n // new file\n }\n const ts = new Date().toISOString();\n // Use a stable ID so forget() can target exact entries regardless of content.\n const id = `mem_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const entry = `\\n- [${ts}] ${id} ${text.replace(/\\n/g, ' ')}\\n`;\n const next = existing.trim()\n ? existing.replace(/\\n+$/, '') + entry\n : `# WrongStack Memory\\n${entry}`;\n await atomicWrite(file, next);\n const buf = Buffer.byteLength(next, 'utf8');\n if (buf > MAX_BYTES_TOTAL) {\n // consolidate enqueues onto the same chain — call directly into the\n // inner implementation to avoid deadlocking on our own queue slot.\n await this.consolidateUnsafe(scope);\n }\n });\n }\n\n async forget(query: string, scope: MemoryScope = 'project-memory'): Promise<number> {\n return this.runSerialized(scope, async () => this.forgetUnsafe(query, scope));\n }\n\n private async forgetUnsafe(query: string, scope: MemoryScope): Promise<number> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return 0;\n }\n // Match by unique ID suffix (mem_<ts>_<rand>) embedded in the entry.\n // Fall back to case-insensitive content match for entries without an ID.\n const needle = query.toLowerCase();\n const idMatcher = /mem_\\d+_\\w+/;\n let removed = 0;\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n // If the query looks like an ID, match exactly; otherwise match content.\n if (idMatcher.test(query)) {\n // The entry ID appears right after the timestamp: \"- [ts] mem_<ts>_<rand> ...\"\n const afterBracket = trimmed.indexOf('] ');\n if (afterBracket !== -1) {\n const afterTs = trimmed.slice(afterBracket + 2);\n const entryIdMatch = /^mem_\\d+_\\w+/.exec(afterTs);\n if (entryIdMatch && entryIdMatch[0] === query) {\n removed++;\n return false;\n }\n }\n }\n // Fall back to content-based match (still useful for project-agents legacy entries)\n if (trimmed.toLowerCase().includes(needle)) {\n removed++;\n return false;\n }\n return true;\n });\n if (removed > 0) {\n await atomicWrite(file, lines.join('\\n'));\n }\n return removed;\n }\n\n async consolidate(scope: MemoryScope): Promise<void> {\n return this.runSerialized(scope, async () => this.consolidateUnsafe(scope));\n }\n\n private async consolidateUnsafe(scope: MemoryScope): Promise<void> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return;\n }\n // Dedupe identical bullet lines (case-insensitive, ignoring per-entry\n // metadata: the leading \"[timestamp]\" and the \"mem_<ts>_<rand>\" ID).\n const seen = new Set<string>();\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n const norm = trimmed\n .replace(/\\[[^\\]]+\\]/, '')\n .replace(/\\bmem_\\d+_\\w+\\s*/, '')\n .trim()\n .toLowerCase();\n if (seen.has(norm)) return false;\n seen.add(norm);\n return true;\n });\n const next = lines.join('\\n');\n // Backup BEFORE the write so a crash leaves the original intact and\n // the backup reflects the pre-consolidation state. Best-effort so\n // ENOENT (new file) or permission errors don't block consolidation.\n const backup = `${file}.bak.${Date.now()}`;\n try {\n await fs.copyFile(file, backup);\n } catch {\n // best-effort\n }\n try {\n await atomicWrite(file, next);\n } catch {\n // If the write fails, the original file is untouched (atomicWrite\n // does write-to-temp + rename). We still keep the backup.\n return;\n }\n }\n\n async clear(scope?: MemoryScope): Promise<void> {\n if (scope) {\n await this.runSerialized(scope, async () => atomicWrite(this.files[scope], ''));\n return;\n }\n // Clear-all: serialize each scope independently so different scopes\n // still run in parallel, but each one waits for its own pending writes.\n await Promise.all(\n (['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]).map((s) =>\n this.runSerialized(s, async () => atomicWrite(this.files[s], '')),\n ),\n );\n }\n}\n\nfunction labelOf(scope: MemoryScope): string {\n switch (scope) {\n case 'project-agents':\n return 'Project AGENTS.md';\n case 'project-memory':\n return 'Project memory';\n case 'user-memory':\n return 'User memory';\n }\n}\n","import type { Config, ConfigStore } from '../types/config.js';\n\n\n/**\n * Strip fields that originated from environment variables so they are never\n * persisted back to disk. This prevents an env-sourced secret (e.g.\n * WRONGSTACK_API_KEY) from being accidentally written to ~/.wrongstack/config.json.\n */\nfunction stripEphemeralFields(cfg: Partial<Config>): Partial<Config> {\n const env = (cfg as Partial<Config & { _envSource?: Set<string>}>)._envSource;\n if (!env?.size) return cfg;\n const out: Partial<Config> = { ...cfg };\n for (const field of env) {\n delete (out as Record<string, unknown>)[field];\n }\n delete (out as Record<string, unknown>)._envSource;\n return out;\n}\n\n/**\n * Reference implementation of `ConfigStore`. Stores a single frozen Config\n * and notifies watchers synchronously on every update. Updates use a deep\n * clone so callers can mutate their `partial` argument freely without\n * tainting state.\n *\n * For the CLI: instantiate once at boot, pass the store (not the Config)\n * to subsystems that care about runtime changes (provider switching,\n * extension reload).\n */\nexport class DefaultConfigStore implements ConfigStore {\n private current: Readonly<Config>;\n private watchers = new Set<(next: Readonly<Config>, prev: Readonly<Config>) => void>();\n\n constructor(initial: Config) {\n this.current = deepFreeze(structuredClone(initial));\n }\n\n get(): Readonly<Config> {\n return this.current;\n }\n\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]> {\n return this.current[key] as Readonly<Config[K]>;\n }\n\n getExtension(pluginName: string): Readonly<Record<string, unknown>> {\n const ext = this.current.extensions?.[pluginName];\n return ext ? (ext as Readonly<Record<string, unknown>>) : FROZEN_EMPTY;\n }\n\n update(partial: Partial<Config>): Readonly<Config> {\n // Strip env-sourced fields before persisting to prevent secrets leaking\n // from in-memory env-derived config values into the on-disk config file.\n const scrubbed = stripEphemeralFields(partial);\n // Shallow merge — top-level fields replace, nested objects do too unless\n // the caller passes a fully-formed sub-object. That matches the JSON\n // config user mental model (replace `tools.maxIterations` by passing\n // the whole `tools` block, or by patching `extensions.<name>`).\n const next = deepFreeze(structuredClone({ ...this.current, ...scrubbed })) as Readonly<Config>;\n\n if (next.version !== 1) {\n throw new Error(`ConfigStore.update: version must remain 1, got ${String(next.version)}`);\n }\n\n const prev = this.current;\n this.current = next;\n // Notify watchers AFTER mutating `current` so re-entrant watcher reads\n // see the new state. Watcher exceptions are caught individually so one\n // misbehaving subscriber can't block the others.\n for (const w of this.watchers) {\n try {\n w(next, prev);\n } catch (err) {\n // A plugin watcher that crashes on /model switch or similar would\n // otherwise leave the system in a quietly-inconsistent state. We\n // still don't propagate (one bad subscriber must not break the\n // others), but we surface the error so it's discoverable.\n console.error('[config-store] watcher threw:', err);\n }\n }\n return next;\n }\n\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void {\n this.watchers.add(cb);\n return () => this.watchers.delete(cb);\n }\n}\n\nconst FROZEN_EMPTY: Readonly<Record<string, unknown>> = Object.freeze({});\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Object.isFrozen(obj)) return obj;\n for (const key of Object.keys(obj as object)) {\n const v = (obj as Record<string, unknown>)[key];\n if (v !== null && typeof v === 'object' && !Object.isFrozen(v)) {\n deepFreeze(v);\n }\n }\n return Object.freeze(obj);\n}\n","import type { SecretVault } from '../types/secret-vault.js';\n\n/**\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\n * returning a new object. Used by the config loader so the rest of the\n * system never has to know about the wire format.\n */\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n // A single corrupted/malformed encrypted field should not kill the entire\n // config load. Swallow per-field decrypt errors (zero the field so callers\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\n return walk(cfg, vault, (v, key) => {\n try {\n return vault.decrypt(v);\n } catch (err) {\n console.warn(\n `[secret-vault] Failed to decrypt \"${key}\":`,\n err instanceof Error ? err.message : err,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n return walk(cfg, vault, (v) => vault.encrypt(v));\n}\n\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walk(item, vault, transform)) as unknown as T;\n }\n // Use Object.create(null) to prevent prototype pollution — a crafted key\n // like \"__proto__\" in the input would otherwise corrupt Object.prototype.\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k)) {\n out[k] = transform(v, k);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walk(v, vault, transform);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A key is treated as secret-bearing if its name (case-insensitive) contains\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\n */\nconst SECRET_KEY_PATTERN =\n /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\n\n// Field names that contain the literal substring \"key\" but are not secrets.\n// Keep this list short; the substring rule itself is intentionally narrow.\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\n\nexport function isSecretField(name: string): boolean {\n const lc = name.toLowerCase();\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\n return SECRET_KEY_PATTERN.test(lc);\n}\n","export type ContextWindowModeId = 'balanced' | 'frugal' | 'deep' | 'archival';\n\nexport type ContextWindowAggressiveOn = 'hard' | 'soft' | 'warn';\n\nexport interface ContextWindowThresholds {\n warn: number;\n soft: number;\n hard: number;\n}\n\nexport interface ContextWindowMode {\n id: ContextWindowModeId;\n name: string;\n description: string;\n thresholds: ContextWindowThresholds;\n aggressiveOn: ContextWindowAggressiveOn;\n preserveK: number;\n eliseThreshold: number;\n targetLoad: number;\n}\n\nexport interface ContextWindowPolicy extends ContextWindowMode {}\n\nexport interface ContextWindowConfigLike {\n mode?: ContextWindowModeId | string;\n warnThreshold?: number;\n softThreshold?: number;\n hardThreshold?: number;\n preserveK?: number;\n eliseThreshold?: number;\n}\n\nexport const DEFAULT_CONTEXT_WINDOW_MODE_ID: ContextWindowModeId = 'balanced';\n\nexport const CONTEXT_WINDOW_MODES: readonly ContextWindowMode[] = Object.freeze([\n {\n id: 'balanced',\n name: 'Balanced',\n description: 'Default rolling compaction: recent work stays verbatim, old tool output is trimmed.',\n thresholds: { warn: 0.6, soft: 0.75, hard: 0.9 },\n aggressiveOn: 'soft',\n preserveK: 10,\n eliseThreshold: 2000,\n targetLoad: 0.65,\n },\n {\n id: 'frugal',\n name: 'Frugal',\n description: 'Token-saver mode: compacts early and keeps a tighter verbatim tail.',\n thresholds: { warn: 0.45, soft: 0.6, hard: 0.75 },\n aggressiveOn: 'warn',\n preserveK: 6,\n eliseThreshold: 700,\n targetLoad: 0.5,\n },\n {\n id: 'deep',\n name: 'Deep',\n description: 'Long-reasoning mode: delays compaction and keeps more recent turns intact.',\n thresholds: { warn: 0.72, soft: 0.86, hard: 0.96 },\n aggressiveOn: 'hard',\n preserveK: 18,\n eliseThreshold: 5000,\n targetLoad: 0.78,\n },\n {\n id: 'archival',\n name: 'Archival',\n description: 'Decision-preserving mode: compacts steadily while keeping summaries prominent.',\n thresholds: { warn: 0.55, soft: 0.7, hard: 0.84 },\n aggressiveOn: 'soft',\n preserveK: 8,\n eliseThreshold: 1200,\n targetLoad: 0.58,\n },\n]);\n\nexport function listContextWindowModes(): ContextWindowMode[] {\n return CONTEXT_WINDOW_MODES.map((m) => ({ ...m, thresholds: { ...m.thresholds } }));\n}\n\nexport function getContextWindowMode(id: string | null | undefined): ContextWindowMode | null {\n if (!id) return null;\n const mode = CONTEXT_WINDOW_MODES.find((m) => m.id === id);\n return mode ? { ...mode, thresholds: { ...mode.thresholds } } : null;\n}\n\nexport function isContextWindowModeId(id: string): id is ContextWindowModeId {\n return CONTEXT_WINDOW_MODES.some((m) => m.id === id);\n}\n\nexport function resolveContextWindowPolicy(\n config: ContextWindowConfigLike = {},\n overrideMode?: string | null,\n): ContextWindowPolicy {\n const requested = overrideMode ?? config.mode ?? DEFAULT_CONTEXT_WINDOW_MODE_ID;\n const mode = getContextWindowMode(requested) ?? getContextWindowMode(DEFAULT_CONTEXT_WINDOW_MODE_ID)!;\n\n if (mode.id !== DEFAULT_CONTEXT_WINDOW_MODE_ID) {\n return mode;\n }\n\n return {\n ...mode,\n thresholds: {\n warn: config.warnThreshold ?? mode.thresholds.warn,\n soft: config.softThreshold ?? mode.thresholds.soft,\n hard: config.hardThreshold ?? mode.thresholds.hard,\n },\n preserveK: config.preserveK ?? mode.preserveK,\n eliseThreshold: config.eliseThreshold ?? mode.eliseThreshold,\n };\n}\n\nexport function formatContextWindowModeList(activeId?: string | null): string {\n return CONTEXT_WINDOW_MODES.map((m) => {\n const marker = m.id === activeId ? '*' : ' ';\n return `${marker} ${m.id.padEnd(9)} ${m.name} - ${m.description}`;\n }).join('\\n');\n}\n","export interface SafeParseResult<T> {\n ok: boolean;\n value?: T;\n error?: string;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: escape literal control characters that appear *inside* string\n // values. Models frequently emit raw newlines/tabs inside a code payload\n // (e.g. edit's old_string/new_string) instead of the required \\n / \\t, which\n // makes JSON.parse throw. This is the single most common malformed-args case.\n out = escapeControlCharsInStrings(out);\n\n // Stage 4: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\n/**\n * Walk the string tracking whether we are inside a JSON string literal and\n * replace raw control characters (U+0000–U+001F) that appear inside strings\n * with their valid JSON escape sequences. Characters outside strings are left\n * untouched (insignificant whitespace stays as-is). Already-escaped sequences\n * are not double-escaped because we only act on *literal* control bytes.\n */\nfunction escapeControlCharsInStrings(s: string): string {\n let inString = false;\n let out = '';\n for (let i = 0; i < s.length; i++) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n out += c;\n continue;\n }\n const code = c.charCodeAt(0);\n if (inString && code < 0x20) {\n switch (c) {\n case '\\n':\n out += '\\\\n';\n break;\n case '\\r':\n out += '\\\\r';\n break;\n case '\\t':\n out += '\\\\t';\n break;\n case '\\b':\n out += '\\\\b';\n break;\n case '\\f':\n out += '\\\\f';\n break;\n default:\n out += `\\\\u${code.toString(16).padStart(4, '0')}`;\n }\n continue;\n }\n out += c;\n }\n return out;\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s[i + 1] === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s[i] !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","/**\n * Shared configuration constants used across execution, storage, CLI, and WebUI.\n * Centralized here to avoid cross-domain import cycles.\n */\n\n/** Default tools config — mirrors values baked into BEHAVIOR_DEFAULTS. */\nexport const DEFAULT_TOOLS_CONFIG = Object.freeze({\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n});\n\n/** Default context config — mirrors BEHAVIOR_DEFAULTS.context. */\nexport const DEFAULT_CONTEXT_CONFIG = Object.freeze({\n preserveK: 10,\n eliseThreshold: 2000,\n});\n\n/** Default autonomy config — auto-proceed delay etc. */\nexport const DEFAULT_AUTONOMY_CONFIG = Object.freeze({\n autoProceedDelayMs: 45_000,\n});\n\n/** Default session logging / audit configuration. */\nexport const DEFAULT_SESSION_LOGGING_CONFIG = Object.freeze({\n auditLevel: 'standard' as const,\n sampling: {\n toolProgress: {\n sampleRate: 8,\n },\n },\n});","import * as fs from 'node:fs/promises';\nimport { decryptConfigSecrets } from '../security/config-secrets.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport {\n DEFAULT_CONTEXT_WINDOW_MODE_ID,\n isContextWindowModeId,\n listContextWindowModes,\n} from '../types/context-window.js';\nimport type { Config, ConfigLoader, SyncConfig } from '../types/config.js';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { safeParse } from '../utils/safe-json.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\nimport {\n DEFAULT_TOOLS_CONFIG,\n DEFAULT_CONTEXT_CONFIG,\n DEFAULT_SESSION_LOGGING_CONFIG,\n} from '../types/default-config.js';\n\n/**\n * Defaults express *behavior*, not identity. Provider and model are NOT\n * hardcoded — they must be resolved at runtime from config + env + the\n * ModelsRegistry. A bare Config returned by this loader will throw when\n * the agent tries to construct a provider, with a message that points\n * users at `wstack init`.\n */\nconst BEHAVIOR_DEFAULTS: Omit<Config, 'provider' | 'model'> = {\n version: 1,\n context: {\n mode: DEFAULT_CONTEXT_WINDOW_MODE_ID,\n warnThreshold: 0.6,\n softThreshold: 0.75,\n hardThreshold: 0.9,\n autoCompact: true,\n preserveK: DEFAULT_CONTEXT_CONFIG.preserveK,\n eliseThreshold: DEFAULT_CONTEXT_CONFIG.eliseThreshold,\n },\n tools: {\n defaultExecutionStrategy: DEFAULT_TOOLS_CONFIG.defaultExecutionStrategy,\n maxIterations: DEFAULT_TOOLS_CONFIG.maxIterations,\n iterationTimeoutMs: DEFAULT_TOOLS_CONFIG.iterationTimeoutMs,\n sessionTimeoutMs: DEFAULT_TOOLS_CONFIG.sessionTimeoutMs,\n perIterationOutputCapBytes: DEFAULT_TOOLS_CONFIG.perIterationOutputCapBytes,\n autoExtendLimit: DEFAULT_TOOLS_CONFIG.autoExtendLimit,\n },\n log: { level: 'info' },\n features: {\n mcp: true,\n plugins: true,\n memory: true,\n modelsRegistry: true,\n skills: true,\n },\n session: { ...DEFAULT_SESSION_LOGGING_CONFIG },\n};\n\nconst ENV_MAP: Record<string, (cfg: PartialConfig, val: string) => void> = {\n WRONGSTACK_PROVIDER: (c, v) => {\n c.provider = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('provider');\n },\n WRONGSTACK_MODEL: (c, v) => {\n c.model = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('model');\n },\n WRONGSTACK_API_KEY: (c, v) => {\n c.apiKey = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('apiKey');\n },\n WRONGSTACK_BASE_URL: (c, v) => {\n c.baseUrl = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('baseUrl');\n },\n WRONGSTACK_LOG_LEVEL: (c, v) => {\n if (!c.log) c.log = { level: 'info' };\n c.log.level = v as Config['log']['level'];\n },\n};\n\ntype PartialConfig = Partial<Config> & {\n providers?: Record<string, { apiKey?: string; baseUrl?: string; type?: string }>;\n /** Fields that came from environment variables — must not be persisted. */\n _envSource?: Set<string>;\n};\n\nfunction isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || typeof v !== 'object');\n}\n\nconst FORBIDDEN_PROTO_KEYS = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n]);\n\nfunction deepMerge<T>(base: T, patch: Partial<T>): T {\n if (typeof base !== 'object' || base === null) return (patch as T) ?? base;\n if (typeof patch !== 'object' || patch === null) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [k, v] of Object.entries(patch as Record<string, unknown>)) {\n // Defense in depth — user config is parsed from JSON and merged\n // recursively; blocking these keys eliminates prototype-pollution\n // gadgets regardless of where else they might be touched.\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n // Primitive arrays (plugins, tools, etc.) are merged by concatenation.\n // Object arrays (MCP servers, etc.) are replaced wholesale.\n if (Array.isArray(v)) {\n if (Array.isArray(existing) && isPrimitiveArray(v) && isPrimitiveArray(existing)) {\n out[k] = [...new Set([...existing, ...v])];\n } else {\n out[k] = v;\n if (process.env.WRONGSTACK_DEBUG_CONFIG) {\n console.warn(\n `[config] Non-primitive array for \"${k}\" replaced (global + local config merge). ` +\n `Global entries: ${(existing as unknown[] | undefined)?.length ?? 0}, local entries: ${v.length}.`,\n );\n }\n }\n } else if (\n typeof v === 'object' &&\n v !== null &&\n typeof existing === 'object' &&\n existing !== null\n ) {\n out[k] = deepMerge(existing, v as Record<string, unknown>);\n } else if (v !== undefined) {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A single config source. Higher priority wins in merges.\n * Sources are applied in priority order (lowest first), so a source\n * with priority=10 overrides one with priority=1.\n */\nexport interface ConfigSource {\n /** Unique name for debugging and error messages. */\n name: string;\n /** Lower numbers merge first, higher numbers override lower. Default: 50. */\n priority?: number;\n /**\n * Read the raw config patch. Return an empty object if unavailable.\n * Errors are surfaced but do not abort loading — the source is skipped.\n */\n read(): Promise<Partial<Config>>;\n}\n\nexport interface ConfigLoaderOptions {\n paths: WstackPaths;\n strict?: boolean;\n vault?: SecretVault;\n /** Extra sources merged after the built-in layers. */\n sources?: ConfigSource[];\n}\n\nexport class DefaultConfigLoader implements ConfigLoader {\n private readonly paths: WstackPaths;\n private readonly strict: boolean;\n private readonly vault: SecretVault | undefined;\n private readonly extraSources: ConfigSource[];\n\n constructor(opts: ConfigLoaderOptions) {\n this.paths = opts.paths;\n this.strict = opts.strict ?? false;\n this.vault = opts.vault;\n this.extraSources = opts.sources ?? [];\n }\n\n async load(opts: { cliFlags?: Partial<Config>; cwd?: string } = {}): Promise<Config> {\n let cfg: PartialConfig = { ...BEHAVIOR_DEFAULTS } as PartialConfig;\n\n // Layer 2 & 3: global + project-local config — read in parallel\n const [global, local] = await Promise.all([\n this.readJson(this.paths.globalConfig),\n this.readJson(this.paths.projectLocalConfig),\n ]);\n cfg = deepMerge(cfg, global);\n cfg = deepMerge(cfg, local);\n\n // Layer 4: env vars\n for (const [key, fn] of Object.entries(ENV_MAP)) {\n const v = process.env[key];\n if (v) fn(cfg, v);\n }\n\n // Layer 5: extra sources — sorted by priority (lowest first).\n // When priorities tie, sort by name for deterministic order.\n const sorted = [...this.extraSources].sort((a, b) => {\n const pd = (a.priority ?? 50) - (b.priority ?? 50);\n if (pd !== 0) return pd;\n return a.name.localeCompare(b.name);\n });\n for (const src of sorted) {\n try {\n const patch = await src.read();\n if (patch && Object.keys(patch).length > 0) {\n cfg = deepMerge(cfg, patch);\n }\n } catch (err) {\n // Best-effort: skip failing sources so one bad source doesn't block boot.\n console.warn(`Config source \"${src.name}\" failed`, err);\n }\n }\n\n // Layer 6: CLI flags\n if (opts.cliFlags) {\n cfg = deepMerge(cfg, opts.cliFlags);\n }\n\n // Decrypt apiKey-like fields if a vault is configured.\n if (this.vault) {\n cfg = decryptConfigSecrets(cfg, this.vault);\n }\n\n // Multi-key resolution: when a provider has `apiKeys[]` configured,\n // mirror the active entry into `apiKey` so downstream construction\n // code (provider registry, wire adapters) needs no changes. Honors\n // `activeKey` (by label), else falls back to the first entry. A\n // pre-existing `apiKey` set by env/CLI flags wins so an explicit\n // override still beats the saved list.\n if (cfg.providers) {\n for (const pcfg of Object.values(cfg.providers)) {\n if (!pcfg || typeof pcfg !== 'object') continue;\n const rawKeys = (pcfg as { apiKeys?: unknown }).apiKeys;\n if (!Array.isArray(rawKeys) || rawKeys.length === 0) continue;\n // Each apiKeys entry came from arbitrary JSON. Filter to entries\n // that actually have a string apiKey + label so a malformed array\n // (null entry, missing field) doesn't crash the .find / chosen.apiKey\n // path below.\n const keys = rawKeys.filter(\n (k): k is { label: string; apiKey: string } =>\n !!k &&\n typeof k === 'object' &&\n typeof (k as { label?: unknown }).label === 'string' &&\n typeof (k as { apiKey?: unknown }).apiKey === 'string',\n );\n if (keys.length === 0) continue;\n const existing = (pcfg as { apiKey?: string }).apiKey;\n if (existing && existing.length > 0) continue;\n const activeLabel = (pcfg as { activeKey?: string }).activeKey;\n const chosen = activeLabel\n ? (keys.find((k) => k.label === activeLabel) ?? keys[0])\n : keys[0];\n if (chosen?.apiKey) {\n (pcfg as { apiKey?: string }).apiKey = chosen.apiKey;\n }\n }\n }\n\n this.validateBehavior(cfg);\n if (this.strict) {\n this.validateIdentity(cfg);\n }\n // In strict mode, validateIdentity has confirmed provider/model are set;\n // it's safe to assert the full Config contract. In non-strict mode the\n // caller (e.g. early-boot wizard) accepts a Partial and constructs the\n // provider later, so we deliberately return without the cast.\n return Object.freeze(cfg) as Config;\n }\n\n /**\n * Persist a sync config to ~/.wrongstack/sync.json, with the token encrypted\n * by the vault (if provided). The file is isolated from the main config\n * hierarchy to prevent accidental commits.\n */\n async persistSyncConfig(cfg: SyncConfig): Promise<void> {\n let toWrite = { ...cfg };\n if (this.vault && toWrite.githubToken && !toWrite.githubToken.startsWith('enc:')) {\n // Re-encrypt if plaintext (e.g. came from in-memory configStore update\n // rather than direct /sync enable call). Idempotent for already-encrypted.\n toWrite = { ...toWrite, githubToken: this.vault.encrypt(toWrite.githubToken) };\n }\n await atomicWrite(this.paths.syncConfig, JSON.stringify(toWrite, null, 2), { mode: 0o600 });\n }\n\n /**\n * Read ~/.wrongstack/sync.json (encrypted GitHub token storage) and decrypt\n * the token if a vault is available. Returns null if the file doesn't exist.\n * This is separate from main config loading because sync.json is intentionally\n * isolated — it should never be part of project-local or env-driven config.\n */\n async loadSyncConfig(): Promise<SyncConfig | null> {\n try {\n const raw = await fs.readFile(this.paths.syncConfig, 'utf8');\n const parsed = safeParse<SyncConfig>(raw);\n if (!parsed.ok || !parsed.value) return null;\n\n // Decrypt the token if vault is available (field name matches secret pattern)\n if (this.vault) {\n const decrypted = decryptConfigSecrets({ sync: parsed.value } as PartialConfig, this.vault);\n return (decrypted as { sync: SyncConfig }).sync ?? null;\n }\n return parsed.value;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n console.warn('[config] Failed to load sync config:', err);\n return null;\n }\n }\n\n private async readJson(file: string): Promise<PartialConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(file, 'utf8');\n } catch (err) {\n // Missing file is the common case (per-project local config rarely\n // exists at start). Surface anything else (EACCES, EISDIR) so a\n // mis-permissioned config doesn't silently fall back to defaults.\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`[config] Failed to read \"${file}\":`, err);\n }\n return {};\n }\n const parsed = safeParse<PartialConfig>(raw);\n if (!parsed.ok || !parsed.value) {\n // The file exists but isn't valid JSON. Don't silently reset to\n // defaults — that's hours of debug timesink for users who'd typo'd\n // their config. Warn loudly and keep the in-memory defaults.\n console.warn(\n `[config] Failed to parse \"${file}\": invalid JSON. Falling back to defaults for this layer.`,\n );\n return {};\n }\n return parsed.value;\n }\n\n private validateBehavior(cfg: PartialConfig): void {\n if (cfg.version === undefined) throw new Error('Config: missing version field');\n if (cfg.version !== 1) throw new Error(`Config: unsupported version ${cfg.version}`);\n const c = cfg.context;\n if (!c) throw new Error('Config: missing context section');\n // A user-edited config.json can land strings here (\"0.6\") and slip past\n // truthiness checks; the `>=` comparison then coerces silently and the\n // threshold ordering check passes for nonsense values. Validate types\n // explicitly so misconfigs surface here, not as confusing failures deep\n // in the auto-compaction logic.\n const fields: Array<keyof typeof c> = ['warnThreshold', 'softThreshold', 'hardThreshold'];\n for (const f of fields) {\n const v = c[f];\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`Config: context.${String(f)} must be a finite number (got ${typeof v})`);\n }\n }\n if (c.warnThreshold >= c.softThreshold || c.softThreshold >= c.hardThreshold) {\n throw new Error('Config: context thresholds must satisfy warn < soft < hard');\n }\n if (c.mode !== undefined && !isContextWindowModeId(c.mode)) {\n // An unknown mode (typo or value from an older/renamed scheme) should not\n // brick the CLI — unlike the numeric thresholds above there is a safe\n // default. Warn and fall back rather than throwing.\n const known = listContextWindowModes().map((m) => m.id).join(', ');\n console.warn(\n `[config] Ignoring unknown context.mode \"${c.mode}\" (expected one of: ${known}); ` +\n `falling back to \"${DEFAULT_CONTEXT_WINDOW_MODE_ID}\".`,\n );\n c.mode = DEFAULT_CONTEXT_WINDOW_MODE_ID;\n }\n }\n\n private validateIdentity(cfg: PartialConfig): void {\n if (!cfg.provider) {\n throw new Error(\n 'Config: no provider configured. Run `wstack init` or set WRONGSTACK_PROVIDER.',\n );\n }\n if (!cfg.model) {\n throw new Error('Config: no model configured. Run `wstack init` or set WRONGSTACK_MODEL.');\n }\n }\n}\n","/**\n * L2-D: Config version migration framework. Pure functions, decoupled\n * from disk/CLI — caller passes a parsed JSON object and gets back the\n * up-to-date `Config` shape (or a structured error explaining why\n * migration failed).\n *\n * Migrations are registered as `{ from, to, migrate }` triples and run\n * sequentially. Each migration is independently testable. Adding a new\n * version means appending one migration; existing user configs are\n * upgraded in place at load time.\n */\n\nexport interface MigrationContext {\n /**\n * Original on-disk version of the input. Migrations may use this to\n * decide between in-place patches and rewrites.\n */\n fromVersion: number;\n /**\n * Set when the migration writes back to disk. Callers persist the\n * migrated config when this is true so the user doesn't see the same\n * migration banner on every boot.\n */\n shouldPersist: boolean;\n}\n\nexport interface ConfigMigration {\n /** Version of the input this migration accepts. */\n from: number;\n /** Version of the output it produces. */\n to: number;\n /** Pure transform — no I/O. */\n migrate(input: Record<string, unknown>, ctx: MigrationContext): Record<string, unknown>;\n /** Optional human-readable description for migration logs / banners. */\n describe?: string;\n}\n\nexport interface MigrationResult {\n /** Final config (still typed as `unknown`-keyed — caller validates). */\n config: Record<string, unknown>;\n /** Ordered list of `from→to` versions that ran. */\n applied: string[];\n /** True when at least one migration produced changes worth persisting. */\n shouldPersist: boolean;\n}\n\nexport class ConfigMigrationError extends Error {\n readonly fromVersion: number;\n readonly targetVersion: number;\n readonly missingStep: number | null;\n\n constructor(opts: {\n message: string;\n fromVersion: number;\n targetVersion: number;\n missingStep: number | null;\n }) {\n super(opts.message);\n this.name = 'ConfigMigrationError';\n this.fromVersion = opts.fromVersion;\n this.targetVersion = opts.targetVersion;\n this.missingStep = opts.missingStep;\n }\n}\n\n/**\n * Run registered migrations until the input reaches `targetVersion`.\n *\n * Resolution rules:\n * 1. If `input.version === targetVersion`, no migrations run; `shouldPersist`\n * is false.\n * 2. Otherwise walk the migration chain from `input.version` upward,\n * picking the migration whose `from` matches the current version.\n * 3. Stop when `current.version === targetVersion`.\n * 4. If no migration matches at some point, throw `ConfigMigrationError`\n * with the missing step recorded for diagnostics.\n *\n * Migrations may be downward (e.g. for staged rollouts), but `targetVersion`\n * must be reachable strictly via the registered chain — there's no implicit\n * \"skip\" or transitive resolution.\n */\nexport function runConfigMigrations(\n input: Record<string, unknown>,\n targetVersion: number,\n migrations: readonly ConfigMigration[],\n): MigrationResult {\n const initial = typeof input['version'] === 'number' ? (input['version'] as number) : 1;\n let current: Record<string, unknown> = { ...input };\n let currentVersion = initial;\n const applied: string[] = [];\n let shouldPersist = false;\n\n let guard = 0;\n while (currentVersion !== targetVersion) {\n if (++guard > 100) {\n throw new ConfigMigrationError({\n message: `Config migration looped past 100 steps (from v${initial} toward v${targetVersion})`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const step = migrations.find((m) => m.from === currentVersion);\n if (!step) {\n throw new ConfigMigrationError({\n message: `No migration registered from config v${currentVersion} (target v${targetVersion}). Update the framework or revert the config file.`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const ctx: MigrationContext = { fromVersion: currentVersion, shouldPersist: false };\n const next = step.migrate(current, ctx);\n // Ensure the migration set the new version. Be tolerant: if it didn't,\n // patch it in so the chain doesn't infinite-loop on author oversight.\n if (typeof next['version'] !== 'number' || next['version'] !== step.to) {\n next['version'] = step.to;\n }\n current = next;\n currentVersion = step.to;\n applied.push(`v${step.from}→v${step.to}`);\n shouldPersist = shouldPersist || ctx.shouldPersist || step.from < step.to;\n }\n return { config: current, applied, shouldPersist };\n}\n\n/**\n * Default empty migration registry. Real migrations are appended as new\n * Config versions are introduced. Example (when v2 lands):\n *\n * export const CONFIG_MIGRATIONS: readonly ConfigMigration[] = [\n * {\n * from: 1, to: 2, describe: 'rename `apiKey` → `auth.apiKey`',\n * migrate(cfg) {\n * const apiKey = cfg.apiKey;\n * delete cfg.apiKey;\n * return { ...cfg, auth: { ...(cfg.auth ?? {}), apiKey } };\n * },\n * },\n * ];\n */\nexport const DEFAULT_CONFIG_MIGRATIONS: readonly ConfigMigration[] = [];\n","import * as fsp from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SessionStore } from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\n/**\n * Per-project lockfile used for crash detection. The CLI writes one of\n * these alongside the session JSONLs (`<projectSessions>/active.json`)\n * when an interactive run starts, and deletes it on clean exit. If we\n * find one on the next launch whose owning PID is dead (or whose host\n * doesn't match), we know the previous run was killed mid-flight and\n * the session it was writing to is a recovery candidate.\n *\n * The lockfile is intentionally per-project (already isolated by\n * `wpaths.projectSessions`), so two TUIs in two different repos do not\n * fight each other.\n */\nexport interface RecoveryLockOptions {\n /** Directory the lockfile lives in. Usually `wpaths.projectSessions`. */\n dir: string;\n /** This process's PID. Default: `process.pid`. */\n pid?: number;\n /** Hostname recorded for the lock. Default: `os.hostname()`. */\n hostname?: string;\n /** Locks older than this are considered orphaned (disk wiped, etc.). Default 24h. */\n maxAgeMs?: number;\n /** Used to check whether the abandoned session was actually closed cleanly. */\n sessionStore?: SessionStore;\n /**\n * Override the PID-liveness probe. Default: `process.kill(pid, 0)` —\n * succeeds (or throws EPERM) when the PID is alive, throws ESRCH when\n * it is gone. Tests inject a deterministic stub.\n */\n isPidAlive?: (pid: number) => boolean;\n}\n\nexport interface AbandonedSession {\n sessionId: string;\n pid: number;\n startedAt: string;\n /** Lockfile age in ms at the time of the check. */\n ageMs: number;\n /** Number of messages already on disk for this session. */\n messageCount: number;\n}\n\ninterface LockFile {\n v: 1;\n sessionId: string;\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\nconst LOCK_FILE = 'active.json';\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport class RecoveryLock {\n private readonly file: string;\n private readonly pid: number;\n private readonly hostname: string;\n private readonly maxAgeMs: number;\n private readonly sessionStore?: SessionStore;\n private readonly probe: (pid: number) => boolean;\n\n constructor(opts: RecoveryLockOptions) {\n this.file = path.join(opts.dir, LOCK_FILE);\n this.pid = opts.pid ?? process.pid;\n this.hostname = opts.hostname ?? os.hostname();\n this.maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n this.sessionStore = opts.sessionStore;\n this.probe = opts.isPidAlive ?? defaultIsPidAlive;\n }\n\n /**\n * Examine the lockfile and decide whether it represents an abandoned\n * session. Returns `null` if the file is missing, points to a live\n * instance, references a clean-closed session, is too old, or is\n * malformed. Otherwise returns enough detail to prompt the user.\n *\n * Important: this is a read-only check. We never delete an active\n * lock from here — if another wstack instance is alive, the caller\n * should bail or run with a fresh session instead.\n */\n async checkAbandoned(): Promise<AbandonedSession | null> {\n const lock = await this.readLock();\n if (!lock) return null;\n\n const ageMs = Date.now() - new Date(lock.startedAt).getTime();\n if (Number.isNaN(ageMs) || ageMs < 0) {\n // Clock skew or corrupted timestamp — treat as orphan.\n return null;\n }\n if (ageMs > this.maxAgeMs) return null;\n\n // PID liveness only meaningful on the same host. Different host\n // means we can't probe — assume abandoned (the other machine's\n // wstack can't be holding *our* sessions dir unless it was\n // shared via network mount, in which case the user is on their\n // own).\n if (lock.hostname === this.hostname && this.probe(lock.pid)) {\n // Another wstack on this box is actively writing here.\n return null;\n }\n\n let messageCount = 0;\n if (this.sessionStore) {\n try {\n const data = await this.sessionStore.load(lock.sessionId);\n const closed = data.events.some((e) => e.type === 'session_end');\n if (closed) return null;\n messageCount = data.messages.length;\n } catch {\n // Lock points to a session that doesn't exist on disk (deleted\n // out from under us). Nothing to recover.\n return null;\n }\n }\n\n return {\n sessionId: lock.sessionId,\n pid: lock.pid,\n startedAt: lock.startedAt,\n ageMs,\n messageCount,\n };\n }\n\n /**\n * Claim the lock for the given session. Uses exclusive-create (`O_EXCL`)\n * to detect whether another process acquired the lock between our\n * `checkAbandoned()` call and now. If the file already exists, it means\n * another process won the race and we throw instead of silently\n * overwriting their recovery record.\n *\n * The caller MUST have already called `checkAbandoned()` and handled its\n * null return before calling this.\n */\n async write(sessionId: string): Promise<void> {\n await ensureDir(path.dirname(this.file));\n const lock: LockFile = {\n v: 1,\n sessionId,\n pid: this.pid,\n hostname: this.hostname,\n startedAt: new Date().toISOString(),\n };\n // O_EXCL: atomic create — fails with EEXIST if another process wrote\n // the file between our checkAbandoned() and this write. This prevents\n // two processes that scanned the same stale lock from both believing\n // they hold it. The atomicWrite approach (temp+rename) would silently\n // replace on POSIX, hiding the race.\n try {\n await fsp.writeFile(this.file, JSON.stringify(lock), { flag: 'wx', mode: 0o600 });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EEXIST') {\n throw new Error(`Recovery lock already held by another process`);\n }\n throw err;\n }\n }\n\n /**\n * Release the lock. Idempotent — silently succeeds if the file is\n * already gone (e.g. someone else cleared it, or the directory was\n * wiped).\n */\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n throw err;\n }\n }\n\n private async readLock(): Promise<LockFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return null;\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isLockFile(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n }\n}\n\nfunction isLockFile(v: unknown): v is LockFile {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return (\n o['v'] === 1 &&\n typeof o['sessionId'] === 'string' &&\n typeof o['pid'] === 'number' &&\n typeof o['hostname'] === 'string' &&\n typeof o['startedAt'] === 'string'\n );\n}\n\n/**\n * Probe whether a process is alive without sending it a real signal.\n *\n * Unix: `process.kill(pid, 0)` succeeds for our own processes, throws\n * EPERM for others (still alive, just not ours), and throws ESRCH\n * when the PID is gone.\n * Windows (Node 22+): same call returns true if the process exists,\n * throws otherwise.\n */\nfunction defaultIsPidAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EPERM') return true; // alive, but owned by someone else\n return false;\n }\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\r\nimport type {\r\n DefaultSessionReaderOptions,\r\n SessionExportOptions,\r\n SessionQuery,\r\n SessionReader,\r\n SessionSearchHit,\r\n SessionSearchQuery,\r\n SessionSummaryLite,\r\n} from '../types/session-reader.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\r\nimport type { SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\r\n\r\n/**\r\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\r\n * and export helpers. Implemented on top of the public `SessionStore`\r\n * surface so any concrete store can be inspected without re-implementation.\r\n *\r\n * The heavy operations re-parse the JSONL stream on every call — fine for\r\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\r\n */\r\nexport class DefaultSessionReader implements SessionReader {\r\n private readonly store: SessionStore;\r\n\r\n constructor(opts: DefaultSessionReaderOptions) {\r\n this.store = opts.store;\r\n }\r\n\r\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\r\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\r\n const titleNeedle = q.titleContains?.toLowerCase();\r\n const filtered = raw.filter((s) => {\r\n if (q.since && s.startedAt < q.since) return false;\r\n if (q.until && s.startedAt > q.until) return false;\r\n if (q.provider && s.provider !== q.provider) return false;\r\n if (q.model && s.model !== q.model) return false;\r\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n const out: SessionSummaryLite[] = filtered.map((s) => ({\r\n id: s.id,\r\n title: s.title,\r\n startedAt: s.startedAt,\r\n provider: s.provider,\r\n model: s.model,\r\n tokenTotal: s.tokenTotal,\r\n }));\r\n return q.limit ? out.slice(0, q.limit) : out;\r\n }\r\n\r\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\r\n const data = await this.store.load(sessionId);\r\n for (const e of data.events) yield e;\r\n }\r\n\r\n async search(q: SessionSearchQuery, sessionId?: string, sessionQuery?: SessionQuery): Promise<SessionSearchHit[]> {\r\n const limit = q.limit ?? 100;\r\n const matcher = buildMatcher(q);\r\n const allowedTypes = q.types ? new Set(q.types) : null;\r\n\r\n // Filter sessions BEFORE loading events — avoids loading thousands of events\r\n // from sessions that don't match the time/provider/model criteria.\r\n let ids: string[];\r\n if (sessionId) {\r\n ids = [sessionId];\r\n } else {\r\n const sessions = await this.store.list(1000);\r\n const titleNeedle = sessionQuery?.titleContains?.toLowerCase();\r\n const filtered = sessions.filter((s) => {\r\n if (sessionQuery?.since && s.startedAt < sessionQuery.since) return false;\r\n if (sessionQuery?.until && s.startedAt > sessionQuery.until) return false;\r\n if (sessionQuery?.provider && s.provider !== sessionQuery.provider) return false;\r\n if (sessionQuery?.model && s.model !== sessionQuery.model) return false;\r\n if (sessionQuery?.minTokens !== undefined && s.tokenTotal < sessionQuery.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n ids = filtered.map((s) => s.id);\r\n }\r\n\r\n const hits: SessionSearchHit[] = [];\r\n for (const id of ids) {\r\n let data;\r\n try {\r\n data = await this.store.load(id);\r\n } catch {\r\n continue;\r\n }\r\n for (let i = 0; i < data.events.length; i++) {\r\n const ev = data.events[i]!;\r\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\r\n const text = eventText(ev);\r\n if (text === null) continue;\r\n const hit = matcher(text);\r\n if (!hit) continue;\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: i,\r\n ts: ev.ts,\r\n type: ev.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\r\n const data = await this.store.load(sessionId);\r\n const includeTools = opts.includeTools ?? true;\r\n const includeDiagnostics = opts.includeDiagnostics ?? true;\r\n\r\n const filtered = data.events.filter((e) => {\r\n if (\r\n !includeTools &&\r\n (e.type === 'tool_use' ||\r\n e.type === 'tool_result' ||\r\n e.type === 'tool_call_start' ||\r\n e.type === 'tool_call_end')\r\n ) {\r\n return false;\r\n }\r\n if (\r\n !includeDiagnostics &&\r\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (opts.format === 'json') {\r\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\r\n }\r\n if (opts.format === 'text') {\r\n return renderPlainText(data.metadata, filtered);\r\n }\r\n return renderMarkdown(data.metadata, filtered);\r\n }\r\n\r\n async metadata(sessionId: string): Promise<SessionMetadata> {\r\n const data = await this.store.load(sessionId);\r\n return data.metadata;\r\n }\r\n}\r\n\r\nfunction buildMatcher(\r\n q: SessionSearchQuery,\r\n): (text: string) => { start: number; end: number } | null {\r\n const ci = q.caseInsensitive ?? true;\r\n if (q.regex) {\r\n const flags = ci ? 'i' : '';\r\n const compiled = compileUserRegex(q.query, flags);\r\n if (!compiled.ok) {\r\n throw new Error(`Invalid search regex \"${q.query}\": ${compiled.reason}`);\r\n }\r\n const re = compiled.regex;\r\n return (text) => {\r\n const m = re.exec(text);\r\n return m ? { start: m.index, end: m.index + m[0].length } : null;\r\n };\r\n }\r\n const needle = ci ? q.query.toLowerCase() : q.query;\r\n return (text) => {\r\n const hay = ci ? text.toLowerCase() : text;\r\n const idx = hay.indexOf(needle);\r\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\r\n };\r\n}\r\n\r\nfunction eventText(e: SessionEvent): string | null {\r\n switch (e.type) {\r\n case 'user_input':\r\n return contentToString(e.content);\r\n case 'llm_response':\r\n return contentToString(e.content);\r\n case 'tool_use':\r\n return `${e.name} ${JSON.stringify(e.input)}`;\r\n case 'tool_result':\r\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\r\n case 'error':\r\n return `${e.phase}: ${e.message}`;\r\n case 'session_start':\r\n case 'session_resumed':\r\n return `${e.model}/${e.provider}`;\r\n case 'task_created':\r\n case 'task_completed':\r\n return e.title;\r\n case 'task_failed':\r\n return `${e.title}: ${e.error}`;\r\n case 'skill_activated':\r\n case 'skill_deactivated':\r\n return e.skillName;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nfunction contentToString(content: string | ContentBlock[]): string {\r\n if (typeof content === 'string') return content;\r\n return content\r\n .map((b) => {\r\n switch (b.type) {\r\n case 'text':\r\n return b.text;\r\n case 'tool_use':\r\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\r\n case 'tool_result':\r\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n default:\r\n return '';\r\n }\r\n })\r\n .join('\\n');\r\n}\r\n\r\nconst SNIPPET_RADIUS = 60;\r\n\r\nfunction snippetOf(text: string, start: number, end: number): string {\r\n const from = Math.max(0, start - SNIPPET_RADIUS);\r\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\r\n const prefix = from > 0 ? '…' : '';\r\n const suffix = to < text.length ? '…' : '';\r\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\r\n}\r\n\r\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(`# Session ${meta.id}`);\r\n lines.push('');\r\n if (meta.model || meta.provider) {\r\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\r\n }\r\n lines.push(`- **Started:** ${meta.startedAt}`);\r\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input': {\r\n lines.push(`## User — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n }\r\n case 'llm_response': {\r\n lines.push(`## Assistant — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n if (e.stopReason && e.stopReason !== 'end_turn') {\r\n lines.push('');\r\n lines.push(`*stop: ${e.stopReason}*`);\r\n }\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_use': {\r\n lines.push(`### Tool call: \\`${e.name}\\``);\r\n lines.push('');\r\n lines.push('```json');\r\n lines.push(JSON.stringify(e.input, null, 2));\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_result': {\r\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\r\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\r\n lines.push('');\r\n lines.push('```');\r\n lines.push(body);\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'error': {\r\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\r\n lines.push('');\r\n break;\r\n }\r\n case 'compaction': {\r\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\r\n lines.push('');\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(\r\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\r\n );\r\n lines.push(''.padEnd(72, '-'));\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input':\r\n lines.push(`[${e.ts}] USER`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'llm_response':\r\n lines.push(`[${e.ts}] ASSISTANT`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'tool_use':\r\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\r\n break;\r\n case 'tool_result':\r\n lines.push(\r\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\r\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\r\n }`,\r\n );\r\n break;\r\n case 'error':\r\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * L2-B: AnnotationsStore — sidecar storage for collaboration annotations\n * (Phase 2 of idea #13 from IDEAS.md).\n *\n * Why a sidecar file, not the session JSONL?\n *\n * The session log is an event-sourced append-only journal\n * (`packages/core/src/types/session.ts` invariant: events are\n * append-only, with `truncateToCheckpoint` only as an explicit\n * rewind). Mixing in human-typed annotations would break that\n * invariant — the user's note about \"this rm looks dangerous\"\n * is not part of the agent's event history; it is meta-commentary\n * on the history.\n *\n * So we keep annotations in a sibling file: one JSON document per\n * session, at `<sessionDir>/<sessionId>.annotations.json`. The\n * shape is a simple versioned array, written atomically.\n *\n * Concurrency model:\n *\n * The store uses a per-session Promise chain to serialize writes.\n * Multiple annotators adding notes at the same time will queue,\n * not race. The atomic write itself is the second line of\n * defense (in case the chain is bypassed — e.g. two processes\n * pointing at the same dir).\n */\n\n/** Wire/storage shape for one annotation. */\nexport interface Annotation {\n /** Stable id (UUIDv4-ish). Referenced by resolve/delete. */\n id: string;\n /** Session this annotation belongs to. */\n sessionId: string;\n /** Index into the session event log the annotation refers to. */\n atEventIndex: number;\n /** Participant id of the annotator (matches WSCollabParticipantJoined.participantId). */\n authorId: string;\n /** Human-readable role label snapshot for display (e.g. \"annotator\"). */\n authorRole: 'annotator';\n /** The note itself. Trimmed, capped at `MAX_TEXT_LENGTH` on add. */\n text: string;\n /** ISO timestamp of creation. */\n createdAt: string;\n /** Resolved state. Annotations start unresolved. */\n resolved: boolean;\n /** ISO timestamp when resolved (if resolved). */\n resolvedAt?: string;\n /** Participant id of the resolver (if resolved). */\n resolvedBy?: string;\n}\n\ninterface AnnotationsFile {\n /** Bumped when the on-disk shape changes. v1 = initial release. */\n version: 1;\n annotations: Annotation[];\n}\n\n/** Bumped when the on-disk shape changes. Bump + migration on change. */\nconst FILE_VERSION = 1;\n/** Hard cap to keep a runaway annotator from writing megabytes. */\nconst MAX_TEXT_LENGTH = 2000;\n/** Hard cap on total annotations per session (oldest are evicted beyond this). */\nconst MAX_ANNOTATIONS = 1000;\n\nexport interface AnnotationsStoreOptions {\n /** Directory where `<sessionId>.annotations.json` files live. */\n dir: string;\n}\n\nexport class AnnotationsStore {\n private readonly dir: string;\n /** Per-session write queue. Created lazily on first add. */\n private readonly writeChains = new Map<string, Promise<void>>();\n\n constructor(opts: AnnotationsStoreOptions) {\n this.dir = opts.dir;\n }\n\n // ── Reads ──────────────────────────────────────────────────────────────\n\n /**\n * Return all annotations for `sessionId` in insertion order\n * (oldest first). Returns an empty array when no file exists\n * yet (the normal case for a fresh session).\n */\n async list(sessionId: string): Promise<Annotation[]> {\n const file = await this.readFile(sessionId);\n return file ? file.annotations : [];\n }\n\n /**\n * Convenience: only unresolved annotations, newest first — the\n * common UI rendering for \"what still needs attention?\".\n */\n async listOpen(sessionId: string): Promise<Annotation[]> {\n const all = await this.list(sessionId);\n return all.filter((a) => !a.resolved).reverse();\n }\n\n // ── Writes ─────────────────────────────────────────────────────────────\n\n /**\n * Add a new annotation. Returns the persisted record (with id\n * and timestamps filled in). Throws when `text` is empty or\n * exceeds `MAX_TEXT_LENGTH`.\n */\n async add(input: {\n sessionId: string;\n atEventIndex: number;\n authorId: string;\n text: string;\n }): Promise<Annotation> {\n const text = input.text.trim();\n if (text.length === 0) {\n throw new Error('Annotation text must be non-empty');\n }\n if (text.length > MAX_TEXT_LENGTH) {\n throw new Error(\n `Annotation text exceeds ${MAX_TEXT_LENGTH} chars (got ${text.length})`,\n );\n }\n if (!Number.isInteger(input.atEventIndex) || input.atEventIndex < 0) {\n throw new Error('atEventIndex must be a non-negative integer');\n }\n const annotation: Annotation = {\n id: randomUUID(),\n sessionId: input.sessionId,\n atEventIndex: input.atEventIndex,\n authorId: input.authorId,\n authorRole: 'annotator',\n text,\n createdAt: new Date().toISOString(),\n resolved: false,\n };\n await this.enqueue(input.sessionId, async () => {\n const all = await this.list(input.sessionId);\n all.push(annotation);\n // Evict oldest if we crossed the cap. Resolved first, then oldest.\n if (all.length > MAX_ANNOTATIONS) {\n const sorted = all\n .map((a, i) => ({ a, i }))\n .sort((x, y) => {\n // resolved=false wins (keep unresolved); among same resolved state, oldest first.\n if (x.a.resolved !== y.a.resolved) return x.a.resolved ? 1 : -1;\n return x.a.createdAt.localeCompare(y.a.createdAt);\n });\n const evictCount = all.length - MAX_ANNOTATIONS;\n const toEvict = new Set(sorted.slice(0, evictCount).map((s) => s.a.id));\n const kept = all.filter((a) => !toEvict.has(a.id));\n await this.writeFile(input.sessionId, { version: FILE_VERSION, annotations: kept });\n } else {\n await this.writeFile(input.sessionId, { version: FILE_VERSION, annotations: all });\n }\n });\n return annotation;\n }\n\n /**\n * Mark an annotation as resolved. Returns the updated record, or\n * `null` if no annotation with that id exists in this session.\n * Idempotent: resolving an already-resolved annotation refreshes\n * `resolvedAt` / `resolvedBy` to the latest call.\n */\n async resolve(input: {\n sessionId: string;\n annotationId: string;\n resolvedBy: string;\n }): Promise<Annotation | null> {\n let updated: Annotation | null = null;\n await this.enqueue(input.sessionId, async () => {\n const all = await this.list(input.sessionId);\n const idx = all.findIndex((a) => a.id === input.annotationId);\n if (idx === -1) {\n updated = null;\n return;\n }\n const next: Annotation = {\n ...all[idx]!,\n resolved: true,\n resolvedAt: new Date().toISOString(),\n resolvedBy: input.resolvedBy,\n };\n all[idx] = next;\n await this.writeFile(input.sessionId, { version: FILE_VERSION, annotations: all });\n updated = next;\n });\n return updated;\n }\n\n // ── Internals ──────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (!sessionId || sessionId.includes('/') || sessionId.includes('\\\\') || sessionId.includes('..')) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.annotations.json`);\n }\n\n private async readFile(sessionId: string): Promise<AnnotationsFile | null> {\n const fp = this.filePath(sessionId);\n try {\n const raw = await fs.readFile(fp, 'utf8');\n const parsed = JSON.parse(raw) as AnnotationsFile;\n if (parsed.version !== FILE_VERSION) {\n // Future-proof: migrations land here. For now, treat unknown\n // versions as an empty store — safer than crashing on a\n // downgrade.\n return { version: FILE_VERSION, annotations: [] };\n }\n return parsed;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n // Corrupt JSON or permission error: log via the silent-recovery\n // path (the store doesn't take a logger; callers observe via\n // list() returning [] for an unreadable file is acceptable for\n // Phase 2 — annotations are meta-data, losing them is not fatal).\n return { version: FILE_VERSION, annotations: [] };\n }\n }\n\n private async writeFile(sessionId: string, file: AnnotationsFile): Promise<void> {\n const fp = this.filePath(sessionId);\n await atomicWrite(fp, JSON.stringify(file, null, 2));\n }\n\n /**\n * Serialize writes per-sessionId. We chain promises instead of\n * using a Mutex class so the contract is obvious from the\n * call-site: `enqueue(sid, fn)` runs `fn` after every prior\n * enqueue for `sid` has settled.\n */\n private enqueue(sessionId: string, fn: () => Promise<void>): Promise<void> {\n const prev = this.writeChains.get(sessionId) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n // Keep the chain intact even when `fn` throws; failures\n // shouldn't break subsequent writes.\n this.writeChains.set(\n sessionId,\n next.catch(() => undefined),\n );\n return next;\n }\n}\n","import { createHash } from 'node:crypto';\nimport type { Request } from '../types/provider.js';\n\n/**\n * Idea #2 from IDEAS.md — Deterministic Replay.\n *\n * The hash function is the foundation of replay: given a `Request`,\n * produce a stable identifier so a recorded `Response` can be looked\n * up later when we want to \"re-run\" the same agent loop without\n * burning API credits.\n *\n * Stability rules:\n *\n * - All object keys are sorted recursively before stringification.\n * Without this, two semantically identical requests that differ\n * only in key insertion order would produce different hashes.\n * - We hash ONLY the fields that affect the response: `model`,\n * `system`, `messages`, `tools`, `maxTokens`, and the four\n * sampling knobs (`temperature`, `topP`, `stopSequences`,\n * `toolChoice`). Anything else on the `Request` (metadata,\n * future extensions) is ignored so replay stays forward-compat.\n * - We serialize to JSON. The `ContentBlock` and `Message` shapes\n * are pure data; this works as long as no `undefined` values\n * sneak in (those get dropped by `JSON.stringify`, which is\n * fine — the structural diff is what matters).\n *\n * The SHA-256 output is hex-encoded and prefixed with the algorithm\n * tag so a future migration to a different hash (e.g. blake3) is\n * trivial to detect.\n */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys(obj[key]);\n }\n return sorted;\n }\n return value;\n}\n\nexport function hashRequest(request: Request): string {\n // Pick only the fields that affect the response. See stability rules.\n const payload = {\n model: request.model,\n system: request.system,\n messages: request.messages,\n tools: request.tools,\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n topP: request.topP,\n stopSequences: request.stopSequences,\n toolChoice: request.toolChoice,\n };\n const json = stableStringify(payload);\n const digest = createHash('sha256').update(json, 'utf8').digest('hex');\n return `sha256:${digest}`;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { hashRequest } from '../replay/hash.js';\nimport type { Request, Response } from '../types/provider.js';\n\n/**\n * ReplayLogStore — sidecar store for deterministic-replay support\n * (idea #2 from IDEAS.md). One JSONL file per session, recording\n * every provider request/response pair so the same agent loop can\n * be re-run later with frozen API responses.\n *\n * Why a sidecar (not the session JSONL)?\n *\n * Same reason as `AnnotationsStore` — the session log is\n * event-sourced and append-only; a provider request payload can be\n * tens of kilobytes (especially with long conversation history),\n * and we want replay to be opt-in (recorded only when the user\n * runs with `--replay` or a future equivalent). Mixing it into\n * the event log would inflate every read for replay-irrelevant\n * paths.\n *\n * File layout: `<dir>/<sessionId>.replay.jsonl`, one entry per line.\n * Each entry: `{ hash, ts, request, response }`. The `hash` is\n * computed via `hashRequest` so lookups are O(1) by hash.\n *\n * Concurrency: per-session write queue (same pattern as\n * `AnnotationsStore`). Reads are lock-free; the write chain makes\n * the append + rehash sequence atomic.\n */\nexport interface ReplayEntry {\n hash: string;\n ts: string;\n request: Request;\n response: Response;\n}\n\nconst FILE_VERSION = 1;\n\n/** Default cap on the number of entries per session. */\nconst DEFAULT_MAX_ENTRIES = 1000;\n\nexport interface ReplayLogStoreOptions {\n /** Directory where `<sessionId>.replay.jsonl` files live. */\n dir: string;\n /**\n * Cap on the number of entries per session. When a `record` would\n * push the file beyond this, the oldest entries are evicted (LRU\n * by insertion order). Set to `Infinity` to disable rotation.\n * Defaults to 1000 — a single LLM call averages ~5KB serialized\n * (messages + tools + response), so 1000 entries is ~5MB per\n * session which is a reasonable upper bound.\n */\n maxEntries?: number;\n}\n\nexport class ReplayLogStore {\n private readonly dir: string;\n private readonly writeChains = new Map<string, Promise<void>>();\n /** Per-session hash → entry index, kept in memory after the first load. */\n private readonly cache = new Map<string, Map<string, ReplayEntry>>();\n /** Per-session entry count on disk, to detect when compaction is needed. */\n private readonly diskCount = new Map<string, number>();\n private readonly maxEntries: number;\n\n constructor(opts: ReplayLogStoreOptions) {\n this.dir = opts.dir;\n this.maxEntries = opts.maxEntries ?? DEFAULT_MAX_ENTRIES;\n }\n\n // ── Writes ──────────────────────────────────────────────────────────────\n\n /**\n * Record a request/response pair. Idempotent on hash: a second\n * `record` for the same hash is a no-op (the existing entry wins).\n * Returns the hash.\n */\n async record(input: {\n sessionId: string;\n request: Request;\n response: Response;\n }): Promise<string> {\n const hash = hashRequest(input.request);\n await this.enqueue(input.sessionId, async () => {\n const cache = await this.ensureCache(input.sessionId);\n if (cache.has(hash)) return; // already recorded\n const entry: ReplayEntry = {\n hash,\n ts: new Date().toISOString(),\n request: input.request,\n response: input.response,\n };\n // True append — O(1) per write. Only compact (full rewrite) when\n // we exceed maxEntries and need to evict oldest entries.\n cache.set(hash, entry);\n const count = (this.diskCount.get(input.sessionId) ?? 0) + 1;\n if (count > this.maxEntries) {\n // Need to compact: keep only the most recent maxEntries.\n await this.compact(input.sessionId, cache);\n } else {\n await fs.appendFile(this.filePath(input.sessionId), JSON.stringify(entry) + '\\n', 'utf8');\n this.diskCount.set(input.sessionId, count);\n }\n });\n return hash;\n }\n\n /**\n * Compact the replay log to keep only the most recent maxEntries.\n * Called when entry count exceeds the cap. Rewrites the entire file\n * but only happens O(n / maxEntries) times per session.\n */\n private async compact(sessionId: string, cache: Map<string, ReplayEntry>): Promise<void> {\n // Map.values() preserves insertion order — take the last maxEntries.\n const all = [...cache.values()];\n const keep = all.slice(-this.maxEntries);\n await this.writeAll(sessionId, keep);\n cache.clear();\n for (const e of keep) cache.set(e.hash, e);\n this.diskCount.set(sessionId, keep.length);\n }\n\n // ── Reads ───────────────────────────────────────────────────────────────\n\n /**\n * Look up an entry by hash. Returns `null` when the request has\n * not been recorded for this session. O(1) after the first call\n * per session (in-memory cache).\n */\n async lookup(sessionId: string, hash: string): Promise<ReplayEntry | null> {\n const cache = await this.ensureCache(sessionId);\n return cache.get(hash) ?? null;\n }\n\n /** All recorded entries for a session, in insertion order. */\n async load(sessionId: string): Promise<ReplayEntry[]> {\n const cache = await this.ensureCache(sessionId);\n return [...cache.values()];\n }\n\n /**\n * List every session id that has a replay log in the store dir.\n * Returns an array of `{ sessionId, entryCount, path }` sorted\n * by sessionId for stable output. Used by `wstack replay --list`.\n */\n async list(): Promise<Array<{ sessionId: string; entryCount: number; path: string }>> {\n let entries: string[];\n try {\n entries = await fs.readdir(this.dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n return [];\n }\n const out: Array<{ sessionId: string; entryCount: number; path: string }> = [];\n for (const name of entries) {\n if (!name.endsWith('.replay.jsonl')) continue;\n const sessionId = name.slice(0, -'.replay.jsonl'.length);\n const all = await this.load(sessionId);\n out.push({\n sessionId,\n entryCount: all.length,\n path: path.join(this.dir, name),\n });\n }\n return out.sort((a, b) => a.sessionId.localeCompare(b.sessionId));\n }\n\n // ── Internals ───────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (!sessionId || sessionId.includes('/') || sessionId.includes('\\\\') || sessionId.includes('..')) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.replay.jsonl`);\n }\n\n private async readAll(sessionId: string): Promise<ReplayEntry[]> {\n const fp = this.filePath(sessionId);\n try {\n const raw = await fs.readFile(fp, 'utf8');\n const out: ReplayEntry[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line) as { version?: number; entry?: ReplayEntry } & ReplayEntry;\n // Forward-compat: v1 stores entries one per line, no envelope.\n // A future \"v2\" could wrap with `{version, entries:[...]}`;\n // the loader would then branch on `parsed.version`.\n if ('entry' in parsed && parsed.entry) {\n out.push(parsed.entry);\n } else {\n out.push(parsed);\n }\n } catch {\n // Skip a corrupt line — annotations-store and other sidecar\n // stores take the same approach (meta-data, not fatal).\n }\n }\n return out;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n // Corrupt or unreadable: treat as empty.\n return [];\n }\n }\n\n private async writeAll(sessionId: string, entries: ReplayEntry[]): Promise<void> {\n const fp = this.filePath(sessionId);\n const body = entries.map((e) => JSON.stringify(e)).join('\\n') + (entries.length ? '\\n' : '');\n await atomicWrite(fp, body);\n // Drop the version-stamp comment at the top — v1 has no envelope,\n // but we keep a one-line marker for human readers / future tooling.\n // (The atomicWrite just wrote pure JSONL; that's correct for v1.)\n void FILE_VERSION;\n }\n\n private async ensureCache(sessionId: string): Promise<Map<string, ReplayEntry>> {\n let cache = this.cache.get(sessionId);\n if (cache) return cache;\n const all = await this.readAll(sessionId);\n cache = new Map();\n for (const e of all) cache.set(e.hash, e);\n this.cache.set(sessionId, cache);\n this.diskCount.set(sessionId, all.length);\n return cache;\n }\n\n private enqueue(sessionId: string, fn: () => Promise<void>): Promise<void> {\n const prev = this.writeChains.get(sessionId) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n this.writeChains.set(\n sessionId,\n next.catch(() => undefined),\n );\n return next;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SessionEvent } from '../types/session.js';\n\n/**\n * Idea #1 from IDEAS.md — Stateful Session Recovery.\n *\n * `SessionRecovery` is the read-side companion to the in-flight\n * marker mechanism. When the agent loop is running, it writes an\n * `in_flight_start` event at the current point in the log. On\n * clean shutdown, a matching `in_flight_end` follows. If the\n * process dies (crash, OOM, machine sleep, SIGKILL) the marker\n * is the last event in the file — and `detectStale` flags the\n * session as \"incomplete, can be resumed\".\n *\n * Phase 1 of this feature is **detection only**. The actual\n * re-execution of incomplete work is a follow-up: it requires\n * tracking pending tool calls, mid-stream LLM responses, and\n * uncommitted file changes — and re-running the agent loop from\n * the last `checkpoint` event. The detection layer is independent\n * and ships first because (a) it gives the user immediate\n * visibility into what died, and (b) it's the foundation for the\n * resume command and the CLI's \"Incomplete sessions\" surface.\n *\n * Concurrency: pure read; no writes. Safe to call from multiple\n * processes simultaneously.\n */\nexport interface StaleSession {\n sessionId: string;\n /** Path to the JSONL log. */\n path: string;\n /** Last event ts (the in_flight_start timestamp). */\n lastEventTs: string;\n /** Context the agent was working on when it died. */\n context: string;\n /** Total events in the log. */\n eventCount: number;\n}\n\nexport interface RecoveryPlan {\n sessionId: string;\n /** True if the session is stale (has a dangling in_flight_start). */\n stale: boolean;\n /** The last `checkpoint` event before the un-replayed work, or null. */\n lastCheckpoint: SessionEvent | null;\n /** All events after the last checkpoint (i.e. the work that needs re-execution). */\n pendingEvents: SessionEvent[];\n /** The dangling in_flight_start event, if any. */\n inFlightStart: SessionEvent | null;\n /** Free-form context the agent was working on, if any. */\n context: string | null;\n}\n\n/**\n * Result of `SessionRecovery.recover(sessionId)`. Distinct from\n * `StaleSession`: a session is \"stale\" if the last event is an\n * open marker, but a \"recovery plan\" can also be generated for\n * clean sessions whose last checkpoint is older than the\n * conversation history (e.g. a user-initiated \"rewind to last\n * good state\" flow). Phase 2 of idea #1: this returns the plan;\n * the actual kernel re-execution is a follow-up.\n */\nexport class SessionRecovery {\n /**\n * Scan a session log and return a `StaleSession` if and only\n * if the last event is an `in_flight_start` without a matching\n * `in_flight_end`. Returns `null` when:\n * - the log does not exist;\n * - the log is empty;\n * - the last event is `in_flight_end` (clean shutdown);\n * - the last event is something else (e.g. an unannotated\n * legacy log without in-flight markers).\n */\n async detectStale(sessionId: string): Promise<StaleSession | null> {\n const fp = this.filePath(sessionId);\n // Only read the last ~8KB — enough for several large events.\n // This is O(1) I/O vs O(n) of reading the entire file.\n const TAIL_SIZE = 8192;\n let stat;\n try {\n stat = await fs.stat(fp);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n return null;\n }\n if (stat.size === 0) return null;\n const position = Math.max(0, stat.size - TAIL_SIZE);\n const buf = Buffer.alloc(TAIL_SIZE);\n let fh;\n try {\n fh = await fs.open(fp, 'r');\n const { bytesRead } = await fh.read(buf, 0, TAIL_SIZE, position);\n // Count total events for StaleSession.eventCount — requires full scan.\n // For very large files this is a trade-off; count is informational.\n let eventCount = 0;\n const raw = buf.subarray(0, bytesRead).toString('utf8');\n for (const line of raw.split('\\n')) {\n if (line.trim()) eventCount++;\n }\n // Find the last complete JSON line in the tail.\n const lines = raw.split('\\n').filter((l) => l.trim());\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const ev = JSON.parse(lines[i]!) as SessionEvent;\n if (ev.type === 'in_flight_start') {\n return {\n sessionId,\n path: fp,\n lastEventTs: ev.ts,\n context: ev.context,\n eventCount,\n };\n }\n // Found a different last event — clean shutdown or legacy\n return null;\n } catch {\n // Incomplete line (spans the read boundary) — skip\n continue;\n }\n }\n return null;\n } catch {\n return null;\n } finally {\n if (fh) await fh.close();\n }\n }\n\n /**\n * Generate a recovery plan for a session. The plan describes\n * \"what would be re-executed\" if the user chose to resume —\n * everything after the last `checkpoint` event, plus the\n * dangling in-flight marker if present.\n *\n * Returns a non-null plan for ANY session that has at least\n * one event after a checkpoint (or, for legacy sessions, at\n * least one event). Pure read; no mutation.\n */\n async recover(sessionId: string): Promise<RecoveryPlan | null> {\n const fp = this.filePath(sessionId);\n let raw: string;\n try {\n raw = await fs.readFile(fp, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n return null;\n }\n const events: SessionEvent[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n events.push(JSON.parse(line) as SessionEvent);\n } catch {\n // skip corrupt lines\n }\n }\n if (events.length === 0) return null;\n // Find the last checkpoint.\n let lastCheckpoint: SessionEvent | null = null;\n let lastCheckpointIdx = -1;\n for (let i = 0; i < events.length; i++) {\n if (events[i]!.type === 'checkpoint') {\n lastCheckpoint = events[i]!;\n lastCheckpointIdx = i;\n }\n }\n // Events after the last checkpoint = the work that needs re-execution.\n const pendingEvents =\n lastCheckpointIdx >= 0 ? events.slice(lastCheckpointIdx + 1) : events;\n // The dangling in_flight_start, if the last event is one.\n const lastEv = events[events.length - 1]!;\n const inFlightStart =\n lastEv.type === 'in_flight_start' ? lastEv : null;\n const context = inFlightStart && inFlightStart.type === 'in_flight_start'\n ? inFlightStart.context\n : null;\n return {\n sessionId,\n stale: inFlightStart !== null,\n lastCheckpoint,\n pendingEvents,\n inFlightStart,\n context,\n };\n }\n\n /**\n * List every stale session in a directory. Returns an array\n * (possibly empty) sorted by `lastEventTs` descending — most\n * recent crash first.\n */\n async listResumable(): Promise<StaleSession[]> {\n let entries: string[];\n try {\n entries = await fs.readdir(this.dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n return [];\n }\n const out: StaleSession[] = [];\n for (const name of entries) {\n if (!name.endsWith('.jsonl')) continue;\n const sessionId = name.slice(0, -'.jsonl'.length);\n if (sessionId.includes('.replay') || sessionId.includes('.annotations')) continue;\n const stale = await this.detectStale(sessionId);\n if (stale) out.push(stale);\n }\n return out.sort((a, b) => b.lastEventTs.localeCompare(a.lastEventTs));\n }\n\n // ── Internals ──────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (\n !sessionId ||\n sessionId.includes('/') ||\n sessionId.includes('\\\\') ||\n sessionId.includes('..')\n ) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.jsonl`);\n }\n\n constructor(private readonly dir: string) {}\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * ToolAuditLog — idea #9 from IDEAS.md.\n *\n * Tamper-evident audit trail for tool calls. Every tool_use /\n * tool_result pair is appended to a sidecar JSONL with a chained\n * SHA-256 — each entry's `prevHash` is the prior entry's `hash`,\n * so any post-hoc modification of a single line breaks the chain\n * from that point forward.\n *\n * Why a sidecar (not the session JSONL)?\n * Same reason as `AnnotationsStore` and `ReplayLogStore`: the\n * session log is an event-sourced journal. Mixing in a hash\n * chain would inflate every read and tightly couple the\n * integrity check to the event format. Sidecar keeps both\n * concerns orthogonal.\n *\n * What \"tamper-evident\" means here:\n * - The hash covers the full serialized entry: tool name, id,\n * input, output, timestamp, author. Changing any byte\n * changes the hash.\n * - The chain is sequential — a verifier walks the file in\n * order, recomputing each hash, and checks `prevHash`\n * matches the previous entry's `hash`.\n * - Any insertion, deletion, or modification of a single\n * entry surfaces as a \"chain broken at entry N\" verdict.\n *\n * What it does NOT defend against:\n * - An attacker who rewrites the whole file consistently.\n * For that you'd need an external anchor (signing key,\n * transparency log, etc.) — out of scope for Phase 1.\n * - The agent itself misbehaving; this is post-hoc audit, not\n * real-time enforcement. Use `PermissionPolicy` for that.\n *\n * File layout: `<dir>/<sessionId>.audit.jsonl`, one entry per\n * line. The chain starts with a `genesis` entry whose\n * `prevHash` is all zeros.\n */\nexport interface AuditEntry {\n /** Monotonic index (0-based). */\n index: number;\n /** UUID for cross-referencing with logs. */\n id: string;\n /** ISO timestamp. */\n ts: string;\n /** Hash of the previous entry (or all-zeros for the genesis entry). */\n prevHash: string;\n /** Hash of this entry's content (sha256 over the canonical JSON). */\n hash: string;\n toolName: string;\n toolUseId: string;\n input: unknown;\n output: unknown;\n isError: boolean;\n}\n\nconst GENESIS_PREV = '0'.repeat(64);\n\nexport type VerifyResult =\n | { ok: true; entries: number }\n | { ok: false; brokenAt: number; reason: string };\n\nexport interface ToolAuditLogOptions {\n /** Directory where `<sessionId>.audit.jsonl` files live. */\n dir: string;\n /**\n * Flush the file system cache to disk every N writes per session.\n * Default 100. Lower values = better crash durability, more I/O overhead.\n * Set to `Infinity` to disable periodic fsync (fastest, but highest data-loss risk).\n */\n fsyncEvery?: number;\n}\n\n/** Default number of writes between fsync calls. */\nconst DEFAULT_FSYNC_EVERY = 100;\n\nexport class ToolAuditLog {\n private readonly dir: string;\n /** In-memory cache of the last entry's hash (per session), to compute chains efficiently. */\n private readonly tailHash = new Map<string, string>();\n /** In-memory counter for entry indices — avoids re-reading the file on every write. */\n private readonly tailIndex = new Map<string, number>();\n /** Tracks writes since last fsync, per session. */\n private readonly unSyncedWrites = new Map<string, number>();\n private readonly writeChains = new Map<string, Promise<void>>();\n private readonly fsyncEvery: number;\n\n constructor(opts: ToolAuditLogOptions) {\n this.dir = opts.dir;\n this.fsyncEvery = opts.fsyncEvery ?? DEFAULT_FSYNC_EVERY;\n }\n\n /**\n * Append a tool call/result pair to the chain. Returns the\n * resulting entry. Idempotency is not guaranteed — if you\n * record the same tool_use twice you get two entries. That's\n * intentional: the audit log is a record, not a cache.\n */\n async record(input: {\n sessionId: string;\n toolName: string;\n toolUseId: string;\n input: unknown;\n output: unknown;\n isError: boolean;\n }): Promise<AuditEntry> {\n let entry: AuditEntry = null as never; // assigned in enqueue\n await this.enqueue(input.sessionId, async () => {\n const prevHash = this.tailHash.get(input.sessionId) ?? GENESIS_PREV;\n const index = this.tailIndex.get(input.sessionId) ?? 0;\n const id = randomUUID();\n const ts = new Date().toISOString();\n // Compute the hash with index included so the hash covers the index.\n const content = {\n id,\n ts,\n prevHash,\n toolName: input.toolName,\n toolUseId: input.toolUseId,\n input: input.input,\n output: input.output,\n isError: input.isError,\n index,\n };\n const hash = createHash('sha256')\n .update(stableStringify(content), 'utf8')\n .digest('hex');\n entry = {\n id,\n ts,\n prevHash,\n hash,\n toolName: input.toolName,\n toolUseId: input.toolUseId,\n input: input.input,\n output: input.output,\n isError: input.isError,\n index,\n };\n await this.appendLine(input.sessionId, entry);\n this.tailHash.set(input.sessionId, hash);\n this.tailIndex.set(input.sessionId, index + 1);\n });\n return entry;\n }\n\n /**\n * Walk the chain and verify every entry's hash and prevHash.\n * Returns a structured verdict — never throws.\n */\n async verify(sessionId: string): Promise<VerifyResult> {\n const entries = await this.readAll(sessionId);\n if (entries.length === 0) return { ok: true, entries: 0 };\n // The first entry's prevHash must be the all-zeros genesis marker.\n if (entries[0]!.prevHash !== GENESIS_PREV) {\n return {\n ok: false,\n brokenAt: 0,\n reason: 'first entry is not the genesis (prevHash != 0…0)',\n };\n }\n let prevHash = GENESIS_PREV;\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]!;\n if (e.prevHash !== prevHash) {\n return {\n ok: false,\n brokenAt: i,\n reason: `prevHash mismatch at entry ${i} (expected ${prevHash.slice(0, 8)}…, got ${e.prevHash.slice(0, 8)}…)`,\n };\n }\n // Recompute the hash from the entry's content (without the\n // `hash` field itself, which is what we are verifying).\n const content = {\n id: e.id,\n ts: e.ts,\n prevHash: e.prevHash,\n toolName: e.toolName,\n toolUseId: e.toolUseId,\n input: e.input,\n output: e.output,\n isError: e.isError,\n index: e.index,\n };\n const expectedHash = createHash('sha256')\n .update(stableStringify(content), 'utf8')\n .digest('hex');\n if (expectedHash !== e.hash) {\n return {\n ok: false,\n brokenAt: i,\n reason: `hash mismatch at entry ${i} (entry content was modified)`,\n };\n }\n prevHash = e.hash;\n }\n return { ok: true, entries: entries.length };\n }\n\n /** All entries for a session, in insertion order. */\n async load(sessionId: string): Promise<AuditEntry[]> {\n return this.readAll(sessionId);\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (\n !sessionId ||\n sessionId.includes('/') ||\n sessionId.includes('\\\\') ||\n sessionId.includes('..')\n ) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.audit.jsonl`);\n }\n\n private async readAll(sessionId: string): Promise<AuditEntry[]> {\n const fp = this.filePath(sessionId);\n try {\n const raw = await fs.readFile(fp, 'utf8');\n const out: AuditEntry[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as AuditEntry);\n } catch {\n // Skip corrupt lines — audit data is meta, not fatal.\n }\n }\n return out;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n return [];\n }\n }\n\n private async appendLine(sessionId: string, entry: AuditEntry): Promise<void> {\n const fp = this.filePath(sessionId);\n const line = JSON.stringify(entry) + '\\n';\n // Real append — O(1) per write. The write chain ensures serial\n // ordering per session. On crash a partial line may appear;\n // readAll skips unparseable lines so the chain stays verifiable.\n await fs.appendFile(fp, line, 'utf8');\n // Periodic fsync: every fsyncEvery writes, open the file and sync it.\n // This limits data loss to at most fsyncEvery entries on crash.\n const count = (this.unSyncedWrites.get(sessionId) ?? 0) + 1;\n this.unSyncedWrites.set(sessionId, count);\n if (this.fsyncEvery !== Infinity && count % this.fsyncEvery === 0) {\n await this.sync(sessionId, fp);\n }\n }\n\n /**\n * Explicitly sync the file to disk. Called automatically every\n * `fsyncEvery` writes, and available for callers who want to\n * force a sync before closing or during graceful shutdown.\n */\n async flush(sessionId: string): Promise<void> {\n await this.sync(sessionId, this.filePath(sessionId));\n }\n\n private async sync(sessionId: string, fp: string): Promise<void> {\n try {\n const fh = await fs.open(fp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync is best-effort; a failure here does not corrupt the chain.\n } finally {\n this.unSyncedWrites.set(sessionId, 0);\n }\n }\n\n private enqueue(sessionId: string, fn: () => Promise<void>): Promise<void> {\n const prev = this.writeChains.get(sessionId) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n this.writeChains.set(\n sessionId,\n next.catch(() => undefined),\n );\n return next;\n }\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys(obj[key]);\n }\n return sorted;\n }\n return value;\n}\n","import type { SessionEvent } from '../types/session.js';\n\nexport interface QueryFilter {\n eventTypes?: string[];\n toolNames?: string[];\n timeRange?: { start: string; end: string };\n}\n\nexport interface ToolInvocation {\n ts: string;\n name: string;\n input: unknown;\n output?: unknown;\n error?: string;\n durationMs: number;\n}\n\nexport interface SessionError {\n ts: string;\n phase: string;\n message: string;\n}\n\nexport interface ModeChange {\n ts: string;\n from: string;\n to: string;\n}\n\nexport interface TaskSummary {\n taskId: string;\n title: string;\n status: string;\n createdAt: string;\n completedAt?: string;\n}\n\nexport interface SessionAnalysis {\n sessionId: string;\n totalDuration: number;\n toolUsageCount: Record<string, number>;\n errorCount: number;\n modeChanges: ModeChange[];\n tasks: TaskSummary[];\n}\n\nexport class SessionAnalyzer {\n analyze(events: SessionEvent[]): SessionAnalysis {\n const toolUsageCount: Record<string, number> = {};\n const errors: SessionError[] = [];\n const modeChanges: ModeChange[] = [];\n const tasksById = new Map<string, TaskSummary>();\n let sessionId = '';\n\n for (const event of events) {\n // sessionId comes from session_start / session_resumed.\n if (event.type === 'session_start' || event.type === 'session_resumed') {\n if (!sessionId) sessionId = event.id;\n }\n if (event.type === 'tool_use') {\n toolUsageCount[event.name] = (toolUsageCount[event.name] ?? 0) + 1;\n }\n if (event.type === 'error') {\n errors.push({ ts: event.ts, phase: event.phase, message: event.message });\n }\n if (event.type === 'mode_changed') {\n modeChanges.push({ ts: event.ts, from: event.from, to: event.to });\n }\n if (event.type === 'task_created') {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'created',\n createdAt: event.ts,\n });\n }\n if (event.type === 'task_updated') {\n const t = tasksById.get(event.taskId);\n if (t) t.status = event.status;\n }\n if (event.type === 'task_completed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'completed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'completed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n if (event.type === 'task_failed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'failed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'failed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n }\n\n return {\n sessionId,\n totalDuration: this.calcDuration(events),\n toolUsageCount,\n errorCount: errors.length,\n modeChanges,\n tasks: Array.from(tasksById.values()),\n };\n }\n\n query(events: SessionEvent[], filter: QueryFilter): SessionEvent[] {\n return events.filter((e) => {\n if (filter.eventTypes?.length && !filter.eventTypes.includes(e.type)) return false;\n if (filter.toolNames?.length && e.type === 'tool_use') {\n const toolEvent = e as { type: 'tool_use'; name: string };\n if (!filter.toolNames.includes(toolEvent.name)) return false;\n }\n if (filter.timeRange) {\n const ts = new Date(e.ts).getTime();\n const start = new Date(filter.timeRange.start).getTime();\n const end = new Date(filter.timeRange.end).getTime();\n if (ts < start || ts > end) return false;\n }\n return true;\n });\n }\n\n private calcDuration(events: SessionEvent[]): number {\n if (events.length < 2) return 0;\n const first = new Date(events[0]!.ts).getTime();\n const last = new Date(events[events.length - 1]!.ts).getTime();\n return last - first;\n }\n}\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type { CheckpointInfo, RewindResult, RewindResultExtended, SessionRewinder } from '../types/session-rewinder.js';\r\nimport type { SessionEvent, FileSnapshot } from '../types/session.js';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\n\r\nexport interface SessionRewinderOptions {\r\n sessionsDir: string;\r\n /** The project root directory; used to validate rewind targets stay inside it. */\r\n projectRoot: string;\r\n}\r\n\r\n/**\r\n * Rewind engine that reads session JSONL files and reverts file system\r\n * changes to any previous checkpoint.\r\n */\r\nexport class DefaultSessionRewinder implements SessionRewinder {\r\n constructor(private readonly sessionsDir: string, private readonly projectRoot: string) {}\r\n\r\n async listCheckpoints(sessionId: string): Promise<CheckpointInfo[]> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n // Build a map of promptIndex -> file snapshot count\r\n const fileCountMap = new Map<number, number>();\r\n for (const event of events) {\r\n if (event.type === 'file_snapshot') {\r\n const e = event as { promptIndex: number; files: FileSnapshot[] };\r\n fileCountMap.set(e.promptIndex, (fileCountMap.get(e.promptIndex) ?? 0) + e.files.length);\r\n }\r\n }\r\n\r\n const checkpoints: CheckpointInfo[] = [];\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n const e = event as { promptIndex: number; promptPreview: string; ts: string };\r\n checkpoints.push({\r\n promptIndex: e.promptIndex,\r\n promptPreview: e.promptPreview,\r\n ts: e.ts,\r\n fileCount: fileCountMap.get(e.promptIndex) ?? 0,\r\n });\r\n }\r\n }\r\n\r\n return checkpoints;\r\n }\r\n\r\n async rewindToCheckpoint(\r\n sessionId: string,\r\n checkpointIndex: number,\r\n ): Promise<RewindResultExtended> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n let targetIdx = -1;\r\n for (let i = 0; i < events.length; i++) {\r\n const event = events[i]!;\r\n if (event.type === 'checkpoint') {\r\n const checkpointEvent = event as { promptIndex: number };\r\n if (checkpointEvent.promptIndex === checkpointIndex) {\r\n targetIdx = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (targetIdx === -1) {\r\n throw new Error(`Checkpoint ${checkpointIndex} not found`);\r\n }\r\n\r\n const snapshotsToRevert: Array<{ promptIndex: number; files: FileSnapshot[] }> = [];\r\n for (let i = targetIdx + 1; i < events.length; i++) {\r\n const event = events[i]!;\r\n if (event.type === 'checkpoint') {\r\n break;\r\n }\r\n if (event.type === 'file_snapshot') {\r\n const snapshotEvent = event as { promptIndex: number; files: FileSnapshot[] };\r\n if (snapshotEvent.promptIndex >= checkpointIndex) {\r\n snapshotsToRevert.push({ promptIndex: snapshotEvent.promptIndex, files: snapshotEvent.files });\r\n }\r\n }\r\n }\r\n\r\n const result = await revertSnapshots(snapshotsToRevert, this.projectRoot);\r\n const removedEvents = events.length - targetIdx - 1;\r\n return { ...result, toPromptIndex: checkpointIndex, removedEvents };\r\n }\r\n\r\n async rewindLastN(sessionId: string, n: number): Promise<RewindResultExtended> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n const checkpoints: Array<{ promptIndex: number; ts: string }> = [];\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n checkpoints.push({ promptIndex: event.promptIndex, ts: event.ts });\r\n }\r\n }\r\n\r\n if (checkpoints.length === 0) {\r\n return { revertedFiles: [], errors: [], toPromptIndex: 0, removedEvents: 0 };\r\n }\r\n\r\n checkpoints.sort((a, b) => b.promptIndex - a.promptIndex);\r\n const targetIndex = checkpoints[n]?.promptIndex ?? 0;\r\n\r\n const snapshotsToRevert: Array<{ promptIndex: number; files: FileSnapshot[] }> = [];\r\n let shouldRevert = false;\r\n\r\n for (const event of events) {\r\n if (event.type === 'checkpoint' && event.promptIndex === targetIndex) {\r\n shouldRevert = true;\r\n continue;\r\n }\r\n if (shouldRevert && event.type === 'file_snapshot') {\r\n snapshotsToRevert.push({ promptIndex: event.promptIndex, files: event.files });\r\n }\r\n }\r\n\r\n const result = await revertSnapshots(snapshotsToRevert.reverse(), this.projectRoot);\r\n return { ...result, toPromptIndex: targetIndex, removedEvents: snapshotsToRevert.length };\r\n }\r\n\r\n async rewindToStart(sessionId: string): Promise<RewindResultExtended> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n const allSnapshots: Array<{ promptIndex: number; files: FileSnapshot[] }> = [];\r\n for (const event of events) {\r\n if (event.type === 'file_snapshot') {\r\n allSnapshots.push({ promptIndex: event.promptIndex, files: event.files });\r\n }\r\n }\r\n\r\n if (allSnapshots.length === 0) {\r\n return { revertedFiles: [], errors: [], toPromptIndex: 0, removedEvents: 0 };\r\n }\r\n\r\n const result = await revertSnapshots(allSnapshots.reverse(), this.projectRoot);\r\n return { ...result, toPromptIndex: 0, removedEvents: allSnapshots.length };\r\n }\r\n}\r\n\r\nfunction parseEvents(raw: string): SessionEvent[] {\r\n const lines = raw.split('\\n').filter((l) => l.trim());\r\n const events: SessionEvent[] = [];\r\n\r\n for (const line of lines) {\r\n try {\r\n const parsed = JSON.parse(line);\r\n if (\r\n parsed !== null &&\r\n typeof parsed === 'object' &&\r\n typeof (parsed as { type?: unknown }).type === 'string' &&\r\n typeof (parsed as { ts?: unknown }).ts === 'string'\r\n ) {\r\n events.push(parsed as SessionEvent);\r\n }\r\n } catch {\r\n // skip malformed\r\n }\r\n }\r\n\r\n return events;\r\n}\r\n\r\nasync function revertSnapshots(\r\n snapshots: Array<{ promptIndex: number; files: FileSnapshot[] }>,\r\n projectRoot: string,\r\n): Promise<RewindResult> {\r\n const revertedFiles: string[] = [];\r\n const errors: string[] = [];\r\n\r\n for (const snapshot of snapshots) {\r\n for (const file of snapshot.files) {\r\n try {\r\n // Guard: ensure the target path resolves inside the project root.\r\n // Without this, a maliciously recorded path (e.g., via path traversal\r\n // in a tool call that wasn't caught) could cause rewind to write\r\n // to arbitrary locations.\r\n const absPath = path.resolve(file.path);\r\n const root = path.resolve(projectRoot);\r\n const rel = path.relative(root, absPath);\r\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\r\n errors.push(`${file.path}: path resolves outside project root — skipping`);\r\n continue;\r\n }\r\n\r\n if (file.action === 'deleted') {\r\n // File was deleted — restore it from before\r\n if (file.before !== null) {\r\n // atomicWrite: torn restore would leave the user with a frankenstein file.\r\n await atomicWrite(file.path, file.before, { mode: 0o644 });\r\n revertedFiles.push(file.path);\r\n }\r\n } else if (file.action === 'created') {\r\n // File was created — delete it\r\n await fsp.unlink(file.path);\r\n revertedFiles.push(file.path);\r\n } else if (file.action === 'modified') {\r\n // File was modified — restore before content\r\n if (file.before !== null) {\r\n // atomicWrite: torn restore would leave the user with a frankenstein file.\r\n await atomicWrite(file.path, file.before, { mode: 0o644 });\r\n revertedFiles.push(file.path);\r\n }\r\n }\r\n } catch (err) {\r\n errors.push(`${file.path}: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n }\r\n }\r\n\r\n return { revertedFiles, errors };\r\n}","import * as fsp from 'node:fs/promises';\nimport type { TodoItem } from '../core/context.js';\nimport type { ConversationState } from '../core/conversation-state.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * On-disk checkpoint for `ctx.todos`. Written atomically every time the\n * todo list changes, read once on session resume. This is the missing\n * piece that lets `wstack resume <id>` rehydrate where the previous run\n * stopped instead of starting with an empty board.\n *\n * Schema is intentionally small — a single JSON object so a future\n * format bump is easy. The `version` field is the only contract; the\n * shape under `todos` mirrors `TodoItem` so reading is a straight assign.\n */\nexport interface TodosCheckpointFile {\n version: 1;\n sessionId: string;\n updatedAt: string;\n todos: TodoItem[];\n}\n\nexport type TodosCheckpointDetach = () => Promise<void>;\n\n/** Read a checkpoint from disk. Returns null when the file doesn't\n * exist or is corrupt — callers treat both cases as \"no prior state\".\n */\nexport async function loadTodosCheckpoint(filePath: string): Promise<TodoItem[] | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as TodosCheckpointFile;\n if (parsed?.version !== 1 || !Array.isArray(parsed.todos)) return null;\n return parsed.todos.filter(\n (t): t is TodoItem =>\n !!t && typeof t.id === 'string' && typeof t.content === 'string' && typeof t.status === 'string',\n );\n } catch {\n return null;\n }\n}\n\n/** Write the checkpoint atomically. Best-effort: a write failure is\n * logged but does not throw — losing one checkpoint shouldn't bring\n * down the agent run.\n */\nexport async function saveTodosCheckpoint(\n filePath: string,\n sessionId: string,\n todos: readonly TodoItem[],\n): Promise<void> {\n const payload: TodosCheckpointFile = {\n version: 1,\n sessionId,\n updatedAt: new Date().toISOString(),\n todos: [...todos],\n };\n try {\n await atomicWrite(filePath, JSON.stringify(payload, null, 2), { mode: 0o600 });\n } catch (err) {\n console.warn(\n '[todos-checkpoint] save failed:',\n err instanceof Error ? err.message : String(err),\n );\n }\n}\n\n/**\n * Subscribe a `ConversationState` so every `todos_replaced` mutation\n * triggers an atomic write to disk. Returns the unsubscribe function.\n *\n * Writes are debounced by 150ms so a flurry of edits (e.g. the LLM\n * marking three items done in the same tool call) coalesces into one\n * disk hit.\n */\nexport function attachTodosCheckpoint(\n state: ConversationState,\n filePath: string,\n sessionId: string,\n): TodosCheckpointDetach {\n let timer: NodeJS.Timeout | null = null;\n let pending: readonly TodoItem[] | null = null;\n let writeChain: Promise<void> = Promise.resolve();\n\n const enqueueWrite = (todos: readonly TodoItem[]) => {\n writeChain = writeChain.then(() => saveTodosCheckpoint(filePath, sessionId, todos));\n return writeChain;\n };\n\n const flush = () => {\n timer = null;\n if (pending) {\n const todos = pending;\n pending = null;\n return enqueueWrite(todos);\n }\n return writeChain;\n };\n\n const unsubscribe = state.onChange((change) => {\n if (change.kind !== 'todos_replaced') return;\n pending = change.todos;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n void flush();\n }, 150);\n });\n return async () => {\n unsubscribe();\n if (timer) {\n clearTimeout(timer);\n // Flush any pending write before detach so callers can safely\n // unsubscribe at shutdown without losing the last update.\n await flush();\n } else {\n await writeChain;\n }\n };\n}\n","import * as fsp from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport type { ConversationState } from '../core/conversation-state.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Plan items are the strategic counterpart to todos. Where `ctx.todos`\n * is the moment-to-moment task board the LLM mutates per-turn, a plan\n * captures the higher-level approach — the steps the user (or LLM)\n * laid out before any work began.\n *\n * Plans persist by default (per session) so a resumed session can show\n * \"you were on step 3 of 5\". Todos are derived/transient. Both can\n * coexist: think roadmap (plan) vs. sprint board (todos).\n */\nexport interface PlanItem {\n id: string;\n title: string;\n /** Optional longer-form context or rationale. */\n details?: string;\n status: 'open' | 'in_progress' | 'done';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface PlanFile {\n version: 1;\n sessionId: string;\n title?: string;\n updatedAt: string;\n items: PlanItem[];\n}\n\nexport async function loadPlan(filePath: string): Promise<PlanFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as PlanFile;\n if (parsed?.version !== 1 || !Array.isArray(parsed.items)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport async function savePlan(filePath: string, plan: PlanFile): Promise<void> {\n try {\n await atomicWrite(filePath, JSON.stringify(plan, null, 2), { mode: 0o600 });\n } catch (err) {\n console.warn(\n '[plan-store] save failed:',\n err instanceof Error ? err.message : String(err),\n );\n }\n}\n\n/** Create a new PlanFile when none exists on disk. */\nexport function emptyPlan(sessionId: string, title?: string): PlanFile {\n return {\n version: 1,\n sessionId,\n title,\n updatedAt: new Date().toISOString(),\n items: [],\n };\n}\n\nexport function addPlanItem(\n plan: PlanFile,\n title: string,\n details?: string,\n): { plan: PlanFile; item: PlanItem } {\n const now = new Date().toISOString();\n const item: PlanItem = {\n id: `plan_${Date.now()}_${randomUUID().slice(0, 6)}`,\n title,\n details,\n status: 'open',\n createdAt: now,\n updatedAt: now,\n };\n return {\n plan: { ...plan, items: [...plan.items, item], updatedAt: now },\n item,\n };\n}\n\nexport function removePlanItem(plan: PlanFile, idOrIndex: string): PlanFile {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return plan;\n return {\n ...plan,\n items: plan.items.filter((_, i) => i !== idx),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function setPlanItemStatus(\n plan: PlanFile,\n idOrIndex: string,\n status: PlanItem['status'],\n): PlanFile {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return plan;\n const now = new Date().toISOString();\n const items = plan.items.map((it, i) =>\n i === idx ? { ...it, status, updatedAt: now } : it,\n );\n return { ...plan, items, updatedAt: now };\n}\n\nexport function clearPlan(plan: PlanFile): PlanFile {\n return { ...plan, items: [], updatedAt: new Date().toISOString() };\n}\n\n/** Render the plan as a short markdown-ish string suitable for slash output. */\nexport function formatPlan(plan: PlanFile): string {\n if (plan.items.length === 0) return 'Plan is empty.';\n const lines: string[] = [];\n if (plan.title) lines.push(`# ${plan.title}`);\n plan.items.forEach((it, i) => {\n const mark = it.status === 'done' ? '[x]' : it.status === 'in_progress' ? '[~]' : '[ ]';\n lines.push(`${i + 1}. ${mark} ${it.title}`);\n if (it.details) {\n for (const line of it.details.split('\\n')) lines.push(` ${line}`);\n }\n });\n return lines.join('\\n');\n}\n\nfunction matchIndex(plan: PlanFile, idOrIndex: string): number {\n const asNum = Number.parseInt(idOrIndex, 10);\n if (!Number.isNaN(asNum) && asNum >= 1 && asNum <= plan.items.length) return asNum - 1;\n const byId = plan.items.findIndex((it) => it.id === idOrIndex);\n if (byId !== -1) return byId;\n const lower = idOrIndex.toLowerCase();\n return plan.items.findIndex((it) => it.title.toLowerCase().includes(lower));\n}\n\n/**\n * Promote a plan item to a set of todo items.\n * The plan item is marked 'in_progress' (if not already done) and its\n * title + details become the first todo; additional subtasks are appended.\n * Returns the derived todo list so the caller can pass it to `todoTool`\n * or `ctx.state.replaceTodos()`.\n */\nexport function deriveTodosFromPlanItem(\n plan: PlanFile,\n idOrIndex: string,\n subtasks?: string[],\n): { plan: PlanFile; todos: Array<{ id: string; content: string; status: 'pending' | 'in_progress' | 'completed'; activeForm?: string }> } | null {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return null;\n\n const item = plan.items[idx];\n if (!item) return null;\n\n // Mark the plan item in_progress if it wasn't already done\n let updatedPlan = plan;\n if (item.status !== 'done') {\n updatedPlan = setPlanItemStatus(plan, idOrIndex, 'in_progress');\n }\n\n const todos: Array<{ id: string; content: string; status: 'pending' | 'in_progress' | 'completed'; activeForm?: string }> = [];\n\n // First todo from the plan item itself\n todos.push({\n id: `todo_${Date.now()}_plan`,\n content: item.title,\n status: 'in_progress',\n activeForm: item.title,\n });\n\n // Optional subtasks\n if (subtasks && subtasks.length > 0) {\n for (const st of subtasks) {\n todos.push({\n id: `todo_${Date.now()}_${randomUUID().slice(0, 6)}`,\n content: st,\n status: 'pending',\n });\n }\n }\n\n return { plan: updatedPlan, todos };\n}\n\n/**\n * Optional: attach a state-listener so meta operations (storing a plan\n * id on ctx.meta) trigger a save. Currently a stub — plans don't live\n * on Context, but this keeps the API surface symmetric with the todos\n * checkpoint so future refactors can flip plans into Context if needed.\n */\nexport function attachPlanCheckpoint(\n _state: ConversationState,\n _filePath: string,\n _sessionId: string,\n): () => void {\n return () => undefined;\n}\n","/**\n * Plan templates — pre-defined plan skeletons for common workflows.\n *\n * Templates are stored in-memory (no disk I/O). Users instantiate them\n * via `/plan template use <name>` or `planTool(action: 'template_use')`.\n * Each template is a function that returns an array of item titles, so\n * dynamic content (dates, project names) can be injected later.\n */\n\nexport interface PlanTemplate {\n name: string;\n description: string;\n category: 'development' | 'release' | 'maintenance' | 'infrastructure';\n items: Array<{\n title: string;\n details?: string;\n }>;\n}\n\nconst templates: Record<string, PlanTemplate> = {\n 'new-feature': {\n name: 'new-feature',\n description: 'Standard workflow for adding a new feature',\n category: 'development',\n items: [\n { title: 'Write specification / design doc', details: 'Define scope, acceptance criteria, edge cases' },\n { title: 'Set up feature branch', details: 'git checkout -b feature/...' },\n { title: 'Implement core logic', details: 'TDD preferred — write tests first' },\n { title: 'Add unit tests', details: '>= 80% coverage for new code' },\n { title: 'Add integration tests', details: 'End-to-end happy path + error paths' },\n { title: 'Update documentation', details: 'README, API docs, changelog' },\n { title: 'Code review', details: 'Self-review before requesting review' },\n { title: 'Merge and deploy', details: 'CI green, tag release' },\n ],\n },\n 'bug-fix': {\n name: 'bug-fix',\n description: 'Systematic approach to fixing bugs',\n category: 'maintenance',\n items: [\n { title: 'Reproduce the bug', details: 'Minimal reproduction case' },\n { title: 'Root cause analysis', details: 'Trace through logs, debugger' },\n { title: 'Write failing test', details: 'Test must fail before fix' },\n { title: 'Implement fix', details: 'Smallest possible change' },\n { title: 'Verify fix', details: 'Test passes, reproduction no longer fails' },\n { title: 'Regression test', details: 'Ensure no related tests broken' },\n { title: 'Document in changelog', details: 'Brief description + issue link' },\n ],\n },\n 'refactor': {\n name: 'refactor',\n description: 'Safe refactoring workflow',\n category: 'maintenance',\n items: [\n { title: 'Identify refactoring target', details: 'Code smell, performance bottleneck, or tech debt' },\n { title: 'Ensure test coverage', details: 'Existing tests must pass before and after' },\n { title: 'Write characterization tests', details: 'Capture current behavior if tests weak' },\n { title: 'Apply refactoring', details: 'Small steps, frequent commits' },\n { title: 'Run full test suite', details: 'All tests must pass' },\n { title: 'Performance check', details: 'Ensure no regression' },\n { title: 'Code review', details: 'Explain the why, not just the what' },\n ],\n },\n 'release': {\n name: 'release',\n description: 'Preparing a new release',\n category: 'release',\n items: [\n { title: 'Version bump', details: 'package.json, lockfiles, tags' },\n { title: 'Update changelog', details: 'All changes since last release' },\n { title: 'Run full test suite', details: 'Unit + integration + e2e' },\n { title: 'Build artifacts', details: 'Docker images, bundles, binaries' },\n { title: 'Staging smoke tests', details: 'Deploy to staging, verify' },\n { title: 'Production deploy', details: 'Blue-green or canary' },\n { title: 'Post-deploy verification', details: 'Health checks, error rates' },\n { title: 'Announce release', details: 'Slack, email, GitHub release notes' },\n ],\n },\n 'security-audit': {\n name: 'security-audit',\n description: 'Security review and hardening',\n category: 'infrastructure',\n items: [\n { title: 'Dependency audit', details: 'npm audit, Snyk, Dependabot alerts' },\n { title: 'Secret scan', details: 'git-secrets, truffleHog, manual review' },\n { title: 'Access control review', details: 'IAM, roles, least privilege' },\n { title: 'Input validation audit', details: 'SQL injection, XSS, path traversal' },\n { title: 'Authentication review', details: 'Session management, MFA, password policy' },\n { title: 'Logging and monitoring', details: 'PII in logs, audit trails' },\n { title: 'Incident response plan', details: 'Runbooks, contacts, escalation' },\n ],\n },\n 'onboarding': {\n name: 'onboarding',\n description: 'New developer onboarding checklist',\n category: 'infrastructure',\n items: [\n { title: 'Repository access', details: 'GitHub/GitLab permissions' },\n { title: 'Local environment setup', details: 'Docker, dependencies, env files' },\n { title: 'Run tests locally', details: 'Verify green suite' },\n { title: 'Read architecture docs', details: 'ADR, README, onboarding guide' },\n { title: 'First commit', details: 'Docs fix or small improvement' },\n { title: 'Pair programming session', details: 'Walk through codebase with buddy' },\n { title: 'Deploy to staging', details: 'Verify CI/CD access' },\n ],\n },\n};\n\nexport function listPlanTemplates(): PlanTemplate[] {\n return Object.values(templates);\n}\n\nexport function getPlanTemplate(name: string): PlanTemplate | undefined {\n return templates[name];\n}\n\nexport function formatPlanTemplates(): string {\n const cats = new Map<PlanTemplate['category'], PlanTemplate[]>();\n for (const t of Object.values(templates)) {\n const arr = cats.get(t.category) ?? [];\n arr.push(t);\n cats.set(t.category, arr);\n }\n\n const lines: string[] = ['Available plan templates:'];\n for (const [cat, items] of cats) {\n lines.push(`\\n${cat}:`);\n for (const t of items) {\n lines.push(` ${t.name.padEnd(18)} — ${t.description}`);\n }\n }\n return lines.join('\\n');\n}\n","import * as fsp from 'node:fs/promises';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Director state checkpoint — written incrementally throughout a fleet\n * run so a crashed director can be inspected (and eventually resumed)\n * instead of leaving only a final `fleet.json` manifest after `shutdown()`.\n *\n * Schema is JSON-friendly and deliberately denormalized. Each mutation\n * triggers an atomic-write of the whole file — small payloads (typically\n * < 10 KB even with dozens of subagents) make this cheap.\n */\nexport interface DirectorSubagentState {\n id: string;\n name?: string;\n role?: string;\n provider?: string;\n model?: string;\n spawnedAt: string;\n}\n\nexport interface DirectorTaskState {\n taskId: string;\n subagentId?: string;\n description?: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'stopped' | 'timeout';\n assignedAt?: string;\n completedAt?: string;\n iterations?: number;\n toolCalls?: number;\n durationMs?: number;\n error?: string;\n}\n\nexport interface DirectorStateSnapshot {\n version: 1;\n directorRunId: string;\n updatedAt: string;\n spawnCount: number;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n subagents: DirectorSubagentState[];\n tasks: DirectorTaskState[];\n /** Aggregated usage snapshot. Optional — populated by the Director on save when available. */\n usage?: unknown;\n}\n\nexport async function loadDirectorState(filePath: string): Promise<DirectorStateSnapshot | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as DirectorStateSnapshot;\n if (parsed?.version !== 1) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * Lock file entry written when a director starts. Prevents two directors\n * from resuming the same run — the second one sees the lock and refuses\n * rather than corrupting the checkpoint by writing concurrently.\n */\nexport interface DirectorStateLock {\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\n/**\n * Write a lock file to claim this checkpoint. Returns false if the lock\n * is already held by a live process; returns true if the lock was acquired\n * (either the file didn't exist, or the previous holder is dead).\n */\nexport async function acquireDirectorStateLock(\n lockPath: string,\n processId = process.pid,\n): Promise<boolean> {\n let existing: string | undefined;\n try {\n existing = await fsp.readFile(lockPath, 'utf8');\n } catch {\n // No lock file — we're safe to claim\n }\n\n if (existing) {\n try {\n const lock = JSON.parse(existing) as DirectorStateLock;\n // Check if the process is still alive\n try {\n process.kill(lock.pid, 0);\n // Signal success means the process is alive — another director\n // owns this checkpoint. Refuse.\n return false;\n } catch {\n // ESRCH means the process is dead — stale lock. We'll overwrite.\n }\n } catch {\n // Malformed lock — treat as stale.\n }\n }\n\n const lock: DirectorStateLock = {\n pid: processId,\n hostname: require('node:os').hostname(),\n startedAt: new Date().toISOString(),\n };\n await atomicWrite(lockPath, JSON.stringify(lock), { mode: 0o600 });\n return true;\n}\n\n/**\n * Remove the lock file. Call this on graceful Director.shutdown() so the\n * next director run can claim the checkpoint without stale-lock checks.\n */\nexport async function releaseDirectorStateLock(lockPath: string): Promise<void> {\n try {\n await fsp.unlink(lockPath);\n } catch {\n // ignore\n }\n}\n\n/**\n * In-memory accumulator with atomic-write checkpoint. The Director keeps\n * an instance, mutates it on every spawn/assign/complete/fail event, and\n * the instance debounces writes so a burst of activity collapses into a\n * single disk hit.\n *\n * Supports crash recovery: use `loadDirectorState()` to read an existing\n * checkpoint, then call `DirectorStateCheckpoint.resume(snapshot)` to\n * re-attach to a fleet mid-flight. The lock mechanism ensures no two\n * directors can claim the same checkpoint.\n */\nexport class DirectorStateCheckpoint {\n private snapshot: DirectorStateSnapshot;\n private readonly filePath: string;\n private readonly lockPath: string;\n private timer: NodeJS.Timeout | null = null;\n private readonly debounceMs: number;\n private writing = false;\n private rewriteRequested = false;\n\n constructor(\n filePath: string,\n init: {\n directorRunId: string;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n },\n debounceMs = 250,\n ) {\n this.filePath = filePath;\n // Lock file lives alongside the checkpoint — `<path>.lock`\n this.lockPath = `${filePath}.lock`;\n this.debounceMs = debounceMs;\n this.snapshot = {\n version: 1,\n directorRunId: init.directorRunId,\n updatedAt: new Date().toISOString(),\n spawnCount: 0,\n maxSpawns: init.maxSpawns,\n spawnDepth: init.spawnDepth,\n maxSpawnDepth: init.maxSpawnDepth,\n directorBudget: init.directorBudget,\n subagents: [],\n tasks: [],\n };\n }\n\n /**\n * Attempt to acquire the lock for this checkpoint. Call this before\n * resuming a crashed director run. If it returns false, another\n * director process is still running this fleet — do not resume.\n */\n async acquireLock(): Promise<boolean> {\n return acquireDirectorStateLock(this.lockPath);\n }\n\n /**\n * Release the lock on graceful shutdown. Call `flush()` first to ensure\n * the final checkpoint state is on disk before removing the lock.\n * Without this, the next resume will see a stale-lock and refuse.\n */\n async releaseLock(): Promise<void> {\n return releaseDirectorStateLock(this.lockPath);\n }\n\n /**\n * Resume from a snapshot previously loaded via `loadDirectorState()`.\n * Use this when `--resume <runId>` is triggered — the snapshot has\n * the full fleet state (subagents, tasks) from before the crash; the\n * checkpoint continues from there.\n */\n resume(snapshot: DirectorStateSnapshot): void {\n this.snapshot = snapshot;\n }\n\n current(): DirectorStateSnapshot {\n return this.snapshot;\n }\n\n recordSpawn(sub: DirectorSubagentState, spawnCount: number): void {\n this.snapshot = {\n ...this.snapshot,\n spawnCount,\n subagents: [...this.snapshot.subagents.filter((s) => s.id !== sub.id), sub],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskAssigned(task: DirectorTaskState): void {\n const exists = this.snapshot.tasks.some((t) => t.taskId === task.taskId);\n this.snapshot = {\n ...this.snapshot,\n tasks: exists\n ? this.snapshot.tasks.map((t) => (t.taskId === task.taskId ? { ...t, ...task } : t))\n : [...this.snapshot.tasks, task],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskStatus(\n taskId: string,\n patch: Partial<DirectorTaskState> & { status: DirectorTaskState['status'] },\n ): void {\n this.snapshot = {\n ...this.snapshot,\n tasks: this.snapshot.tasks.map((t) =>\n t.taskId === taskId ? { ...t, ...patch } : t,\n ),\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n setUsage(usage: unknown): void {\n this.snapshot = { ...this.snapshot, usage };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n /** Force a synchronous flush — used by Director.shutdown(). */\n async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n await this.persist();\n // If a rewrite was requested while we waited, persist() scheduled\n // a follow-up write. Loop until no more rewrites are requested so\n // shutdown doesn't return before the most recent state lands on disk.\n while (this.rewriteRequested) {\n this.rewriteRequested = false;\n await this.persist();\n }\n }\n\n private bumpUpdatedAt(): void {\n this.snapshot = { ...this.snapshot, updatedAt: new Date().toISOString() };\n }\n\n private schedule(): void {\n if (this.timer) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.persist();\n }, this.debounceMs);\n }\n\n private async persist(): Promise<void> {\n if (this.writing) {\n // A write is already in flight — defer to a follow-up flush so the\n // most recent state still lands. Without this guard, simultaneous\n // burst mutations can drop the latest snapshot if rename races.\n this.rewriteRequested = true;\n return;\n }\n this.writing = true;\n try {\n await atomicWrite(this.filePath, JSON.stringify(this.snapshot, null, 2), {\n mode: 0o600,\n });\n } catch (err) {\n console.warn(\n '[director-state] checkpoint write failed:',\n err instanceof Error ? err.message : String(err),\n );\n } finally {\n this.writing = false;\n if (this.rewriteRequested) {\n this.rewriteRequested = false;\n this.schedule();\n }\n }\n }\n}\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { createHash } from 'node:crypto';\r\nimport * as os from 'node:os';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\nimport { FsError, ERROR_CODES } from '../types/errors.js';\r\n\r\n/**\r\n * Long-running autonomous mission. A goal survives across sessions and\r\n * drives the EternalAutonomyEngine — every iteration of the engine\r\n * consults the goal to choose what to do next.\r\n *\r\n * Storage: `~/.wrongstack/projects/<hash>/goal.json`. Persistent and\r\n * project-scoped on purpose: the goal belongs to the codebase, not the\r\n * REPL session.\r\n */\r\n\r\nexport interface JournalEntry {\r\n /** ISO timestamp of the iteration. */\r\n at: string;\r\n /** Sequential iteration counter (1-based, monotonically increasing). */\r\n iteration: number;\r\n /** Source that produced the action ('todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel'). */\r\n source: 'todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel';\r\n /** Short one-line description of what the iteration set out to do. */\r\n task: string;\r\n /** Outcome status. */\r\n status: 'success' | 'failure' | 'aborted' | 'skipped';\r\n /** Optional free-form note (error message, summary, etc.). */\r\n note?: string;\r\n /** Optional token usage delta for this iteration. */\r\n tokens?: { input: number; output: number };\r\n /** Optional USD cost delta for this iteration (provider-estimated). */\r\n costUsd?: number;\r\n}\r\n\r\nexport interface GoalFile {\r\n version: 1;\r\n /** The mission statement. */\r\n goal: string;\r\n /** When the goal was first set or last replaced. */\r\n setAt: string;\r\n /** Updated on every iteration completion. */\r\n lastActivityAt: string;\r\n /** Total iterations the engine has run against this goal (cumulative). */\r\n iterations: number;\r\n /** Engine lifecycle state — 'running' means another process owns this goal. */\r\n engineState: 'idle' | 'running' | 'stopped';\r\n /**\r\n * Mission-level lifecycle. `active` is the default; `completed` is set\r\n * when the engine detects `[GOAL_COMPLETE]` in a successful iteration's\r\n * final text AND a verification pass agrees; `abandoned` is set by the\r\n * user (e.g. `/goal abandon`) or when the engine exceeds a configured\r\n * failure ceiling. Once not `active`, the engine refuses to run further\r\n * iterations against this goal — protects against accidental restarts\r\n * burning through API quota after the work is done.\r\n *\r\n * Optional for backward compatibility — pre-existing `goal.json` files\r\n * without this field load as `active`.\r\n */\r\n goalState?: 'active' | 'paused' | 'completed' | 'abandoned';\r\n /**\r\n * Per-todo attempt counter. Keyed by TodoItem id. Used by the engine\r\n * to skip a todo that has failed N times rather than spinning on it\r\n * forever. Persisted so attempt counts survive restarts (`/autonomy\r\n * stop` + resume should not reset progress against a stuck task).\r\n */\r\n todoAttempts?: Record<string, number>;\r\n /** Bounded ring buffer of recent iterations (newest last). */\r\n journal: JournalEntry[];\r\n}\r\n\r\n/** Cap on persisted journal entries — older entries are evicted FIFO. */\r\nexport const MAX_JOURNAL_ENTRIES = 500;\r\n\r\n/**\r\n * Resolve the goal file path for a given project root.\r\n * Exposed so the engine and CLI use one canonical path.\r\n * Uses `~/.wrongstack/projects/<hash>/goal.json` .<hash>/`.\r\n */\r\nexport function goalFilePath(projectRoot: string): string {\r\n // Now resolves to ~/.wrongstack/projects/<hash>/goal.json for consistency\r\n // with WstackPaths.projectGoal.\r\n const hash = createHash('sha256').update(path.resolve(projectRoot)).digest('hex').slice(0, 12);\r\n return path.join(os.homedir(), '.wrongstack', 'projects', hash, 'goal.json');\r\n}\r\n\r\nexport async function loadGoal(filePath: string): Promise<GoalFile | null> {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(filePath, 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n try {\r\n const parsed = JSON.parse(raw) as GoalFile;\r\n if (parsed?.version !== 1 || typeof parsed.goal !== 'string' || !Array.isArray(parsed.journal)) {\r\n return null;\r\n }\r\n return parsed;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function saveGoal(filePath: string, goal: GoalFile): Promise<void> {\r\n try {\r\n await atomicWrite(filePath, JSON.stringify(goal, null, 2), { mode: 0o600 });\r\n } catch (err) {\r\n throw new FsError({\r\n message: err instanceof Error ? err.message : String(err),\r\n code: ERROR_CODES.FS_ATOMIC_WRITE_FAILED,\r\n path: filePath,\r\n cause: err,\r\n });\r\n }\r\n}\r\n\r\nexport function emptyGoal(goal: string): GoalFile {\r\n const now = new Date().toISOString();\r\n return {\r\n version: 1,\r\n goal,\r\n setAt: now,\r\n lastActivityAt: now,\r\n iterations: 0,\r\n engineState: 'idle',\r\n goalState: 'active',\r\n todoAttempts: {},\r\n journal: [],\r\n };\r\n}\r\n\r\n/**\r\n * Append a journal entry, bumping iteration counters and trimming the\r\n * ring buffer. Returns a new GoalFile — does not mutate the argument.\r\n */\r\nexport function appendJournal(goal: GoalFile, entry: Omit<JournalEntry, 'iteration' | 'at'>): GoalFile {\r\n const iteration = goal.iterations + 1;\r\n const at = new Date().toISOString();\r\n const full: JournalEntry = { ...entry, iteration, at };\r\n const journal = [...goal.journal, full];\r\n // Trim FIFO if over cap. Slice from the tail so the *newest* MAX entries survive.\r\n const trimmed = journal.length > MAX_JOURNAL_ENTRIES\r\n ? journal.slice(journal.length - MAX_JOURNAL_ENTRIES)\r\n : journal;\r\n return {\r\n ...goal,\r\n iterations: iteration,\r\n lastActivityAt: at,\r\n journal: trimmed,\r\n };\r\n}\r\n\r\n/**\r\n * Aggregate cumulative cost + tokens across all journal entries. Entries\r\n * without telemetry are skipped (legacy entries from before the field\r\n * was added still load cleanly).\r\n */\r\nexport function summarizeUsage(goal: GoalFile): {\r\n totalCostUsd: number;\r\n totalInputTokens: number;\r\n totalOutputTokens: number;\r\n iterationsWithUsage: number;\r\n} {\r\n let totalCostUsd = 0;\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n let iterationsWithUsage = 0;\r\n for (const e of goal.journal) {\r\n if (typeof e.costUsd === 'number') totalCostUsd += e.costUsd;\r\n if (e.tokens) {\r\n totalInputTokens += e.tokens.input;\r\n totalOutputTokens += e.tokens.output;\r\n }\r\n if (typeof e.costUsd === 'number' || e.tokens) iterationsWithUsage++;\r\n }\r\n return { totalCostUsd, totalInputTokens, totalOutputTokens, iterationsWithUsage };\r\n}\r\n\r\n/** Format the goal + recent journal as a human-readable status block. */\r\nexport function formatGoal(goal: GoalFile, journalLimit = 10): string {\r\n const lines: string[] = [];\r\n lines.push(`Goal: ${goal.goal}`);\r\n lines.push(`Set: ${goal.setAt}`);\r\n lines.push(`Last activity: ${goal.lastActivityAt}`);\r\n lines.push(`Iterations: ${goal.iterations}`);\r\n const stateLabel = goal.goalState ?? 'active';\r\n lines.push(`State: ${stateLabel}${goal.iterations > 0 ? ` (iteration #${goal.iterations})` : ''}`);\r\n lines.push(`Engine: ${goal.engineState}`);\r\n const usage = summarizeUsage(goal);\r\n if (usage.iterationsWithUsage > 0) {\r\n lines.push(\r\n `Spent: $${usage.totalCostUsd.toFixed(4)} (in ${usage.totalInputTokens} / out ${usage.totalOutputTokens} tokens across ${usage.iterationsWithUsage} iterations)`,\r\n );\r\n }\r\n if (goal.journal.length > 0) {\r\n lines.push('');\r\n lines.push(`Recent journal (last ${Math.min(journalLimit, goal.journal.length)}):`);\r\n const tail = goal.journal.slice(-journalLimit);\r\n for (const e of tail) {\r\n const mark = e.status === 'success' ? '✓' : e.status === 'failure' ? '✗' : e.status === 'aborted' ? '⊘' : '·';\r\n const note = e.note ? ` — ${e.note}` : '';\r\n const cost = typeof e.costUsd === 'number' ? ` ($${e.costUsd.toFixed(4)})` : '';\r\n lines.push(` #${e.iteration} ${mark} [${e.source}] ${e.task}${cost}${note}`);\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface PromptEntry {\n id: string;\n title: string;\n content: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface PromptStore {\n list(): Promise<PromptEntry[]>;\n get(id: string): Promise<PromptEntry | null>;\n save(entry: PromptEntry): Promise<void>;\n delete(id: string): Promise<boolean>;\n find(query: string): Promise<PromptEntry[]>;\n}\n\ninterface RawPromptFile {\n version: 1;\n entry: PromptEntry;\n}\n\nexport class DefaultPromptStore implements PromptStore {\n private readonly dir: string;\n\n constructor(paths: WstackPaths) {\n this.dir = paths.globalPrompts;\n }\n\n async list(): Promise<PromptEntry[]> {\n await ensureDir(this.dir);\n const entries: PromptEntry[] = [];\n try {\n const files = await fs.readdir(this.dir);\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n try {\n const raw: RawPromptFile = JSON.parse(\n await fs.readFile(path.join(this.dir, file), 'utf8'),\n );\n entries.push(raw.entry);\n } catch {\n // skip corrupt files\n }\n }\n } catch {\n // dir doesn't exist yet\n }\n return entries.sort(\n (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n );\n }\n\n async get(id: string): Promise<PromptEntry | null> {\n const file = path.join(this.dir, `${id}.json`);\n try {\n const raw: RawPromptFile = JSON.parse(await fs.readFile(file, 'utf8'));\n return raw.entry;\n } catch {\n return null;\n }\n }\n\n async save(entry: PromptEntry): Promise<void> {\n await ensureDir(this.dir);\n const file = path.join(this.dir, `${entry.id}.json`);\n const raw: RawPromptFile = { version: 1, entry };\n await atomicWrite(file, JSON.stringify(raw, null, 2));\n }\n\n async delete(id: string): Promise<boolean> {\n const file = path.join(this.dir, `${id}.json`);\n try {\n await fs.unlink(file);\n return true;\n } catch {\n return false;\n }\n }\n\n async find(query: string): Promise<PromptEntry[]> {\n const all = await this.list();\n const lower = query.toLowerCase();\n return all.filter(\n (e) =>\n e.title.toLowerCase().includes(lower) ||\n e.content.toLowerCase().includes(lower) ||\n e.tags.some((t) => t.toLowerCase().includes(lower)),\n );\n }\n\n /** Create a new entry and return it. Does NOT persist — call save() afterwards. */\n createNew(title: string, content: string, tags: string[] = []): PromptEntry {\n const now = new Date().toISOString();\n return {\n id: randomUUID().slice(0, 8),\n title,\n content,\n tags,\n createdAt: now,\n updatedAt: now,\n };\n }\n}","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\nimport type { SyncCategory, SyncConfig } from '../types/config.js';\n\nexport const ALL_SYNC_CATEGORIES: SyncCategory[] = ['settings', 'skills', 'prompts', 'memory', 'history'];\n\nexport interface SyncResult {\n ok: boolean;\n action: 'push' | 'pull';\n categories: SyncCategory[];\n committedAt?: string;\n message: string;\n}\n\ninterface SyncStateFile {\n version: 1;\n sha: string;\n lastSyncedAt: string;\n localRev: string;\n}\n\n/**\n * CloudSync — push/pull user-selected ~/.wrongstack categories to a\n * private GitHub repo. No git CLI needed; uses GitHub REST API via fetch.\n * The token is stored encrypted via SecretVault (field named `githubToken`\n * so the vault walker picks it up automatically).\n */\nexport class CloudSync {\n private readonly statePath: string;\n private state: SyncStateFile | null = null;\n\n constructor(\n private readonly paths: WstackPaths,\n private readonly getConfig: () => SyncConfig | null,\n private readonly setConfig: (c: SyncConfig) => Promise<void>,\n ) {\n this.statePath = path.join(paths.globalRoot, 'sync-state.json');\n }\n\n // ── Public API ─────────────────────────────────────────────────────\n\n async status(): Promise<string> {\n const cfg = this.getConfig();\n if (!cfg?.enabled) {\n return 'CloudSync: disabled. Run `/sync enable` to activate.';\n }\n const last = this.state?.lastSyncedAt;\n const since = last ? timeAgo(last) : 'never';\n return [\n `CloudSync: enabled`,\n ` repo: ${cfg.repo}`,\n ` categories: ${cfg.categories.join(', ')}`,\n ` last sync: ${since}`,\n ].join('\\n');\n }\n\n async enable(_repo: string, _categories: SyncCategory[]): Promise<string> {\n // Persisted by the slash command via configStore.update.\n return 'Enable via /sync enable.';\n }\n\n async disable(): Promise<string> {\n const cfg = this.getConfig();\n if (!cfg) return 'CloudSync is not configured.';\n const next = { ...cfg, enabled: false };\n await this.setConfig(next);\n return 'CloudSync disabled. Local data kept.';\n }\n\n async push(token: string): Promise<SyncResult> {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return { ok: false, action: 'push', categories: [], message: 'Not enabled.' };\n\n const parts = cfg.repo.split('/');\n const owner = parts[0]!;\n const repoName = parts[1]!;\n const branch = 'main';\n const baseTreeSha = this.state?.sha;\n\n const { treeEntries, rev } = await this.buildLocalTree(cfg.categories);\n const newTreeSha = await this.createGitTree(token, owner, repoName, treeEntries, baseTreeSha);\n\n const commitSha = await this.createCommit(\n token, owner, repoName, newTreeSha,\n baseTreeSha,\n `Sync ${cfg.categories.join(', ')} — ${new Date().toISOString()}`,\n );\n\n try {\n await this.updateRef(token, owner, repoName, branch, commitSha);\n } catch (err) {\n // 422 = not a fast forward — remote branch moved. Fetch latest SHA and retry.\n if (err instanceof Error && err.message.includes('422')) {\n const remote = await this.getRef(token, owner, repoName, branch);\n const currentSha = remote.object.sha;\n const rebasedCommitSha = await this.createCommit(\n token, owner, repoName, newTreeSha,\n currentSha,\n `Sync ${cfg.categories.join(', ')} — ${new Date().toISOString()}`,\n );\n await this.updateRef(token, owner, repoName, branch, rebasedCommitSha);\n } else {\n throw err;\n }\n }\n\n const syncState: SyncStateFile = {\n version: 1,\n sha: commitSha,\n lastSyncedAt: new Date().toISOString(),\n localRev: rev,\n };\n await fs.writeFile(this.statePath, JSON.stringify(syncState, null, 2), 'utf8');\n this.state = syncState;\n\n return {\n ok: true,\n action: 'push',\n categories: cfg.categories,\n committedAt: commitSha,\n message: `Pushed ${cfg.categories.join(', ')} to ${cfg.repo}. Commit: ${commitSha.slice(0, 7)}`,\n };\n }\n\n async pull(token: string): Promise<SyncResult> {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return { ok: false, action: 'pull', categories: [], message: 'Not enabled.' };\n\n const pullParts = cfg.repo.split('/');\n const owner = pullParts[0]!;\n const repoName = pullParts[1]!;\n\n const branchData = await this.getRef(token, owner, repoName, 'main');\n const currentSha = branchData.object.sha;\n\n const commitData = await this.getCommit(token, owner, repoName, currentSha);\n const treeSha = commitData.tree.sha;\n\n const treeEntries = await this.getTreeEntries(token, owner, repoName, treeSha);\n\n for (const entry of treeEntries) {\n if (entry.type !== 'blob') continue;\n\n // Paths look like \"data/{category}/...\" — extract the category\n const segments = entry.path.split('/');\n if (segments[0] !== 'data' || !segments[1]) continue;\n const cat = segments[1] as SyncCategory;\n if (!['settings', 'skills', 'prompts', 'memory', 'history'].includes(cat)) continue;\n\n const localPath = this.categoryToPath(cat);\n if (!localPath) continue;\n\n // Reconstruct relative path under the category dir\n const rel = segments.slice(2).join('/');\n const destPath = rel ? path.join(localPath, rel) : localPath;\n\n const blobData = await this.getBlob(token, owner, repoName, entry.sha);\n await fs.mkdir(path.dirname(destPath), { recursive: true });\n await fs.writeFile(destPath, Buffer.from(blobData, 'base64'));\n }\n\n const localRev = await this.hashLocalCategories(cfg.categories);\n const syncState: SyncStateFile = {\n version: 1,\n sha: currentSha,\n lastSyncedAt: new Date().toISOString(),\n localRev,\n };\n await fs.writeFile(this.statePath, JSON.stringify(syncState, null, 2), 'utf8');\n this.state = syncState;\n\n return {\n ok: true,\n action: 'pull',\n categories: cfg.categories,\n committedAt: currentSha,\n message: `Pulled ${cfg.categories.join(', ')} from ${cfg.repo}. Commit: ${currentSha.slice(0, 7)}`,\n };\n }\n\n async hasLocalChanges(): Promise<boolean> {\n if (!this.state) return true;\n const cfg = this.getConfig();\n if (!cfg) return true;\n const current = await this.hashLocalCategories(cfg.categories);\n return current !== this.state.localRev;\n }\n\n async loadState(): Promise<void> {\n try {\n const raw = await fs.readFile(this.statePath, 'utf8');\n this.state = JSON.parse(raw) as SyncStateFile;\n } catch {\n this.state = null;\n }\n }\n\n // ── GitHub API helpers ──────────────────────────────────────────────\n\n private async githubFetch(\n token: string,\n owner: string,\n repo: string,\n method: 'GET' | 'POST' | 'PUT' | 'PATCH',\n pathSegment: string,\n body?: unknown,\n ): Promise<unknown> {\n const url = `https://api.github.com/repos/${owner}/${repo}${pathSegment}`;\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`GitHub API ${method} ${pathSegment} failed (${res.status}): ${errText}`);\n }\n\n const text = await res.text();\n return text ? JSON.parse(text) : {};\n }\n\n private async getRef(token: string, owner: string, repo: string, ref: string) {\n return (await this.githubFetch(token, owner, repo, 'GET', `/git/refs/heads/${ref}`)) as {\n object: { sha: string };\n };\n }\n\n private async updateRef(token: string, owner: string, repo: string, ref: string, sha: string) {\n await this.githubFetch(token, owner, repo, 'PATCH', `/git/refs/heads/${ref}`, {\n sha,\n force: false,\n });\n }\n\n private async getCommit(token: string, owner: string, repo: string, sha: string) {\n return (await this.githubFetch(token, owner, repo, 'GET', `/git/commits/${sha}`)) as {\n tree: { sha: string };\n message: string;\n };\n }\n\n private async getTreeEntries(token: string, owner: string, repo: string, treeSha: string) {\n return (await this.githubFetch(token, owner, repo, 'GET', `/git/trees/${treeSha}?recursive=1`)) as Array<{\n path: string;\n sha: string;\n type: 'blob' | 'tree';\n }>;\n }\n\n private async createCommit(\n token: string, owner: string, repo: string,\n treeSha: string, parentSha?: string, message = 'sync',\n ) {\n const body: Record<string, unknown> = { message, tree: treeSha };\n if (parentSha) body.parents = [parentSha];\n const result = (await this.githubFetch(token, owner, repo, 'POST', '/git/commits', body)) as { sha: string };\n return result.sha;\n }\n\n private async createGitTree(\n token: string, owner: string, repo: string,\n entries: Array<{ path: string; content: string; mode: string }>,\n baseTreeSha?: string,\n ): Promise<string> {\n const tree = entries.map((e) => ({\n path: e.path,\n mode: e.mode,\n type: 'blob',\n content: e.content,\n }));\n const body: Record<string, unknown> = { tree };\n if (baseTreeSha) body.base_tree = baseTreeSha;\n const result = (await this.githubFetch(token, owner, repo, 'POST', '/git/trees', body)) as { sha: string };\n return result.sha;\n }\n\n private async getBlob(token: string, owner: string, repo: string, sha: string): Promise<string> {\n const result = (await this.githubFetch(token, owner, repo, 'GET', `/git/blobs/${sha}`)) as { content: string };\n return result.content;\n }\n\n // ── Local file helpers ──────────────────────────────────────────────\n\n private async buildLocalTree(categories: SyncCategory[]): Promise<{\n treeEntries: Array<{ path: string; content: string; mode: string }>;\n rev: string;\n }> {\n const entries: Array<{ path: string; content: string; mode: string }> = [];\n const hashes: string[] = [];\n\n for (const cat of categories) {\n const localPath = this.categoryToPath(cat);\n if (!localPath) continue;\n try {\n const stat = await fs.stat(localPath);\n if (stat.isDirectory()) {\n const files = await this.walkDir(localPath, localPath);\n for (const file of files) {\n const content = await fs.readFile(file, 'utf8');\n const rel = path.relative(localPath, file).replace(/\\\\/g, '/');\n entries.push({ path: `data/${cat}/${rel}`, content, mode: '100644' });\n hashes.push(content);\n }\n } else {\n const content = await fs.readFile(localPath, 'utf8');\n entries.push({ path: `data/${cat}`, content, mode: '100644' });\n hashes.push(content);\n }\n } catch {\n // skip missing files/dirs\n }\n }\n\n const rev = createHash('sha256').update(hashes.join('')).digest('hex').slice(0, 12);\n return { treeEntries: entries, rev };\n }\n\n private async hashLocalCategories(categories: SyncCategory[]): Promise<string> {\n const hashes: string[] = [];\n for (const cat of categories) {\n const localPath = this.categoryToPath(cat);\n if (!localPath) continue;\n try {\n const stat = await fs.stat(localPath);\n if (stat.isDirectory()) {\n const files = await this.walkDir(localPath, localPath);\n for (const file of files) {\n const content = await fs.readFile(file);\n hashes.push(content.toString('base64') + file);\n }\n } else {\n const content = await fs.readFile(localPath);\n hashes.push(content.toString('base64') + localPath);\n }\n } catch {\n // skip\n }\n }\n return createHash('sha256').update(hashes.join('')).digest('hex').slice(0, 12);\n }\n\n private categoryToPath(cat: SyncCategory): string | null {\n switch (cat) {\n case 'settings': return this.paths.globalConfig;\n case 'skills': return this.paths.globalSkills;\n case 'prompts': return this.paths.globalPrompts;\n case 'memory': return this.paths.globalMemory;\n case 'history': return this.paths.historyFile;\n default: return null;\n }\n }\n\n private async walkDir(dir: string, base: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...(await this.walkDir(full, base)));\n } else {\n results.push(full);\n }\n }\n return results;\n }\n}\n\nfunction timeAgo(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n}","import type { SessionEvent, SessionWriter } from '../types/session.js';\n\nexport type AuditLevel = 'minimal' | 'standard' | 'full';\n\n/**\n * Configuration for sampling high-volume events inside the bridge.\n * This allows callers (CLI, TUI, WebUI, plugins) to tune how aggressively\n * noisy events like tool progress are persisted.\n */\nexport interface ToolProgressSamplingOptions {\n /**\n * How often to persist 'log' and 'partial_output' progress events.\n * - 1 = every message (no sampling)\n * - 8 = keep the first message + every 8th after that (default)\n */\n sampleRate?: number;\n}\n\nexport interface SessionSamplingOptions {\n /** Controls sampling behavior for `tool_progress` events (only relevant at auditLevel 'full'). */\n toolProgress?: ToolProgressSamplingOptions;\n}\n\nexport interface SessionEventBridgeOptions {\n /** Sampling rules for high-volume audit events. */\n sampling?: SessionSamplingOptions;\n}\n\n/**\n * Small, safe helper that wraps a SessionWriter and enforces the\n * configured auditLevel.\n *\n * All appends are best-effort. Failures are swallowed (with optional\n * diagnostics) so they never crash the agent loop.\n */\nexport interface SessionEventBridge {\n /** Append an event if allowed by the current audit level. */\n append(event: SessionEvent): Promise<void>;\n\n /** Current audit level this bridge was created with. */\n readonly level: AuditLevel;\n\n /** Returns true if an event of this type should be written at the current level. */\n allows(type: SessionEvent['type']): boolean;\n}\n\n/** Core events that are always written regardless of auditLevel. */\nconst CORE_RECONSTRUCT_EVENTS = new Set<SessionEvent['type']>([\n 'session_start',\n 'session_resumed',\n 'user_input',\n 'llm_response',\n 'tool_result',\n 'checkpoint',\n 'file_snapshot',\n 'rewound',\n 'in_flight_start',\n 'in_flight_end',\n 'session_end',\n]);\n\n/**\n * Events that are considered \"standard\" audit detail.\n * These are lightweight and high-value for forensics.\n */\nconst STANDARD_AUDIT_EVENTS = new Set<SessionEvent['type']>([\n 'llm_request',\n 'tool_use',\n 'tool_call_start',\n 'tool_call_end',\n 'compaction',\n 'error',\n 'message_truncated',\n 'provider_retry',\n 'provider_error',\n]);\n\n/**\n * Events that are only allowed at 'full' audit level because they can be\n * very high volume (e.g. streaming tool output).\n */\nconst FULL_ONLY_EVENTS = new Set<SessionEvent['type']>([\n 'tool_progress',\n]);\n\n/**\n * \"full\" level allows everything (including potentially heavy events\n * that plugins or future code may emit).\n */\nfunction isAllowed(type: SessionEvent['type'], level: AuditLevel): boolean {\n if (CORE_RECONSTRUCT_EVENTS.has(type)) return true;\n if (level === 'minimal') return false;\n\n if (STANDARD_AUDIT_EVENTS.has(type)) return true;\n if (level === 'standard') return false;\n\n // 'full' level events (high volume)\n if (FULL_ONLY_EVENTS.has(type)) {\n return level === 'full';\n }\n\n // 'full' — allow everything else\n return true;\n}\n\n/**\n * Create a safe, audit-level-aware bridge around a SessionWriter.\n *\n * The bridge can also apply sampling for high-volume events (e.g. `tool_progress`)\n * when `auditLevel` is set to `'full'`.\n *\n * @example\n * const bridge = createSessionEventBridge(sessionWriter, 'full', {\n * sampling: {\n * toolProgress: { sampleRate: 5 } // more aggressive sampling\n * }\n * });\n */\nexport function createSessionEventBridge(\n writer: SessionWriter | undefined | null,\n level: AuditLevel = 'standard',\n options: SessionEventBridgeOptions = {},\n): SessionEventBridge {\n const normalizedLevel: AuditLevel = level ?? 'standard';\n\n // Internal sampling state for high-volume events (e.g. tool_progress).\n // Keyed by tool call id (or name as fallback) to keep sampling per-call.\n const progressCounters = new Map<string, number>();\n\n const toolProgressConfig = options.sampling?.toolProgress ?? {};\n const TOOL_PROGRESS_SAMPLE_RATE = toolProgressConfig.sampleRate ?? 8;\n\n /**\n * Decide whether a high-volume event should be sampled in.\n * Currently only implements sampling for 'tool_progress'.\n */\n function shouldSample(event: SessionEvent): boolean {\n if (event.type !== 'tool_progress') return true;\n\n const progEvent = event as Extract<SessionEvent, { type: 'tool_progress' }>;\n const innerType = progEvent.event?.type;\n\n // Always let through high-signal structured events\n if (innerType === 'warning' || innerType === 'metric' || innerType === 'file_changed') {\n return true;\n }\n\n // Sample noisy text streams (log / partial_output)\n if (innerType === 'log' || innerType === 'partial_output') {\n const key = progEvent.id || progEvent.name;\n const count = (progressCounters.get(key) || 0) + 1;\n progressCounters.set(key, count);\n\n // Always keep the first message + every Nth after that\n return count === 1 || (count % TOOL_PROGRESS_SAMPLE_RATE === 0);\n }\n\n return true;\n }\n\n return {\n level: normalizedLevel,\n\n allows(type) {\n return isAllowed(type, normalizedLevel);\n },\n\n async append(event) {\n if (!writer) return;\n if (!isAllowed(event.type, normalizedLevel)) return;\n\n // Apply sampling for high-volume events (only at 'full' level)\n if (!shouldSample(event)) return;\n\n try {\n await writer.append(event);\n } catch (err) {\n // Best-effort: never let session logging break the agent.\n // The existing FileSessionWriter already does throttled warnings,\n // but we keep this wrapper silent by default to avoid log spam.\n // Callers that care can listen to EventBus 'session.damaged' etc.\n }\n },\n };\n}\n\n/** Convenience re-export of the allowed core set for tests/docs. */\nexport { CORE_RECONSTRUCT_EVENTS, STANDARD_AUDIT_EVENTS };\n\n/**\n * Safely extract the auditLevel from a (possibly partial) Config object.\n * Falls back to 'standard' if not present or invalid.\n */\nexport function resolveAuditLevel(\n cfg?: { session?: { auditLevel?: AuditLevel } } | null,\n): AuditLevel {\n const raw = cfg?.session?.auditLevel;\n if (raw === 'minimal' || raw === 'standard' || raw === 'full') {\n return raw;\n }\n return 'standard';\n}\n\n/**\n * Fully resolves the session logging configuration with sensible defaults.\n * This is the recommended way for the CLI / TUI / WebUI to read session config.\n */\nexport function resolveSessionLoggingConfig(\n cfg?: {\n session?: {\n auditLevel?: AuditLevel;\n sampling?: {\n toolProgress?: { sampleRate?: number };\n };\n };\n } | null,\n): {\n auditLevel: AuditLevel;\n sampling: {\n toolProgress: { sampleRate: number };\n };\n} {\n const session = cfg?.session ?? {};\n\n const auditLevel = resolveAuditLevel(cfg);\n\n const toolProgressSampleRate =\n session.sampling?.toolProgress?.sampleRate ?? 8;\n\n return {\n auditLevel,\n sampling: {\n toolProgress: {\n sampleRate: Math.max(1, Math.floor(toolProgressSampleRate)),\n },\n },\n };\n}"]}
1
+ {"version":3,"sources":["../../src/utils/atomic-write.ts","../../src/utils/message-invariants.ts","../../src/storage/session-store.ts","../../src/storage/queue-store.ts","../../src/storage/attachment-store.ts","../../src/storage/memory-store.ts","../../src/storage/config-store.ts","../../src/security/config-secrets.ts","../../src/types/context-window.ts","../../src/utils/safe-json.ts","../../src/types/default-config.ts","../../src/storage/config-loader.ts","../../src/storage/config-migration.ts","../../src/storage/recovery-lock.ts","../../src/utils/regex-guard.ts","../../src/storage/session-reader.ts","../../src/storage/annotations-store.ts","../../src/replay/hash.ts","../../src/storage/replay-log-store.ts","../../src/storage/session-recovery.ts","../../src/storage/tool-audit-log.ts","../../src/storage/session-analyzer.ts","../../src/storage/session-rewinder.ts","../../src/storage/todos-checkpoint.ts","../../src/storage/plan-store.ts","../../src/storage/plan-templates.ts","../../src/storage/director-state.ts","../../src/types/errors.ts","../../src/storage/goal-store.ts","../../src/storage/prompt-store.ts","../../src/storage/cloud-sync.ts","../../src/storage/session-event-bridge.ts"],"names":["path","fs","stat","resolve","path2","randomBytes","path3","fsp2","fsp3","path4","fs2","path5","fs3","path6","fsp4","randomUUID","path7","fs4","fs5","path8","fs6","path9","createHash","stableStringify","path10","fs7","sortKeys","path11","fsp5","fsp6","fsp7","fsp8","lock","path12","os2","fsp9","fs8","path13","fs9","relative"],"mappings":"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","file":"index.js","sourcesContent":["import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus } from '../kernel/events.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { SecretScrubber } from '../types/secret-scrubber.js';\nimport type {\n ResumedSession,\n SessionData,\n SessionEvent,\n SessionMetadata,\n SessionStore,\n SessionSummary,\n SessionWriter,\n} from '../types/session.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\nexport interface SessionStoreOptions {\n dir: string;\n /** Optional EventBus for emitting session diagnostics. */\n events?: EventBus;\n /**\n * Optional secret scrubber. When set, `user_input` and `llm_response` event\n * content is scrubbed before being persisted to the JSONL log and the\n * summary sidecar — so a secret a user pastes or the model echoes does not\n * sit in cleartext on disk (and does not ride along in history cloud-sync).\n * Tool output is already scrubbed upstream by the executor; this closes the\n * conversation-turn gap (finding F-06).\n */\n secretScrubber?: SecretScrubber;\n}\n\nexport class DefaultSessionStore implements SessionStore {\n private readonly dir: string;\n private readonly events?: EventBus;\n private readonly secretScrubber?: SecretScrubber;\n\n constructor(opts: SessionStoreOptions) {\n this.dir = opts.dir;\n this.events = opts.events;\n this.secretScrubber = opts.secretScrubber;\n }\n\n /** Join session ID to its absolute path within the store directory. */\n private sessionPath(id: string, ext: '.jsonl' | '.summary.json'): string {\n return path.join(this.dir, `${id}${ext}`);\n }\n\n private async ensureShardDir(_id: string): Promise<string> {\n await ensureDir(this.dir);\n return this.dir;\n }\n\n async create(meta: Omit<SessionMetadata, 'startedAt'>): Promise<SessionWriter> {\n const startedAt = new Date().toISOString();\n const id = meta.id ?? `${startedAt.replace(/[:.]/g, '-')}-${randomBytes(2).toString('hex')}`;\n const shardDir = await this.ensureShardDir(id);\n const file = path.join(shardDir, `${id}.jsonl`);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session file: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n try {\n return new FileSessionWriter(id, handle, startedAt, meta, this.events, {\n dir: shardDir,\n filePath: file,\n secretScrubber: this.secretScrubber,\n });\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async resume(id: string): Promise<ResumedSession> {\n const file = this.sessionPath(id, '.jsonl');\n const data = await this.load(id);\n let handle: fsp.FileHandle;\n try {\n handle = await fsp.open(file, 'a', 0o600);\n } catch (err) {\n throw new Error(\n `Failed to open session \"${id}\" for append: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err },\n );\n }\n try {\n const writer = new FileSessionWriter(\n id,\n handle,\n new Date().toISOString(),\n {\n id,\n model: data.metadata.model,\n provider: data.metadata.provider,\n },\n this.events,\n { resumed: true, dir: this.dir, filePath: file, secretScrubber: this.secretScrubber },\n );\n return { writer, data };\n } catch (err) {\n await handle.close().catch(() => {});\n throw err;\n }\n }\n\n async load(id: string): Promise<SessionData> {\n const file = this.sessionPath(id, '.jsonl');\n const raw = await fsp.readFile(file, 'utf8');\n const lines = raw.split('\\n').filter((l) => l.trim());\n const events: SessionEvent[] = [];\n for (const line of lines) {\n try {\n const parsed: unknown = JSON.parse(line);\n if (\n parsed !== null &&\n typeof parsed === 'object' &&\n typeof (parsed as { type?: unknown }).type === 'string' &&\n typeof (parsed as { ts?: unknown }).ts === 'string'\n ) {\n events.push(parsed as SessionEvent);\n }\n } catch {\n // skip malformed JSON\n }\n }\n const meta = this.metaFromEvents(id, events);\n const { messages, usage } = this.replay(events, id);\n return { metadata: meta, events, messages, usage };\n }\n\n async list(limit = 20): Promise<SessionSummary[]> {\n try {\n await ensureDir(this.dir);\n const ids = await this.collectSessionIds(this.dir);\n const sessions = await Promise.all(ids.map((id) => this.summaryFor(id).catch(() => null)));\n const out = sessions.filter((s): s is SessionSummary => s !== null);\n out.sort((a, b) => {\n if (a.startedAt < b.startedAt) return 1;\n if (a.startedAt > b.startedAt) return -1;\n return a.id.localeCompare(b.id);\n });\n return out.slice(0, limit);\n } catch {\n return [];\n }\n }\n\n /** Recursively collect all session IDs from shard subdirectories. */\n private async collectSessionIds(dir: string): Promise<string[]> {\n const ids: string[] = [];\n const entries = await fsp.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n ids.push(...(await this.collectSessionIds(full)));\n } else if (entry.isFile() && entry.name.endsWith('.jsonl')) {\n ids.push(entry.name.replace(/\\.jsonl$/, ''));\n }\n }\n return ids;\n }\n\n private async summaryFor(id: string): Promise<SessionSummary> {\n const manifest = this.sessionPath(id, '.summary.json');\n try {\n const raw = await fsp.readFile(manifest, 'utf8');\n return JSON.parse(raw) as SessionSummary;\n } catch {\n const full = this.sessionPath(id, '.jsonl');\n const stat = await fsp.stat(full);\n const summary = await this.summarize(id, stat.mtime.toISOString());\n await atomicWrite(manifest, JSON.stringify(summary), { mode: 0o600 }).catch((err) => {\n console.warn(\n `[session-store] Failed to write manifest for \"${id}\":`,\n err instanceof Error ? err.message : String(err),\n );\n });\n return summary;\n }\n }\n\n async delete(id: string): Promise<void> {\n await fsp.unlink(this.sessionPath(id, '.jsonl'));\n await fsp.unlink(this.sessionPath(id, '.summary.json')).catch(() => undefined);\n }\n\n async clearHistory(id: string): Promise<void> {\n await this.ensureShardDir(id);\n const file = this.sessionPath(id, '.jsonl');\n const meta = this.sessionPath(id, '.summary.json');\n const record = `${JSON.stringify({\n type: 'session_start',\n ts: new Date().toISOString(),\n id,\n model: 'unknown',\n provider: 'unknown',\n })}\\n`;\n await fsp.writeFile(file, record, 'utf8');\n await fsp.unlink(meta).catch(() => undefined);\n }\n\n private async summarize(id: string, mtime: string): Promise<SessionSummary> {\n try {\n const data = await this.load(id);\n const firstUser = data.events.find((e) => e.type === 'user_input');\n const title =\n firstUser && firstUser.type === 'user_input'\n ? userInputTitle(firstUser.content)\n : '(empty session)';\n return {\n id,\n title,\n startedAt: data.metadata.startedAt,\n model: data.metadata.model ?? 'unknown',\n provider: data.metadata.provider ?? 'unknown',\n tokenTotal: data.usage.input + data.usage.output,\n };\n } catch {\n return {\n id,\n title: '(damaged)',\n startedAt: mtime,\n model: 'unknown',\n provider: 'unknown',\n tokenTotal: 0,\n };\n }\n }\n\n private metaFromEvents(id: string, events: SessionEvent[]): SessionMetadata {\n const start = events.find((e) => e.type === 'session_start');\n const end = events.find((e) => e.type === 'session_end');\n return {\n id,\n startedAt: start?.ts ?? new Date(0).toISOString(),\n endedAt: end?.ts,\n model: start?.model,\n provider: start?.provider,\n pendingToolUses: end?.pendingToolUses,\n };\n }\n\n private replay(\n events: SessionEvent[],\n sessionId = 'unknown',\n ): { messages: Message[]; usage: SessionData['usage'] } {\n const messages: Message[] = [];\n let usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n const openToolUses = new Set<string>();\n for (const e of events) {\n if (e.type === 'user_input') {\n openToolUses.clear();\n messages.push({ role: 'user', content: e.content });\n } else if (e.type === 'llm_response') {\n messages.push({ role: 'assistant', content: e.content });\n for (const b of e.content) {\n if (b.type === 'tool_use') openToolUses.add(b.id);\n }\n usage = {\n input: usage.input + (e.usage.input ?? 0),\n output: usage.output + (e.usage.output ?? 0),\n cacheRead: (usage.cacheRead ?? 0) + (e.usage.cacheRead ?? 0),\n cacheWrite: (usage.cacheWrite ?? 0) + (e.usage.cacheWrite ?? 0),\n };\n } else if (e.type === 'tool_result') {\n if (!openToolUses.has(e.id)) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `Orphan tool_result \"${e.id}\" has no matching tool_use`,\n });\n continue;\n }\n openToolUses.delete(e.id);\n const content: ContentBlock[] = [\n {\n type: 'tool_result',\n tool_use_id: e.id,\n content: typeof e.content === 'string' ? e.content : JSON.stringify(e.content),\n is_error: e.isError,\n },\n ];\n const last = messages[messages.length - 1];\n if (last && last.role === 'user') {\n if (Array.isArray(last.content)) {\n last.content.push(...content);\n } else if (typeof last.content === 'string') {\n last.content = [{ type: 'text', text: last.content }, ...content];\n } else {\n messages.push({ role: 'user', content });\n }\n } else {\n messages.push({ role: 'user', content });\n }\n }\n }\n if (openToolUses.size > 0) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail: `${openToolUses.size} tool_use blocks without matching results - replay repaired`,\n });\n }\n const repaired = repairToolUseAdjacency(messages);\n if (repaired.report.changed) {\n this.events?.emit('session.damaged', {\n sessionId,\n detail:\n `Repaired replay adjacency: removed ${repaired.report.removedToolUses.length} tool_use, ` +\n `${repaired.report.removedToolResults.length} tool_result, ` +\n `${repaired.report.removedMessages} empty messages`,\n });\n }\n return { messages: repaired.messages, usage };\n }\n}\n\nclass FileSessionWriter implements SessionWriter {\n private closed = false;\n private closing = false;\n private manifestFile: string;\n private summary: SessionSummary;\n private tokenIn = 0;\n private tokenOut = 0;\n private readonly filePath: string;\n get transcriptPath(): string | undefined {\n return this.filePath || undefined;\n }\n private initDone = false;\n private readonly resumed: boolean;\n private appendFailCount = 0;\n private lastAppendWarnAt = 0;\n private readonly secretScrubber?: SecretScrubber;\n\n /**\n * Scrub secrets out of conversation-turn events before they are observed\n * for the summary, written to the JSONL log, or surfaced on resume. Only\n * `user_input` / `llm_response` carry free-form user/model text; other event\n * types either have no secret-bearing content or are already scrubbed\n * upstream (tool results). Returns the event unchanged when no scrubber is\n * configured.\n */\n private scrubEvent(event: SessionEvent): SessionEvent {\n const s = this.secretScrubber;\n if (!s) return event;\n if (event.type === 'user_input') {\n return {\n ...event,\n content:\n typeof event.content === 'string' ? s.scrub(event.content) : s.scrubObject(event.content),\n };\n }\n if (event.type === 'llm_response') {\n return { ...event, content: s.scrubObject(event.content) };\n }\n return event;\n }\n\n private pendingFileSnapshots: Array<{\n path: string;\n action: 'created' | 'modified' | 'deleted';\n before: string | null;\n after: string | null;\n }> = [];\n /** Tracks open tool_use IDs during the current run to serialize on close for resume. */\n private openToolUses = new Set<string>();\n\n recordFileChange(input: {\n path: string;\n action: 'created' | 'modified' | 'deleted';\n before: string | null;\n after: string | null;\n }): void {\n this.pendingFileSnapshots.push(input);\n }\n\n constructor(\n public readonly id: string,\n private handle: fsp.FileHandle,\n private readonly startedAt: string,\n private readonly meta: Omit<SessionMetadata, 'startedAt'>,\n private readonly events?: EventBus,\n opts: {\n resumed?: boolean;\n dir?: string;\n filePath?: string;\n secretScrubber?: SecretScrubber;\n } = {},\n ) {\n this.resumed = opts.resumed ?? false;\n this.manifestFile = opts.dir ? path.join(opts.dir, `${id}.summary.json`) : '';\n this.filePath = opts.filePath ?? '';\n this.secretScrubber = opts.secretScrubber;\n this.summary = {\n id,\n title: '(empty session)',\n startedAt,\n model: meta.model ?? 'unknown',\n provider: meta.provider ?? 'unknown',\n tokenTotal: 0,\n };\n }\n\n get pendingToolUses(): string[] {\n return Array.from(this.openToolUses);\n }\n\n private async writeSessionStartLazy(): Promise<void> {\n const record = `${JSON.stringify({\n type: this.resumed ? 'session_resumed' : 'session_start',\n ts: this.startedAt,\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n try {\n if (this.filePath) {\n await fsp.writeFile(this.filePath, record, { flag: 'a', mode: 0o600 });\n }\n } catch {\n // best-effort\n }\n }\n\n async append(event: SessionEvent): Promise<void> {\n if (this.closed) return;\n if (!this.initDone) {\n this.initDone = true;\n await this.writeSessionStartLazy();\n }\n // Scrub before observing (the summary title is derived from user_input\n // content) and before writing, so neither the JSONL nor the sidecar holds\n // a cleartext secret.\n const scrubbed = this.scrubEvent(event);\n this.observeForSummary(scrubbed);\n try {\n await this.handle.appendFile(`${JSON.stringify(scrubbed)}\\n`, 'utf8');\n } catch (err) {\n this.appendFailCount++;\n const now = Date.now();\n if (now - this.lastAppendWarnAt > 5000) {\n const suppressed = this.appendFailCount - 1;\n const tail = suppressed > 0 ? ` (+${suppressed} suppressed)` : '';\n console.warn(\n '[session] append failed:',\n err instanceof Error ? err.message : String(err),\n tail,\n );\n this.lastAppendWarnAt = now;\n this.appendFailCount = 0;\n }\n }\n }\n\n private observeForSummary(event: SessionEvent): void {\n // Track open tool uses so we can serialize them on close for resume.\n if (event.type === 'tool_use') {\n this.openToolUses.add(event.id);\n } else if (event.type === 'tool_result') {\n this.openToolUses.delete(event.id);\n }\n if (event.type === 'user_input' && this.summary.title === '(empty session)') {\n this.summary = { ...this.summary, title: userInputTitle(event.content) };\n } else if (event.type === 'llm_response') {\n this.tokenIn += event.usage.input;\n this.tokenOut += event.usage.output;\n this.summary = { ...this.summary, tokenTotal: this.tokenIn + this.tokenOut };\n } else if (event.type === 'session_end') {\n const total = event.usage.input + event.usage.output;\n if (total > 0) this.summary = { ...this.summary, tokenTotal: total };\n }\n }\n\n async close(): Promise<void> {\n if (this.closing) return;\n this.closing = true;\n this.closed = true;\n if (this.manifestFile) {\n try {\n await atomicWrite(this.manifestFile, JSON.stringify(this.summary), { mode: 0o600 });\n } catch {\n // manifest write is best-effort\n }\n }\n try {\n await this.handle.close();\n } catch {\n // ignore\n }\n }\n\n async writeCheckpoint(promptIndex: number, promptPreview: string): Promise<void> {\n const fileCount = this.pendingFileSnapshots.length;\n if (fileCount > 0) {\n await this.writeFileSnapshot(promptIndex, [...this.pendingFileSnapshots]);\n this.pendingFileSnapshots = [];\n }\n await this.append({\n type: 'checkpoint',\n ts: new Date().toISOString(),\n promptIndex,\n promptPreview,\n });\n this.events?.emit('checkpoint.written', {\n promptIndex,\n promptPreview,\n ts: new Date().toISOString(),\n fileCount,\n });\n }\n\n async writeFileSnapshot(\n promptIndex: number,\n files: import('../types/session.js').FileSnapshot[],\n ): Promise<void> {\n await this.append({\n type: 'file_snapshot',\n ts: new Date().toISOString(),\n promptIndex,\n files,\n });\n }\n\n async truncateToCheckpoint(targetPromptIndex: number): Promise<number> {\n if (!this.filePath) return 0;\n const raw = await fsp.readFile(this.filePath, 'utf8');\n const lines = raw.split('\\n');\n const kept: string[] = [];\n let removedCount = 0;\n\n let targetCheckpointLine = -1;\n let afterTarget = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (!line.trim()) continue;\n\n let event: { type?: string; promptIndex?: number };\n try {\n event = JSON.parse(line);\n } catch {\n kept.push(line);\n continue;\n }\n\n if (event.type === 'checkpoint') {\n if ((event as { promptIndex: number }).promptIndex === targetPromptIndex) {\n targetCheckpointLine = kept.length;\n afterTarget = true;\n } else if ((event as { promptIndex: number }).promptIndex > targetPromptIndex) {\n afterTarget = true;\n }\n }\n\n if (event.promptIndex !== undefined && event.promptIndex > targetPromptIndex) {\n removedCount++;\n } else if (event.promptIndex === undefined) {\n if (!afterTarget || targetCheckpointLine === -1) {\n kept.push(line);\n } else {\n removedCount++;\n }\n } else {\n kept.push(line);\n }\n }\n\n const truncated = kept.join('\\n');\n // Windows EPERM fix: close the append-mode handle, write via temp file\n // and rename, then reopen. This is needed because rename() fails on\n // Windows when the target has an open file handle.\n const tmpPath = `${this.filePath}.rewind.tmp`;\n await fsp.writeFile(tmpPath, truncated + '\\n', 'utf8');\n try {\n await this.handle.close();\n await fsp.rename(tmpPath, this.filePath);\n // Re-open in append mode for continued use of this file.\n this.handle = await fsp.open(this.filePath, 'a', 0o600);\n } catch (err) {\n await fsp.unlink(tmpPath).catch(() => undefined);\n throw err;\n }\n\n await this.append({\n type: 'rewound',\n ts: new Date().toISOString(),\n toPromptIndex: targetPromptIndex,\n revertedFiles: [],\n });\n\n this.events?.emit('session.rewound', {\n toPromptIndex: targetPromptIndex,\n revertedFiles: [],\n removedEvents: removedCount,\n });\n\n return removedCount;\n }\n\n async clearSession(): Promise<void> {\n if (!this.filePath) return;\n const record = `${JSON.stringify({\n type: 'session_start',\n ts: new Date().toISOString(),\n id: this.id,\n model: this.meta.model ?? 'unknown',\n provider: this.meta.provider ?? 'unknown',\n })}\\n`;\n await fsp.writeFile(this.filePath, record, 'utf8');\n }\n\n /**\n * Idea #1 — write an in-flight marker. The agent loop should call\n * this at the start of each long-running operation; a matching\n * `clearInFlightMarker` follows on clean exit. A stale marker\n * (no end) is what `SessionRecovery.detectStale` looks for.\n */\n async writeInFlightMarker(context: string): Promise<void> {\n if (!context || context.length > 500) {\n throw new Error('In-flight context must be 1..500 chars');\n }\n await this.append({\n type: 'in_flight_start',\n ts: new Date().toISOString(),\n context,\n });\n this.events?.emit('in_flight.started', { context, ts: new Date().toISOString() });\n }\n\n /**\n * Idea #1 — close the in-flight marker. Idempotent in spirit\n * (you can call it after a successful iteration even if you\n * didn't open one this round) — but the session log records\n * every call so postmortem tooling can see \"the agent finished\n * cleanly X times, then died without finishing Y\".\n */\n async clearInFlightMarker(reason: 'clean' | 'aborted' | 'recovered'): Promise<void> {\n await this.append({\n type: 'in_flight_end',\n ts: new Date().toISOString(),\n reason,\n });\n this.events?.emit('in_flight.ended', { reason, ts: new Date().toISOString() });\n }\n}\n\nfunction userInputTitle(content: string | ContentBlock[]): string {\n const text =\n typeof content === 'string'\n ? content\n : content\n .filter((b): b is { type: 'text'; text: string } => b.type === 'text')\n .map((b) => b.text)\n .join(' ');\n return (text || '(non-text input)').slice(0, 60);\n}\n","import * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * The persisted form of a single queued user message. The TUI's\n * in-memory QueueItem has a render id; that's pure UI bookkeeping, so\n * we drop it when serializing — fresh ids are assigned on rehydrate.\n */\nexport interface PersistedQueueItem {\n displayText: string;\n blocks: ContentBlock[];\n}\n\n/**\n * Side-file storage for a session's pending input queue. Lives at\n * `<sessionDir>/queue.json` next to the attachment spool. Reads are\n * tolerant (missing/malformed file → empty array); writes are atomic\n * (tmp + rename) so a crash mid-write can never leave a partial file\n * the next launch would choke on.\n *\n * The contract is \"snapshot replacement\": every mutation hands the\n * full queue and we rewrite the file. The queue is small (rarely more\n * than a handful of messages), so this is cheaper than delta logging\n * and avoids the replay complexity.\n */\nexport class QueueStore {\n private readonly file: string;\n\n constructor(opts: { dir: string }) {\n this.file = path.join(opts.dir, 'queue.json');\n }\n\n async write(items: PersistedQueueItem[]): Promise<void> {\n if (items.length === 0) {\n // Empty queue → remove the file rather than write `[]`. Keeps\n // a clean idle state on disk and makes `read()` cheaper.\n await this.clear();\n return;\n }\n await atomicWrite(this.file, JSON.stringify(items), { mode: 0o600 });\n }\n\n async read(): Promise<PersistedQueueItem[]> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return [];\n console.warn(`[QueueStore] failed to read queue file \"${this.file}\":`, err instanceof Error ? err.message : String(err));\n return [];\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (!Array.isArray(parsed)) return [];\n const out: PersistedQueueItem[] = [];\n for (const v of parsed) {\n if (isPersistedQueueItem(v)) out.push(v);\n }\n return out;\n }\n\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n // Best-effort: a permission/lock error during clear is rare and\n // the queue slash command is non-critical. Warn so it's observable\n // but don't throw so the slash command doesn't crash.\n console.warn(`QueueStore.clear() failed for ${this.file}: ${(err as Error).message}`);\n }\n }\n}\n\nfunction isPersistedQueueItem(v: unknown): v is PersistedQueueItem {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return typeof o['displayText'] === 'string' && Array.isArray(o['blocks']);\n}\n","import { randomBytes } from 'node:crypto';\nimport * as fsp from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport type {\n AddAttachmentInput,\n Attachment,\n AttachmentKind,\n AttachmentRef,\n AttachmentStore,\n} from '../types/attachment.js';\nimport type { ContentBlock } from '../types/blocks.js';\n\nexport interface AttachmentStoreOptions {\n /**\n * Directory for spooling payloads larger than `spoolThresholdBytes`.\n * When omitted, all payloads stay in memory.\n */\n spoolDir?: string;\n spoolThresholdBytes?: number;\n}\n\nconst DEFAULT_SPOOL_THRESHOLD = 256 * 1024; // 256 KB\n// Two placeholder shapes:\n// - seq-keyed `[<kind> #<seq>…]` — kind is `pasted` / `image` / `file`. A\n// cosmetic suffix after the seq (e.g. `, 123 lines`) is tolerated so the\n// TUI can render `[pasted #1, 123 lines]` while still resolving by seq.\n// - path-keyed `[file:<path>]` — resolves to the most recent file ref whose\n// stored path matches, so the TUI can show a human-readable file chip.\nconst PLACEHOLDER_RE = /\\[(pasted|image|file) #(\\d+)[^\\]]*\\]|\\[file:([^\\]]+)\\]/g;\n\n/**\n * In-memory attachment store with optional disk spool. Placeholder syntax\n * is `[<kind> #<seq>]` (seq-keyed) or `[file:<path>]` (path-keyed) where kind\n * is `pasted` / `image` / `file`. Unknown placeholders are passed through\n * as-is so users can write that literal text without losing it.\n */\nexport class DefaultAttachmentStore implements AttachmentStore {\n private readonly items = new Map<string, Attachment>();\n private readonly refs: AttachmentRef[] = [];\n private nextSeq: Record<AttachmentKind, number> = { text: 0, image: 0, file: 0 };\n private readonly spoolDir: string | undefined;\n private readonly spoolThreshold: number;\n\n constructor(opts: AttachmentStoreOptions = {}) {\n this.spoolDir = opts.spoolDir;\n this.spoolThreshold = opts.spoolThresholdBytes ?? DEFAULT_SPOOL_THRESHOLD;\n }\n\n async add(input: AddAttachmentInput): Promise<AttachmentRef> {\n const seq = ++this.nextSeq[input.kind];\n const id = `${kindPrefix(input.kind)}-${seq}-${randomBytes(3).toString('hex')}`;\n const bytes = Buffer.byteLength(input.data, input.kind === 'image' ? 'base64' : 'utf8');\n let spooledPath: string | undefined;\n let data: string | undefined = input.data;\n if (this.spoolDir && bytes >= this.spoolThreshold) {\n await fsp.mkdir(this.spoolDir, { recursive: true });\n spooledPath = path.join(this.spoolDir, `${id}.bin`);\n // atomicWrite: torn spool would silently corrupt the attachment;\n // the user would see garbled output the next time it's expanded.\n await atomicWrite(spooledPath, input.data, {\n encoding: input.kind === 'image' ? 'base64' : 'utf8',\n });\n data = undefined;\n }\n const att: Attachment = {\n id,\n kind: input.kind,\n meta: input.meta ?? {},\n data,\n path: spooledPath,\n bytes,\n createdAt: new Date().toISOString(),\n };\n this.items.set(id, att);\n const ref: AttachmentRef = { id, kind: input.kind, seq, meta: att.meta };\n this.refs.push(ref);\n return ref;\n }\n\n async get(id: string): Promise<Attachment | undefined> {\n return this.items.get(id);\n }\n\n list(): AttachmentRef[] {\n return [...this.refs];\n }\n\n async expand(text: string): Promise<ContentBlock[]> {\n const matches = [...text.matchAll(PLACEHOLDER_RE)];\n if (matches.length === 0) return text ? [{ type: 'text', text }] : [];\n const blocks: ContentBlock[] = [];\n let lastIndex = 0;\n for (const m of matches) {\n const idx = m.index ?? 0;\n const before = text.slice(lastIndex, idx);\n if (before) blocks.push({ type: 'text', text: before });\n let ref: AttachmentRef | undefined;\n if (m[3] !== undefined) {\n // Path-keyed `[file:<path>]` — most recent matching file ref wins.\n const wantPath = m[3];\n ref = findLast(this.refs, (r) => r.kind === 'file' && refPath(r) === wantPath);\n } else {\n const kind = prefixToKind(m[1] as string);\n const seq = Number(m[2]);\n ref = this.refs.find((r) => r.kind === kind && r.seq === seq);\n }\n const att = ref ? this.items.get(ref.id) : undefined;\n if (!att) {\n blocks.push({ type: 'text', text: m[0] });\n } else {\n blocks.push(await this.toBlock(att));\n }\n lastIndex = idx + m[0].length;\n }\n const tail = text.slice(lastIndex);\n if (tail) blocks.push({ type: 'text', text: tail });\n return mergeAdjacentText(blocks);\n }\n\n async clear(): Promise<void> {\n // Unlink any spooled files so we don't leak disk space.\n if (this.spoolDir) {\n const toDelete: string[] = [];\n for (const att of this.items.values()) {\n if (att.path) toDelete.push(att.path);\n }\n await Promise.all(toDelete.map((p) => fsp.unlink(p).catch(() => undefined)));\n }\n this.items.clear();\n this.refs.length = 0;\n this.nextSeq = { text: 0, image: 0, file: 0 };\n }\n\n private async toBlock(att: Attachment): Promise<ContentBlock> {\n if (att.kind === 'image') {\n const data =\n att.data ?? (att.path ? await fsp.readFile(att.path, { encoding: 'base64' }) : '');\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: att.meta.mediaType ?? 'image/png',\n data,\n },\n };\n }\n const raw = att.data ?? (att.path ? await fsp.readFile(att.path, 'utf8') : '');\n const label = att.meta.filename ? `<file path=\"${att.meta.filename}\">` : '<pasted>';\n const close = att.meta.filename ? '</file>' : '</pasted>';\n return { type: 'text', text: `${label}\\n${raw}\\n${close}` };\n }\n}\n\nfunction kindPrefix(kind: AttachmentKind): string {\n return kind === 'text' ? 'pasted' : kind;\n}\n\nfunction prefixToKind(prefix: string): AttachmentKind {\n if (prefix === 'pasted') return 'text';\n if (prefix === 'image') return 'image';\n return 'file';\n}\n\n/** Path a file ref was registered under, for `[file:<path>]` lookup. */\nfunction refPath(ref: AttachmentRef): string | undefined {\n return ref.meta.filename ?? ref.meta.label;\n}\n\n/** Last element matching the predicate (Node < 20 lacks Array.findLast). */\nfunction findLast<T>(arr: readonly T[], pred: (v: T) => boolean): T | undefined {\n for (let i = arr.length - 1; i >= 0; i--) {\n if (pred(arr[i] as T)) return arr[i];\n }\n return undefined;\n}\n\nfunction mergeAdjacentText(blocks: ContentBlock[]): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n const prev = out[out.length - 1];\n if (b.type === 'text' && prev && prev.type === 'text') {\n prev.text += b.text;\n } else {\n out.push(b);\n }\n }\n return out;\n}\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { MemoryScope, MemoryStore } from '../types/memory.js';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nconst MAX_BYTES_TOTAL = 32_000; // ~8K tokens\n\nexport interface MemoryStoreOptions {\n paths: WstackPaths;\n}\n\n/**\n * Three scopes:\n * project-agents → <project>/.wrongstack/AGENTS.md (committed)\n * project-memory → ~/.wrongstack/projects/<hash>/memory.md (per-project agent notes)\n * user-memory → ~/.wrongstack/memory.md (global personal memory)\n */\nexport class DefaultMemoryStore implements MemoryStore {\n private readonly files: Record<MemoryScope, string>;\n /**\n * Per-scope serialization queue. `remember` / `forget` / `consolidate` /\n * `clear` are read-modify-write against a single file; without a lock,\n * two concurrent calls on the same scope can read the same baseline and\n * the later write silently drops the earlier entry. We chain each\n * mutation onto the prior promise for the same scope so they run in\n * issue order. Different scopes still proceed in parallel.\n *\n * The chain tracks only the last pending write. If a write fails, its\n * error is caught and swallowed so the chain stays alive for subsequent\n * calls. The error is stored in `writeErrors` so callers can learn about\n * it on the next read operation.\n */\n private readonly writeChain = new Map<MemoryScope, Promise<unknown>>();\n /** Last write error per scope — surfaced as warnings on the next readAll(). */\n private readonly writeErrors = new Map<MemoryScope, Error>();\n\n constructor(opts: MemoryStoreOptions) {\n this.files = {\n 'project-agents': opts.paths.inProjectAgentsFile,\n 'project-memory': opts.paths.projectMemory,\n 'user-memory': opts.paths.globalMemory,\n };\n }\n\n private async runSerialized<T>(scope: MemoryScope, work: () => Promise<T>): Promise<T> {\n const prior = this.writeChain.get(scope) ?? Promise.resolve();\n // Capture prior error so we can surface it, but don't block the chain.\n prior.catch((err) => {\n this.writeErrors.set(scope, err as Error);\n });\n const next = prior.catch(() => undefined).then(work);\n this.writeChain.set(scope, next as Promise<unknown>);\n try {\n return await next;\n } catch (err) {\n this.writeErrors.set(scope, err as Error);\n throw err;\n } finally {\n if (this.writeChain.get(scope) === next) {\n this.writeChain.delete(scope);\n }\n }\n }\n\n async readAll(): Promise<string> {\n const parts: string[] = [];\n for (const scope of ['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]) {\n const writeErr = this.writeErrors.get(scope);\n if (writeErr) {\n parts.push(`> ⚠️ Memory write error (${labelOf(scope)}): ${writeErr.message}`);\n }\n const body = await this.read(scope);\n if (body.trim()) parts.push(`## ${labelOf(scope)}\\n\\n${body.trim()}`);\n }\n return parts.join('\\n\\n');\n }\n\n async read(scope: MemoryScope): Promise<string> {\n try {\n return await fs.readFile(this.files[scope], 'utf8');\n } catch {\n return '';\n }\n }\n\n async remember(text: string, scope: MemoryScope = 'project-memory'): Promise<void> {\n return this.runSerialized(scope, async () => {\n const file = this.files[scope];\n await ensureDir(path.dirname(file));\n let existing = '';\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n // new file\n }\n const ts = new Date().toISOString();\n // Use a stable ID so forget() can target exact entries regardless of content.\n const id = `mem_${Date.now()}_${randomUUID().slice(0, 8)}`;\n const entry = `\\n- [${ts}] ${id} ${text.replace(/\\n/g, ' ')}\\n`;\n const next = existing.trim()\n ? existing.replace(/\\n+$/, '') + entry\n : `# WrongStack Memory\\n${entry}`;\n await atomicWrite(file, next);\n const buf = Buffer.byteLength(next, 'utf8');\n if (buf > MAX_BYTES_TOTAL) {\n // consolidate enqueues onto the same chain — call directly into the\n // inner implementation to avoid deadlocking on our own queue slot.\n await this.consolidateUnsafe(scope);\n }\n });\n }\n\n async forget(query: string, scope: MemoryScope = 'project-memory'): Promise<number> {\n return this.runSerialized(scope, async () => this.forgetUnsafe(query, scope));\n }\n\n private async forgetUnsafe(query: string, scope: MemoryScope): Promise<number> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return 0;\n }\n // Match by unique ID suffix (mem_<ts>_<rand>) embedded in the entry.\n // Fall back to case-insensitive content match for entries without an ID.\n const needle = query.toLowerCase();\n const idMatcher = /mem_\\d+_\\w+/;\n let removed = 0;\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n // If the query looks like an ID, match exactly; otherwise match content.\n if (idMatcher.test(query)) {\n // The entry ID appears right after the timestamp: \"- [ts] mem_<ts>_<rand> ...\"\n const afterBracket = trimmed.indexOf('] ');\n if (afterBracket !== -1) {\n const afterTs = trimmed.slice(afterBracket + 2);\n const entryIdMatch = /^mem_\\d+_\\w+/.exec(afterTs);\n if (entryIdMatch && entryIdMatch[0] === query) {\n removed++;\n return false;\n }\n }\n }\n // Fall back to content-based match (still useful for project-agents legacy entries)\n if (trimmed.toLowerCase().includes(needle)) {\n removed++;\n return false;\n }\n return true;\n });\n if (removed > 0) {\n await atomicWrite(file, lines.join('\\n'));\n }\n return removed;\n }\n\n async consolidate(scope: MemoryScope): Promise<void> {\n return this.runSerialized(scope, async () => this.consolidateUnsafe(scope));\n }\n\n private async consolidateUnsafe(scope: MemoryScope): Promise<void> {\n const file = this.files[scope];\n let existing: string;\n try {\n existing = await fs.readFile(file, 'utf8');\n } catch {\n return;\n }\n // Dedupe identical bullet lines (case-insensitive, ignoring per-entry\n // metadata: the leading \"[timestamp]\" and the \"mem_<ts>_<rand>\" ID).\n const seen = new Set<string>();\n const lines = existing.split('\\n').filter((line) => {\n const trimmed = line.trim();\n if (!trimmed.startsWith('- ')) return true;\n const norm = trimmed\n .replace(/\\[[^\\]]+\\]/, '')\n .replace(/\\bmem_\\d+_\\w+\\s*/, '')\n .trim()\n .toLowerCase();\n if (seen.has(norm)) return false;\n seen.add(norm);\n return true;\n });\n const next = lines.join('\\n');\n // Backup BEFORE the write so a crash leaves the original intact and\n // the backup reflects the pre-consolidation state. Best-effort so\n // ENOENT (new file) or permission errors don't block consolidation.\n const backup = `${file}.bak.${Date.now()}`;\n try {\n await fs.copyFile(file, backup);\n } catch {\n // best-effort\n }\n try {\n await atomicWrite(file, next);\n } catch {\n // If the write fails, the original file is untouched (atomicWrite\n // does write-to-temp + rename). We still keep the backup.\n return;\n }\n }\n\n async clear(scope?: MemoryScope): Promise<void> {\n if (scope) {\n await this.runSerialized(scope, async () => atomicWrite(this.files[scope], ''));\n return;\n }\n // Clear-all: serialize each scope independently so different scopes\n // still run in parallel, but each one waits for its own pending writes.\n await Promise.all(\n (['project-agents', 'project-memory', 'user-memory'] as MemoryScope[]).map((s) =>\n this.runSerialized(s, async () => atomicWrite(this.files[s], '')),\n ),\n );\n }\n}\n\nfunction labelOf(scope: MemoryScope): string {\n switch (scope) {\n case 'project-agents':\n return 'Project AGENTS.md';\n case 'project-memory':\n return 'Project memory';\n case 'user-memory':\n return 'User memory';\n }\n}\n","import type { Config, ConfigStore } from '../types/config.js';\n\n\n/**\n * Strip fields that originated from environment variables so they are never\n * persisted back to disk. This prevents an env-sourced secret (e.g.\n * WRONGSTACK_API_KEY) from being accidentally written to ~/.wrongstack/config.json.\n */\nfunction stripEphemeralFields(cfg: Partial<Config>): Partial<Config> {\n const env = (cfg as Partial<Config & { _envSource?: Set<string>}>)._envSource;\n if (!env?.size) return cfg;\n const out: Partial<Config> = { ...cfg };\n for (const field of env) {\n delete (out as Record<string, unknown>)[field];\n }\n delete (out as Record<string, unknown>)._envSource;\n return out;\n}\n\n/**\n * Reference implementation of `ConfigStore`. Stores a single frozen Config\n * and notifies watchers synchronously on every update. Updates use a deep\n * clone so callers can mutate their `partial` argument freely without\n * tainting state.\n *\n * For the CLI: instantiate once at boot, pass the store (not the Config)\n * to subsystems that care about runtime changes (provider switching,\n * extension reload).\n */\nexport class DefaultConfigStore implements ConfigStore {\n private current: Readonly<Config>;\n private watchers = new Set<(next: Readonly<Config>, prev: Readonly<Config>) => void>();\n\n constructor(initial: Config) {\n this.current = deepFreeze(structuredClone(initial));\n }\n\n get(): Readonly<Config> {\n return this.current;\n }\n\n getSection<K extends keyof Config>(key: K): Readonly<Config[K]> {\n return this.current[key] as Readonly<Config[K]>;\n }\n\n getExtension(pluginName: string): Readonly<Record<string, unknown>> {\n const ext = this.current.extensions?.[pluginName];\n return ext ? (ext as Readonly<Record<string, unknown>>) : FROZEN_EMPTY;\n }\n\n update(partial: Partial<Config>): Readonly<Config> {\n // Strip env-sourced fields before persisting to prevent secrets leaking\n // from in-memory env-derived config values into the on-disk config file.\n const scrubbed = stripEphemeralFields(partial);\n // Shallow merge — top-level fields replace, nested objects do too unless\n // the caller passes a fully-formed sub-object. That matches the JSON\n // config user mental model (replace `tools.maxIterations` by passing\n // the whole `tools` block, or by patching `extensions.<name>`).\n const next = deepFreeze(structuredClone({ ...this.current, ...scrubbed })) as Readonly<Config>;\n\n if (next.version !== 1) {\n throw new Error(`ConfigStore.update: version must remain 1, got ${String(next.version)}`);\n }\n\n const prev = this.current;\n this.current = next;\n // Notify watchers AFTER mutating `current` so re-entrant watcher reads\n // see the new state. Watcher exceptions are caught individually so one\n // misbehaving subscriber can't block the others.\n for (const w of this.watchers) {\n try {\n w(next, prev);\n } catch (err) {\n // A plugin watcher that crashes on /model switch or similar would\n // otherwise leave the system in a quietly-inconsistent state. We\n // still don't propagate (one bad subscriber must not break the\n // others), but we surface the error so it's discoverable.\n console.error('[config-store] watcher threw:', err);\n }\n }\n return next;\n }\n\n watch(cb: (next: Readonly<Config>, prev: Readonly<Config>) => void): () => void {\n this.watchers.add(cb);\n return () => this.watchers.delete(cb);\n }\n}\n\nconst FROZEN_EMPTY: Readonly<Record<string, unknown>> = Object.freeze({});\n\nfunction deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') return obj;\n if (Object.isFrozen(obj)) return obj;\n for (const key of Object.keys(obj as object)) {\n const v = (obj as Record<string, unknown>)[key];\n if (v !== null && typeof v === 'object' && !Object.isFrozen(v)) {\n deepFreeze(v);\n }\n }\n return Object.freeze(obj);\n}\n","import type { SecretVault } from '../types/secret-vault.js';\n\n/**\n * Walk a Config-shaped object and decrypt any apiKey-like fields in place,\n * returning a new object. Used by the config loader so the rest of the\n * system never has to know about the wire format.\n */\nexport function decryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n // A single corrupted/malformed encrypted field should not kill the entire\n // config load. Swallow per-field decrypt errors (zero the field so callers\n // see \"missing key\" instead of holding ciphertext) and surface a warning.\n return walk(cfg, vault, (v, key) => {\n try {\n return vault.decrypt(v);\n } catch (err) {\n console.warn(\n `[secret-vault] Failed to decrypt \"${key}\":`,\n err instanceof Error ? err.message : err,\n );\n return '';\n }\n });\n}\n\nexport function encryptConfigSecrets<T>(cfg: T, vault: SecretVault): T {\n return walk(cfg, vault, (v) => vault.encrypt(v));\n}\n\nfunction walk<T>(node: T, vault: SecretVault, transform: (s: string, key: string) => string): T {\n if (node === null || node === undefined) return node;\n if (typeof node !== 'object') return node;\n if (Array.isArray(node)) {\n return node.map((item) => walk(item, vault, transform)) as unknown as T;\n }\n // Use Object.create(null) to prevent prototype pollution — a crafted key\n // like \"__proto__\" in the input would otherwise corrupt Object.prototype.\n const out: Record<string, unknown> = Object.create(null);\n for (const [k, v] of Object.entries(node as Record<string, unknown>)) {\n if (typeof v === 'string' && isSecretField(k)) {\n out[k] = transform(v, k);\n } else if (typeof v === 'object' && v !== null) {\n out[k] = walk(v, vault, transform);\n } else {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A key is treated as secret-bearing if its name (case-insensitive) contains\n * one of these tokens. Captures common variants like `apiKey`, `authToken`,\n * `refreshToken`, `sessionKey`, `password`, `client_secret`, `bearer`, etc.\n */\nconst SECRET_KEY_PATTERN =\n /(?:apikey|api_key|authtoken|auth_token|bearer|secret|password|passwd|pwd|refreshtoken|refresh_token|sessionkey|session_key|access[_-]?token|private[_-]?key)/i;\n\n// Field names that contain the literal substring \"key\" but are not secrets.\n// Keep this list short; the substring rule itself is intentionally narrow.\nconst NON_SECRET_OVERRIDES = new Set(['publickey', 'public_key']);\n\nexport function isSecretField(name: string): boolean {\n const lc = name.toLowerCase();\n if (NON_SECRET_OVERRIDES.has(lc)) return false;\n return SECRET_KEY_PATTERN.test(lc);\n}\n","export type ContextWindowModeId = 'balanced' | 'frugal' | 'deep' | 'archival';\n\nexport type ContextWindowAggressiveOn = 'hard' | 'soft' | 'warn';\n\nexport interface ContextWindowThresholds {\n warn: number;\n soft: number;\n hard: number;\n}\n\nexport interface ContextWindowMode {\n id: ContextWindowModeId;\n name: string;\n description: string;\n thresholds: ContextWindowThresholds;\n aggressiveOn: ContextWindowAggressiveOn;\n preserveK: number;\n eliseThreshold: number;\n targetLoad: number;\n}\n\nexport interface ContextWindowPolicy extends ContextWindowMode {}\n\nexport interface ContextWindowConfigLike {\n mode?: ContextWindowModeId | string;\n warnThreshold?: number;\n softThreshold?: number;\n hardThreshold?: number;\n preserveK?: number;\n eliseThreshold?: number;\n}\n\nexport const DEFAULT_CONTEXT_WINDOW_MODE_ID: ContextWindowModeId = 'balanced';\n\nexport const CONTEXT_WINDOW_MODES: readonly ContextWindowMode[] = Object.freeze([\n {\n id: 'balanced',\n name: 'Balanced',\n description: 'Default rolling compaction: recent work stays verbatim, old tool output is trimmed.',\n thresholds: { warn: 0.6, soft: 0.75, hard: 0.9 },\n aggressiveOn: 'soft',\n preserveK: 10,\n eliseThreshold: 2000,\n targetLoad: 0.65,\n },\n {\n id: 'frugal',\n name: 'Frugal',\n description: 'Token-saver mode: compacts early and keeps a tighter verbatim tail.',\n thresholds: { warn: 0.45, soft: 0.6, hard: 0.75 },\n aggressiveOn: 'warn',\n preserveK: 6,\n eliseThreshold: 700,\n targetLoad: 0.5,\n },\n {\n id: 'deep',\n name: 'Deep',\n description: 'Long-reasoning mode: delays compaction and keeps more recent turns intact.',\n thresholds: { warn: 0.72, soft: 0.86, hard: 0.96 },\n aggressiveOn: 'hard',\n preserveK: 18,\n eliseThreshold: 5000,\n targetLoad: 0.78,\n },\n {\n id: 'archival',\n name: 'Archival',\n description: 'Decision-preserving mode: compacts steadily while keeping summaries prominent.',\n thresholds: { warn: 0.55, soft: 0.7, hard: 0.84 },\n aggressiveOn: 'soft',\n preserveK: 8,\n eliseThreshold: 1200,\n targetLoad: 0.58,\n },\n]);\n\nexport function listContextWindowModes(): ContextWindowMode[] {\n return CONTEXT_WINDOW_MODES.map((m) => ({ ...m, thresholds: { ...m.thresholds } }));\n}\n\nexport function getContextWindowMode(id: string | null | undefined): ContextWindowMode | null {\n if (!id) return null;\n const mode = CONTEXT_WINDOW_MODES.find((m) => m.id === id);\n return mode ? { ...mode, thresholds: { ...mode.thresholds } } : null;\n}\n\nexport function isContextWindowModeId(id: string): id is ContextWindowModeId {\n return CONTEXT_WINDOW_MODES.some((m) => m.id === id);\n}\n\nexport function resolveContextWindowPolicy(\n config: ContextWindowConfigLike = {},\n overrideMode?: string | null,\n): ContextWindowPolicy {\n const requested = overrideMode ?? config.mode ?? DEFAULT_CONTEXT_WINDOW_MODE_ID;\n const mode = getContextWindowMode(requested) ?? getContextWindowMode(DEFAULT_CONTEXT_WINDOW_MODE_ID)!;\n\n if (mode.id !== DEFAULT_CONTEXT_WINDOW_MODE_ID) {\n return mode;\n }\n\n return {\n ...mode,\n thresholds: {\n warn: config.warnThreshold ?? mode.thresholds.warn,\n soft: config.softThreshold ?? mode.thresholds.soft,\n hard: config.hardThreshold ?? mode.thresholds.hard,\n },\n preserveK: config.preserveK ?? mode.preserveK,\n eliseThreshold: config.eliseThreshold ?? mode.eliseThreshold,\n };\n}\n\nexport function formatContextWindowModeList(activeId?: string | null): string {\n return CONTEXT_WINDOW_MODES.map((m) => {\n const marker = m.id === activeId ? '*' : ' ';\n return `${marker} ${m.id.padEnd(9)} ${m.name} - ${m.description}`;\n }).join('\\n');\n}\n","export interface SafeParseResult<T> {\n ok: boolean;\n value?: T;\n error?: string;\n}\n\nexport function safeParse<T = unknown>(input: string, maxBytes = 5_000_000): SafeParseResult<T> {\n if (input.length > maxBytes) {\n return { ok: false, error: `Input exceeds limit (${maxBytes} bytes)` };\n }\n try {\n return { ok: true, value: JSON.parse(input) as T };\n } catch (err) {\n return {\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\nexport function safeStringify(value: unknown, pretty = false): string {\n const seen = new WeakSet();\n const replacer = (_k: string, v: unknown): unknown => {\n if (typeof v === 'bigint') return v.toString();\n if (v instanceof Error) {\n return { name: v.name, message: v.message, stack: v.stack };\n }\n if (typeof v === 'object' && v !== null) {\n if (seen.has(v as object)) return '[Circular]';\n seen.add(v as object);\n }\n return v;\n };\n try {\n return JSON.stringify(value, replacer, pretty ? 2 : undefined) ?? 'null';\n } catch (err) {\n return JSON.stringify({\n __serialization_error: err instanceof Error ? err.message : String(err),\n });\n }\n}\n\n/**\n * Attempt to parse JSON5-style input and return a valid JSON string.\n * Handles trailing commas, single-line comments, and unquoted keys\n * that are common in provider output.\n *\n * Returns the sanitized string if it parses successfully as JSON,\n * or `null` if the input cannot be made valid. Callers use this to\n * decide whether to proceed with the parsed result or fall back to\n * raw handling.\n */\nexport function sanitizeJsonString(s: string): string | null {\n let out = s.trim();\n\n // Stage 1: strip single-line comments (// to end of line) that appear\n // outside of string values. This is a heuristic: comments inside strings\n // are preserved because we only strip // when preceded by a char that\n // strongly suggests we're not in a string (quote count modulo 2 is even).\n out = stripSingleLineComments(out);\n\n // Stage 2: strip trailing commas before } or ]\n out = out.replace(/,(\\s*[}\\]])/g, '$1');\n\n // Stage 3: escape literal control characters that appear *inside* string\n // values. Models frequently emit raw newlines/tabs inside a code payload\n // (e.g. edit's old_string/new_string) instead of the required \\n / \\t, which\n // makes JSON.parse throw. This is the single most common malformed-args case.\n out = escapeControlCharsInStrings(out);\n\n // Stage 4: attempt full parse; return null if it fails so callers can\n // distinguish \"already valid JSON\" from \"unrecoverable\".\n try {\n JSON.parse(out);\n return out;\n } catch {\n return null; // stripped but still not valid JSON; caller handles it\n }\n}\n\n/**\n * Walk the string tracking whether we are inside a JSON string literal and\n * replace raw control characters (U+0000–U+001F) that appear inside strings\n * with their valid JSON escape sequences. Characters outside strings are left\n * untouched (insignificant whitespace stays as-is). Already-escaped sequences\n * are not double-escaped because we only act on *literal* control bytes.\n */\nfunction escapeControlCharsInStrings(s: string): string {\n let inString = false;\n let out = '';\n for (let i = 0; i < s.length; i++) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n out += c;\n continue;\n }\n const code = c.charCodeAt(0);\n if (inString && code < 0x20) {\n switch (c) {\n case '\\n':\n out += '\\\\n';\n break;\n case '\\r':\n out += '\\\\r';\n break;\n case '\\t':\n out += '\\\\t';\n break;\n case '\\b':\n out += '\\\\b';\n break;\n case '\\f':\n out += '\\\\f';\n break;\n default:\n out += `\\\\u${code.toString(16).padStart(4, '0')}`;\n }\n continue;\n }\n out += c;\n }\n return out;\n}\n\nfunction stripSingleLineComments(s: string): string {\n let inString = false;\n const chars: string[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i]!;\n if (c === '\"' && (i === 0 || s[i - 1] !== '\\\\')) {\n inString = !inString;\n chars.push(c);\n } else if (c === '/' && s[i + 1] === '/' && !inString) {\n // skip to end of line\n while (i < s.length && s[i] !== '\\n') i++;\n } else {\n chars.push(c);\n }\n i++;\n }\n return chars.join('');\n}\n","/**\n * Shared configuration constants used across execution, storage, CLI, and WebUI.\n * Centralized here to avoid cross-domain import cycles.\n */\n\n/** Default tools config — mirrors values baked into BEHAVIOR_DEFAULTS. */\nexport const DEFAULT_TOOLS_CONFIG = Object.freeze({\n defaultExecutionStrategy: 'smart',\n maxIterations: 100,\n iterationTimeoutMs: 300_000,\n sessionTimeoutMs: 1_800_000,\n perIterationOutputCapBytes: 100_000,\n autoExtendLimit: true,\n});\n\n/** Default context config — mirrors BEHAVIOR_DEFAULTS.context. */\nexport const DEFAULT_CONTEXT_CONFIG = Object.freeze({\n preserveK: 10,\n eliseThreshold: 2000,\n});\n\n/** Default autonomy config — auto-proceed delay etc. */\nexport const DEFAULT_AUTONOMY_CONFIG = Object.freeze({\n autoProceedDelayMs: 45_000,\n});\n\n/** Default session logging / audit configuration. */\nexport const DEFAULT_SESSION_LOGGING_CONFIG = Object.freeze({\n auditLevel: 'standard' as const,\n sampling: {\n toolProgress: {\n sampleRate: 8,\n },\n },\n});","import * as fs from 'node:fs/promises';\nimport { decryptConfigSecrets } from '../security/config-secrets.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport {\n DEFAULT_CONTEXT_WINDOW_MODE_ID,\n isContextWindowModeId,\n listContextWindowModes,\n} from '../types/context-window.js';\nimport type { Config, ConfigLoader, SyncConfig } from '../types/config.js';\nimport type { SecretVault } from '../types/secret-vault.js';\nimport { safeParse } from '../utils/safe-json.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\nimport {\n DEFAULT_TOOLS_CONFIG,\n DEFAULT_CONTEXT_CONFIG,\n DEFAULT_SESSION_LOGGING_CONFIG,\n} from '../types/default-config.js';\n\n/**\n * Defaults express *behavior*, not identity. Provider and model are NOT\n * hardcoded — they must be resolved at runtime from config + env + the\n * ModelsRegistry. A bare Config returned by this loader will throw when\n * the agent tries to construct a provider, with a message that points\n * users at `wstack init`.\n */\nconst BEHAVIOR_DEFAULTS: Omit<Config, 'provider' | 'model'> = {\n version: 1,\n context: {\n mode: DEFAULT_CONTEXT_WINDOW_MODE_ID,\n warnThreshold: 0.6,\n softThreshold: 0.75,\n hardThreshold: 0.9,\n autoCompact: true,\n preserveK: DEFAULT_CONTEXT_CONFIG.preserveK,\n eliseThreshold: DEFAULT_CONTEXT_CONFIG.eliseThreshold,\n },\n tools: {\n defaultExecutionStrategy: DEFAULT_TOOLS_CONFIG.defaultExecutionStrategy,\n maxIterations: DEFAULT_TOOLS_CONFIG.maxIterations,\n iterationTimeoutMs: DEFAULT_TOOLS_CONFIG.iterationTimeoutMs,\n sessionTimeoutMs: DEFAULT_TOOLS_CONFIG.sessionTimeoutMs,\n perIterationOutputCapBytes: DEFAULT_TOOLS_CONFIG.perIterationOutputCapBytes,\n autoExtendLimit: DEFAULT_TOOLS_CONFIG.autoExtendLimit,\n },\n log: { level: 'info' },\n features: {\n mcp: true,\n plugins: true,\n memory: true,\n modelsRegistry: true,\n skills: true,\n },\n session: { ...DEFAULT_SESSION_LOGGING_CONFIG },\n};\n\nconst ENV_MAP: Record<string, (cfg: PartialConfig, val: string) => void> = {\n WRONGSTACK_PROVIDER: (c, v) => {\n c.provider = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('provider');\n },\n WRONGSTACK_MODEL: (c, v) => {\n c.model = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('model');\n },\n WRONGSTACK_API_KEY: (c, v) => {\n c.apiKey = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('apiKey');\n },\n WRONGSTACK_BASE_URL: (c, v) => {\n c.baseUrl = v;\n if (c._envSource === undefined) c._envSource = new Set();\n c._envSource.add('baseUrl');\n },\n WRONGSTACK_LOG_LEVEL: (c, v) => {\n if (!c.log) c.log = { level: 'info' };\n c.log.level = v as Config['log']['level'];\n },\n};\n\ntype PartialConfig = Partial<Config> & {\n providers?: Record<string, { apiKey?: string; baseUrl?: string; type?: string }>;\n /** Fields that came from environment variables — must not be persisted. */\n _envSource?: Set<string>;\n};\n\nfunction isPrimitiveArray(a: unknown[]): boolean {\n return a.every((v) => v === null || typeof v !== 'object');\n}\n\nconst FORBIDDEN_PROTO_KEYS = new Set([\n '__proto__',\n 'constructor',\n 'prototype',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__',\n]);\n\nfunction deepMerge<T>(base: T, patch: Partial<T>): T {\n if (typeof base !== 'object' || base === null) return (patch as T) ?? base;\n if (typeof patch !== 'object' || patch === null) return base;\n const out: Record<string, unknown> = { ...(base as Record<string, unknown>) };\n for (const [k, v] of Object.entries(patch as Record<string, unknown>)) {\n // Defense in depth — user config is parsed from JSON and merged\n // recursively; blocking these keys eliminates prototype-pollution\n // gadgets regardless of where else they might be touched.\n if (FORBIDDEN_PROTO_KEYS.has(k)) continue;\n const existing = out[k];\n // Primitive arrays (plugins, tools, etc.) are merged by concatenation.\n // Object arrays (MCP servers, etc.) are replaced wholesale.\n if (Array.isArray(v)) {\n if (Array.isArray(existing) && isPrimitiveArray(v) && isPrimitiveArray(existing)) {\n out[k] = [...new Set([...existing, ...v])];\n } else {\n out[k] = v;\n if (process.env.WRONGSTACK_DEBUG_CONFIG) {\n console.warn(\n `[config] Non-primitive array for \"${k}\" replaced (global + local config merge). ` +\n `Global entries: ${(existing as unknown[] | undefined)?.length ?? 0}, local entries: ${v.length}.`,\n );\n }\n }\n } else if (\n typeof v === 'object' &&\n v !== null &&\n typeof existing === 'object' &&\n existing !== null\n ) {\n out[k] = deepMerge(existing, v as Record<string, unknown>);\n } else if (v !== undefined) {\n out[k] = v;\n }\n }\n return out as T;\n}\n\n/**\n * A single config source. Higher priority wins in merges.\n * Sources are applied in priority order (lowest first), so a source\n * with priority=10 overrides one with priority=1.\n */\nexport interface ConfigSource {\n /** Unique name for debugging and error messages. */\n name: string;\n /** Lower numbers merge first, higher numbers override lower. Default: 50. */\n priority?: number;\n /**\n * Read the raw config patch. Return an empty object if unavailable.\n * Errors are surfaced but do not abort loading — the source is skipped.\n */\n read(): Promise<Partial<Config>>;\n}\n\nexport interface ConfigLoaderOptions {\n paths: WstackPaths;\n strict?: boolean;\n vault?: SecretVault;\n /** Extra sources merged after the built-in layers. */\n sources?: ConfigSource[];\n}\n\nexport class DefaultConfigLoader implements ConfigLoader {\n private readonly paths: WstackPaths;\n private readonly strict: boolean;\n private readonly vault: SecretVault | undefined;\n private readonly extraSources: ConfigSource[];\n\n constructor(opts: ConfigLoaderOptions) {\n this.paths = opts.paths;\n this.strict = opts.strict ?? false;\n this.vault = opts.vault;\n this.extraSources = opts.sources ?? [];\n }\n\n async load(opts: { cliFlags?: Partial<Config>; cwd?: string } = {}): Promise<Config> {\n let cfg: PartialConfig = { ...BEHAVIOR_DEFAULTS } as PartialConfig;\n\n // Layer 2 & 3: global + project-local config — read in parallel\n const [global, local] = await Promise.all([\n this.readJson(this.paths.globalConfig),\n this.readJson(this.paths.projectLocalConfig),\n ]);\n cfg = deepMerge(cfg, global);\n cfg = deepMerge(cfg, local);\n\n // Layer 4: env vars\n for (const [key, fn] of Object.entries(ENV_MAP)) {\n const v = process.env[key];\n if (v) fn(cfg, v);\n }\n\n // Layer 5: extra sources — sorted by priority (lowest first).\n // When priorities tie, sort by name for deterministic order.\n const sorted = [...this.extraSources].sort((a, b) => {\n const pd = (a.priority ?? 50) - (b.priority ?? 50);\n if (pd !== 0) return pd;\n return a.name.localeCompare(b.name);\n });\n for (const src of sorted) {\n try {\n const patch = await src.read();\n if (patch && Object.keys(patch).length > 0) {\n cfg = deepMerge(cfg, patch);\n }\n } catch (err) {\n // Best-effort: skip failing sources so one bad source doesn't block boot.\n console.warn(`Config source \"${src.name}\" failed`, err);\n }\n }\n\n // Layer 6: CLI flags\n if (opts.cliFlags) {\n cfg = deepMerge(cfg, opts.cliFlags);\n }\n\n // Decrypt apiKey-like fields if a vault is configured.\n if (this.vault) {\n cfg = decryptConfigSecrets(cfg, this.vault);\n }\n\n // Multi-key resolution: when a provider has `apiKeys[]` configured,\n // mirror the active entry into `apiKey` so downstream construction\n // code (provider registry, wire adapters) needs no changes. Honors\n // `activeKey` (by label), else falls back to the first entry. A\n // pre-existing `apiKey` set by env/CLI flags wins so an explicit\n // override still beats the saved list.\n if (cfg.providers) {\n for (const pcfg of Object.values(cfg.providers)) {\n if (!pcfg || typeof pcfg !== 'object') continue;\n const rawKeys = (pcfg as { apiKeys?: unknown }).apiKeys;\n if (!Array.isArray(rawKeys) || rawKeys.length === 0) continue;\n // Each apiKeys entry came from arbitrary JSON. Filter to entries\n // that actually have a string apiKey + label so a malformed array\n // (null entry, missing field) doesn't crash the .find / chosen.apiKey\n // path below.\n const keys = rawKeys.filter(\n (k): k is { label: string; apiKey: string } =>\n !!k &&\n typeof k === 'object' &&\n typeof (k as { label?: unknown }).label === 'string' &&\n typeof (k as { apiKey?: unknown }).apiKey === 'string',\n );\n if (keys.length === 0) continue;\n const existing = (pcfg as { apiKey?: string }).apiKey;\n if (existing && existing.length > 0) continue;\n const activeLabel = (pcfg as { activeKey?: string }).activeKey;\n const chosen = activeLabel\n ? (keys.find((k) => k.label === activeLabel) ?? keys[0])\n : keys[0];\n if (chosen?.apiKey) {\n (pcfg as { apiKey?: string }).apiKey = chosen.apiKey;\n }\n }\n }\n\n this.validateBehavior(cfg);\n if (this.strict) {\n this.validateIdentity(cfg);\n }\n // In strict mode, validateIdentity has confirmed provider/model are set;\n // it's safe to assert the full Config contract. In non-strict mode the\n // caller (e.g. early-boot wizard) accepts a Partial and constructs the\n // provider later, so we deliberately return without the cast.\n return Object.freeze(cfg) as Config;\n }\n\n /**\n * Persist a sync config to ~/.wrongstack/sync.json, with the token encrypted\n * by the vault (if provided). The file is isolated from the main config\n * hierarchy to prevent accidental commits.\n */\n async persistSyncConfig(cfg: SyncConfig): Promise<void> {\n let toWrite = { ...cfg };\n if (this.vault && toWrite.githubToken && !toWrite.githubToken.startsWith('enc:')) {\n // Re-encrypt if plaintext (e.g. came from in-memory configStore update\n // rather than direct /sync enable call). Idempotent for already-encrypted.\n toWrite = { ...toWrite, githubToken: this.vault.encrypt(toWrite.githubToken) };\n }\n await atomicWrite(this.paths.syncConfig, JSON.stringify(toWrite, null, 2), { mode: 0o600 });\n }\n\n /**\n * Read ~/.wrongstack/sync.json (encrypted GitHub token storage) and decrypt\n * the token if a vault is available. Returns null if the file doesn't exist.\n * This is separate from main config loading because sync.json is intentionally\n * isolated — it should never be part of project-local or env-driven config.\n */\n async loadSyncConfig(): Promise<SyncConfig | null> {\n try {\n const raw = await fs.readFile(this.paths.syncConfig, 'utf8');\n const parsed = safeParse<SyncConfig>(raw);\n if (!parsed.ok || !parsed.value) return null;\n\n // Decrypt the token if vault is available (field name matches secret pattern)\n if (this.vault) {\n const decrypted = decryptConfigSecrets({ sync: parsed.value } as PartialConfig, this.vault);\n return (decrypted as { sync: SyncConfig }).sync ?? null;\n }\n return parsed.value;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n console.warn('[config] Failed to load sync config:', err);\n return null;\n }\n }\n\n private async readJson(file: string): Promise<PartialConfig> {\n let raw: string;\n try {\n raw = await fs.readFile(file, 'utf8');\n } catch (err) {\n // Missing file is the common case (per-project local config rarely\n // exists at start). Surface anything else (EACCES, EISDIR) so a\n // mis-permissioned config doesn't silently fall back to defaults.\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') {\n console.warn(`[config] Failed to read \"${file}\":`, err);\n }\n return {};\n }\n const parsed = safeParse<PartialConfig>(raw);\n if (!parsed.ok || !parsed.value) {\n // The file exists but isn't valid JSON. Don't silently reset to\n // defaults — that's hours of debug timesink for users who'd typo'd\n // their config. Warn loudly and keep the in-memory defaults.\n console.warn(\n `[config] Failed to parse \"${file}\": invalid JSON. Falling back to defaults for this layer.`,\n );\n return {};\n }\n return parsed.value;\n }\n\n private validateBehavior(cfg: PartialConfig): void {\n if (cfg.version === undefined) throw new Error('Config: missing version field');\n if (cfg.version !== 1) throw new Error(`Config: unsupported version ${cfg.version}`);\n const c = cfg.context;\n if (!c) throw new Error('Config: missing context section');\n // A user-edited config.json can land strings here (\"0.6\") and slip past\n // truthiness checks; the `>=` comparison then coerces silently and the\n // threshold ordering check passes for nonsense values. Validate types\n // explicitly so misconfigs surface here, not as confusing failures deep\n // in the auto-compaction logic.\n const fields: Array<keyof typeof c> = ['warnThreshold', 'softThreshold', 'hardThreshold'];\n for (const f of fields) {\n const v = c[f];\n if (typeof v !== 'number' || !Number.isFinite(v)) {\n throw new Error(`Config: context.${String(f)} must be a finite number (got ${typeof v})`);\n }\n }\n if (c.warnThreshold >= c.softThreshold || c.softThreshold >= c.hardThreshold) {\n throw new Error('Config: context thresholds must satisfy warn < soft < hard');\n }\n if (c.mode !== undefined && !isContextWindowModeId(c.mode)) {\n // An unknown mode (typo or value from an older/renamed scheme) should not\n // brick the CLI — unlike the numeric thresholds above there is a safe\n // default. Warn and fall back rather than throwing.\n const known = listContextWindowModes().map((m) => m.id).join(', ');\n console.warn(\n `[config] Ignoring unknown context.mode \"${c.mode}\" (expected one of: ${known}); ` +\n `falling back to \"${DEFAULT_CONTEXT_WINDOW_MODE_ID}\".`,\n );\n c.mode = DEFAULT_CONTEXT_WINDOW_MODE_ID;\n }\n }\n\n private validateIdentity(cfg: PartialConfig): void {\n if (!cfg.provider) {\n throw new Error(\n 'Config: no provider configured. Run `wstack init` or set WRONGSTACK_PROVIDER.',\n );\n }\n if (!cfg.model) {\n throw new Error('Config: no model configured. Run `wstack init` or set WRONGSTACK_MODEL.');\n }\n }\n}\n","/**\n * L2-D: Config version migration framework. Pure functions, decoupled\n * from disk/CLI — caller passes a parsed JSON object and gets back the\n * up-to-date `Config` shape (or a structured error explaining why\n * migration failed).\n *\n * Migrations are registered as `{ from, to, migrate }` triples and run\n * sequentially. Each migration is independently testable. Adding a new\n * version means appending one migration; existing user configs are\n * upgraded in place at load time.\n */\n\nexport interface MigrationContext {\n /**\n * Original on-disk version of the input. Migrations may use this to\n * decide between in-place patches and rewrites.\n */\n fromVersion: number;\n /**\n * Set when the migration writes back to disk. Callers persist the\n * migrated config when this is true so the user doesn't see the same\n * migration banner on every boot.\n */\n shouldPersist: boolean;\n}\n\nexport interface ConfigMigration {\n /** Version of the input this migration accepts. */\n from: number;\n /** Version of the output it produces. */\n to: number;\n /** Pure transform — no I/O. */\n migrate(input: Record<string, unknown>, ctx: MigrationContext): Record<string, unknown>;\n /** Optional human-readable description for migration logs / banners. */\n describe?: string;\n}\n\nexport interface MigrationResult {\n /** Final config (still typed as `unknown`-keyed — caller validates). */\n config: Record<string, unknown>;\n /** Ordered list of `from→to` versions that ran. */\n applied: string[];\n /** True when at least one migration produced changes worth persisting. */\n shouldPersist: boolean;\n}\n\nexport class ConfigMigrationError extends Error {\n readonly fromVersion: number;\n readonly targetVersion: number;\n readonly missingStep: number | null;\n\n constructor(opts: {\n message: string;\n fromVersion: number;\n targetVersion: number;\n missingStep: number | null;\n }) {\n super(opts.message);\n this.name = 'ConfigMigrationError';\n this.fromVersion = opts.fromVersion;\n this.targetVersion = opts.targetVersion;\n this.missingStep = opts.missingStep;\n }\n}\n\n/**\n * Run registered migrations until the input reaches `targetVersion`.\n *\n * Resolution rules:\n * 1. If `input.version === targetVersion`, no migrations run; `shouldPersist`\n * is false.\n * 2. Otherwise walk the migration chain from `input.version` upward,\n * picking the migration whose `from` matches the current version.\n * 3. Stop when `current.version === targetVersion`.\n * 4. If no migration matches at some point, throw `ConfigMigrationError`\n * with the missing step recorded for diagnostics.\n *\n * Migrations may be downward (e.g. for staged rollouts), but `targetVersion`\n * must be reachable strictly via the registered chain — there's no implicit\n * \"skip\" or transitive resolution.\n */\nexport function runConfigMigrations(\n input: Record<string, unknown>,\n targetVersion: number,\n migrations: readonly ConfigMigration[],\n): MigrationResult {\n const initial = typeof input['version'] === 'number' ? (input['version'] as number) : 1;\n let current: Record<string, unknown> = { ...input };\n let currentVersion = initial;\n const applied: string[] = [];\n let shouldPersist = false;\n\n let guard = 0;\n while (currentVersion !== targetVersion) {\n if (++guard > 100) {\n throw new ConfigMigrationError({\n message: `Config migration looped past 100 steps (from v${initial} toward v${targetVersion})`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const step = migrations.find((m) => m.from === currentVersion);\n if (!step) {\n throw new ConfigMigrationError({\n message: `No migration registered from config v${currentVersion} (target v${targetVersion}). Update the framework or revert the config file.`,\n fromVersion: initial,\n targetVersion,\n missingStep: currentVersion,\n });\n }\n const ctx: MigrationContext = { fromVersion: currentVersion, shouldPersist: false };\n const next = step.migrate(current, ctx);\n // Ensure the migration set the new version. Be tolerant: if it didn't,\n // patch it in so the chain doesn't infinite-loop on author oversight.\n if (typeof next['version'] !== 'number' || next['version'] !== step.to) {\n next['version'] = step.to;\n }\n current = next;\n currentVersion = step.to;\n applied.push(`v${step.from}→v${step.to}`);\n shouldPersist = shouldPersist || ctx.shouldPersist || step.from < step.to;\n }\n return { config: current, applied, shouldPersist };\n}\n\n/**\n * Default empty migration registry. Real migrations are appended as new\n * Config versions are introduced. Example (when v2 lands):\n *\n * export const CONFIG_MIGRATIONS: readonly ConfigMigration[] = [\n * {\n * from: 1, to: 2, describe: 'rename `apiKey` → `auth.apiKey`',\n * migrate(cfg) {\n * const apiKey = cfg.apiKey;\n * delete cfg.apiKey;\n * return { ...cfg, auth: { ...(cfg.auth ?? {}), apiKey } };\n * },\n * },\n * ];\n */\nexport const DEFAULT_CONFIG_MIGRATIONS: readonly ConfigMigration[] = [];\n","import * as fsp from 'node:fs/promises';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport type { SessionStore } from '../types/session.js';\nimport { ensureDir } from '../utils/atomic-write.js';\n\n/**\n * Per-project lockfile used for crash detection. The CLI writes one of\n * these alongside the session JSONLs (`<projectSessions>/active.json`)\n * when an interactive run starts, and deletes it on clean exit. If we\n * find one on the next launch whose owning PID is dead (or whose host\n * doesn't match), we know the previous run was killed mid-flight and\n * the session it was writing to is a recovery candidate.\n *\n * The lockfile is intentionally per-project (already isolated by\n * `wpaths.projectSessions`), so two TUIs in two different repos do not\n * fight each other.\n */\nexport interface RecoveryLockOptions {\n /** Directory the lockfile lives in. Usually `wpaths.projectSessions`. */\n dir: string;\n /** This process's PID. Default: `process.pid`. */\n pid?: number;\n /** Hostname recorded for the lock. Default: `os.hostname()`. */\n hostname?: string;\n /** Locks older than this are considered orphaned (disk wiped, etc.). Default 24h. */\n maxAgeMs?: number;\n /** Used to check whether the abandoned session was actually closed cleanly. */\n sessionStore?: SessionStore;\n /**\n * Override the PID-liveness probe. Default: `process.kill(pid, 0)` —\n * succeeds (or throws EPERM) when the PID is alive, throws ESRCH when\n * it is gone. Tests inject a deterministic stub.\n */\n isPidAlive?: (pid: number) => boolean;\n}\n\nexport interface AbandonedSession {\n sessionId: string;\n pid: number;\n startedAt: string;\n /** Lockfile age in ms at the time of the check. */\n ageMs: number;\n /** Number of messages already on disk for this session. */\n messageCount: number;\n}\n\ninterface LockFile {\n v: 1;\n sessionId: string;\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\nconst LOCK_FILE = 'active.json';\nconst DEFAULT_MAX_AGE_MS = 24 * 60 * 60 * 1000;\n\nexport class RecoveryLock {\n private readonly file: string;\n private readonly pid: number;\n private readonly hostname: string;\n private readonly maxAgeMs: number;\n private readonly sessionStore?: SessionStore;\n private readonly probe: (pid: number) => boolean;\n\n constructor(opts: RecoveryLockOptions) {\n this.file = path.join(opts.dir, LOCK_FILE);\n this.pid = opts.pid ?? process.pid;\n this.hostname = opts.hostname ?? os.hostname();\n this.maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n this.sessionStore = opts.sessionStore;\n this.probe = opts.isPidAlive ?? defaultIsPidAlive;\n }\n\n /**\n * Examine the lockfile and decide whether it represents an abandoned\n * session. Returns `null` if the file is missing, points to a live\n * instance, references a clean-closed session, is too old, or is\n * malformed. Otherwise returns enough detail to prompt the user.\n *\n * Important: this is a read-only check. We never delete an active\n * lock from here — if another wstack instance is alive, the caller\n * should bail or run with a fresh session instead.\n */\n async checkAbandoned(): Promise<AbandonedSession | null> {\n const lock = await this.readLock();\n if (!lock) return null;\n\n const ageMs = Date.now() - new Date(lock.startedAt).getTime();\n if (Number.isNaN(ageMs) || ageMs < 0) {\n // Clock skew or corrupted timestamp — treat as orphan.\n return null;\n }\n if (ageMs > this.maxAgeMs) return null;\n\n // PID liveness only meaningful on the same host. Different host\n // means we can't probe — assume abandoned (the other machine's\n // wstack can't be holding *our* sessions dir unless it was\n // shared via network mount, in which case the user is on their\n // own).\n if (lock.hostname === this.hostname && this.probe(lock.pid)) {\n // Another wstack on this box is actively writing here.\n return null;\n }\n\n let messageCount = 0;\n if (this.sessionStore) {\n try {\n const data = await this.sessionStore.load(lock.sessionId);\n const closed = data.events.some((e) => e.type === 'session_end');\n if (closed) return null;\n messageCount = data.messages.length;\n } catch {\n // Lock points to a session that doesn't exist on disk (deleted\n // out from under us). Nothing to recover.\n return null;\n }\n }\n\n return {\n sessionId: lock.sessionId,\n pid: lock.pid,\n startedAt: lock.startedAt,\n ageMs,\n messageCount,\n };\n }\n\n /**\n * Claim the lock for the given session. Uses exclusive-create (`O_EXCL`)\n * to detect whether another process acquired the lock between our\n * `checkAbandoned()` call and now. If the file already exists, it means\n * another process won the race and we throw instead of silently\n * overwriting their recovery record.\n *\n * The caller MUST have already called `checkAbandoned()` and handled its\n * null return before calling this.\n */\n async write(sessionId: string): Promise<void> {\n await ensureDir(path.dirname(this.file));\n const lock: LockFile = {\n v: 1,\n sessionId,\n pid: this.pid,\n hostname: this.hostname,\n startedAt: new Date().toISOString(),\n };\n // O_EXCL: atomic create — fails with EEXIST if another process wrote\n // the file between our checkAbandoned() and this write. This prevents\n // two processes that scanned the same stale lock from both believing\n // they hold it. The atomicWrite approach (temp+rename) would silently\n // replace on POSIX, hiding the race.\n try {\n await fsp.writeFile(this.file, JSON.stringify(lock), { flag: 'wx', mode: 0o600 });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EEXIST') {\n throw new Error(`Recovery lock already held by another process`);\n }\n throw err;\n }\n }\n\n /**\n * Release the lock. Idempotent — silently succeeds if the file is\n * already gone (e.g. someone else cleared it, or the directory was\n * wiped).\n */\n async clear(): Promise<void> {\n try {\n await fsp.unlink(this.file);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return;\n throw err;\n }\n }\n\n private async readLock(): Promise<LockFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(this.file, 'utf8');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') return null;\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (!isLockFile(parsed)) return null;\n return parsed;\n } catch {\n return null;\n }\n }\n}\n\nfunction isLockFile(v: unknown): v is LockFile {\n if (typeof v !== 'object' || v === null) return false;\n const o = v as Record<string, unknown>;\n return (\n o['v'] === 1 &&\n typeof o['sessionId'] === 'string' &&\n typeof o['pid'] === 'number' &&\n typeof o['hostname'] === 'string' &&\n typeof o['startedAt'] === 'string'\n );\n}\n\n/**\n * Probe whether a process is alive without sending it a real signal.\n *\n * Unix: `process.kill(pid, 0)` succeeds for our own processes, throws\n * EPERM for others (still alive, just not ours), and throws ESRCH\n * when the PID is gone.\n * Windows (Node 22+): same call returns true if the process exists,\n * throws otherwise.\n */\nfunction defaultIsPidAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EPERM') return true; // alive, but owned by someone else\n return false;\n }\n}\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import type { ContentBlock } from '../types/blocks.js';\r\nimport type {\r\n DefaultSessionReaderOptions,\r\n SessionExportOptions,\r\n SessionQuery,\r\n SessionReader,\r\n SessionSearchHit,\r\n SessionSearchQuery,\r\n SessionSummaryLite,\r\n} from '../types/session-reader.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\r\nimport type { SessionEvent, SessionMetadata, SessionStore } from '../types/session.js';\r\n\r\n/**\r\n * L2-A: read-only view over a `SessionStore` with query, replay, search,\r\n * and export helpers. Implemented on top of the public `SessionStore`\r\n * surface so any concrete store can be inspected without re-implementation.\r\n *\r\n * The heavy operations re-parse the JSONL stream on every call — fine for\r\n * /resume and one-off analytics. Wrap with a memoizing decorator if needed.\r\n */\r\nexport class DefaultSessionReader implements SessionReader {\r\n private readonly store: SessionStore;\r\n\r\n constructor(opts: DefaultSessionReaderOptions) {\r\n this.store = opts.store;\r\n }\r\n\r\n async query(q: SessionQuery = {}): Promise<SessionSummaryLite[]> {\r\n const raw = await this.store.list(q.limit ? Math.max(q.limit * 4, 100) : 1000);\r\n const titleNeedle = q.titleContains?.toLowerCase();\r\n const filtered = raw.filter((s) => {\r\n if (q.since && s.startedAt < q.since) return false;\r\n if (q.until && s.startedAt > q.until) return false;\r\n if (q.provider && s.provider !== q.provider) return false;\r\n if (q.model && s.model !== q.model) return false;\r\n if (q.minTokens !== undefined && s.tokenTotal < q.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n const out: SessionSummaryLite[] = filtered.map((s) => ({\r\n id: s.id,\r\n title: s.title,\r\n startedAt: s.startedAt,\r\n provider: s.provider,\r\n model: s.model,\r\n tokenTotal: s.tokenTotal,\r\n }));\r\n return q.limit ? out.slice(0, q.limit) : out;\r\n }\r\n\r\n async *replay(sessionId: string): AsyncIterable<SessionEvent> {\r\n const data = await this.store.load(sessionId);\r\n for (const e of data.events) yield e;\r\n }\r\n\r\n async search(q: SessionSearchQuery, sessionId?: string, sessionQuery?: SessionQuery): Promise<SessionSearchHit[]> {\r\n const limit = q.limit ?? 100;\r\n const matcher = buildMatcher(q);\r\n const allowedTypes = q.types ? new Set(q.types) : null;\r\n\r\n // Filter sessions BEFORE loading events — avoids loading thousands of events\r\n // from sessions that don't match the time/provider/model criteria.\r\n let ids: string[];\r\n if (sessionId) {\r\n ids = [sessionId];\r\n } else {\r\n const sessions = await this.store.list(1000);\r\n const titleNeedle = sessionQuery?.titleContains?.toLowerCase();\r\n const filtered = sessions.filter((s) => {\r\n if (sessionQuery?.since && s.startedAt < sessionQuery.since) return false;\r\n if (sessionQuery?.until && s.startedAt > sessionQuery.until) return false;\r\n if (sessionQuery?.provider && s.provider !== sessionQuery.provider) return false;\r\n if (sessionQuery?.model && s.model !== sessionQuery.model) return false;\r\n if (sessionQuery?.minTokens !== undefined && s.tokenTotal < sessionQuery.minTokens) return false;\r\n if (titleNeedle && !s.title.toLowerCase().includes(titleNeedle)) return false;\r\n return true;\r\n });\r\n ids = filtered.map((s) => s.id);\r\n }\r\n\r\n const hits: SessionSearchHit[] = [];\r\n for (const id of ids) {\r\n let data;\r\n try {\r\n data = await this.store.load(id);\r\n } catch {\r\n continue;\r\n }\r\n for (let i = 0; i < data.events.length; i++) {\r\n const ev = data.events[i]!;\r\n if (allowedTypes && !allowedTypes.has(ev.type)) continue;\r\n const text = eventText(ev);\r\n if (text === null) continue;\r\n const hit = matcher(text);\r\n if (!hit) continue;\r\n hits.push({\r\n sessionId: id,\r\n eventIndex: i,\r\n ts: ev.ts,\r\n type: ev.type,\r\n snippet: snippetOf(text, hit.start, hit.end),\r\n });\r\n if (hits.length >= limit) return hits;\r\n }\r\n }\r\n return hits;\r\n }\r\n\r\n async export(sessionId: string, opts: SessionExportOptions): Promise<string> {\r\n const data = await this.store.load(sessionId);\r\n const includeTools = opts.includeTools ?? true;\r\n const includeDiagnostics = opts.includeDiagnostics ?? true;\r\n\r\n const filtered = data.events.filter((e) => {\r\n if (\r\n !includeTools &&\r\n (e.type === 'tool_use' ||\r\n e.type === 'tool_result' ||\r\n e.type === 'tool_call_start' ||\r\n e.type === 'tool_call_end')\r\n ) {\r\n return false;\r\n }\r\n if (\r\n !includeDiagnostics &&\r\n (e.type === 'error' || e.type === 'compaction' || e.type === 'message_truncated')\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n if (opts.format === 'json') {\r\n return JSON.stringify({ metadata: data.metadata, events: filtered }, null, 2);\r\n }\r\n if (opts.format === 'text') {\r\n return renderPlainText(data.metadata, filtered);\r\n }\r\n return renderMarkdown(data.metadata, filtered);\r\n }\r\n\r\n async metadata(sessionId: string): Promise<SessionMetadata> {\r\n const data = await this.store.load(sessionId);\r\n return data.metadata;\r\n }\r\n}\r\n\r\nfunction buildMatcher(\r\n q: SessionSearchQuery,\r\n): (text: string) => { start: number; end: number } | null {\r\n const ci = q.caseInsensitive ?? true;\r\n if (q.regex) {\r\n const flags = ci ? 'i' : '';\r\n const compiled = compileUserRegex(q.query, flags);\r\n if (!compiled.ok) {\r\n throw new Error(`Invalid search regex \"${q.query}\": ${compiled.reason}`);\r\n }\r\n const re = compiled.regex;\r\n return (text) => {\r\n const m = re.exec(text);\r\n return m ? { start: m.index, end: m.index + m[0].length } : null;\r\n };\r\n }\r\n const needle = ci ? q.query.toLowerCase() : q.query;\r\n return (text) => {\r\n const hay = ci ? text.toLowerCase() : text;\r\n const idx = hay.indexOf(needle);\r\n return idx === -1 ? null : { start: idx, end: idx + needle.length };\r\n };\r\n}\r\n\r\nfunction eventText(e: SessionEvent): string | null {\r\n switch (e.type) {\r\n case 'user_input':\r\n return contentToString(e.content);\r\n case 'llm_response':\r\n return contentToString(e.content);\r\n case 'tool_use':\r\n return `${e.name} ${JSON.stringify(e.input)}`;\r\n case 'tool_result':\r\n return typeof e.content === 'string' ? e.content : JSON.stringify(e.content);\r\n case 'error':\r\n return `${e.phase}: ${e.message}`;\r\n case 'session_start':\r\n case 'session_resumed':\r\n return `${e.model}/${e.provider}`;\r\n case 'task_created':\r\n case 'task_completed':\r\n return e.title;\r\n case 'task_failed':\r\n return `${e.title}: ${e.error}`;\r\n case 'skill_activated':\r\n case 'skill_deactivated':\r\n return e.skillName;\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\nfunction contentToString(content: string | ContentBlock[]): string {\r\n if (typeof content === 'string') return content;\r\n return content\r\n .map((b) => {\r\n switch (b.type) {\r\n case 'text':\r\n return b.text;\r\n case 'tool_use':\r\n return `[tool_use:${b.name} ${JSON.stringify(b.input)}]`;\r\n case 'tool_result':\r\n return typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\r\n default:\r\n return '';\r\n }\r\n })\r\n .join('\\n');\r\n}\r\n\r\nconst SNIPPET_RADIUS = 60;\r\n\r\nfunction snippetOf(text: string, start: number, end: number): string {\r\n const from = Math.max(0, start - SNIPPET_RADIUS);\r\n const to = Math.min(text.length, end + SNIPPET_RADIUS);\r\n const prefix = from > 0 ? '…' : '';\r\n const suffix = to < text.length ? '…' : '';\r\n return prefix + text.slice(from, to).replace(/\\s+/g, ' ').trim() + suffix;\r\n}\r\n\r\nfunction renderMarkdown(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(`# Session ${meta.id}`);\r\n lines.push('');\r\n if (meta.model || meta.provider) {\r\n lines.push(`- **Model:** ${meta.provider ?? '?'}/${meta.model ?? '?'}`);\r\n }\r\n lines.push(`- **Started:** ${meta.startedAt}`);\r\n if (meta.endedAt) lines.push(`- **Ended:** ${meta.endedAt}`);\r\n lines.push('');\r\n lines.push('---');\r\n lines.push('');\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input': {\r\n lines.push(`## User — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n }\r\n case 'llm_response': {\r\n lines.push(`## Assistant — ${e.ts}`);\r\n lines.push('');\r\n lines.push(contentToString(e.content));\r\n if (e.stopReason && e.stopReason !== 'end_turn') {\r\n lines.push('');\r\n lines.push(`*stop: ${e.stopReason}*`);\r\n }\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_use': {\r\n lines.push(`### Tool call: \\`${e.name}\\``);\r\n lines.push('');\r\n lines.push('```json');\r\n lines.push(JSON.stringify(e.input, null, 2));\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'tool_result': {\r\n const body = typeof e.content === 'string' ? e.content : JSON.stringify(e.content, null, 2);\r\n lines.push(`### Tool result${e.isError ? ' (error)' : ''}`);\r\n lines.push('');\r\n lines.push('```');\r\n lines.push(body);\r\n lines.push('```');\r\n lines.push('');\r\n break;\r\n }\r\n case 'error': {\r\n lines.push(`> **Error** (${e.phase}): ${e.message}`);\r\n lines.push('');\r\n break;\r\n }\r\n case 'compaction': {\r\n lines.push(`> **Compaction**: ${e.before} → ${e.after} tokens`);\r\n lines.push('');\r\n break;\r\n }\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n\r\nfunction renderPlainText(meta: SessionMetadata, events: SessionEvent[]): string {\r\n const lines: string[] = [];\r\n lines.push(\r\n `Session ${meta.id} — ${meta.provider ?? '?'}/${meta.model ?? '?'} — started ${meta.startedAt}`,\r\n );\r\n lines.push(''.padEnd(72, '-'));\r\n for (const e of events) {\r\n switch (e.type) {\r\n case 'user_input':\r\n lines.push(`[${e.ts}] USER`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'llm_response':\r\n lines.push(`[${e.ts}] ASSISTANT`);\r\n lines.push(contentToString(e.content));\r\n lines.push('');\r\n break;\r\n case 'tool_use':\r\n lines.push(`[${e.ts}] TOOL_USE ${e.name} ${JSON.stringify(e.input)}`);\r\n break;\r\n case 'tool_result':\r\n lines.push(\r\n `[${e.ts}] TOOL_RESULT${e.isError ? ' (error)' : ''} ${\r\n typeof e.content === 'string' ? e.content : JSON.stringify(e.content)\r\n }`,\r\n );\r\n break;\r\n case 'error':\r\n lines.push(`[${e.ts}] ERROR (${e.phase}): ${e.message}`);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * L2-B: AnnotationsStore — sidecar storage for collaboration annotations\n * (Phase 2 of idea #13 from IDEAS.md).\n *\n * Why a sidecar file, not the session JSONL?\n *\n * The session log is an event-sourced append-only journal\n * (`packages/core/src/types/session.ts` invariant: events are\n * append-only, with `truncateToCheckpoint` only as an explicit\n * rewind). Mixing in human-typed annotations would break that\n * invariant — the user's note about \"this rm looks dangerous\"\n * is not part of the agent's event history; it is meta-commentary\n * on the history.\n *\n * So we keep annotations in a sibling file: one JSON document per\n * session, at `<sessionDir>/<sessionId>.annotations.json`. The\n * shape is a simple versioned array, written atomically.\n *\n * Concurrency model:\n *\n * The store uses a per-session Promise chain to serialize writes.\n * Multiple annotators adding notes at the same time will queue,\n * not race. The atomic write itself is the second line of\n * defense (in case the chain is bypassed — e.g. two processes\n * pointing at the same dir).\n */\n\n/** Wire/storage shape for one annotation. */\nexport interface Annotation {\n /** Stable id (UUIDv4-ish). Referenced by resolve/delete. */\n id: string;\n /** Session this annotation belongs to. */\n sessionId: string;\n /** Index into the session event log the annotation refers to. */\n atEventIndex: number;\n /** Participant id of the annotator (matches WSCollabParticipantJoined.participantId). */\n authorId: string;\n /** Human-readable role label snapshot for display (e.g. \"annotator\"). */\n authorRole: 'annotator';\n /** The note itself. Trimmed, capped at `MAX_TEXT_LENGTH` on add. */\n text: string;\n /** ISO timestamp of creation. */\n createdAt: string;\n /** Resolved state. Annotations start unresolved. */\n resolved: boolean;\n /** ISO timestamp when resolved (if resolved). */\n resolvedAt?: string;\n /** Participant id of the resolver (if resolved). */\n resolvedBy?: string;\n}\n\ninterface AnnotationsFile {\n /** Bumped when the on-disk shape changes. v1 = initial release. */\n version: 1;\n annotations: Annotation[];\n}\n\n/** Bumped when the on-disk shape changes. Bump + migration on change. */\nconst FILE_VERSION = 1;\n/** Hard cap to keep a runaway annotator from writing megabytes. */\nconst MAX_TEXT_LENGTH = 2000;\n/** Hard cap on total annotations per session (oldest are evicted beyond this). */\nconst MAX_ANNOTATIONS = 1000;\n\nexport interface AnnotationsStoreOptions {\n /** Directory where `<sessionId>.annotations.json` files live. */\n dir: string;\n}\n\nexport class AnnotationsStore {\n private readonly dir: string;\n /** Per-session write queue. Created lazily on first add. */\n private readonly writeChains = new Map<string, Promise<void>>();\n\n constructor(opts: AnnotationsStoreOptions) {\n this.dir = opts.dir;\n }\n\n // ── Reads ──────────────────────────────────────────────────────────────\n\n /**\n * Return all annotations for `sessionId` in insertion order\n * (oldest first). Returns an empty array when no file exists\n * yet (the normal case for a fresh session).\n */\n async list(sessionId: string): Promise<Annotation[]> {\n const file = await this.readFile(sessionId);\n return file ? file.annotations : [];\n }\n\n /**\n * Convenience: only unresolved annotations, newest first — the\n * common UI rendering for \"what still needs attention?\".\n */\n async listOpen(sessionId: string): Promise<Annotation[]> {\n const all = await this.list(sessionId);\n return all.filter((a) => !a.resolved).reverse();\n }\n\n // ── Writes ─────────────────────────────────────────────────────────────\n\n /**\n * Add a new annotation. Returns the persisted record (with id\n * and timestamps filled in). Throws when `text` is empty or\n * exceeds `MAX_TEXT_LENGTH`.\n */\n async add(input: {\n sessionId: string;\n atEventIndex: number;\n authorId: string;\n text: string;\n }): Promise<Annotation> {\n const text = input.text.trim();\n if (text.length === 0) {\n throw new Error('Annotation text must be non-empty');\n }\n if (text.length > MAX_TEXT_LENGTH) {\n throw new Error(\n `Annotation text exceeds ${MAX_TEXT_LENGTH} chars (got ${text.length})`,\n );\n }\n if (!Number.isInteger(input.atEventIndex) || input.atEventIndex < 0) {\n throw new Error('atEventIndex must be a non-negative integer');\n }\n const annotation: Annotation = {\n id: randomUUID(),\n sessionId: input.sessionId,\n atEventIndex: input.atEventIndex,\n authorId: input.authorId,\n authorRole: 'annotator',\n text,\n createdAt: new Date().toISOString(),\n resolved: false,\n };\n await this.enqueue(input.sessionId, async () => {\n const all = await this.list(input.sessionId);\n all.push(annotation);\n // Evict oldest if we crossed the cap. Resolved first, then oldest.\n if (all.length > MAX_ANNOTATIONS) {\n const sorted = all\n .map((a, i) => ({ a, i }))\n .sort((x, y) => {\n // resolved=false wins (keep unresolved); among same resolved state, oldest first.\n if (x.a.resolved !== y.a.resolved) return x.a.resolved ? 1 : -1;\n return x.a.createdAt.localeCompare(y.a.createdAt);\n });\n const evictCount = all.length - MAX_ANNOTATIONS;\n const toEvict = new Set(sorted.slice(0, evictCount).map((s) => s.a.id));\n const kept = all.filter((a) => !toEvict.has(a.id));\n await this.writeFile(input.sessionId, { version: FILE_VERSION, annotations: kept });\n } else {\n await this.writeFile(input.sessionId, { version: FILE_VERSION, annotations: all });\n }\n });\n return annotation;\n }\n\n /**\n * Mark an annotation as resolved. Returns the updated record, or\n * `null` if no annotation with that id exists in this session.\n * Idempotent: resolving an already-resolved annotation refreshes\n * `resolvedAt` / `resolvedBy` to the latest call.\n */\n async resolve(input: {\n sessionId: string;\n annotationId: string;\n resolvedBy: string;\n }): Promise<Annotation | null> {\n let updated: Annotation | null = null;\n await this.enqueue(input.sessionId, async () => {\n const all = await this.list(input.sessionId);\n const idx = all.findIndex((a) => a.id === input.annotationId);\n if (idx === -1) {\n updated = null;\n return;\n }\n const next: Annotation = {\n ...all[idx]!,\n resolved: true,\n resolvedAt: new Date().toISOString(),\n resolvedBy: input.resolvedBy,\n };\n all[idx] = next;\n await this.writeFile(input.sessionId, { version: FILE_VERSION, annotations: all });\n updated = next;\n });\n return updated;\n }\n\n // ── Internals ──────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (!sessionId || sessionId.includes('/') || sessionId.includes('\\\\') || sessionId.includes('..')) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.annotations.json`);\n }\n\n private async readFile(sessionId: string): Promise<AnnotationsFile | null> {\n const fp = this.filePath(sessionId);\n try {\n const raw = await fs.readFile(fp, 'utf8');\n const parsed = JSON.parse(raw) as AnnotationsFile;\n if (parsed.version !== FILE_VERSION) {\n // Future-proof: migrations land here. For now, treat unknown\n // versions as an empty store — safer than crashing on a\n // downgrade.\n return { version: FILE_VERSION, annotations: [] };\n }\n return parsed;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n // Corrupt JSON or permission error: log via the silent-recovery\n // path (the store doesn't take a logger; callers observe via\n // list() returning [] for an unreadable file is acceptable for\n // Phase 2 — annotations are meta-data, losing them is not fatal).\n return { version: FILE_VERSION, annotations: [] };\n }\n }\n\n private async writeFile(sessionId: string, file: AnnotationsFile): Promise<void> {\n const fp = this.filePath(sessionId);\n await atomicWrite(fp, JSON.stringify(file, null, 2));\n }\n\n /**\n * Serialize writes per-sessionId. We chain promises instead of\n * using a Mutex class so the contract is obvious from the\n * call-site: `enqueue(sid, fn)` runs `fn` after every prior\n * enqueue for `sid` has settled.\n */\n private enqueue(sessionId: string, fn: () => Promise<void>): Promise<void> {\n const prev = this.writeChains.get(sessionId) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n // Keep the chain intact even when `fn` throws; failures\n // shouldn't break subsequent writes.\n this.writeChains.set(\n sessionId,\n next.catch(() => undefined),\n );\n return next;\n }\n}\n","import { createHash } from 'node:crypto';\nimport type { Request } from '../types/provider.js';\n\n/**\n * Idea #2 from IDEAS.md — Deterministic Replay.\n *\n * The hash function is the foundation of replay: given a `Request`,\n * produce a stable identifier so a recorded `Response` can be looked\n * up later when we want to \"re-run\" the same agent loop without\n * burning API credits.\n *\n * Stability rules:\n *\n * - All object keys are sorted recursively before stringification.\n * Without this, two semantically identical requests that differ\n * only in key insertion order would produce different hashes.\n * - We hash ONLY the fields that affect the response: `model`,\n * `system`, `messages`, `tools`, `maxTokens`, and the four\n * sampling knobs (`temperature`, `topP`, `stopSequences`,\n * `toolChoice`). Anything else on the `Request` (metadata,\n * future extensions) is ignored so replay stays forward-compat.\n * - We serialize to JSON. The `ContentBlock` and `Message` shapes\n * are pure data; this works as long as no `undefined` values\n * sneak in (those get dropped by `JSON.stringify`, which is\n * fine — the structural diff is what matters).\n *\n * The SHA-256 output is hex-encoded and prefixed with the algorithm\n * tag so a future migration to a different hash (e.g. blake3) is\n * trivial to detect.\n */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys(obj[key]);\n }\n return sorted;\n }\n return value;\n}\n\nexport function hashRequest(request: Request): string {\n // Pick only the fields that affect the response. See stability rules.\n const payload = {\n model: request.model,\n system: request.system,\n messages: request.messages,\n tools: request.tools,\n maxTokens: request.maxTokens,\n temperature: request.temperature,\n topP: request.topP,\n stopSequences: request.stopSequences,\n toolChoice: request.toolChoice,\n };\n const json = stableStringify(payload);\n const digest = createHash('sha256').update(json, 'utf8').digest('hex');\n return `sha256:${digest}`;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite } from '../utils/atomic-write.js';\nimport { hashRequest } from '../replay/hash.js';\nimport type { Request, Response } from '../types/provider.js';\n\n/**\n * ReplayLogStore — sidecar store for deterministic-replay support\n * (idea #2 from IDEAS.md). One JSONL file per session, recording\n * every provider request/response pair so the same agent loop can\n * be re-run later with frozen API responses.\n *\n * Why a sidecar (not the session JSONL)?\n *\n * Same reason as `AnnotationsStore` — the session log is\n * event-sourced and append-only; a provider request payload can be\n * tens of kilobytes (especially with long conversation history),\n * and we want replay to be opt-in (recorded only when the user\n * runs with `--replay` or a future equivalent). Mixing it into\n * the event log would inflate every read for replay-irrelevant\n * paths.\n *\n * File layout: `<dir>/<sessionId>.replay.jsonl`, one entry per line.\n * Each entry: `{ hash, ts, request, response }`. The `hash` is\n * computed via `hashRequest` so lookups are O(1) by hash.\n *\n * Concurrency: per-session write queue (same pattern as\n * `AnnotationsStore`). Reads are lock-free; the write chain makes\n * the append + rehash sequence atomic.\n */\nexport interface ReplayEntry {\n hash: string;\n ts: string;\n request: Request;\n response: Response;\n}\n\nconst FILE_VERSION = 1;\n\n/** Default cap on the number of entries per session. */\nconst DEFAULT_MAX_ENTRIES = 1000;\n\nexport interface ReplayLogStoreOptions {\n /** Directory where `<sessionId>.replay.jsonl` files live. */\n dir: string;\n /**\n * Cap on the number of entries per session. When a `record` would\n * push the file beyond this, the oldest entries are evicted (LRU\n * by insertion order). Set to `Infinity` to disable rotation.\n * Defaults to 1000 — a single LLM call averages ~5KB serialized\n * (messages + tools + response), so 1000 entries is ~5MB per\n * session which is a reasonable upper bound.\n */\n maxEntries?: number;\n}\n\nexport class ReplayLogStore {\n private readonly dir: string;\n private readonly writeChains = new Map<string, Promise<void>>();\n /** Per-session hash → entry index, kept in memory after the first load. */\n private readonly cache = new Map<string, Map<string, ReplayEntry>>();\n /** Per-session entry count on disk, to detect when compaction is needed. */\n private readonly diskCount = new Map<string, number>();\n private readonly maxEntries: number;\n\n constructor(opts: ReplayLogStoreOptions) {\n this.dir = opts.dir;\n this.maxEntries = opts.maxEntries ?? DEFAULT_MAX_ENTRIES;\n }\n\n // ── Writes ──────────────────────────────────────────────────────────────\n\n /**\n * Record a request/response pair. Idempotent on hash: a second\n * `record` for the same hash is a no-op (the existing entry wins).\n * Returns the hash.\n */\n async record(input: {\n sessionId: string;\n request: Request;\n response: Response;\n }): Promise<string> {\n const hash = hashRequest(input.request);\n await this.enqueue(input.sessionId, async () => {\n const cache = await this.ensureCache(input.sessionId);\n if (cache.has(hash)) return; // already recorded\n const entry: ReplayEntry = {\n hash,\n ts: new Date().toISOString(),\n request: input.request,\n response: input.response,\n };\n // True append — O(1) per write. Only compact (full rewrite) when\n // we exceed maxEntries and need to evict oldest entries.\n cache.set(hash, entry);\n const count = (this.diskCount.get(input.sessionId) ?? 0) + 1;\n if (count > this.maxEntries) {\n // Need to compact: keep only the most recent maxEntries.\n await this.compact(input.sessionId, cache);\n } else {\n await fs.appendFile(this.filePath(input.sessionId), JSON.stringify(entry) + '\\n', 'utf8');\n this.diskCount.set(input.sessionId, count);\n }\n });\n return hash;\n }\n\n /**\n * Compact the replay log to keep only the most recent maxEntries.\n * Called when entry count exceeds the cap. Rewrites the entire file\n * but only happens O(n / maxEntries) times per session.\n */\n private async compact(sessionId: string, cache: Map<string, ReplayEntry>): Promise<void> {\n // Map.values() preserves insertion order — take the last maxEntries.\n const all = [...cache.values()];\n const keep = all.slice(-this.maxEntries);\n await this.writeAll(sessionId, keep);\n cache.clear();\n for (const e of keep) cache.set(e.hash, e);\n this.diskCount.set(sessionId, keep.length);\n }\n\n // ── Reads ───────────────────────────────────────────────────────────────\n\n /**\n * Look up an entry by hash. Returns `null` when the request has\n * not been recorded for this session. O(1) after the first call\n * per session (in-memory cache).\n */\n async lookup(sessionId: string, hash: string): Promise<ReplayEntry | null> {\n const cache = await this.ensureCache(sessionId);\n return cache.get(hash) ?? null;\n }\n\n /** All recorded entries for a session, in insertion order. */\n async load(sessionId: string): Promise<ReplayEntry[]> {\n const cache = await this.ensureCache(sessionId);\n return [...cache.values()];\n }\n\n /**\n * List every session id that has a replay log in the store dir.\n * Returns an array of `{ sessionId, entryCount, path }` sorted\n * by sessionId for stable output. Used by `wstack replay --list`.\n */\n async list(): Promise<Array<{ sessionId: string; entryCount: number; path: string }>> {\n let entries: string[];\n try {\n entries = await fs.readdir(this.dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n return [];\n }\n const out: Array<{ sessionId: string; entryCount: number; path: string }> = [];\n for (const name of entries) {\n if (!name.endsWith('.replay.jsonl')) continue;\n const sessionId = name.slice(0, -'.replay.jsonl'.length);\n const all = await this.load(sessionId);\n out.push({\n sessionId,\n entryCount: all.length,\n path: path.join(this.dir, name),\n });\n }\n return out.sort((a, b) => a.sessionId.localeCompare(b.sessionId));\n }\n\n // ── Internals ───────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (!sessionId || sessionId.includes('/') || sessionId.includes('\\\\') || sessionId.includes('..')) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.replay.jsonl`);\n }\n\n private async readAll(sessionId: string): Promise<ReplayEntry[]> {\n const fp = this.filePath(sessionId);\n try {\n const raw = await fs.readFile(fp, 'utf8');\n const out: ReplayEntry[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n const parsed = JSON.parse(line) as { version?: number; entry?: ReplayEntry } & ReplayEntry;\n // Forward-compat: v1 stores entries one per line, no envelope.\n // A future \"v2\" could wrap with `{version, entries:[...]}`;\n // the loader would then branch on `parsed.version`.\n if ('entry' in parsed && parsed.entry) {\n out.push(parsed.entry);\n } else {\n out.push(parsed);\n }\n } catch {\n // Skip a corrupt line — annotations-store and other sidecar\n // stores take the same approach (meta-data, not fatal).\n }\n }\n return out;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n // Corrupt or unreadable: treat as empty.\n return [];\n }\n }\n\n private async writeAll(sessionId: string, entries: ReplayEntry[]): Promise<void> {\n const fp = this.filePath(sessionId);\n const body = entries.map((e) => JSON.stringify(e)).join('\\n') + (entries.length ? '\\n' : '');\n await atomicWrite(fp, body);\n // Drop the version-stamp comment at the top — v1 has no envelope,\n // but we keep a one-line marker for human readers / future tooling.\n // (The atomicWrite just wrote pure JSONL; that's correct for v1.)\n void FILE_VERSION;\n }\n\n private async ensureCache(sessionId: string): Promise<Map<string, ReplayEntry>> {\n let cache = this.cache.get(sessionId);\n if (cache) return cache;\n const all = await this.readAll(sessionId);\n cache = new Map();\n for (const e of all) cache.set(e.hash, e);\n this.cache.set(sessionId, cache);\n this.diskCount.set(sessionId, all.length);\n return cache;\n }\n\n private enqueue(sessionId: string, fn: () => Promise<void>): Promise<void> {\n const prev = this.writeChains.get(sessionId) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n this.writeChains.set(\n sessionId,\n next.catch(() => undefined),\n );\n return next;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SessionEvent } from '../types/session.js';\n\n/**\n * Idea #1 from IDEAS.md — Stateful Session Recovery.\n *\n * `SessionRecovery` is the read-side companion to the in-flight\n * marker mechanism. When the agent loop is running, it writes an\n * `in_flight_start` event at the current point in the log. On\n * clean shutdown, a matching `in_flight_end` follows. If the\n * process dies (crash, OOM, machine sleep, SIGKILL) the marker\n * is the last event in the file — and `detectStale` flags the\n * session as \"incomplete, can be resumed\".\n *\n * Phase 1 of this feature is **detection only**. The actual\n * re-execution of incomplete work is a follow-up: it requires\n * tracking pending tool calls, mid-stream LLM responses, and\n * uncommitted file changes — and re-running the agent loop from\n * the last `checkpoint` event. The detection layer is independent\n * and ships first because (a) it gives the user immediate\n * visibility into what died, and (b) it's the foundation for the\n * resume command and the CLI's \"Incomplete sessions\" surface.\n *\n * Concurrency: pure read; no writes. Safe to call from multiple\n * processes simultaneously.\n */\nexport interface StaleSession {\n sessionId: string;\n /** Path to the JSONL log. */\n path: string;\n /** Last event ts (the in_flight_start timestamp). */\n lastEventTs: string;\n /** Context the agent was working on when it died. */\n context: string;\n /** Total events in the log. */\n eventCount: number;\n}\n\nexport interface RecoveryPlan {\n sessionId: string;\n /** True if the session is stale (has a dangling in_flight_start). */\n stale: boolean;\n /** The last `checkpoint` event before the un-replayed work, or null. */\n lastCheckpoint: SessionEvent | null;\n /** All events after the last checkpoint (i.e. the work that needs re-execution). */\n pendingEvents: SessionEvent[];\n /** The dangling in_flight_start event, if any. */\n inFlightStart: SessionEvent | null;\n /** Free-form context the agent was working on, if any. */\n context: string | null;\n}\n\n/**\n * Result of `SessionRecovery.recover(sessionId)`. Distinct from\n * `StaleSession`: a session is \"stale\" if the last event is an\n * open marker, but a \"recovery plan\" can also be generated for\n * clean sessions whose last checkpoint is older than the\n * conversation history (e.g. a user-initiated \"rewind to last\n * good state\" flow). Phase 2 of idea #1: this returns the plan;\n * the actual kernel re-execution is a follow-up.\n */\nexport class SessionRecovery {\n /**\n * Scan a session log and return a `StaleSession` if and only\n * if the last event is an `in_flight_start` without a matching\n * `in_flight_end`. Returns `null` when:\n * - the log does not exist;\n * - the log is empty;\n * - the last event is `in_flight_end` (clean shutdown);\n * - the last event is something else (e.g. an unannotated\n * legacy log without in-flight markers).\n */\n async detectStale(sessionId: string): Promise<StaleSession | null> {\n const fp = this.filePath(sessionId);\n // Only read the last ~8KB — enough for several large events.\n // This is O(1) I/O vs O(n) of reading the entire file.\n const TAIL_SIZE = 8192;\n let stat;\n try {\n stat = await fs.stat(fp);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n return null;\n }\n if (stat.size === 0) return null;\n const position = Math.max(0, stat.size - TAIL_SIZE);\n const buf = Buffer.alloc(TAIL_SIZE);\n let fh;\n try {\n fh = await fs.open(fp, 'r');\n const { bytesRead } = await fh.read(buf, 0, TAIL_SIZE, position);\n // Count total events for StaleSession.eventCount — requires full scan.\n // For very large files this is a trade-off; count is informational.\n let eventCount = 0;\n const raw = buf.subarray(0, bytesRead).toString('utf8');\n for (const line of raw.split('\\n')) {\n if (line.trim()) eventCount++;\n }\n // Find the last complete JSON line in the tail.\n const lines = raw.split('\\n').filter((l) => l.trim());\n for (let i = lines.length - 1; i >= 0; i--) {\n try {\n const ev = JSON.parse(lines[i]!) as SessionEvent;\n if (ev.type === 'in_flight_start') {\n return {\n sessionId,\n path: fp,\n lastEventTs: ev.ts,\n context: ev.context,\n eventCount,\n };\n }\n // Found a different last event — clean shutdown or legacy\n return null;\n } catch {\n // Incomplete line (spans the read boundary) — skip\n continue;\n }\n }\n return null;\n } catch {\n return null;\n } finally {\n if (fh) await fh.close();\n }\n }\n\n /**\n * Generate a recovery plan for a session. The plan describes\n * \"what would be re-executed\" if the user chose to resume —\n * everything after the last `checkpoint` event, plus the\n * dangling in-flight marker if present.\n *\n * Returns a non-null plan for ANY session that has at least\n * one event after a checkpoint (or, for legacy sessions, at\n * least one event). Pure read; no mutation.\n */\n async recover(sessionId: string): Promise<RecoveryPlan | null> {\n const fp = this.filePath(sessionId);\n let raw: string;\n try {\n raw = await fs.readFile(fp, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n return null;\n }\n const events: SessionEvent[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n events.push(JSON.parse(line) as SessionEvent);\n } catch {\n // skip corrupt lines\n }\n }\n if (events.length === 0) return null;\n // Find the last checkpoint.\n let lastCheckpoint: SessionEvent | null = null;\n let lastCheckpointIdx = -1;\n for (let i = 0; i < events.length; i++) {\n if (events[i]!.type === 'checkpoint') {\n lastCheckpoint = events[i]!;\n lastCheckpointIdx = i;\n }\n }\n // Events after the last checkpoint = the work that needs re-execution.\n const pendingEvents =\n lastCheckpointIdx >= 0 ? events.slice(lastCheckpointIdx + 1) : events;\n // The dangling in_flight_start, if the last event is one.\n const lastEv = events[events.length - 1]!;\n const inFlightStart =\n lastEv.type === 'in_flight_start' ? lastEv : null;\n const context = inFlightStart && inFlightStart.type === 'in_flight_start'\n ? inFlightStart.context\n : null;\n return {\n sessionId,\n stale: inFlightStart !== null,\n lastCheckpoint,\n pendingEvents,\n inFlightStart,\n context,\n };\n }\n\n /**\n * List every stale session in a directory. Returns an array\n * (possibly empty) sorted by `lastEventTs` descending — most\n * recent crash first.\n */\n async listResumable(): Promise<StaleSession[]> {\n let entries: string[];\n try {\n entries = await fs.readdir(this.dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n return [];\n }\n const out: StaleSession[] = [];\n for (const name of entries) {\n if (!name.endsWith('.jsonl')) continue;\n const sessionId = name.slice(0, -'.jsonl'.length);\n if (sessionId.includes('.replay') || sessionId.includes('.annotations')) continue;\n const stale = await this.detectStale(sessionId);\n if (stale) out.push(stale);\n }\n return out.sort((a, b) => b.lastEventTs.localeCompare(a.lastEventTs));\n }\n\n // ── Internals ──────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (\n !sessionId ||\n sessionId.includes('/') ||\n sessionId.includes('\\\\') ||\n sessionId.includes('..')\n ) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.jsonl`);\n }\n\n constructor(private readonly dir: string) {}\n}\n","import { createHash, randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\n/**\n * ToolAuditLog — idea #9 from IDEAS.md.\n *\n * Tamper-evident audit trail for tool calls. Every tool_use /\n * tool_result pair is appended to a sidecar JSONL with a chained\n * SHA-256 — each entry's `prevHash` is the prior entry's `hash`,\n * so any post-hoc modification of a single line breaks the chain\n * from that point forward.\n *\n * Why a sidecar (not the session JSONL)?\n * Same reason as `AnnotationsStore` and `ReplayLogStore`: the\n * session log is an event-sourced journal. Mixing in a hash\n * chain would inflate every read and tightly couple the\n * integrity check to the event format. Sidecar keeps both\n * concerns orthogonal.\n *\n * What \"tamper-evident\" means here:\n * - The hash covers the full serialized entry: tool name, id,\n * input, output, timestamp, author. Changing any byte\n * changes the hash.\n * - The chain is sequential — a verifier walks the file in\n * order, recomputing each hash, and checks `prevHash`\n * matches the previous entry's `hash`.\n * - Any insertion, deletion, or modification of a single\n * entry surfaces as a \"chain broken at entry N\" verdict.\n *\n * What it does NOT defend against:\n * - An attacker who rewrites the whole file consistently.\n * For that you'd need an external anchor (signing key,\n * transparency log, etc.) — out of scope for Phase 1.\n * - The agent itself misbehaving; this is post-hoc audit, not\n * real-time enforcement. Use `PermissionPolicy` for that.\n *\n * File layout: `<dir>/<sessionId>.audit.jsonl`, one entry per\n * line. The chain starts with a `genesis` entry whose\n * `prevHash` is all zeros.\n */\nexport interface AuditEntry {\n /** Monotonic index (0-based). */\n index: number;\n /** UUID for cross-referencing with logs. */\n id: string;\n /** ISO timestamp. */\n ts: string;\n /** Hash of the previous entry (or all-zeros for the genesis entry). */\n prevHash: string;\n /** Hash of this entry's content (sha256 over the canonical JSON). */\n hash: string;\n toolName: string;\n toolUseId: string;\n input: unknown;\n output: unknown;\n isError: boolean;\n}\n\nconst GENESIS_PREV = '0'.repeat(64);\n\nexport type VerifyResult =\n | { ok: true; entries: number }\n | { ok: false; brokenAt: number; reason: string };\n\nexport interface ToolAuditLogOptions {\n /** Directory where `<sessionId>.audit.jsonl` files live. */\n dir: string;\n /**\n * Flush the file system cache to disk every N writes per session.\n * Default 100. Lower values = better crash durability, more I/O overhead.\n * Set to `Infinity` to disable periodic fsync (fastest, but highest data-loss risk).\n */\n fsyncEvery?: number;\n}\n\n/** Default number of writes between fsync calls. */\nconst DEFAULT_FSYNC_EVERY = 100;\n\nexport class ToolAuditLog {\n private readonly dir: string;\n /** In-memory cache of the last entry's hash (per session), to compute chains efficiently. */\n private readonly tailHash = new Map<string, string>();\n /** In-memory counter for entry indices — avoids re-reading the file on every write. */\n private readonly tailIndex = new Map<string, number>();\n /** Tracks writes since last fsync, per session. */\n private readonly unSyncedWrites = new Map<string, number>();\n private readonly writeChains = new Map<string, Promise<void>>();\n private readonly fsyncEvery: number;\n\n constructor(opts: ToolAuditLogOptions) {\n this.dir = opts.dir;\n this.fsyncEvery = opts.fsyncEvery ?? DEFAULT_FSYNC_EVERY;\n }\n\n /**\n * Append a tool call/result pair to the chain. Returns the\n * resulting entry. Idempotency is not guaranteed — if you\n * record the same tool_use twice you get two entries. That's\n * intentional: the audit log is a record, not a cache.\n */\n async record(input: {\n sessionId: string;\n toolName: string;\n toolUseId: string;\n input: unknown;\n output: unknown;\n isError: boolean;\n }): Promise<AuditEntry> {\n let entry: AuditEntry = null as never; // assigned in enqueue\n await this.enqueue(input.sessionId, async () => {\n const prevHash = this.tailHash.get(input.sessionId) ?? GENESIS_PREV;\n const index = this.tailIndex.get(input.sessionId) ?? 0;\n const id = randomUUID();\n const ts = new Date().toISOString();\n // Compute the hash with index included so the hash covers the index.\n const content = {\n id,\n ts,\n prevHash,\n toolName: input.toolName,\n toolUseId: input.toolUseId,\n input: input.input,\n output: input.output,\n isError: input.isError,\n index,\n };\n const hash = createHash('sha256')\n .update(stableStringify(content), 'utf8')\n .digest('hex');\n entry = {\n id,\n ts,\n prevHash,\n hash,\n toolName: input.toolName,\n toolUseId: input.toolUseId,\n input: input.input,\n output: input.output,\n isError: input.isError,\n index,\n };\n await this.appendLine(input.sessionId, entry);\n this.tailHash.set(input.sessionId, hash);\n this.tailIndex.set(input.sessionId, index + 1);\n });\n return entry;\n }\n\n /**\n * Walk the chain and verify every entry's hash and prevHash.\n * Returns a structured verdict — never throws.\n */\n async verify(sessionId: string): Promise<VerifyResult> {\n const entries = await this.readAll(sessionId);\n if (entries.length === 0) return { ok: true, entries: 0 };\n // The first entry's prevHash must be the all-zeros genesis marker.\n if (entries[0]!.prevHash !== GENESIS_PREV) {\n return {\n ok: false,\n brokenAt: 0,\n reason: 'first entry is not the genesis (prevHash != 0…0)',\n };\n }\n let prevHash = GENESIS_PREV;\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]!;\n if (e.prevHash !== prevHash) {\n return {\n ok: false,\n brokenAt: i,\n reason: `prevHash mismatch at entry ${i} (expected ${prevHash.slice(0, 8)}…, got ${e.prevHash.slice(0, 8)}…)`,\n };\n }\n // Recompute the hash from the entry's content (without the\n // `hash` field itself, which is what we are verifying).\n const content = {\n id: e.id,\n ts: e.ts,\n prevHash: e.prevHash,\n toolName: e.toolName,\n toolUseId: e.toolUseId,\n input: e.input,\n output: e.output,\n isError: e.isError,\n index: e.index,\n };\n const expectedHash = createHash('sha256')\n .update(stableStringify(content), 'utf8')\n .digest('hex');\n if (expectedHash !== e.hash) {\n return {\n ok: false,\n brokenAt: i,\n reason: `hash mismatch at entry ${i} (entry content was modified)`,\n };\n }\n prevHash = e.hash;\n }\n return { ok: true, entries: entries.length };\n }\n\n /** All entries for a session, in insertion order. */\n async load(sessionId: string): Promise<AuditEntry[]> {\n return this.readAll(sessionId);\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private filePath(sessionId: string): string {\n if (\n !sessionId ||\n sessionId.includes('/') ||\n sessionId.includes('\\\\') ||\n sessionId.includes('..')\n ) {\n throw new Error(`Invalid sessionId: ${sessionId}`);\n }\n return path.join(this.dir, `${sessionId}.audit.jsonl`);\n }\n\n private async readAll(sessionId: string): Promise<AuditEntry[]> {\n const fp = this.filePath(sessionId);\n try {\n const raw = await fs.readFile(fp, 'utf8');\n const out: AuditEntry[] = [];\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n try {\n out.push(JSON.parse(line) as AuditEntry);\n } catch {\n // Skip corrupt lines — audit data is meta, not fatal.\n }\n }\n return out;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n return [];\n }\n }\n\n private async appendLine(sessionId: string, entry: AuditEntry): Promise<void> {\n const fp = this.filePath(sessionId);\n const line = JSON.stringify(entry) + '\\n';\n // Real append — O(1) per write. The write chain ensures serial\n // ordering per session. On crash a partial line may appear;\n // readAll skips unparseable lines so the chain stays verifiable.\n await fs.appendFile(fp, line, 'utf8');\n // Periodic fsync: every fsyncEvery writes, open the file and sync it.\n // This limits data loss to at most fsyncEvery entries on crash.\n const count = (this.unSyncedWrites.get(sessionId) ?? 0) + 1;\n this.unSyncedWrites.set(sessionId, count);\n if (this.fsyncEvery !== Infinity && count % this.fsyncEvery === 0) {\n await this.sync(sessionId, fp);\n }\n }\n\n /**\n * Explicitly sync the file to disk. Called automatically every\n * `fsyncEvery` writes, and available for callers who want to\n * force a sync before closing or during graceful shutdown.\n */\n async flush(sessionId: string): Promise<void> {\n await this.sync(sessionId, this.filePath(sessionId));\n }\n\n private async sync(sessionId: string, fp: string): Promise<void> {\n try {\n const fh = await fs.open(fp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync is best-effort; a failure here does not corrupt the chain.\n } finally {\n this.unSyncedWrites.set(sessionId, 0);\n }\n }\n\n private enqueue(sessionId: string, fn: () => Promise<void>): Promise<void> {\n const prev = this.writeChains.get(sessionId) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n this.writeChains.set(\n sessionId,\n next.catch(() => undefined),\n );\n return next;\n }\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\n\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = sortKeys(obj[key]);\n }\n return sorted;\n }\n return value;\n}\n","import type { SessionEvent } from '../types/session.js';\n\nexport interface QueryFilter {\n eventTypes?: string[];\n toolNames?: string[];\n timeRange?: { start: string; end: string };\n}\n\nexport interface ToolInvocation {\n ts: string;\n name: string;\n input: unknown;\n output?: unknown;\n error?: string;\n durationMs: number;\n}\n\nexport interface SessionError {\n ts: string;\n phase: string;\n message: string;\n}\n\nexport interface ModeChange {\n ts: string;\n from: string;\n to: string;\n}\n\nexport interface TaskSummary {\n taskId: string;\n title: string;\n status: string;\n createdAt: string;\n completedAt?: string;\n}\n\nexport interface SessionAnalysis {\n sessionId: string;\n totalDuration: number;\n toolUsageCount: Record<string, number>;\n errorCount: number;\n modeChanges: ModeChange[];\n tasks: TaskSummary[];\n}\n\nexport class SessionAnalyzer {\n analyze(events: SessionEvent[]): SessionAnalysis {\n const toolUsageCount: Record<string, number> = {};\n const errors: SessionError[] = [];\n const modeChanges: ModeChange[] = [];\n const tasksById = new Map<string, TaskSummary>();\n let sessionId = '';\n\n for (const event of events) {\n // sessionId comes from session_start / session_resumed.\n if (event.type === 'session_start' || event.type === 'session_resumed') {\n if (!sessionId) sessionId = event.id;\n }\n if (event.type === 'tool_use') {\n toolUsageCount[event.name] = (toolUsageCount[event.name] ?? 0) + 1;\n }\n if (event.type === 'error') {\n errors.push({ ts: event.ts, phase: event.phase, message: event.message });\n }\n if (event.type === 'mode_changed') {\n modeChanges.push({ ts: event.ts, from: event.from, to: event.to });\n }\n if (event.type === 'task_created') {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'created',\n createdAt: event.ts,\n });\n }\n if (event.type === 'task_updated') {\n const t = tasksById.get(event.taskId);\n if (t) t.status = event.status;\n }\n if (event.type === 'task_completed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'completed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'completed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n if (event.type === 'task_failed') {\n const t = tasksById.get(event.taskId);\n if (t) {\n t.status = 'failed';\n t.completedAt = event.ts;\n } else {\n tasksById.set(event.taskId, {\n taskId: event.taskId,\n title: event.title,\n status: 'failed',\n createdAt: event.ts,\n completedAt: event.ts,\n });\n }\n }\n }\n\n return {\n sessionId,\n totalDuration: this.calcDuration(events),\n toolUsageCount,\n errorCount: errors.length,\n modeChanges,\n tasks: Array.from(tasksById.values()),\n };\n }\n\n query(events: SessionEvent[], filter: QueryFilter): SessionEvent[] {\n return events.filter((e) => {\n if (filter.eventTypes?.length && !filter.eventTypes.includes(e.type)) return false;\n if (filter.toolNames?.length && e.type === 'tool_use') {\n const toolEvent = e as { type: 'tool_use'; name: string };\n if (!filter.toolNames.includes(toolEvent.name)) return false;\n }\n if (filter.timeRange) {\n const ts = new Date(e.ts).getTime();\n const start = new Date(filter.timeRange.start).getTime();\n const end = new Date(filter.timeRange.end).getTime();\n if (ts < start || ts > end) return false;\n }\n return true;\n });\n }\n\n private calcDuration(events: SessionEvent[]): number {\n if (events.length < 2) return 0;\n const first = new Date(events[0]!.ts).getTime();\n const last = new Date(events[events.length - 1]!.ts).getTime();\n return last - first;\n }\n}\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport type { CheckpointInfo, RewindResult, RewindResultExtended, SessionRewinder } from '../types/session-rewinder.js';\r\nimport type { SessionEvent, FileSnapshot } from '../types/session.js';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\n\r\nexport interface SessionRewinderOptions {\r\n sessionsDir: string;\r\n /** The project root directory; used to validate rewind targets stay inside it. */\r\n projectRoot: string;\r\n}\r\n\r\n/**\r\n * Rewind engine that reads session JSONL files and reverts file system\r\n * changes to any previous checkpoint.\r\n */\r\nexport class DefaultSessionRewinder implements SessionRewinder {\r\n constructor(private readonly sessionsDir: string, private readonly projectRoot: string) {}\r\n\r\n async listCheckpoints(sessionId: string): Promise<CheckpointInfo[]> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n // Build a map of promptIndex -> file snapshot count\r\n const fileCountMap = new Map<number, number>();\r\n for (const event of events) {\r\n if (event.type === 'file_snapshot') {\r\n const e = event as { promptIndex: number; files: FileSnapshot[] };\r\n fileCountMap.set(e.promptIndex, (fileCountMap.get(e.promptIndex) ?? 0) + e.files.length);\r\n }\r\n }\r\n\r\n const checkpoints: CheckpointInfo[] = [];\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n const e = event as { promptIndex: number; promptPreview: string; ts: string };\r\n checkpoints.push({\r\n promptIndex: e.promptIndex,\r\n promptPreview: e.promptPreview,\r\n ts: e.ts,\r\n fileCount: fileCountMap.get(e.promptIndex) ?? 0,\r\n });\r\n }\r\n }\r\n\r\n return checkpoints;\r\n }\r\n\r\n async rewindToCheckpoint(\r\n sessionId: string,\r\n checkpointIndex: number,\r\n ): Promise<RewindResultExtended> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n let targetIdx = -1;\r\n for (let i = 0; i < events.length; i++) {\r\n const event = events[i]!;\r\n if (event.type === 'checkpoint') {\r\n const checkpointEvent = event as { promptIndex: number };\r\n if (checkpointEvent.promptIndex === checkpointIndex) {\r\n targetIdx = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (targetIdx === -1) {\r\n throw new Error(`Checkpoint ${checkpointIndex} not found`);\r\n }\r\n\r\n const snapshotsToRevert: Array<{ promptIndex: number; files: FileSnapshot[] }> = [];\r\n for (let i = targetIdx + 1; i < events.length; i++) {\r\n const event = events[i]!;\r\n if (event.type === 'checkpoint') {\r\n break;\r\n }\r\n if (event.type === 'file_snapshot') {\r\n const snapshotEvent = event as { promptIndex: number; files: FileSnapshot[] };\r\n if (snapshotEvent.promptIndex >= checkpointIndex) {\r\n snapshotsToRevert.push({ promptIndex: snapshotEvent.promptIndex, files: snapshotEvent.files });\r\n }\r\n }\r\n }\r\n\r\n const result = await revertSnapshots(snapshotsToRevert, this.projectRoot);\r\n const removedEvents = events.length - targetIdx - 1;\r\n return { ...result, toPromptIndex: checkpointIndex, removedEvents };\r\n }\r\n\r\n async rewindLastN(sessionId: string, n: number): Promise<RewindResultExtended> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n const checkpoints: Array<{ promptIndex: number; ts: string }> = [];\r\n for (const event of events) {\r\n if (event.type === 'checkpoint') {\r\n checkpoints.push({ promptIndex: event.promptIndex, ts: event.ts });\r\n }\r\n }\r\n\r\n if (checkpoints.length === 0) {\r\n return { revertedFiles: [], errors: [], toPromptIndex: 0, removedEvents: 0 };\r\n }\r\n\r\n checkpoints.sort((a, b) => b.promptIndex - a.promptIndex);\r\n const targetIndex = checkpoints[n]?.promptIndex ?? 0;\r\n\r\n const snapshotsToRevert: Array<{ promptIndex: number; files: FileSnapshot[] }> = [];\r\n let shouldRevert = false;\r\n\r\n for (const event of events) {\r\n if (event.type === 'checkpoint' && event.promptIndex === targetIndex) {\r\n shouldRevert = true;\r\n continue;\r\n }\r\n if (shouldRevert && event.type === 'file_snapshot') {\r\n snapshotsToRevert.push({ promptIndex: event.promptIndex, files: event.files });\r\n }\r\n }\r\n\r\n const result = await revertSnapshots(snapshotsToRevert.reverse(), this.projectRoot);\r\n return { ...result, toPromptIndex: targetIndex, removedEvents: snapshotsToRevert.length };\r\n }\r\n\r\n async rewindToStart(sessionId: string): Promise<RewindResultExtended> {\r\n const file = path.join(this.sessionsDir, `${sessionId}.jsonl`);\r\n const raw = await fsp.readFile(file, 'utf8');\r\n const events = parseEvents(raw);\r\n\r\n const allSnapshots: Array<{ promptIndex: number; files: FileSnapshot[] }> = [];\r\n for (const event of events) {\r\n if (event.type === 'file_snapshot') {\r\n allSnapshots.push({ promptIndex: event.promptIndex, files: event.files });\r\n }\r\n }\r\n\r\n if (allSnapshots.length === 0) {\r\n return { revertedFiles: [], errors: [], toPromptIndex: 0, removedEvents: 0 };\r\n }\r\n\r\n const result = await revertSnapshots(allSnapshots.reverse(), this.projectRoot);\r\n return { ...result, toPromptIndex: 0, removedEvents: allSnapshots.length };\r\n }\r\n}\r\n\r\nfunction parseEvents(raw: string): SessionEvent[] {\r\n const lines = raw.split('\\n').filter((l) => l.trim());\r\n const events: SessionEvent[] = [];\r\n\r\n for (const line of lines) {\r\n try {\r\n const parsed = JSON.parse(line);\r\n if (\r\n parsed !== null &&\r\n typeof parsed === 'object' &&\r\n typeof (parsed as { type?: unknown }).type === 'string' &&\r\n typeof (parsed as { ts?: unknown }).ts === 'string'\r\n ) {\r\n events.push(parsed as SessionEvent);\r\n }\r\n } catch {\r\n // skip malformed\r\n }\r\n }\r\n\r\n return events;\r\n}\r\n\r\nasync function revertSnapshots(\r\n snapshots: Array<{ promptIndex: number; files: FileSnapshot[] }>,\r\n projectRoot: string,\r\n): Promise<RewindResult> {\r\n const revertedFiles: string[] = [];\r\n const errors: string[] = [];\r\n\r\n for (const snapshot of snapshots) {\r\n for (const file of snapshot.files) {\r\n try {\r\n // Guard: ensure the target path resolves inside the project root.\r\n // Without this, a maliciously recorded path (e.g., via path traversal\r\n // in a tool call that wasn't caught) could cause rewind to write\r\n // to arbitrary locations.\r\n const absPath = path.resolve(file.path);\r\n const root = path.resolve(projectRoot);\r\n const rel = path.relative(root, absPath);\r\n if (rel.startsWith('..') || path.isAbsolute(rel)) {\r\n errors.push(`${file.path}: path resolves outside project root — skipping`);\r\n continue;\r\n }\r\n\r\n if (file.action === 'deleted') {\r\n // File was deleted — restore it from before\r\n if (file.before !== null) {\r\n // atomicWrite: torn restore would leave the user with a frankenstein file.\r\n await atomicWrite(file.path, file.before, { mode: 0o644 });\r\n revertedFiles.push(file.path);\r\n }\r\n } else if (file.action === 'created') {\r\n // File was created — delete it\r\n await fsp.unlink(file.path);\r\n revertedFiles.push(file.path);\r\n } else if (file.action === 'modified') {\r\n // File was modified — restore before content\r\n if (file.before !== null) {\r\n // atomicWrite: torn restore would leave the user with a frankenstein file.\r\n await atomicWrite(file.path, file.before, { mode: 0o644 });\r\n revertedFiles.push(file.path);\r\n }\r\n }\r\n } catch (err) {\r\n errors.push(`${file.path}: ${err instanceof Error ? err.message : String(err)}`);\r\n }\r\n }\r\n }\r\n\r\n return { revertedFiles, errors };\r\n}","import * as fsp from 'node:fs/promises';\nimport type { TodoItem } from '../core/context.js';\nimport type { ConversationState } from '../core/conversation-state.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * On-disk checkpoint for `ctx.todos`. Written atomically every time the\n * todo list changes, read once on session resume. This is the missing\n * piece that lets `wstack resume <id>` rehydrate where the previous run\n * stopped instead of starting with an empty board.\n *\n * Schema is intentionally small — a single JSON object so a future\n * format bump is easy. The `version` field is the only contract; the\n * shape under `todos` mirrors `TodoItem` so reading is a straight assign.\n */\nexport interface TodosCheckpointFile {\n version: 1;\n sessionId: string;\n updatedAt: string;\n todos: TodoItem[];\n}\n\nexport type TodosCheckpointDetach = () => Promise<void>;\n\n/** Read a checkpoint from disk. Returns null when the file doesn't\n * exist or is corrupt — callers treat both cases as \"no prior state\".\n */\nexport async function loadTodosCheckpoint(filePath: string): Promise<TodoItem[] | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as TodosCheckpointFile;\n if (parsed?.version !== 1 || !Array.isArray(parsed.todos)) return null;\n return parsed.todos.filter(\n (t): t is TodoItem =>\n !!t && typeof t.id === 'string' && typeof t.content === 'string' && typeof t.status === 'string',\n );\n } catch {\n return null;\n }\n}\n\n/** Write the checkpoint atomically. Best-effort: a write failure is\n * logged but does not throw — losing one checkpoint shouldn't bring\n * down the agent run.\n */\nexport async function saveTodosCheckpoint(\n filePath: string,\n sessionId: string,\n todos: readonly TodoItem[],\n): Promise<void> {\n const payload: TodosCheckpointFile = {\n version: 1,\n sessionId,\n updatedAt: new Date().toISOString(),\n todos: [...todos],\n };\n try {\n await atomicWrite(filePath, JSON.stringify(payload, null, 2), { mode: 0o600 });\n } catch (err) {\n console.warn(\n '[todos-checkpoint] save failed:',\n err instanceof Error ? err.message : String(err),\n );\n }\n}\n\n/**\n * Subscribe a `ConversationState` so every `todos_replaced` mutation\n * triggers an atomic write to disk. Returns the unsubscribe function.\n *\n * Writes are debounced by 150ms so a flurry of edits (e.g. the LLM\n * marking three items done in the same tool call) coalesces into one\n * disk hit.\n */\nexport function attachTodosCheckpoint(\n state: ConversationState,\n filePath: string,\n sessionId: string,\n): TodosCheckpointDetach {\n let timer: NodeJS.Timeout | null = null;\n let pending: readonly TodoItem[] | null = null;\n let writeChain: Promise<void> = Promise.resolve();\n\n const enqueueWrite = (todos: readonly TodoItem[]) => {\n writeChain = writeChain.then(() => saveTodosCheckpoint(filePath, sessionId, todos));\n return writeChain;\n };\n\n const flush = () => {\n timer = null;\n if (pending) {\n const todos = pending;\n pending = null;\n return enqueueWrite(todos);\n }\n return writeChain;\n };\n\n const unsubscribe = state.onChange((change) => {\n if (change.kind !== 'todos_replaced') return;\n pending = change.todos;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n void flush();\n }, 150);\n });\n return async () => {\n unsubscribe();\n if (timer) {\n clearTimeout(timer);\n // Flush any pending write before detach so callers can safely\n // unsubscribe at shutdown without losing the last update.\n await flush();\n } else {\n await writeChain;\n }\n };\n}\n","import * as fsp from 'node:fs/promises';\nimport { randomUUID } from 'node:crypto';\nimport type { ConversationState } from '../core/conversation-state.js';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Plan items are the strategic counterpart to todos. Where `ctx.todos`\n * is the moment-to-moment task board the LLM mutates per-turn, a plan\n * captures the higher-level approach — the steps the user (or LLM)\n * laid out before any work began.\n *\n * Plans persist by default (per session) so a resumed session can show\n * \"you were on step 3 of 5\". Todos are derived/transient. Both can\n * coexist: think roadmap (plan) vs. sprint board (todos).\n */\nexport interface PlanItem {\n id: string;\n title: string;\n /** Optional longer-form context or rationale. */\n details?: string;\n status: 'open' | 'in_progress' | 'done';\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface PlanFile {\n version: 1;\n sessionId: string;\n title?: string;\n updatedAt: string;\n items: PlanItem[];\n}\n\nexport async function loadPlan(filePath: string): Promise<PlanFile | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as PlanFile;\n if (parsed?.version !== 1 || !Array.isArray(parsed.items)) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\nexport async function savePlan(filePath: string, plan: PlanFile): Promise<void> {\n try {\n await atomicWrite(filePath, JSON.stringify(plan, null, 2), { mode: 0o600 });\n } catch (err) {\n console.warn(\n '[plan-store] save failed:',\n err instanceof Error ? err.message : String(err),\n );\n }\n}\n\n/** Create a new PlanFile when none exists on disk. */\nexport function emptyPlan(sessionId: string, title?: string): PlanFile {\n return {\n version: 1,\n sessionId,\n title,\n updatedAt: new Date().toISOString(),\n items: [],\n };\n}\n\nexport function addPlanItem(\n plan: PlanFile,\n title: string,\n details?: string,\n): { plan: PlanFile; item: PlanItem } {\n const now = new Date().toISOString();\n const item: PlanItem = {\n id: `plan_${Date.now()}_${randomUUID().slice(0, 6)}`,\n title,\n details,\n status: 'open',\n createdAt: now,\n updatedAt: now,\n };\n return {\n plan: { ...plan, items: [...plan.items, item], updatedAt: now },\n item,\n };\n}\n\nexport function removePlanItem(plan: PlanFile, idOrIndex: string): PlanFile {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return plan;\n return {\n ...plan,\n items: plan.items.filter((_, i) => i !== idx),\n updatedAt: new Date().toISOString(),\n };\n}\n\nexport function setPlanItemStatus(\n plan: PlanFile,\n idOrIndex: string,\n status: PlanItem['status'],\n): PlanFile {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return plan;\n const now = new Date().toISOString();\n const items = plan.items.map((it, i) =>\n i === idx ? { ...it, status, updatedAt: now } : it,\n );\n return { ...plan, items, updatedAt: now };\n}\n\nexport function clearPlan(plan: PlanFile): PlanFile {\n return { ...plan, items: [], updatedAt: new Date().toISOString() };\n}\n\n/** Render the plan as a short markdown-ish string suitable for slash output. */\nexport function formatPlan(plan: PlanFile): string {\n if (plan.items.length === 0) return 'Plan is empty.';\n const lines: string[] = [];\n if (plan.title) lines.push(`# ${plan.title}`);\n plan.items.forEach((it, i) => {\n const mark = it.status === 'done' ? '[x]' : it.status === 'in_progress' ? '[~]' : '[ ]';\n lines.push(`${i + 1}. ${mark} ${it.title}`);\n if (it.details) {\n for (const line of it.details.split('\\n')) lines.push(` ${line}`);\n }\n });\n return lines.join('\\n');\n}\n\nfunction matchIndex(plan: PlanFile, idOrIndex: string): number {\n const asNum = Number.parseInt(idOrIndex, 10);\n if (!Number.isNaN(asNum) && asNum >= 1 && asNum <= plan.items.length) return asNum - 1;\n const byId = plan.items.findIndex((it) => it.id === idOrIndex);\n if (byId !== -1) return byId;\n const lower = idOrIndex.toLowerCase();\n return plan.items.findIndex((it) => it.title.toLowerCase().includes(lower));\n}\n\n/**\n * Promote a plan item to a set of todo items.\n * The plan item is marked 'in_progress' (if not already done) and its\n * title + details become the first todo; additional subtasks are appended.\n * Returns the derived todo list so the caller can pass it to `todoTool`\n * or `ctx.state.replaceTodos()`.\n */\nexport function deriveTodosFromPlanItem(\n plan: PlanFile,\n idOrIndex: string,\n subtasks?: string[],\n): { plan: PlanFile; todos: Array<{ id: string; content: string; status: 'pending' | 'in_progress' | 'completed'; activeForm?: string }> } | null {\n const idx = matchIndex(plan, idOrIndex);\n if (idx === -1) return null;\n\n const item = plan.items[idx];\n if (!item) return null;\n\n // Mark the plan item in_progress if it wasn't already done\n let updatedPlan = plan;\n if (item.status !== 'done') {\n updatedPlan = setPlanItemStatus(plan, idOrIndex, 'in_progress');\n }\n\n const todos: Array<{ id: string; content: string; status: 'pending' | 'in_progress' | 'completed'; activeForm?: string }> = [];\n\n // First todo from the plan item itself\n todos.push({\n id: `todo_${Date.now()}_plan`,\n content: item.title,\n status: 'in_progress',\n activeForm: item.title,\n });\n\n // Optional subtasks\n if (subtasks && subtasks.length > 0) {\n for (const st of subtasks) {\n todos.push({\n id: `todo_${Date.now()}_${randomUUID().slice(0, 6)}`,\n content: st,\n status: 'pending',\n });\n }\n }\n\n return { plan: updatedPlan, todos };\n}\n\n/**\n * Optional: attach a state-listener so meta operations (storing a plan\n * id on ctx.meta) trigger a save. Currently a stub — plans don't live\n * on Context, but this keeps the API surface symmetric with the todos\n * checkpoint so future refactors can flip plans into Context if needed.\n */\nexport function attachPlanCheckpoint(\n _state: ConversationState,\n _filePath: string,\n _sessionId: string,\n): () => void {\n return () => undefined;\n}\n","/**\n * Plan templates — pre-defined plan skeletons for common workflows.\n *\n * Templates are stored in-memory (no disk I/O). Users instantiate them\n * via `/plan template use <name>` or `planTool(action: 'template_use')`.\n * Each template is a function that returns an array of item titles, so\n * dynamic content (dates, project names) can be injected later.\n */\n\nexport interface PlanTemplate {\n name: string;\n description: string;\n category: 'development' | 'release' | 'maintenance' | 'infrastructure';\n items: Array<{\n title: string;\n details?: string;\n }>;\n}\n\nconst templates: Record<string, PlanTemplate> = {\n 'new-feature': {\n name: 'new-feature',\n description: 'Standard workflow for adding a new feature',\n category: 'development',\n items: [\n { title: 'Write specification / design doc', details: 'Define scope, acceptance criteria, edge cases' },\n { title: 'Set up feature branch', details: 'git checkout -b feature/...' },\n { title: 'Implement core logic', details: 'TDD preferred — write tests first' },\n { title: 'Add unit tests', details: '>= 80% coverage for new code' },\n { title: 'Add integration tests', details: 'End-to-end happy path + error paths' },\n { title: 'Update documentation', details: 'README, API docs, changelog' },\n { title: 'Code review', details: 'Self-review before requesting review' },\n { title: 'Merge and deploy', details: 'CI green, tag release' },\n ],\n },\n 'bug-fix': {\n name: 'bug-fix',\n description: 'Systematic approach to fixing bugs',\n category: 'maintenance',\n items: [\n { title: 'Reproduce the bug', details: 'Minimal reproduction case' },\n { title: 'Root cause analysis', details: 'Trace through logs, debugger' },\n { title: 'Write failing test', details: 'Test must fail before fix' },\n { title: 'Implement fix', details: 'Smallest possible change' },\n { title: 'Verify fix', details: 'Test passes, reproduction no longer fails' },\n { title: 'Regression test', details: 'Ensure no related tests broken' },\n { title: 'Document in changelog', details: 'Brief description + issue link' },\n ],\n },\n 'refactor': {\n name: 'refactor',\n description: 'Safe refactoring workflow',\n category: 'maintenance',\n items: [\n { title: 'Identify refactoring target', details: 'Code smell, performance bottleneck, or tech debt' },\n { title: 'Ensure test coverage', details: 'Existing tests must pass before and after' },\n { title: 'Write characterization tests', details: 'Capture current behavior if tests weak' },\n { title: 'Apply refactoring', details: 'Small steps, frequent commits' },\n { title: 'Run full test suite', details: 'All tests must pass' },\n { title: 'Performance check', details: 'Ensure no regression' },\n { title: 'Code review', details: 'Explain the why, not just the what' },\n ],\n },\n 'release': {\n name: 'release',\n description: 'Preparing a new release',\n category: 'release',\n items: [\n { title: 'Version bump', details: 'package.json, lockfiles, tags' },\n { title: 'Update changelog', details: 'All changes since last release' },\n { title: 'Run full test suite', details: 'Unit + integration + e2e' },\n { title: 'Build artifacts', details: 'Docker images, bundles, binaries' },\n { title: 'Staging smoke tests', details: 'Deploy to staging, verify' },\n { title: 'Production deploy', details: 'Blue-green or canary' },\n { title: 'Post-deploy verification', details: 'Health checks, error rates' },\n { title: 'Announce release', details: 'Slack, email, GitHub release notes' },\n ],\n },\n 'security-audit': {\n name: 'security-audit',\n description: 'Security review and hardening',\n category: 'infrastructure',\n items: [\n { title: 'Dependency audit', details: 'npm audit, Snyk, Dependabot alerts' },\n { title: 'Secret scan', details: 'git-secrets, truffleHog, manual review' },\n { title: 'Access control review', details: 'IAM, roles, least privilege' },\n { title: 'Input validation audit', details: 'SQL injection, XSS, path traversal' },\n { title: 'Authentication review', details: 'Session management, MFA, password policy' },\n { title: 'Logging and monitoring', details: 'PII in logs, audit trails' },\n { title: 'Incident response plan', details: 'Runbooks, contacts, escalation' },\n ],\n },\n 'onboarding': {\n name: 'onboarding',\n description: 'New developer onboarding checklist',\n category: 'infrastructure',\n items: [\n { title: 'Repository access', details: 'GitHub/GitLab permissions' },\n { title: 'Local environment setup', details: 'Docker, dependencies, env files' },\n { title: 'Run tests locally', details: 'Verify green suite' },\n { title: 'Read architecture docs', details: 'ADR, README, onboarding guide' },\n { title: 'First commit', details: 'Docs fix or small improvement' },\n { title: 'Pair programming session', details: 'Walk through codebase with buddy' },\n { title: 'Deploy to staging', details: 'Verify CI/CD access' },\n ],\n },\n};\n\nexport function listPlanTemplates(): PlanTemplate[] {\n return Object.values(templates);\n}\n\nexport function getPlanTemplate(name: string): PlanTemplate | undefined {\n return templates[name];\n}\n\nexport function formatPlanTemplates(): string {\n const cats = new Map<PlanTemplate['category'], PlanTemplate[]>();\n for (const t of Object.values(templates)) {\n const arr = cats.get(t.category) ?? [];\n arr.push(t);\n cats.set(t.category, arr);\n }\n\n const lines: string[] = ['Available plan templates:'];\n for (const [cat, items] of cats) {\n lines.push(`\\n${cat}:`);\n for (const t of items) {\n lines.push(` ${t.name.padEnd(18)} — ${t.description}`);\n }\n }\n return lines.join('\\n');\n}\n","import * as fsp from 'node:fs/promises';\nimport { atomicWrite } from '../utils/atomic-write.js';\n\n/**\n * Director state checkpoint — written incrementally throughout a fleet\n * run so a crashed director can be inspected (and eventually resumed)\n * instead of leaving only a final `fleet.json` manifest after `shutdown()`.\n *\n * Schema is JSON-friendly and deliberately denormalized. Each mutation\n * triggers an atomic-write of the whole file — small payloads (typically\n * < 10 KB even with dozens of subagents) make this cheap.\n */\nexport interface DirectorSubagentState {\n id: string;\n name?: string;\n role?: string;\n provider?: string;\n model?: string;\n spawnedAt: string;\n}\n\nexport interface DirectorTaskState {\n taskId: string;\n subagentId?: string;\n description?: string;\n status: 'pending' | 'running' | 'completed' | 'failed' | 'stopped' | 'timeout';\n assignedAt?: string;\n completedAt?: string;\n iterations?: number;\n toolCalls?: number;\n durationMs?: number;\n error?: string;\n}\n\nexport interface DirectorStateSnapshot {\n version: 1;\n directorRunId: string;\n updatedAt: string;\n spawnCount: number;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n subagents: DirectorSubagentState[];\n tasks: DirectorTaskState[];\n /** Aggregated usage snapshot. Optional — populated by the Director on save when available. */\n usage?: unknown;\n}\n\nexport async function loadDirectorState(filePath: string): Promise<DirectorStateSnapshot | null> {\n let raw: string;\n try {\n raw = await fsp.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n try {\n const parsed = JSON.parse(raw) as DirectorStateSnapshot;\n if (parsed?.version !== 1) return null;\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * Lock file entry written when a director starts. Prevents two directors\n * from resuming the same run — the second one sees the lock and refuses\n * rather than corrupting the checkpoint by writing concurrently.\n */\nexport interface DirectorStateLock {\n pid: number;\n hostname: string;\n startedAt: string;\n}\n\n/**\n * Write a lock file to claim this checkpoint. Returns false if the lock\n * is already held by a live process; returns true if the lock was acquired\n * (either the file didn't exist, or the previous holder is dead).\n */\nexport async function acquireDirectorStateLock(\n lockPath: string,\n processId = process.pid,\n): Promise<boolean> {\n let existing: string | undefined;\n try {\n existing = await fsp.readFile(lockPath, 'utf8');\n } catch {\n // No lock file — we're safe to claim\n }\n\n if (existing) {\n try {\n const lock = JSON.parse(existing) as DirectorStateLock;\n // Check if the process is still alive\n try {\n process.kill(lock.pid, 0);\n // Signal success means the process is alive — another director\n // owns this checkpoint. Refuse.\n return false;\n } catch {\n // ESRCH means the process is dead — stale lock. We'll overwrite.\n }\n } catch {\n // Malformed lock — treat as stale.\n }\n }\n\n const lock: DirectorStateLock = {\n pid: processId,\n hostname: require('node:os').hostname(),\n startedAt: new Date().toISOString(),\n };\n await atomicWrite(lockPath, JSON.stringify(lock), { mode: 0o600 });\n return true;\n}\n\n/**\n * Remove the lock file. Call this on graceful Director.shutdown() so the\n * next director run can claim the checkpoint without stale-lock checks.\n */\nexport async function releaseDirectorStateLock(lockPath: string): Promise<void> {\n try {\n await fsp.unlink(lockPath);\n } catch {\n // ignore\n }\n}\n\n/**\n * In-memory accumulator with atomic-write checkpoint. The Director keeps\n * an instance, mutates it on every spawn/assign/complete/fail event, and\n * the instance debounces writes so a burst of activity collapses into a\n * single disk hit.\n *\n * Supports crash recovery: use `loadDirectorState()` to read an existing\n * checkpoint, then call `DirectorStateCheckpoint.resume(snapshot)` to\n * re-attach to a fleet mid-flight. The lock mechanism ensures no two\n * directors can claim the same checkpoint.\n */\nexport class DirectorStateCheckpoint {\n private snapshot: DirectorStateSnapshot;\n private readonly filePath: string;\n private readonly lockPath: string;\n private timer: NodeJS.Timeout | null = null;\n private readonly debounceMs: number;\n private writing = false;\n private rewriteRequested = false;\n\n constructor(\n filePath: string,\n init: {\n directorRunId: string;\n maxSpawns?: number;\n spawnDepth: number;\n maxSpawnDepth: number;\n directorBudget?: {\n maxCostUsd?: number;\n };\n },\n debounceMs = 250,\n ) {\n this.filePath = filePath;\n // Lock file lives alongside the checkpoint — `<path>.lock`\n this.lockPath = `${filePath}.lock`;\n this.debounceMs = debounceMs;\n this.snapshot = {\n version: 1,\n directorRunId: init.directorRunId,\n updatedAt: new Date().toISOString(),\n spawnCount: 0,\n maxSpawns: init.maxSpawns,\n spawnDepth: init.spawnDepth,\n maxSpawnDepth: init.maxSpawnDepth,\n directorBudget: init.directorBudget,\n subagents: [],\n tasks: [],\n };\n }\n\n /**\n * Attempt to acquire the lock for this checkpoint. Call this before\n * resuming a crashed director run. If it returns false, another\n * director process is still running this fleet — do not resume.\n */\n async acquireLock(): Promise<boolean> {\n return acquireDirectorStateLock(this.lockPath);\n }\n\n /**\n * Release the lock on graceful shutdown. Call `flush()` first to ensure\n * the final checkpoint state is on disk before removing the lock.\n * Without this, the next resume will see a stale-lock and refuse.\n */\n async releaseLock(): Promise<void> {\n return releaseDirectorStateLock(this.lockPath);\n }\n\n /**\n * Resume from a snapshot previously loaded via `loadDirectorState()`.\n * Use this when `--resume <runId>` is triggered — the snapshot has\n * the full fleet state (subagents, tasks) from before the crash; the\n * checkpoint continues from there.\n */\n resume(snapshot: DirectorStateSnapshot): void {\n this.snapshot = snapshot;\n }\n\n current(): DirectorStateSnapshot {\n return this.snapshot;\n }\n\n recordSpawn(sub: DirectorSubagentState, spawnCount: number): void {\n this.snapshot = {\n ...this.snapshot,\n spawnCount,\n subagents: [...this.snapshot.subagents.filter((s) => s.id !== sub.id), sub],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskAssigned(task: DirectorTaskState): void {\n const exists = this.snapshot.tasks.some((t) => t.taskId === task.taskId);\n this.snapshot = {\n ...this.snapshot,\n tasks: exists\n ? this.snapshot.tasks.map((t) => (t.taskId === task.taskId ? { ...t, ...task } : t))\n : [...this.snapshot.tasks, task],\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n recordTaskStatus(\n taskId: string,\n patch: Partial<DirectorTaskState> & { status: DirectorTaskState['status'] },\n ): void {\n this.snapshot = {\n ...this.snapshot,\n tasks: this.snapshot.tasks.map((t) =>\n t.taskId === taskId ? { ...t, ...patch } : t,\n ),\n };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n setUsage(usage: unknown): void {\n this.snapshot = { ...this.snapshot, usage };\n this.bumpUpdatedAt();\n this.schedule();\n }\n\n /** Force a synchronous flush — used by Director.shutdown(). */\n async flush(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n await this.persist();\n // If a rewrite was requested while we waited, persist() scheduled\n // a follow-up write. Loop until no more rewrites are requested so\n // shutdown doesn't return before the most recent state lands on disk.\n while (this.rewriteRequested) {\n this.rewriteRequested = false;\n await this.persist();\n }\n }\n\n private bumpUpdatedAt(): void {\n this.snapshot = { ...this.snapshot, updatedAt: new Date().toISOString() };\n }\n\n private schedule(): void {\n if (this.timer) return;\n this.timer = setTimeout(() => {\n this.timer = null;\n void this.persist();\n }, this.debounceMs);\n }\n\n private async persist(): Promise<void> {\n if (this.writing) {\n // A write is already in flight — defer to a follow-up flush so the\n // most recent state still lands. Without this guard, simultaneous\n // burst mutations can drop the latest snapshot if rename races.\n this.rewriteRequested = true;\n return;\n }\n this.writing = true;\n try {\n await atomicWrite(this.filePath, JSON.stringify(this.snapshot, null, 2), {\n mode: 0o600,\n });\n } catch (err) {\n console.warn(\n '[director-state] checkpoint write failed:',\n err instanceof Error ? err.message : String(err),\n );\n } finally {\n this.writing = false;\n if (this.rewriteRequested) {\n this.rewriteRequested = false;\n this.schedule();\n }\n }\n }\n}\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n CONTAINER_CIRCULAR_DEPENDENCY: 'CONTAINER_CIRCULAR_DEPENDENCY',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n REGISTRY_INVALID: 'REGISTRY_INVALID',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { createHash } from 'node:crypto';\r\nimport * as os from 'node:os';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\nimport { FsError, ERROR_CODES } from '../types/errors.js';\r\n\r\n/**\r\n * Long-running autonomous mission. A goal survives across sessions and\r\n * drives the EternalAutonomyEngine — every iteration of the engine\r\n * consults the goal to choose what to do next.\r\n *\r\n * Storage: `~/.wrongstack/projects/<hash>/goal.json`. Persistent and\r\n * project-scoped on purpose: the goal belongs to the codebase, not the\r\n * REPL session.\r\n */\r\n\r\nexport interface JournalEntry {\r\n /** ISO timestamp of the iteration. */\r\n at: string;\r\n /** Sequential iteration counter (1-based, monotonically increasing). */\r\n iteration: number;\r\n /** Source that produced the action ('todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel'). */\r\n source: 'todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel';\r\n /** Short one-line description of what the iteration set out to do. */\r\n task: string;\r\n /** Outcome status. */\r\n status: 'success' | 'failure' | 'aborted' | 'skipped';\r\n /** Optional free-form note (error message, summary, etc.). */\r\n note?: string;\r\n /** Optional token usage delta for this iteration. */\r\n tokens?: { input: number; output: number };\r\n /** Optional USD cost delta for this iteration (provider-estimated). */\r\n costUsd?: number;\r\n}\r\n\r\nexport interface GoalFile {\r\n version: 1;\r\n /** The mission statement. */\r\n goal: string;\r\n /** When the goal was first set or last replaced. */\r\n setAt: string;\r\n /** Updated on every iteration completion. */\r\n lastActivityAt: string;\r\n /** Total iterations the engine has run against this goal (cumulative). */\r\n iterations: number;\r\n /** Engine lifecycle state — 'running' means another process owns this goal. */\r\n engineState: 'idle' | 'running' | 'stopped';\r\n /**\r\n * Mission-level lifecycle. `active` is the default; `completed` is set\r\n * when the engine detects `[GOAL_COMPLETE]` in a successful iteration's\r\n * final text AND a verification pass agrees; `abandoned` is set by the\r\n * user (e.g. `/goal abandon`) or when the engine exceeds a configured\r\n * failure ceiling. Once not `active`, the engine refuses to run further\r\n * iterations against this goal — protects against accidental restarts\r\n * burning through API quota after the work is done.\r\n *\r\n * Optional for backward compatibility — pre-existing `goal.json` files\r\n * without this field load as `active`.\r\n */\r\n goalState?: 'active' | 'paused' | 'completed' | 'abandoned';\r\n /**\r\n * Per-todo attempt counter. Keyed by TodoItem id. Used by the engine\r\n * to skip a todo that has failed N times rather than spinning on it\r\n * forever. Persisted so attempt counts survive restarts (`/autonomy\r\n * stop` + resume should not reset progress against a stuck task).\r\n */\r\n todoAttempts?: Record<string, number>;\r\n /** Bounded ring buffer of recent iterations (newest last). */\r\n journal: JournalEntry[];\r\n}\r\n\r\n/** Cap on persisted journal entries — older entries are evicted FIFO. */\r\nexport const MAX_JOURNAL_ENTRIES = 500;\r\n\r\n/**\r\n * Resolve the goal file path for a given project root.\r\n * Exposed so the engine and CLI use one canonical path.\r\n * Uses `~/.wrongstack/projects/<hash>/goal.json` .<hash>/`.\r\n */\r\nexport function goalFilePath(projectRoot: string): string {\r\n // Now resolves to ~/.wrongstack/projects/<hash>/goal.json for consistency\r\n // with WstackPaths.projectGoal.\r\n const hash = createHash('sha256').update(path.resolve(projectRoot)).digest('hex').slice(0, 12);\r\n return path.join(os.homedir(), '.wrongstack', 'projects', hash, 'goal.json');\r\n}\r\n\r\nexport async function loadGoal(filePath: string): Promise<GoalFile | null> {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(filePath, 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n try {\r\n const parsed = JSON.parse(raw) as GoalFile;\r\n if (parsed?.version !== 1 || typeof parsed.goal !== 'string' || !Array.isArray(parsed.journal)) {\r\n return null;\r\n }\r\n return parsed;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function saveGoal(filePath: string, goal: GoalFile): Promise<void> {\r\n try {\r\n await atomicWrite(filePath, JSON.stringify(goal, null, 2), { mode: 0o600 });\r\n } catch (err) {\r\n throw new FsError({\r\n message: err instanceof Error ? err.message : String(err),\r\n code: ERROR_CODES.FS_ATOMIC_WRITE_FAILED,\r\n path: filePath,\r\n cause: err,\r\n });\r\n }\r\n}\r\n\r\nexport function emptyGoal(goal: string): GoalFile {\r\n const now = new Date().toISOString();\r\n return {\r\n version: 1,\r\n goal,\r\n setAt: now,\r\n lastActivityAt: now,\r\n iterations: 0,\r\n engineState: 'idle',\r\n goalState: 'active',\r\n todoAttempts: {},\r\n journal: [],\r\n };\r\n}\r\n\r\n/**\r\n * Append a journal entry, bumping iteration counters and trimming the\r\n * ring buffer. Returns a new GoalFile — does not mutate the argument.\r\n */\r\nexport function appendJournal(goal: GoalFile, entry: Omit<JournalEntry, 'iteration' | 'at'>): GoalFile {\r\n const iteration = goal.iterations + 1;\r\n const at = new Date().toISOString();\r\n const full: JournalEntry = { ...entry, iteration, at };\r\n const journal = [...goal.journal, full];\r\n // Trim FIFO if over cap. Slice from the tail so the *newest* MAX entries survive.\r\n const trimmed = journal.length > MAX_JOURNAL_ENTRIES\r\n ? journal.slice(journal.length - MAX_JOURNAL_ENTRIES)\r\n : journal;\r\n return {\r\n ...goal,\r\n iterations: iteration,\r\n lastActivityAt: at,\r\n journal: trimmed,\r\n };\r\n}\r\n\r\n/**\r\n * Aggregate cumulative cost + tokens across all journal entries. Entries\r\n * without telemetry are skipped (legacy entries from before the field\r\n * was added still load cleanly).\r\n */\r\nexport function summarizeUsage(goal: GoalFile): {\r\n totalCostUsd: number;\r\n totalInputTokens: number;\r\n totalOutputTokens: number;\r\n iterationsWithUsage: number;\r\n} {\r\n let totalCostUsd = 0;\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n let iterationsWithUsage = 0;\r\n for (const e of goal.journal) {\r\n if (typeof e.costUsd === 'number') totalCostUsd += e.costUsd;\r\n if (e.tokens) {\r\n totalInputTokens += e.tokens.input;\r\n totalOutputTokens += e.tokens.output;\r\n }\r\n if (typeof e.costUsd === 'number' || e.tokens) iterationsWithUsage++;\r\n }\r\n return { totalCostUsd, totalInputTokens, totalOutputTokens, iterationsWithUsage };\r\n}\r\n\r\n/** Format the goal + recent journal as a human-readable status block. */\r\nexport function formatGoal(goal: GoalFile, journalLimit = 10): string {\r\n const lines: string[] = [];\r\n lines.push(`Goal: ${goal.goal}`);\r\n lines.push(`Set: ${goal.setAt}`);\r\n lines.push(`Last activity: ${goal.lastActivityAt}`);\r\n lines.push(`Iterations: ${goal.iterations}`);\r\n const stateLabel = goal.goalState ?? 'active';\r\n lines.push(`State: ${stateLabel}${goal.iterations > 0 ? ` (iteration #${goal.iterations})` : ''}`);\r\n lines.push(`Engine: ${goal.engineState}`);\r\n const usage = summarizeUsage(goal);\r\n if (usage.iterationsWithUsage > 0) {\r\n lines.push(\r\n `Spent: $${usage.totalCostUsd.toFixed(4)} (in ${usage.totalInputTokens} / out ${usage.totalOutputTokens} tokens across ${usage.iterationsWithUsage} iterations)`,\r\n );\r\n }\r\n if (goal.journal.length > 0) {\r\n lines.push('');\r\n lines.push(`Recent journal (last ${Math.min(journalLimit, goal.journal.length)}):`);\r\n const tail = goal.journal.slice(-journalLimit);\r\n for (const e of tail) {\r\n const mark = e.status === 'success' ? '✓' : e.status === 'failure' ? '✗' : e.status === 'aborted' ? '⊘' : '·';\r\n const note = e.note ? ` — ${e.note}` : '';\r\n const cost = typeof e.costUsd === 'number' ? ` ($${e.costUsd.toFixed(4)})` : '';\r\n lines.push(` #${e.iteration} ${mark} [${e.source}] ${e.task}${cost}${note}`);\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n","import { randomUUID } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { atomicWrite, ensureDir } from '../utils/atomic-write.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface PromptEntry {\n id: string;\n title: string;\n content: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface PromptStore {\n list(): Promise<PromptEntry[]>;\n get(id: string): Promise<PromptEntry | null>;\n save(entry: PromptEntry): Promise<void>;\n delete(id: string): Promise<boolean>;\n find(query: string): Promise<PromptEntry[]>;\n}\n\ninterface RawPromptFile {\n version: 1;\n entry: PromptEntry;\n}\n\nexport class DefaultPromptStore implements PromptStore {\n private readonly dir: string;\n\n constructor(paths: WstackPaths) {\n this.dir = paths.globalPrompts;\n }\n\n async list(): Promise<PromptEntry[]> {\n await ensureDir(this.dir);\n const entries: PromptEntry[] = [];\n try {\n const files = await fs.readdir(this.dir);\n for (const file of files) {\n if (!file.endsWith('.json')) continue;\n try {\n const raw: RawPromptFile = JSON.parse(\n await fs.readFile(path.join(this.dir, file), 'utf8'),\n );\n entries.push(raw.entry);\n } catch {\n // skip corrupt files\n }\n }\n } catch {\n // dir doesn't exist yet\n }\n return entries.sort(\n (a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n );\n }\n\n async get(id: string): Promise<PromptEntry | null> {\n const file = path.join(this.dir, `${id}.json`);\n try {\n const raw: RawPromptFile = JSON.parse(await fs.readFile(file, 'utf8'));\n return raw.entry;\n } catch {\n return null;\n }\n }\n\n async save(entry: PromptEntry): Promise<void> {\n await ensureDir(this.dir);\n const file = path.join(this.dir, `${entry.id}.json`);\n const raw: RawPromptFile = { version: 1, entry };\n await atomicWrite(file, JSON.stringify(raw, null, 2));\n }\n\n async delete(id: string): Promise<boolean> {\n const file = path.join(this.dir, `${id}.json`);\n try {\n await fs.unlink(file);\n return true;\n } catch {\n return false;\n }\n }\n\n async find(query: string): Promise<PromptEntry[]> {\n const all = await this.list();\n const lower = query.toLowerCase();\n return all.filter(\n (e) =>\n e.title.toLowerCase().includes(lower) ||\n e.content.toLowerCase().includes(lower) ||\n e.tags.some((t) => t.toLowerCase().includes(lower)),\n );\n }\n\n /** Create a new entry and return it. Does NOT persist — call save() afterwards. */\n createNew(title: string, content: string, tags: string[] = []): PromptEntry {\n const now = new Date().toISOString();\n return {\n id: randomUUID().slice(0, 8),\n title,\n content,\n tags,\n createdAt: now,\n updatedAt: now,\n };\n }\n}","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\nimport type { SyncCategory, SyncConfig } from '../types/config.js';\n\nexport const ALL_SYNC_CATEGORIES: SyncCategory[] = ['settings', 'skills', 'prompts', 'memory', 'history'];\n\nexport interface SyncResult {\n ok: boolean;\n action: 'push' | 'pull';\n categories: SyncCategory[];\n committedAt?: string;\n message: string;\n}\n\ninterface SyncStateFile {\n version: 1;\n sha: string;\n lastSyncedAt: string;\n localRev: string;\n}\n\n/**\n * CloudSync — push/pull user-selected ~/.wrongstack categories to a\n * private GitHub repo. No git CLI needed; uses GitHub REST API via fetch.\n * The token is stored encrypted via SecretVault (field named `githubToken`\n * so the vault walker picks it up automatically).\n */\nexport class CloudSync {\n private readonly statePath: string;\n private state: SyncStateFile | null = null;\n\n constructor(\n private readonly paths: WstackPaths,\n private readonly getConfig: () => SyncConfig | null,\n private readonly setConfig: (c: SyncConfig) => Promise<void>,\n ) {\n this.statePath = path.join(paths.globalRoot, 'sync-state.json');\n }\n\n // ── Public API ─────────────────────────────────────────────────────\n\n async status(): Promise<string> {\n const cfg = this.getConfig();\n if (!cfg?.enabled) {\n return 'CloudSync: disabled. Run `/sync enable` to activate.';\n }\n const last = this.state?.lastSyncedAt;\n const since = last ? timeAgo(last) : 'never';\n return [\n `CloudSync: enabled`,\n ` repo: ${cfg.repo}`,\n ` categories: ${cfg.categories.join(', ')}`,\n ` last sync: ${since}`,\n ].join('\\n');\n }\n\n async enable(_repo: string, _categories: SyncCategory[]): Promise<string> {\n // Persisted by the slash command via configStore.update.\n return 'Enable via /sync enable.';\n }\n\n async disable(): Promise<string> {\n const cfg = this.getConfig();\n if (!cfg) return 'CloudSync is not configured.';\n const next = { ...cfg, enabled: false };\n await this.setConfig(next);\n return 'CloudSync disabled. Local data kept.';\n }\n\n async push(token: string): Promise<SyncResult> {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return { ok: false, action: 'push', categories: [], message: 'Not enabled.' };\n\n const parts = cfg.repo.split('/');\n const owner = parts[0]!;\n const repoName = parts[1]!;\n const branch = 'main';\n const baseTreeSha = this.state?.sha;\n\n const { treeEntries, rev } = await this.buildLocalTree(cfg.categories);\n const newTreeSha = await this.createGitTree(token, owner, repoName, treeEntries, baseTreeSha);\n\n const commitSha = await this.createCommit(\n token, owner, repoName, newTreeSha,\n baseTreeSha,\n `Sync ${cfg.categories.join(', ')} — ${new Date().toISOString()}`,\n );\n\n try {\n await this.updateRef(token, owner, repoName, branch, commitSha);\n } catch (err) {\n // 422 = not a fast forward — remote branch moved. Fetch latest SHA and retry.\n if (err instanceof Error && err.message.includes('422')) {\n const remote = await this.getRef(token, owner, repoName, branch);\n const currentSha = remote.object.sha;\n const rebasedCommitSha = await this.createCommit(\n token, owner, repoName, newTreeSha,\n currentSha,\n `Sync ${cfg.categories.join(', ')} — ${new Date().toISOString()}`,\n );\n await this.updateRef(token, owner, repoName, branch, rebasedCommitSha);\n } else {\n throw err;\n }\n }\n\n const syncState: SyncStateFile = {\n version: 1,\n sha: commitSha,\n lastSyncedAt: new Date().toISOString(),\n localRev: rev,\n };\n await fs.writeFile(this.statePath, JSON.stringify(syncState, null, 2), 'utf8');\n this.state = syncState;\n\n return {\n ok: true,\n action: 'push',\n categories: cfg.categories,\n committedAt: commitSha,\n message: `Pushed ${cfg.categories.join(', ')} to ${cfg.repo}. Commit: ${commitSha.slice(0, 7)}`,\n };\n }\n\n async pull(token: string): Promise<SyncResult> {\n const cfg = this.getConfig();\n if (!cfg?.enabled) return { ok: false, action: 'pull', categories: [], message: 'Not enabled.' };\n\n const pullParts = cfg.repo.split('/');\n const owner = pullParts[0]!;\n const repoName = pullParts[1]!;\n\n const branchData = await this.getRef(token, owner, repoName, 'main');\n const currentSha = branchData.object.sha;\n\n const commitData = await this.getCommit(token, owner, repoName, currentSha);\n const treeSha = commitData.tree.sha;\n\n const treeEntries = await this.getTreeEntries(token, owner, repoName, treeSha);\n\n for (const entry of treeEntries) {\n if (entry.type !== 'blob') continue;\n\n // Paths look like \"data/{category}/...\" — extract the category\n const segments = entry.path.split('/');\n if (segments[0] !== 'data' || !segments[1]) continue;\n const cat = segments[1] as SyncCategory;\n if (!['settings', 'skills', 'prompts', 'memory', 'history'].includes(cat)) continue;\n\n const localPath = this.categoryToPath(cat);\n if (!localPath) continue;\n\n // Reconstruct relative path under the category dir. Remote trees are\n // untrusted input: a compromised sync repo could contain paths like\n // data/skills/../../config.json. Keep every write inside the selected\n // category root, and only allow subpaths for directory-backed categories.\n const rel = segments.slice(2).join('/');\n const destPath = resolvePulledCategoryPath(cat, localPath, rel, entry.path);\n\n const blobData = await this.getBlob(token, owner, repoName, entry.sha);\n await fs.mkdir(path.dirname(destPath), { recursive: true });\n await fs.writeFile(destPath, Buffer.from(blobData, 'base64'));\n }\n\n const localRev = await this.hashLocalCategories(cfg.categories);\n const syncState: SyncStateFile = {\n version: 1,\n sha: currentSha,\n lastSyncedAt: new Date().toISOString(),\n localRev,\n };\n await fs.writeFile(this.statePath, JSON.stringify(syncState, null, 2), 'utf8');\n this.state = syncState;\n\n return {\n ok: true,\n action: 'pull',\n categories: cfg.categories,\n committedAt: currentSha,\n message: `Pulled ${cfg.categories.join(', ')} from ${cfg.repo}. Commit: ${currentSha.slice(0, 7)}`,\n };\n }\n\n async hasLocalChanges(): Promise<boolean> {\n if (!this.state) return true;\n const cfg = this.getConfig();\n if (!cfg) return true;\n const current = await this.hashLocalCategories(cfg.categories);\n return current !== this.state.localRev;\n }\n\n async loadState(): Promise<void> {\n try {\n const raw = await fs.readFile(this.statePath, 'utf8');\n this.state = JSON.parse(raw) as SyncStateFile;\n } catch {\n this.state = null;\n }\n }\n\n // ── GitHub API helpers ──────────────────────────────────────────────\n\n private async githubFetch(\n token: string,\n owner: string,\n repo: string,\n method: 'GET' | 'POST' | 'PUT' | 'PATCH',\n pathSegment: string,\n body?: unknown,\n ): Promise<unknown> {\n const url = `https://api.github.com/repos/${owner}/${repo}${pathSegment}`;\n const res = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${token}`,\n Accept: 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n 'Content-Type': 'application/json',\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n });\n\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`GitHub API ${method} ${pathSegment} failed (${res.status}): ${errText}`);\n }\n\n const text = await res.text();\n return text ? JSON.parse(text) : {};\n }\n\n private async getRef(token: string, owner: string, repo: string, ref: string) {\n return (await this.githubFetch(token, owner, repo, 'GET', `/git/refs/heads/${ref}`)) as {\n object: { sha: string };\n };\n }\n\n private async updateRef(token: string, owner: string, repo: string, ref: string, sha: string) {\n await this.githubFetch(token, owner, repo, 'PATCH', `/git/refs/heads/${ref}`, {\n sha,\n force: false,\n });\n }\n\n private async getCommit(token: string, owner: string, repo: string, sha: string) {\n return (await this.githubFetch(token, owner, repo, 'GET', `/git/commits/${sha}`)) as {\n tree: { sha: string };\n message: string;\n };\n }\n\n private async getTreeEntries(token: string, owner: string, repo: string, treeSha: string) {\n return (await this.githubFetch(token, owner, repo, 'GET', `/git/trees/${treeSha}?recursive=1`)) as Array<{\n path: string;\n sha: string;\n type: 'blob' | 'tree';\n }>;\n }\n\n private async createCommit(\n token: string, owner: string, repo: string,\n treeSha: string, parentSha?: string, message = 'sync',\n ) {\n const body: Record<string, unknown> = { message, tree: treeSha };\n if (parentSha) body.parents = [parentSha];\n const result = (await this.githubFetch(token, owner, repo, 'POST', '/git/commits', body)) as { sha: string };\n return result.sha;\n }\n\n private async createGitTree(\n token: string, owner: string, repo: string,\n entries: Array<{ path: string; content: string; mode: string }>,\n baseTreeSha?: string,\n ): Promise<string> {\n const tree = entries.map((e) => ({\n path: e.path,\n mode: e.mode,\n type: 'blob',\n content: e.content,\n }));\n const body: Record<string, unknown> = { tree };\n if (baseTreeSha) body.base_tree = baseTreeSha;\n const result = (await this.githubFetch(token, owner, repo, 'POST', '/git/trees', body)) as { sha: string };\n return result.sha;\n }\n\n private async getBlob(token: string, owner: string, repo: string, sha: string): Promise<string> {\n const result = (await this.githubFetch(token, owner, repo, 'GET', `/git/blobs/${sha}`)) as { content: string };\n return result.content;\n }\n\n // ── Local file helpers ──────────────────────────────────────────────\n\n private async buildLocalTree(categories: SyncCategory[]): Promise<{\n treeEntries: Array<{ path: string; content: string; mode: string }>;\n rev: string;\n }> {\n const entries: Array<{ path: string; content: string; mode: string }> = [];\n const hashes: string[] = [];\n\n for (const cat of categories) {\n const localPath = this.categoryToPath(cat);\n if (!localPath) continue;\n try {\n const stat = await fs.stat(localPath);\n if (stat.isDirectory()) {\n const files = await this.walkDir(localPath, localPath);\n for (const file of files) {\n const content = await fs.readFile(file, 'utf8');\n const rel = path.relative(localPath, file).replace(/\\\\/g, '/');\n entries.push({ path: `data/${cat}/${rel}`, content, mode: '100644' });\n hashes.push(content);\n }\n } else {\n const content = await fs.readFile(localPath, 'utf8');\n entries.push({ path: `data/${cat}`, content, mode: '100644' });\n hashes.push(content);\n }\n } catch {\n // skip missing files/dirs\n }\n }\n\n const rev = createHash('sha256').update(hashes.join('')).digest('hex').slice(0, 12);\n return { treeEntries: entries, rev };\n }\n\n private async hashLocalCategories(categories: SyncCategory[]): Promise<string> {\n const hashes: string[] = [];\n for (const cat of categories) {\n const localPath = this.categoryToPath(cat);\n if (!localPath) continue;\n try {\n const stat = await fs.stat(localPath);\n if (stat.isDirectory()) {\n const files = await this.walkDir(localPath, localPath);\n for (const file of files) {\n const content = await fs.readFile(file);\n hashes.push(content.toString('base64') + file);\n }\n } else {\n const content = await fs.readFile(localPath);\n hashes.push(content.toString('base64') + localPath);\n }\n } catch {\n // skip\n }\n }\n return createHash('sha256').update(hashes.join('')).digest('hex').slice(0, 12);\n }\n\n private categoryToPath(cat: SyncCategory): string | null {\n switch (cat) {\n case 'settings': return this.paths.globalConfig;\n case 'skills': return this.paths.globalSkills;\n case 'prompts': return this.paths.globalPrompts;\n case 'memory': return this.paths.globalMemory;\n case 'history': return this.paths.historyFile;\n default: return null;\n }\n }\n\n private async walkDir(dir: string, base: string): Promise<string[]> {\n const results: string[] = [];\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n results.push(...(await this.walkDir(full, base)));\n } else {\n results.push(full);\n }\n }\n return results;\n }\n}\n\nfunction resolvePulledCategoryPath(\n cat: SyncCategory,\n localPath: string,\n rel: string,\n remotePath: string,\n): string {\n const directoryBacked = cat === 'skills' || cat === 'prompts';\n if (!directoryBacked) {\n if (rel) throw new Error(`Refusing nested CloudSync path for file category: ${remotePath}`);\n return localPath;\n }\n\n if (!rel) return localPath;\n const normalizedRel = path.normalize(rel);\n const traversesUp = normalizedRel === '..' || normalizedRel.startsWith(`..${path.sep}`);\n if (path.isAbsolute(normalizedRel) || traversesUp) {\n throw new Error(`Refusing CloudSync path traversal: ${remotePath}`);\n }\n\n const dest = path.resolve(localPath, normalizedRel);\n const root = path.resolve(localPath);\n const relative = path.relative(root, dest);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n throw new Error(`Refusing CloudSync path outside category root: ${remotePath}`);\n }\n return dest;\n}\n\nfunction timeAgo(iso: string): string {\n const diff = Date.now() - new Date(iso).getTime();\n const mins = Math.floor(diff / 60_000);\n if (mins < 1) return 'just now';\n if (mins < 60) return `${mins}m ago`;\n const hrs = Math.floor(mins / 60);\n if (hrs < 24) return `${hrs}h ago`;\n const days = Math.floor(hrs / 24);\n return `${days}d ago`;\n}","import type { SessionEvent, SessionWriter } from '../types/session.js';\n\nexport type AuditLevel = 'minimal' | 'standard' | 'full';\n\n/**\n * Configuration for sampling high-volume events inside the bridge.\n * This allows callers (CLI, TUI, WebUI, plugins) to tune how aggressively\n * noisy events like tool progress are persisted.\n */\nexport interface ToolProgressSamplingOptions {\n /**\n * How often to persist 'log' and 'partial_output' progress events.\n * - 1 = every message (no sampling)\n * - 8 = keep the first message + every 8th after that (default)\n */\n sampleRate?: number;\n}\n\nexport interface SessionSamplingOptions {\n /** Controls sampling behavior for `tool_progress` events (only relevant at auditLevel 'full'). */\n toolProgress?: ToolProgressSamplingOptions;\n}\n\nexport interface SessionEventBridgeOptions {\n /** Sampling rules for high-volume audit events. */\n sampling?: SessionSamplingOptions;\n}\n\n/**\n * Small, safe helper that wraps a SessionWriter and enforces the\n * configured auditLevel.\n *\n * All appends are best-effort. Failures are swallowed (with optional\n * diagnostics) so they never crash the agent loop.\n */\nexport interface SessionEventBridge {\n /** Append an event if allowed by the current audit level. */\n append(event: SessionEvent): Promise<void>;\n\n /** Current audit level this bridge was created with. */\n readonly level: AuditLevel;\n\n /** Returns true if an event of this type should be written at the current level. */\n allows(type: SessionEvent['type']): boolean;\n}\n\n/** Core events that are always written regardless of auditLevel. */\nconst CORE_RECONSTRUCT_EVENTS = new Set<SessionEvent['type']>([\n 'session_start',\n 'session_resumed',\n 'user_input',\n 'llm_response',\n 'tool_result',\n 'checkpoint',\n 'file_snapshot',\n 'rewound',\n 'in_flight_start',\n 'in_flight_end',\n 'session_end',\n]);\n\n/**\n * Events that are considered \"standard\" audit detail.\n * These are lightweight and high-value for forensics.\n */\nconst STANDARD_AUDIT_EVENTS = new Set<SessionEvent['type']>([\n 'llm_request',\n 'tool_use',\n 'tool_call_start',\n 'tool_call_end',\n 'compaction',\n 'error',\n 'message_truncated',\n 'provider_retry',\n 'provider_error',\n]);\n\n/**\n * Events that are only allowed at 'full' audit level because they can be\n * very high volume (e.g. streaming tool output).\n */\nconst FULL_ONLY_EVENTS = new Set<SessionEvent['type']>([\n 'tool_progress',\n]);\n\n/**\n * \"full\" level allows everything (including potentially heavy events\n * that plugins or future code may emit).\n */\nfunction isAllowed(type: SessionEvent['type'], level: AuditLevel): boolean {\n if (CORE_RECONSTRUCT_EVENTS.has(type)) return true;\n if (level === 'minimal') return false;\n\n if (STANDARD_AUDIT_EVENTS.has(type)) return true;\n if (level === 'standard') return false;\n\n // 'full' level events (high volume)\n if (FULL_ONLY_EVENTS.has(type)) {\n return level === 'full';\n }\n\n // 'full' — allow everything else\n return true;\n}\n\n/**\n * Create a safe, audit-level-aware bridge around a SessionWriter.\n *\n * The bridge can also apply sampling for high-volume events (e.g. `tool_progress`)\n * when `auditLevel` is set to `'full'`.\n *\n * @example\n * const bridge = createSessionEventBridge(sessionWriter, 'full', {\n * sampling: {\n * toolProgress: { sampleRate: 5 } // more aggressive sampling\n * }\n * });\n */\nexport function createSessionEventBridge(\n writer: SessionWriter | undefined | null,\n level: AuditLevel = 'standard',\n options: SessionEventBridgeOptions = {},\n): SessionEventBridge {\n const normalizedLevel: AuditLevel = level ?? 'standard';\n\n // Internal sampling state for high-volume events (e.g. tool_progress).\n // Keyed by tool call id (or name as fallback) to keep sampling per-call.\n const progressCounters = new Map<string, number>();\n\n const toolProgressConfig = options.sampling?.toolProgress ?? {};\n const TOOL_PROGRESS_SAMPLE_RATE = toolProgressConfig.sampleRate ?? 8;\n\n /**\n * Decide whether a high-volume event should be sampled in.\n * Currently only implements sampling for 'tool_progress'.\n */\n function shouldSample(event: SessionEvent): boolean {\n if (event.type !== 'tool_progress') return true;\n\n const progEvent = event as Extract<SessionEvent, { type: 'tool_progress' }>;\n const innerType = progEvent.event?.type;\n\n // Always let through high-signal structured events\n if (innerType === 'warning' || innerType === 'metric' || innerType === 'file_changed') {\n return true;\n }\n\n // Sample noisy text streams (log / partial_output)\n if (innerType === 'log' || innerType === 'partial_output') {\n const key = progEvent.id || progEvent.name;\n const count = (progressCounters.get(key) || 0) + 1;\n progressCounters.set(key, count);\n\n // Always keep the first message + every Nth after that\n return count === 1 || (count % TOOL_PROGRESS_SAMPLE_RATE === 0);\n }\n\n return true;\n }\n\n return {\n level: normalizedLevel,\n\n allows(type) {\n return isAllowed(type, normalizedLevel);\n },\n\n async append(event) {\n if (!writer) return;\n if (!isAllowed(event.type, normalizedLevel)) return;\n\n // Apply sampling for high-volume events (only at 'full' level)\n if (!shouldSample(event)) return;\n\n try {\n await writer.append(event);\n } catch (err) {\n // Best-effort: never let session logging break the agent.\n // The existing FileSessionWriter already does throttled warnings,\n // but we keep this wrapper silent by default to avoid log spam.\n // Callers that care can listen to EventBus 'session.damaged' etc.\n }\n },\n };\n}\n\n/** Convenience re-export of the allowed core set for tests/docs. */\nexport { CORE_RECONSTRUCT_EVENTS, STANDARD_AUDIT_EVENTS };\n\n/**\n * Safely extract the auditLevel from a (possibly partial) Config object.\n * Falls back to 'standard' if not present or invalid.\n */\nexport function resolveAuditLevel(\n cfg?: { session?: { auditLevel?: AuditLevel } } | null,\n): AuditLevel {\n const raw = cfg?.session?.auditLevel;\n if (raw === 'minimal' || raw === 'standard' || raw === 'full') {\n return raw;\n }\n return 'standard';\n}\n\n/**\n * Fully resolves the session logging configuration with sensible defaults.\n * This is the recommended way for the CLI / TUI / WebUI to read session config.\n */\nexport function resolveSessionLoggingConfig(\n cfg?: {\n session?: {\n auditLevel?: AuditLevel;\n sampling?: {\n toolProgress?: { sampleRate?: number };\n };\n };\n } | null,\n): {\n auditLevel: AuditLevel;\n sampling: {\n toolProgress: { sampleRate: number };\n };\n} {\n const session = cfg?.session ?? {};\n\n const auditLevel = resolveAuditLevel(cfg);\n\n const toolProgressSampleRate =\n session.sampling?.toolProgress?.sampleRate ?? 8;\n\n return {\n auditLevel,\n sampling: {\n toolProgress: {\n sampleRate: Math.max(1, Math.floor(toolProgressSampleRate)),\n },\n },\n };\n}"]}