@termwright/mcp 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -28
- package/dist/bin.js +2 -1
- package/dist/bin.js.map +1 -1
- package/dist/chunk-R2N52YYH.js +629 -0
- package/dist/chunk-R2N52YYH.js.map +1 -0
- package/dist/{chunk-IPNUAUAN.js → chunk-ROMJP5D3.js} +595 -482
- package/dist/chunk-ROMJP5D3.js.map +1 -0
- package/dist/docs-85fGFORb.d.ts +13 -0
- package/dist/docs.d.ts +1 -0
- package/dist/docs.js +7 -0
- package/dist/docs.js.map +1 -0
- package/dist/index.d.ts +50 -28
- package/dist/index.js +9 -7
- package/package.json +11 -8
- package/dist/chunk-2J5WHI6X.js +0 -2000
- package/dist/chunk-2J5WHI6X.js.map +0 -1
- package/dist/chunk-36C7A7DW.js +0 -2685
- package/dist/chunk-36C7A7DW.js.map +0 -1
- package/dist/chunk-3PLOAM2C.js +0 -2427
- package/dist/chunk-3PLOAM2C.js.map +0 -1
- package/dist/chunk-57GYK2EF.js +0 -2991
- package/dist/chunk-57GYK2EF.js.map +0 -1
- package/dist/chunk-ABLJBL5P.js +0 -2687
- package/dist/chunk-ABLJBL5P.js.map +0 -1
- package/dist/chunk-BOOUADRN.js +0 -1938
- package/dist/chunk-BOOUADRN.js.map +0 -1
- package/dist/chunk-BPWIETN5.js +0 -2983
- package/dist/chunk-BPWIETN5.js.map +0 -1
- package/dist/chunk-CMQB5G7R.js +0 -2968
- package/dist/chunk-CMQB5G7R.js.map +0 -1
- package/dist/chunk-I4B53KZ7.js +0 -2955
- package/dist/chunk-I4B53KZ7.js.map +0 -1
- package/dist/chunk-IPNUAUAN.js.map +0 -1
- package/dist/chunk-KZWL2S6E.js +0 -2869
- package/dist/chunk-KZWL2S6E.js.map +0 -1
- package/dist/chunk-LB2QBYW4.js +0 -2686
- package/dist/chunk-LB2QBYW4.js.map +0 -1
- package/dist/chunk-MR3AXSXL.js +0 -1977
- package/dist/chunk-MR3AXSXL.js.map +0 -1
- package/dist/chunk-NVSZXEZU.js +0 -2688
- package/dist/chunk-NVSZXEZU.js.map +0 -1
- package/dist/chunk-PD2WKAFE.js +0 -2531
- package/dist/chunk-PD2WKAFE.js.map +0 -1
- package/dist/chunk-PGY4ZDLD.js +0 -1843
- package/dist/chunk-PGY4ZDLD.js.map +0 -1
- package/dist/chunk-QDIAASH7.js +0 -2982
- package/dist/chunk-QDIAASH7.js.map +0 -1
- package/dist/chunk-UZWFLJGG.js +0 -2873
- package/dist/chunk-UZWFLJGG.js.map +0 -1
- package/dist/chunk-VFYTROYG.js +0 -2825
- package/dist/chunk-VFYTROYG.js.map +0 -1
- package/dist/chunk-ZTHKAJKT.js +0 -2981
- package/dist/chunk-ZTHKAJKT.js.map +0 -1
- package/dist/chunk-ZZULGRRE.js +0 -2991
- package/dist/chunk-ZZULGRRE.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/crash.ts","../src/model.ts","../src/traces.ts","../src/sessions.ts","../src/logs.ts","../src/objects.ts","../src/tool-kit.ts","../src/screenshots.ts","../src/format.ts","../src/diff.ts","../src/targets.ts","../src/tools.ts","../src/screenshot-schema.ts","../src/schemas.ts","../src/trace-tools.ts","../src/registry.ts","../src/version.ts","../src/agent-context.ts","../src/agent-skill.ts","../src/server.ts","../src/sdk-facade.ts","../src/cli.ts"],"sourcesContent":["/**\n * Error taxonomy shared by the tools and the CLI.\n *\n * Driver failures arrive as `TermwrightError` and keep their `code` verbatim —\n * a `stale-snapshot` on a reused `n8@42` ref reaches the agent as\n * `kind: \"stale-snapshot\"`, not as a stack trace. The server adds three kinds of\n * its own for failures that never reach the driver: bad arguments, unknown\n * terminal handles, and internal faults.\n */\nimport { TermwrightError } from '@termwright/driver';\nimport type { TermwrightErrorCode } from '@termwright/driver';\nimport { CrashContextError, renderCrash } from './crash.js';\nimport type { CrashProjection } from './crash.js';\n\n/**\n * Kinds an agent can branch on: every driver code, plus the three failures that\n * never reach the driver.\n *\n * Derived from `TermwrightErrorCode` rather than restated, so a code added\n * upstream is publishable here the moment it lands instead of failing the\n * assignment in {@link toErrorPayload}.\n */\nexport type ErrorKind = TermwrightErrorCode | 'usage' | 'no-session' | 'internal';\n\n/** The kinds this layer adds; everything else comes from the driver. */\nexport const MCP_ERROR_KINDS = ['usage', 'no-session', 'internal'] as const satisfies readonly ErrorKind[];\n\n/** CLI exit codes (CONTRACTS.md §MCP). */\nexport const EXIT_CODES = Object.freeze({\n ok: 0,\n assertion: 1,\n usage: 2,\n noSession: 3,\n ipc: 4,\n internal: 5,\n});\n\n/** Exit code for a failure of the given kind. */\nexport function exitCodeFor(kind: ErrorKind): number {\n switch (kind) {\n case 'usage':\n return EXIT_CODES.usage;\n case 'no-session':\n case 'session-closed':\n return EXIT_CODES.noSession;\n case 'not-found':\n // A path the user named that holds nothing is bad input, not our failure\n // — the same call as a malformed flag, and the same exit code.\n return EXIT_CODES.usage;\n case 'protocol-violation':\n return EXIT_CODES.ipc;\n case 'internal':\n return EXIT_CODES.internal;\n default:\n return EXIT_CODES.assertion;\n }\n}\n\n/**\n * A failure raised by the MCP layer itself (argument validation, unknown\n * terminal handle, capacity). Structurally identical to `TermwrightError`\n * (`kind` + `suggestion`) but with a wider kind domain; it never crosses a\n * package boundary, so it does not need to be a `TermwrightError` subclass.\n */\nexport class McpError extends Error {\n readonly kind: ErrorKind;\n readonly suggestion: string | undefined;\n\n constructor(kind: ErrorKind, message: string, suggestion?: string) {\n super(message);\n this.name = 'McpError';\n this.kind = kind;\n this.suggestion = suggestion;\n }\n}\n\n/** Bad or contradictory tool arguments — exit code 2. */\nexport function usageError(message: string, suggestion?: string): McpError {\n return new McpError('usage', message, suggestion);\n}\n\n/** Unknown or already-closed terminal handle — exit code 3. */\nexport function noSessionError(message: string, suggestion?: string): McpError {\n return new McpError('no-session', message, suggestion);\n}\n\n/** The agent-facing projection of a failure. */\nexport interface ErrorPayload {\n readonly kind: ErrorKind;\n readonly message: string;\n readonly suggestion?: string;\n readonly semanticTree?: boolean;\n readonly candidates?: readonly string[];\n readonly screenExcerpt?: string;\n /**\n * What the session knew when the program died, when the failure happened\n * around a crash. Its `screenTail` is unredacted — see `crash.ts`.\n */\n readonly crash?: CrashProjection;\n}\n\nconst MAX_CANDIDATES = 10;\nconst MAX_EXCERPT_CHARS = 2_000;\n\n/**\n * Projects any thrown value into an {@link ErrorPayload}. Driver diagnostics\n * (candidates, screen excerpt, suggestion) are carried over — bounded — because\n * they are what lets an agent fix its own next call. Stack traces are dropped.\n */\nexport function toErrorPayload(error: unknown): ErrorPayload {\n if (error instanceof CrashContextError) {\n // The underlying failure keeps its kind and message; the crash rides along.\n return { ...toErrorPayload(error.cause), crash: error.crash };\n }\n if (error instanceof TermwrightError) {\n const diagnostics = error.diagnostics;\n const candidates = diagnostics.candidates?.slice(0, MAX_CANDIDATES).map((candidate) => {\n const role = candidate.role ?? 'generic';\n const name = candidate.name === undefined ? '' : ` ${JSON.stringify(candidate.name)}`;\n return `${role}${name} ref=${candidate.ref}`;\n });\n return {\n kind: error.code,\n message: error.message,\n ...(diagnostics.suggestion === undefined ? {} : { suggestion: diagnostics.suggestion }),\n semanticTree: diagnostics.semanticTree,\n ...(candidates === undefined || candidates.length === 0 ? {} : { candidates }),\n ...(diagnostics.screenExcerpt === undefined\n ? {}\n : { screenExcerpt: diagnostics.screenExcerpt.slice(0, MAX_EXCERPT_CHARS) }),\n };\n }\n if (error instanceof McpError) {\n return {\n kind: error.kind,\n message: error.message,\n ...(error.suggestion === undefined ? {} : { suggestion: error.suggestion }),\n };\n }\n return { kind: 'internal', message: error instanceof Error ? error.message : String(error) };\n}\n\n/** Renders an {@link ErrorPayload} the way a tool result's text content shows it. */\nexport function renderErrorPayload(payload: ErrorPayload): string {\n const parts = [`error ${payload.kind}: ${payload.message}`];\n if (payload.suggestion !== undefined) parts.push(`suggestion: ${payload.suggestion}`);\n if (payload.semanticTree !== undefined) parts.push(`semanticTree: ${payload.semanticTree}`);\n if (payload.candidates !== undefined) {\n parts.push(`candidates:\\n${payload.candidates.map((candidate) => ` - ${candidate}`).join('\\n')}`);\n }\n if (payload.screenExcerpt !== undefined) parts.push(`screen:\\n${payload.screenExcerpt}`);\n if (payload.crash !== undefined) parts.push(renderCrash(payload.crash));\n return parts.join('\\n');\n}\n","/**\n * Crash reports, projected for agents.\n *\n * When a program dies on its own — a signal, or a non-zero exit nobody asked\n * for — the driver keeps what the session knew at that moment: the exit status,\n * the tail of the screen (where a stack trace lands), the last semantic\n * revision, the inputs just before the end, and the diagnostics log. This module\n * bounds that for a tool result and renders it the way an agent reads it.\n *\n * **The screen tail is unredacted.** It is whatever the terminal displayed,\n * secrets included, so it is treated like a screenshot: bounded, never logged,\n * and flagged as sensitive wherever an agent is told about it.\n */\nimport { z } from 'zod';\nimport type { CrashReport } from '@termwright/driver';\n\n/** How much of a crash report crosses the wire. */\nexport const CRASH_LIMITS = Object.freeze({\n /** Screen-tail lines kept, newest end of the buffer. */\n maxScreenTailLines: 40,\n /** Characters kept per screen-tail line. */\n maxLineChars: 500,\n /** Recent inputs kept, newest last. */\n maxInputs: 10,\n /** Diagnostics entries kept, newest last. */\n maxDiagnostics: 10,\n});\n\n/** The crash projection carried in `structuredContent`. */\nexport const crashSchema = z.object({\n exit: z.object({ code: z.number().int().nullable(), signal: z.string().nullable() }),\n timeMs: z.number(),\n screenTail: z\n .array(z.string())\n .describe('what the terminal showed at the end, verbatim and unredacted — treat as sensitive'),\n screenTailTruncated: z.boolean(),\n lastSemanticRevision: z.number().int().nullable(),\n recentInputs: z.array(\n z.object({\n timeMs: z.number(),\n kind: z.enum(['key', 'mouse', 'paste', 'raw']),\n bytes: z.number().int(),\n preview: z.string().optional().describe('omitted for pastes, which routinely carry secrets'),\n }),\n ),\n diagnostics: z.array(\n z.object({\n // A free string on purpose — do not \"fix\" this into an enum. Tolerant\n // reader, strict producer: the driver owns the closed code set and pins\n // it with its own tests, while this consumer must survive a code it has\n // never heard of. A closed enum here would let one unrecognised code\n // fail the whole crash report, at the moment it is needed most.\n code: z.string(),\n detail: z.string(),\n timeMs: z.number(),\n revision: z.number().int().optional(),\n mode: z\n .enum(['mouse', 'focus'])\n .optional()\n .describe('for \"mode-unverifiable\": which mode the platform hides'),\n }),\n ),\n});\n\n/** The structured shape of {@link crashSchema}. */\nexport type CrashProjection = z.output<typeof crashSchema>;\n\nfunction boundLines(lines: readonly string[]): { lines: string[]; truncated: boolean } {\n const kept = lines.slice(-CRASH_LIMITS.maxScreenTailLines);\n return {\n lines: kept.map((line) => (line.length > CRASH_LIMITS.maxLineChars ? `${line.slice(0, CRASH_LIMITS.maxLineChars)}…` : line)),\n truncated: kept.length < lines.length,\n };\n}\n\n/** Projects a driver {@link CrashReport} into the bounded agent-facing shape. */\nexport function describeCrash(report: CrashReport): CrashProjection {\n const tail = boundLines(report.screenTail);\n return {\n exit: { code: report.exit.code, signal: report.exit.signal },\n timeMs: report.timeMs,\n screenTail: tail.lines,\n screenTailTruncated: tail.truncated,\n lastSemanticRevision: report.lastSemanticTree?.revision ?? null,\n recentInputs: report.recentInputs.slice(-CRASH_LIMITS.maxInputs).map((input) => ({\n timeMs: input.timeMs,\n kind: input.kind,\n bytes: input.bytes,\n ...(input.preview === undefined ? {} : { preview: input.preview }),\n })),\n diagnostics: report.diagnosticsTail.slice(-CRASH_LIMITS.maxDiagnostics).map((entry) => ({\n code: entry.code,\n detail: entry.detail,\n timeMs: entry.timeMs,\n ...(entry.revision === undefined ? {} : { revision: entry.revision }),\n ...(entry.mode === undefined ? {} : { mode: entry.mode }),\n })),\n };\n}\n\n/**\n * Renders a crash the way it appears in a tool result's text: the exit first,\n * because that is the headline, then what was on screen when it happened.\n */\nexport function renderCrash(crash: CrashProjection): string {\n const lines = [\n `crash: the program exited on its own — code=${String(crash.exit.code)} signal=${String(crash.exit.signal)} at ${crash.timeMs}ms`,\n ];\n if (crash.recentInputs.length > 0) {\n const inputs = crash.recentInputs.map((input) =>\n input.preview === undefined ? `${input.kind}(${input.bytes}B)` : `${input.kind} ${JSON.stringify(input.preview)}`,\n );\n lines.push(`last input: ${inputs.join(' ')}`);\n }\n for (const entry of crash.diagnostics) {\n const mode = entry.mode === undefined ? '' : ` (${entry.mode})`;\n lines.push(`diagnostic ${entry.code}${mode}: ${entry.detail}`);\n }\n if (crash.screenTail.length > 0) {\n lines.push(crash.screenTailTruncated ? 'screen tail (truncated):' : 'screen tail:');\n lines.push(...crash.screenTail);\n }\n return lines.join('\\n');\n}\n\n/**\n * An error that happened while a session was dying, carrying the crash the\n * driver recorded.\n *\n * The original failure keeps its kind and message — a `process-exited` stays a\n * `process-exited` — and the crash rides alongside, so an agent gets both \"what\n * you asked for failed\" and \"here is why the program is gone\".\n */\nexport class CrashContextError extends Error {\n override readonly cause: unknown;\n readonly crash: CrashProjection;\n\n constructor(cause: unknown, crash: CrashProjection) {\n super(cause instanceof Error ? cause.message : String(cause));\n this.name = 'CrashContextError';\n this.cause = cause;\n this.crash = crash;\n }\n}\n","/**\n * The protocol- and driver-shaped types this package projects into MCP results.\n *\n * Roles, states and snapshot types come straight from `@termwright/protocol`\n * (CONTRACTS.md §Dependency rules allows `mcp` to import its constants and\n * types), so there is exactly one source of truth for the closed sets an agent\n * sees in the tool schemas. Screen- and session-shaped types come from the\n * driver, which owns them.\n */\nimport type { TerminalHarness } from '@termwright/driver';\nimport { SEMANTIC_ROLES } from '@termwright/protocol';\nimport type { Rect, SemanticNode, SemanticRole, SemanticSnapshot, SemanticState } from '@termwright/protocol';\n\nexport { SEMANTIC_ROLES };\nexport type { Rect, SemanticNode, SemanticRole, SemanticSnapshot, SemanticState };\n\n/** The driver's view of the visible grid. */\nexport type ScreenSnapshot = ReturnType<TerminalHarness['screen']>;\n\n/** Session capabilities as reported after the semantic handshake window. */\nexport type SessionCapabilities = ReturnType<TerminalHarness['capabilities']>;\n\n/** The role type the driver actually reports on a semantic node. */\ntype DriverRole = NonNullable<ReturnType<TerminalHarness['semanticTree']>>['nodes'][number]['role'];\n\ntype RoleDrift = Exclude<DriverRole, SemanticRole> | Exclude<SemanticRole, DriverRole>;\n\n/**\n * Regression lock: `true` while the roles the driver reports are exactly the\n * roles `@termwright/protocol` defines. If the two ever diverge, this line stops\n * type-checking and names the offending member — the tool schemas below build on\n * the protocol's list, so a silent drift would let an agent ask for a role the\n * driver can never match.\n */\nexport const ROLES_ARE_COMPLETE: [RoleDrift] extends [never] ? true : ['role drift', RoleDrift] = true as [\n RoleDrift,\n] extends [never]\n ? true\n : ['role drift', RoleDrift];\n\n/** State flags an agent may filter on; the value type follows {@link SemanticState}. */\nexport const FILTERABLE_STATES = [\n 'disabled',\n 'focused',\n 'selected',\n 'checked',\n 'expanded',\n 'modal',\n 'busy',\n 'hidden',\n 'readonly',\n] as const satisfies readonly (keyof SemanticState)[];\n\n/** Signals `terminal.signal` accepts, mirroring `TerminalHarness['signal']`. */\nexport const SIGNALS = ['INT', 'TERM', 'KILL', 'HUP'] as const satisfies readonly Parameters<\n TerminalHarness['signal']\n>[0][];\n","/**\n * Open `.twtrace` archives, so an agent can investigate a recorded failure the\n * same way it drives a live terminal.\n *\n * The store owns nothing but readers and their ids: reconstruction (cast prefix,\n * nearest semantic snapshot, steps) belongs to `@termwright/trace`, and the\n * projection into the compact ref format is shared with the live tools.\n */\nimport { stat } from 'node:fs/promises';\nimport { openTrace, TraceError } from '@termwright/trace';\nimport type { TraceReader } from '@termwright/trace';\nimport { McpError, noSessionError } from './errors.js';\n\n/** Ceilings for the replay side of the server. */\nexport const TRACE_LIMITS = Object.freeze({\n /** Archives kept open per MCP session; the least recently used is evicted. */\n maxOpen: 8,\n /** Refusal threshold for an archive, in bytes. */\n maxArchiveBytes: 128 * 1024 * 1024,\n /** Rows of reconstructed screen text a single frame may return. */\n maxFrameRows: 200,\n});\n\n/** One archive this session has open. */\nexport interface OpenTrace {\n /** Agent-facing handle, `tr1`, `tr2`, … */\n readonly id: string;\n readonly path: string;\n readonly reader: TraceReader;\n /** Bumped on every use, so eviction drops the coldest archive. */\n lastUsedAt: number;\n}\n\n/** Options for {@link TraceStore}. */\nexport interface TraceStoreOptions {\n readonly maxOpen?: number;\n readonly maxArchiveBytes?: number;\n /** Injectable clock, for tests. */\n readonly now?: () => number;\n}\n\n/**\n * Translates a `TraceError` into the server's error vocabulary.\n *\n * `@termwright/trace` mirrors the `TermwrightError` shape structurally rather\n * than extending it (its own NOTES.md explains why), so it is unwrapped here\n * instead of by `toErrorPayload`. The code and suggestion pass through as they\n * are; only the class changes.\n */\nfunction rethrowTraceError(error: unknown, path: string): never {\n if (error instanceof TraceError) {\n throw new McpError(\n error.code,\n `${path}: ${error.message}`,\n error.diagnostics.suggestion ?? 'check that the path points at a .twtrace directory or zip',\n );\n }\n if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {\n throw new McpError(\n 'not-found',\n `no trace at ${path}`,\n 'pass the path of a .twtrace directory or zip a run wrote',\n );\n }\n throw error;\n}\n\n/** The `.twtrace` archives one MCP session has open. */\nexport class TraceStore {\n readonly #open = new Map<string, OpenTrace>();\n readonly #maxOpen: number;\n readonly #maxArchiveBytes: number;\n readonly #now: () => number;\n #counter = 0;\n\n constructor(options: TraceStoreOptions = {}) {\n this.#maxOpen = options.maxOpen ?? TRACE_LIMITS.maxOpen;\n this.#maxArchiveBytes = options.maxArchiveBytes ?? TRACE_LIMITS.maxArchiveBytes;\n this.#now = options.now ?? Date.now;\n }\n\n /** Handles of every archive still open. */\n list(): readonly OpenTrace[] {\n return [...this.#open.values()];\n }\n\n /**\n * Opens an archive and registers it under a fresh `tr<n>` handle.\n *\n * At the ceiling the least recently used archive is closed rather than the\n * call being refused: an agent can always re-open a path, but it cannot\n * recover from a server that has wedged itself on old readers. The evicted\n * handle is reported so the caller knows why it stopped working.\n */\n async open(path: string): Promise<{ readonly trace: OpenTrace; readonly evicted: string | null }> {\n let size: number;\n try {\n const stats = await stat(path);\n size = stats.isDirectory() ? 0 : stats.size;\n } catch (error) {\n rethrowTraceError(error, path);\n }\n if (size > this.#maxArchiveBytes) {\n throw new McpError(\n 'capacity',\n `${path} is ${size} bytes; the ceiling is ${this.#maxArchiveBytes}`,\n 'open the archive with @termwright/trace directly, or re-record with tighter limits',\n );\n }\n\n let reader: TraceReader;\n try {\n reader = await openTrace(path);\n } catch (error) {\n rethrowTraceError(error, path);\n }\n\n const evicted = await this.#evictIfFull();\n this.#counter += 1;\n const trace: OpenTrace = {\n id: `tr${this.#counter}`,\n path,\n reader,\n lastUsedAt: this.#now(),\n };\n this.#open.set(trace.id, trace);\n return { trace, evicted };\n }\n\n /** Looks up a handle and marks it as used. */\n get(id: string): OpenTrace {\n const trace = this.#open.get(id);\n if (trace === undefined) {\n const known = [...this.#open.keys()];\n throw noSessionError(\n `unknown trace ${JSON.stringify(id)}`,\n known.length === 0\n ? 'open one with trace.open'\n : `open traces: ${known.join(', ')} (an evicted handle has to be re-opened by path)`,\n );\n }\n trace.lastUsedAt = this.#now();\n return trace;\n }\n\n async #evictIfFull(): Promise<string | null> {\n if (this.#open.size < this.#maxOpen) return null;\n const coldest = [...this.#open.values()].reduce((oldest, candidate) =>\n candidate.lastUsedAt < oldest.lastUsedAt ? candidate : oldest,\n );\n this.#open.delete(coldest.id);\n await coldest.reader.close();\n return coldest.id;\n }\n\n /** Closes every open archive. Best-effort, so shutdown always completes. */\n async closeAll(): Promise<void> {\n const traces = [...this.#open.values()];\n this.#open.clear();\n await Promise.all(\n traces.map(async (trace) => {\n try {\n await trace.reader.close();\n } catch {\n // A reader that already released its handles is fine.\n }\n }),\n );\n }\n}\n","/**\n * Session ownership: which terminals belong to which MCP session, and the small\n * amount of history `terminal.capture_since` needs.\n *\n * Session state is keyed in *our* layer, never inside a transport object: a\n * Streamable HTTP transport is just the pipe that carries requests for a session\n * id, and the stdio transport has no session id at all. That keeps the two\n * transports interchangeable and keeps the per-session limits enforceable in one\n * place.\n */\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { launchTerminal } from '@termwright/driver';\nimport type {\n AppLogSource,\n EnvMode,\n ExitStatus,\n LaunchOptions,\n TerminalHarness,\n} from '@termwright/driver';\nimport { DEFAULT_LIMITS } from '@termwright/protocol';\nimport { McpError, noSessionError, usageError } from './errors.js';\nimport { LogBuffer } from './logs.js';\nimport { definedOnly } from './objects.js';\nimport type { Loose } from './objects.js';\nimport type { SemanticSnapshot } from './model.js';\nimport { TraceStore } from './traces.js';\n\n/**\n * Ceilings for the MCP layer. The session counts come from\n * `DEFAULT_LIMITS` in `@termwright/protocol`; the rest are this package's own\n * (how much capture history a terminal keeps, how long a command line may be).\n */\nexport const MCP_LIMITS = Object.freeze({\n /** Concurrent MCP sessions. */\n maxSessions: DEFAULT_LIMITS.maxSessions,\n /** Concurrent terminals inside one MCP session. */\n maxTerminals: DEFAULT_LIMITS.maxSessions,\n /** Snapshots retained per terminal for `capture_since` cursors. */\n maxHistory: 16,\n /** Argument ceiling for a launch command line. */\n maxCommandParts: 64,\n});\n\n/** A snapshot the server handed out, kept so a later cursor can diff against it. */\nexport interface RevisionRecord {\n /** Screen revision; this is the `cursor` value agents pass back. */\n readonly revision: number;\n readonly semanticRevision: number | null;\n readonly rows: readonly string[];\n readonly semantic: SemanticSnapshot | null;\n /** Log sequence at capture time, so a later diff knows where to resume. */\n readonly logSeq: number;\n readonly capturedAt: number;\n}\n\n/** One terminal owned by one MCP session. */\nexport interface TerminalEntry {\n /** Agent-facing handle, `t1`, `t2`, … */\n readonly id: string;\n readonly harness: TerminalHarness;\n /** Directory for `variant: \"full\"` dumps; created lazily. */\n readonly directory: string;\n readonly command: readonly string[];\n exit: ExitStatus | null;\n closed: boolean;\n history: RevisionRecord[];\n /** The application's own log, buffered for `terminal.capture_since`. */\n readonly logs: LogBuffer;\n}\n\n/** Options for {@link TerminalStore}. */\nexport interface TerminalStoreOptions {\n /** Stable key of the owning MCP session (`stdio`, or an `Mcp-Session-Id`). */\n readonly sessionKey: string;\n /** Root for on-disk snapshot dumps. Defaults to `<tmp>/termwright-mcp`. */\n readonly storageDir?: string;\n readonly maxTerminals?: number;\n /** Injectable clock, for tests. */\n readonly now?: () => number;\n}\n\n/**\n * Arguments accepted by {@link TerminalStore.launch}. Optional fields admit an\n * explicit `undefined` because they arrive from zod-parsed tool arguments.\n */\nexport interface LaunchRequest {\n readonly command: readonly string[];\n readonly cwd?: string | undefined;\n readonly env?: Readonly<Record<string, string>> | undefined;\n readonly envMode?: EnvMode | undefined;\n readonly columns?: number | undefined;\n readonly rows?: number | undefined;\n readonly scrollbackLines?: number | undefined;\n readonly semanticNegotiationMs?: number | undefined;\n readonly timeouts?: Loose<NonNullable<LaunchOptions['timeouts']>> | undefined;\n /** Log files to follow for the lifetime of the session. */\n readonly logs?: readonly Loose<AppLogSource>[] | undefined;\n}\n\n/** The terminals of a single MCP session, plus their capture history. */\nexport class TerminalStore {\n readonly sessionKey: string;\n readonly #directory: string;\n readonly #maxTerminals: number;\n readonly #now: () => number;\n readonly #terminals = new Map<string, TerminalEntry>();\n #counter = 0;\n\n constructor(options: TerminalStoreOptions) {\n this.sessionKey = options.sessionKey;\n this.#directory = join(options.storageDir ?? join(tmpdir(), 'termwright-mcp'), options.sessionKey);\n this.#maxTerminals = options.maxTerminals ?? MCP_LIMITS.maxTerminals;\n this.#now = options.now ?? Date.now;\n }\n\n /** Handles of every terminal still open in this session. */\n list(): readonly TerminalEntry[] {\n return [...this.#terminals.values()];\n }\n\n /** Launches a child and registers it under a fresh `t<n>` handle. */\n async launch(request: LaunchRequest): Promise<TerminalEntry> {\n if (request.command.length === 0) throw usageError('command must have at least one element');\n if (request.command.length > MCP_LIMITS.maxCommandParts) {\n throw usageError(`command may have at most ${MCP_LIMITS.maxCommandParts} elements`);\n }\n if (this.#terminals.size >= this.#maxTerminals) {\n throw new McpError(\n 'capacity',\n `this session already owns ${this.#maxTerminals} terminals`,\n 'close a terminal with terminal.close before launching another',\n );\n }\n\n const options: LaunchOptions = {\n command: [...request.command],\n // Environment policy belongs to the driver: 'replace' (its default) keeps\n // the operator's secrets out of the child, 'inherit' is opt-in.\n ...(request.env === undefined ? {} : { env: request.env }),\n ...(request.envMode === undefined ? {} : { envMode: request.envMode }),\n ...(request.cwd === undefined ? {} : { cwd: request.cwd }),\n ...(request.columns === undefined ? {} : { columns: request.columns }),\n ...(request.rows === undefined ? {} : { rows: request.rows }),\n ...(request.scrollbackLines === undefined ? {} : { scrollbackLines: request.scrollbackLines }),\n ...(request.semanticNegotiationMs === undefined\n ? {}\n : { semanticNegotiationMs: request.semanticNegotiationMs }),\n ...(request.timeouts === undefined ? {} : { timeouts: definedOnly(request.timeouts) }),\n ...(request.logs === undefined\n ? {}\n : {\n logs: request.logs.flatMap((source) => (source.path === undefined ? [] : [{\n path: source.path,\n ...(source.label === undefined ? {} : { label: source.label }),\n }])),\n }),\n };\n\n const harness = await launchTerminal(options);\n this.#counter += 1;\n const id = `t${this.#counter}`;\n const entry: TerminalEntry = {\n id,\n harness,\n directory: join(this.#directory, id),\n command: [...request.command],\n exit: null,\n closed: false,\n history: [],\n logs: new LogBuffer(),\n };\n // Buffered from launch, so a log written before the first capture is not\n // lost: the driver only publishes each line once.\n harness.events.on('app-log', (event) => {\n entry.logs.append(event);\n });\n // The exit promise is observed here so `terminal.close` can report a status\n // without racing, and so an exited child never leaves an unhandled rejection.\n void harness.exit.then(\n (status) => {\n entry.exit = status;\n },\n () => {\n entry.exit = { code: null, signal: null };\n },\n );\n this.#terminals.set(id, entry);\n return entry;\n }\n\n /** Looks up a handle without throwing; for callers that tolerate absence. */\n find(id: string): TerminalEntry | undefined {\n return this.#terminals.get(id);\n }\n\n /** Looks up a handle; unknown or closed handles are a `no-session` failure. */\n get(id: string): TerminalEntry {\n const entry = this.#terminals.get(id);\n if (entry === undefined) {\n const known = [...this.#terminals.keys()];\n throw noSessionError(\n `unknown terminal ${JSON.stringify(id)}`,\n known.length === 0\n ? 'launch one with terminal.launch'\n : `open terminals: ${known.join(', ')}`,\n );\n }\n return entry;\n }\n\n /**\n * Captures the current screen and semantic tree, and remembers it so a later\n * `capture_since` can diff against this revision.\n */\n record(entry: TerminalEntry): RevisionRecord {\n const screen = entry.harness.screen();\n const semantic = entry.harness.semanticTree();\n const record: RevisionRecord = {\n revision: screen.revision,\n semanticRevision: semantic?.revision ?? null,\n rows: screen.text().split('\\n'),\n semantic,\n logSeq: entry.logs.sequence,\n capturedAt: this.#now(),\n };\n entry.history = [...entry.history.filter((item) => item.revision !== record.revision), record].slice(\n -MCP_LIMITS.maxHistory,\n );\n return record;\n }\n\n /** The recorded baseline for a cursor, or a `history-truncated` failure. */\n baseline(entry: TerminalEntry, cursor: number): RevisionRecord {\n const found = entry.history.find((item) => item.revision === cursor);\n if (found !== undefined) return found;\n const known = entry.history.map((item) => item.revision);\n throw new McpError(\n 'history-truncated',\n `no capture retained for cursor ${cursor}`,\n known.length === 0\n ? 'take a terminal.snapshot first; its revision is the cursor'\n : `retained cursors: ${known.join(', ')}`,\n );\n }\n\n /** Writes a full dump next to the session and returns its path. */\n async writeDump(entry: TerminalEntry, name: string, contents: string): Promise<string> {\n await mkdir(entry.directory, { recursive: true });\n const path = join(entry.directory, name);\n await writeFile(path, contents, 'utf8');\n return path;\n }\n\n /** Closes one terminal and forgets it. Idempotent. */\n async close(id: string): Promise<TerminalEntry> {\n const entry = this.get(id);\n await entry.harness.close();\n entry.closed = true;\n this.#terminals.delete(id);\n return entry;\n }\n\n /** Closes every terminal; failures are swallowed so shutdown always completes. */\n async closeAll(): Promise<void> {\n const entries = [...this.#terminals.values()];\n this.#terminals.clear();\n await Promise.all(\n entries.map(async (entry) => {\n try {\n await entry.harness.close();\n } catch {\n // Shutdown is best-effort; a child that already exited is fine.\n }\n entry.closed = true;\n }),\n );\n }\n}\n\n/**\n * Everything one MCP session owns: the terminals it launched and the trace\n * archives it opened. Both are disposed together when the session goes away.\n */\nexport interface SessionStores {\n readonly terminals: TerminalStore;\n readonly traces: TraceStore;\n}\n\n/** Builds the stores for a session key. */\nexport function createSessionStores(options: {\n readonly sessionKey: string;\n readonly storageDir?: string | undefined;\n}): SessionStores {\n return {\n terminals: new TerminalStore({\n sessionKey: options.sessionKey,\n ...(options.storageDir === undefined ? {} : { storageDir: options.storageDir }),\n }),\n traces: new TraceStore(),\n };\n}\n\n/** Closes both stores of a session. */\nexport async function closeSessionStores(stores: SessionStores): Promise<void> {\n await Promise.all([stores.terminals.closeAll(), stores.traces.closeAll()]);\n}\n\n/** A registered MCP session: its key, its stores, and its disposer. */\nexport interface RegisteredSession<T> {\n readonly key: string;\n readonly stores: SessionStores;\n readonly attachment: T;\n /** Clock reading of the last request that named this session. */\n lastSeenAt: number;\n}\n\n/** Options for {@link SessionRegistry}. */\nexport interface SessionRegistryOptions<T> {\n readonly maxSessions?: number;\n readonly storageDir?: string;\n /**\n * Milliseconds a session may sit idle before it is torn down. `0` disables\n * expiry, which is what stdio wants: there, EOF on the pipe is the signal.\n */\n readonly idleTtlMs?: number;\n /** Injectable clock, for tests. */\n readonly now?: () => number;\n /** Released alongside the stores — the transport, for a socket-backed session. */\n readonly disposeAttachment?: (attachment: T) => Promise<void> | void;\n /** Called after an idle session was torn down, for the server log. */\n readonly onExpired?: (key: string) => void;\n}\n\n/**\n * Sessions keyed by `Mcp-Session-Id` (or `stdio` for the stdio transport).\n * The registry — not the transport — owns the lifetime and the ceiling.\n */\nexport class SessionRegistry<T> {\n readonly #sessions = new Map<string, RegisteredSession<T>>();\n readonly #maxSessions: number;\n readonly #storageDir: string | undefined;\n readonly #idleTtlMs: number;\n readonly #now: () => number;\n readonly #disposeAttachment: ((attachment: T) => Promise<void> | void) | undefined;\n readonly #onExpired: ((key: string) => void) | undefined;\n #sweeper: NodeJS.Timeout | undefined;\n\n constructor(options: SessionRegistryOptions<T> = {}) {\n this.#maxSessions = options.maxSessions ?? MCP_LIMITS.maxSessions;\n this.#storageDir = options.storageDir;\n this.#idleTtlMs = options.idleTtlMs ?? 0;\n this.#now = options.now ?? Date.now;\n this.#disposeAttachment = options.disposeAttachment;\n this.#onExpired = options.onExpired;\n }\n\n /** The configured idle ceiling; `0` when expiry is disabled. */\n get idleTtlMs(): number {\n return this.#idleTtlMs;\n }\n\n /**\n * Marks a session as used. Called for **every** request that names one, so a\n * session stays alive exactly as long as someone is talking to it.\n */\n touch(key: string): void {\n const session = this.#sessions.get(key);\n if (session !== undefined) session.lastSeenAt = this.#now();\n }\n\n /**\n * Tears down every session idle past the TTL and returns their keys.\n *\n * Streamable HTTP has no disconnect signal: a client that crashes or walks\n * away leaves its session, its terminals and their children running, and its\n * slot taken. Repeated agent failures would then add up to an accidental\n * denial of service against the operator's own machine, so idleness is the\n * only honest liveness signal available here.\n */\n async sweepIdle(): Promise<readonly string[]> {\n if (this.#idleTtlMs <= 0) return [];\n const deadline = this.#now() - this.#idleTtlMs;\n const expired = [...this.#sessions.values()]\n .filter((session) => session.lastSeenAt <= deadline)\n .map((session) => session.key);\n for (const key of expired) {\n await this.delete(key);\n this.#onExpired?.(key);\n }\n return expired;\n }\n\n /**\n * Runs {@link sweepIdle} on a timer until the returned function is called.\n * The timer is unref'd, so it never keeps a process alive on its own.\n */\n startIdleSweeper(intervalMs = Math.min(Math.max(this.#idleTtlMs / 4, 1_000), 60_000)): () => void {\n if (this.#idleTtlMs <= 0) return () => undefined;\n this.#sweeper = setInterval(() => {\n void this.sweepIdle();\n }, intervalMs);\n this.#sweeper.unref?.();\n return () => this.stopIdleSweeper();\n }\n\n /** Stops the sweeper started by {@link startIdleSweeper}. Idempotent. */\n stopIdleSweeper(): void {\n if (this.#sweeper === undefined) return;\n clearInterval(this.#sweeper);\n this.#sweeper = undefined;\n }\n\n get size(): number {\n return this.#sessions.size;\n }\n\n /** True when another session would exceed the ceiling. */\n get atCapacity(): boolean {\n return this.#sessions.size >= this.#maxSessions;\n }\n\n /** Creates a session and its stores; throws `capacity` at the ceiling. */\n create(key: string, attach: (stores: SessionStores) => T): RegisteredSession<T> {\n if (this.#sessions.has(key)) throw usageError(`session ${key} already exists`);\n if (this.atCapacity) {\n throw new McpError(\n 'capacity',\n `server already serves ${this.#maxSessions} MCP sessions`,\n 'close an existing session (DELETE with its Mcp-Session-Id) and retry',\n );\n }\n const stores = createSessionStores({ sessionKey: key, storageDir: this.#storageDir });\n const session: RegisteredSession<T> = {\n key,\n stores,\n attachment: attach(stores),\n lastSeenAt: this.#now(),\n };\n this.#sessions.set(key, session);\n return session;\n }\n\n get(key: string): RegisteredSession<T> | undefined {\n return this.#sessions.get(key);\n }\n\n /** Removes a session and closes everything it owned. */\n async delete(key: string): Promise<void> {\n const session = this.#sessions.get(key);\n if (session === undefined) return;\n this.#sessions.delete(key);\n await closeSessionStores(session.stores);\n try {\n await this.#disposeAttachment?.(session.attachment);\n } catch {\n // A transport that already closed is not a failure to report.\n }\n }\n\n /** Closes every session and stops the sweeper. */\n async closeAll(): Promise<void> {\n this.stopIdleSweeper();\n const keys = [...this.#sessions.keys()];\n await Promise.all(keys.map(async (key) => this.delete(key)));\n }\n}\n","/**\n * The application's own log, on the session timeline.\n *\n * A terminal shows what a program *drew*; its log says what the program\n * *decided*. That gap is where \"the screen looks right but nothing happened\"\n * lives, so an agent that can read both stops guessing.\n *\n * The driver publishes `app-log` events — a followed file yields a raw line, an\n * instrumented adapter yields a structured record — and this module buffers\n * them per terminal so `terminal.capture_since` can hand back everything since\n * a cursor.\n */\nimport { z } from 'zod';\nimport type { AppLogEvent } from '@termwright/driver';\n\n/** Ceilings for the buffer and for one response. */\nexport const LOG_LIMITS = Object.freeze({\n /** Entries retained per terminal; the oldest are evicted first. */\n bufferSize: 1_000,\n /** Entries returned by one call, newest kept. */\n maxPerResponse: 100,\n /** Characters kept per line or message. */\n maxTextChars: 2_000,\n});\n\n/** One buffered log entry, as an agent reads it. */\nexport const logEntrySchema = z.object({\n seq: z.number().int().describe('per-session counter assigned on arrival; the cursor for logs'),\n timeMs: z.number().describe('session clock; for a followed file, when the driver read the line'),\n source: z.enum(['file', 'adapter']),\n label: z.string().optional().describe('which log source, when the session follows more than one'),\n level: z.enum(['trace', 'debug', 'info', 'warn', 'error', 'fatal']).optional(),\n message: z.string().describe('the raw line, or the record’s formatted message'),\n logger: z.string().optional(),\n attrs: z.record(z.string(), z.unknown()).optional(),\n revision: z.number().int().optional().describe('semantic revision current when the record was produced'),\n});\n\n/** The structured shape of {@link logEntrySchema}. */\nexport type LogEntry = z.output<typeof logEntrySchema>;\n\nfunction clamp(text: string): string {\n return text.length > LOG_LIMITS.maxTextChars ? `${text.slice(0, LOG_LIMITS.maxTextChars)}…` : text;\n}\n\n/** Projects a driver event into a buffered entry. */\nfunction toEntry(event: AppLogEvent, seq: number): LogEntry {\n const record = event.record;\n return {\n seq,\n timeMs: event.timeMs,\n source: event.source,\n ...(event.label === undefined ? {} : { label: event.label }),\n ...(record === undefined\n ? { message: clamp(event.line ?? '') }\n : {\n level: record.level,\n message: clamp(record.message),\n ...(record.logger === undefined ? {} : { logger: record.logger }),\n ...(record.attrs === undefined ? {} : { attrs: { ...record.attrs } }),\n ...(record.revision === undefined ? {} : { revision: record.revision }),\n }),\n };\n}\n\n/** What a read since a cursor found. */\nexport interface LogWindow {\n readonly entries: readonly LogEntry[];\n /**\n * Entries that existed between the cursor and the oldest one still buffered,\n * plus any trimmed to fit the response ceiling.\n *\n * Computed **at read time** from sequence numbers rather than accumulated in\n * a counter as entries are dropped. A counter that is only published with the\n * next event silently loses the final window — exactly when a program has\n * gone quiet because it died, which is when the number matters most.\n */\n readonly omitted: number;\n /** Pass as the next cursor; equals the newest sequence number seen. */\n readonly cursor: number;\n}\n\n/** A bounded, per-terminal ring of log entries. */\nexport class LogBuffer {\n readonly #entries: LogEntry[] = [];\n readonly #capacity: number;\n #counter = 0;\n\n constructor(capacity: number = LOG_LIMITS.bufferSize) {\n this.#capacity = capacity;\n }\n\n /** Sequence number of the newest entry; 0 when nothing has arrived. */\n get sequence(): number {\n return this.#counter;\n }\n\n /** Entries currently retained. */\n get size(): number {\n return this.#entries.length;\n }\n\n /** Records one driver event. */\n append(event: AppLogEvent): void {\n this.#counter += 1;\n this.#entries.push(toEntry(event, this.#counter));\n if (this.#entries.length > this.#capacity) this.#entries.splice(0, this.#entries.length - this.#capacity);\n }\n\n /**\n * Everything after `cursor`, newest-biased and bounded.\n *\n * A cursor older than the buffer is not an error: the entries in between are\n * counted in {@link LogWindow.omitted} so an agent knows its view has a hole,\n * rather than quietly seeing a shorter list.\n */\n since(cursor: number, limit: number = LOG_LIMITS.maxPerResponse): LogWindow {\n const newer = this.#entries.filter((entry) => entry.seq > cursor);\n const oldestKept = this.#entries[0]?.seq ?? this.#counter + 1;\n const evicted = Math.max(0, Math.min(oldestKept - 1, this.#counter) - cursor);\n const trimmed = newer.length > limit ? newer.slice(-limit) : newer;\n return {\n entries: trimmed,\n omitted: evicted + (newer.length - trimmed.length),\n cursor: this.#counter,\n };\n }\n}\n\n/** Renders a log window the way it appears in a tool result's text. */\nexport function renderLogs(window: LogWindow): string {\n if (window.entries.length === 0 && window.omitted === 0) return 'logs: none';\n const header =\n window.omitted === 0\n ? `logs: ${window.entries.length}`\n : `logs: ${window.entries.length} (${window.omitted} omitted — raise the limit or read more often)`;\n return [\n header,\n ...window.entries.map((entry) => {\n const level = entry.level === undefined ? '' : ` ${entry.level.toUpperCase()}`;\n const label = entry.label === undefined ? '' : ` [${entry.label}]`;\n const logger = entry.logger === undefined ? '' : ` ${entry.logger}:`;\n return ` ${entry.timeMs}ms${level}${label}${logger} ${entry.message}`;\n }),\n ].join('\\n');\n}\n","/** Tiny object helpers shared by the modules that build driver option objects. */\n\n/**\n * Drops keys whose value is `undefined`.\n *\n * zod hands back objects where an absent optional key is present-and-undefined,\n * while the driver's option types are declared under\n * `exactOptionalPropertyTypes`. This is the one conversion between the two.\n */\nexport function definedOnly<T extends object>(value: T): { [K in keyof T]?: Exclude<T[K], undefined> } {\n const out: Record<string, unknown> = {};\n for (const [key, item] of Object.entries(value)) {\n if (item !== undefined) out[key] = item;\n }\n return out as { [K in keyof T]?: Exclude<T[K], undefined> };\n}\n\n/**\n * The same properties, but optional ones may also be explicitly `undefined` —\n * the shape zod produces for `.optional()` fields.\n */\nexport type Loose<T> = { [K in keyof T]?: T[K] | undefined };\n","/**\n * The small kit every tool definition is built from: what a handler is given,\n * what it returns, and the `defineTool` helper that keeps input schema, output\n * schema and handler types in step.\n *\n * It lives apart from the tool files so that `tools.ts` (live terminals) and\n * `trace-tools.ts` (recorded sessions) can share it without importing each\n * other.\n */\nimport type { z } from 'zod';\nimport type { ToolAnnotations } from './sdk-facade.js';\nimport type { TerminalStore } from './sessions.js';\nimport type { ScreenshotImage } from './screenshots.js';\nimport type { TraceStore } from './traces.js';\n\n/** What a tool handler is given besides its arguments: the session's stores. */\nexport interface ToolContext {\n readonly terminals: TerminalStore;\n readonly traces: TraceStore;\n}\n\n/** A handler's result: the text block an agent reads, plus the structured data. */\nexport interface ToolOutcome<T> {\n readonly text: string;\n readonly data: T;\n /**\n * Images attached to the result as `ImageContent`, when the caller asked for\n * one. Text and structured data are never replaced by an image — an agent\n * that cannot see pictures loses nothing.\n */\n readonly images?: readonly ScreenshotImage[];\n}\n\n/** A registered tool, in the form both the server and `agent-context` consume. */\nexport interface ToolDefinition {\n readonly name: string;\n readonly title: string;\n readonly description: string;\n readonly inputSchema: Record<string, z.ZodType>;\n readonly outputSchema: Record<string, z.ZodType>;\n readonly annotations: ToolAnnotations;\n /**\n * Args are typed `never` in the erased form so that any concrete handler is\n * assignable; the server passes the values zod already validated.\n */\n readonly handler: (context: ToolContext, args: never) => Promise<ToolOutcome<Record<string, unknown>>>;\n}\n\nexport function defineTool<I extends Record<string, z.ZodType>, O extends Record<string, z.ZodType>>(definition: {\n readonly name: string;\n readonly title: string;\n readonly description: string;\n readonly inputSchema: I;\n readonly outputSchema: O;\n readonly annotations?: ToolAnnotations;\n readonly handler: (\n context: ToolContext,\n args: z.output<z.ZodObject<I>>,\n ) => Promise<ToolOutcome<z.output<z.ZodObject<O>>>>;\n}): ToolDefinition {\n return {\n name: definition.name,\n title: definition.title,\n description: definition.description,\n inputSchema: definition.inputSchema,\n outputSchema: definition.outputSchema,\n annotations: definition.annotations ?? {},\n handler: definition.handler as ToolDefinition['handler'],\n };\n}\n\n","/**\n * PNG screenshots as MCP `ImageContent`.\n *\n * Rendering belongs to `@termwright/screenshot`: a cell grid becomes an SVG with\n * the glyph outlines embedded, and resvg rasterises it — no browser, and no\n * dependency on the agent's machine having the right font. This module only\n * decides *when* an image is worth sending and refuses it loudly otherwise.\n */\nimport { LIGHT_THEME, renderPng } from '@termwright/screenshot';\nimport type { ScreenFrame } from '@termwright/screenshot';\nimport { McpError } from './errors.js';\n\n/** Ceilings for images leaving the server. */\nexport const SCREENSHOT_LIMITS = Object.freeze({\n /**\n * Refusal threshold for one PNG, in bytes.\n *\n * An MCP result travels inside a JSON-RPC message, and base64 inflates it by\n * a third: a screenshot larger than this is more likely to blow a context\n * window than to answer a question, so it fails with a suggestion instead.\n */\n maxPngBytes: 3 * 1024 * 1024,\n /** Pixel density multiplier ceiling. */\n maxScale: 3,\n});\n\n/** An image ready to be attached to a tool result. */\nexport interface ScreenshotImage {\n /** Base64 PNG, as `ImageContent.data` requires. */\n readonly data: string;\n readonly mimeType: 'image/png';\n readonly width: number;\n readonly height: number;\n /** False when a character had no embedded outline; see `fallbackCharacters`. */\n readonly selfContained: boolean;\n readonly fallbackCharacters: readonly string[];\n}\n\n/** How a caller asks for an image. */\nexport interface ScreenshotRequest {\n readonly scale?: number | undefined;\n /** Light background instead of the default dark one. */\n readonly theme?: 'dark' | 'light' | undefined;\n}\n\n/**\n * Renders `frame` to a PNG.\n *\n * Failures are typed rather than thrown as raw errors: a scale out of range is\n * `usage`, an image over the ceiling is `capacity`, and a renderer that cannot\n * run at all (no font, no rasteriser) is `unsupported-action` — each with the\n * next thing to try.\n */\nexport function renderScreenshot(frame: ScreenFrame, request: ScreenshotRequest = {}): ScreenshotImage {\n const scale = request.scale ?? 1;\n if (!Number.isFinite(scale) || scale <= 0 || scale > SCREENSHOT_LIMITS.maxScale) {\n throw new McpError(\n 'usage',\n `screenshotScale must be between 0 and ${SCREENSHOT_LIMITS.maxScale}, got ${scale}`,\n 'omit it for 1, or pass 2 for a retina-sharp image',\n );\n }\n\n let rendered;\n try {\n rendered = renderPng(frame, {\n scale,\n ...(request.theme === 'light' ? { theme: LIGHT_THEME } : {}),\n });\n } catch (error) {\n throw new McpError(\n 'unsupported-action',\n `the screenshot renderer failed: ${error instanceof Error ? error.message : String(error)}`,\n 'omit screenshot — the tool still returns the screen as text and the compact tree',\n );\n }\n\n if (rendered.png.byteLength > SCREENSHOT_LIMITS.maxPngBytes) {\n throw new McpError(\n 'capacity',\n `the PNG is ${rendered.png.byteLength} bytes; the ceiling is ${SCREENSHOT_LIMITS.maxPngBytes}`,\n 'lower screenshotScale, or resize the terminal before taking the screenshot',\n );\n }\n\n return {\n data: Buffer.from(rendered.png).toString('base64'),\n mimeType: 'image/png',\n width: rendered.width,\n height: rendered.height,\n selfContained: rendered.selfContained,\n fallbackCharacters: [...rendered.fallbackCharacters],\n };\n}\n","/**\n * The compact snapshot format from CONTRACTS.md §MCP. It is normative, so this\n * module is deliberately small and covered by a golden test:\n *\n * ```\n * Terminal t1 100x30 revision 42\n * semanticTree: available\n * dialog \"Permission\" ref=n7@42 bounds=(8,20,40,9) modal\n * button \"Approve\" ref=n8@42 bounds=(14,23,11,1) focused\n * visible text:\n * <grid text>\n * ```\n *\n * `bounds` is `(row,column,width,height)` — the field order of the protocol's\n * `Rect`. Refs are `<nodeId>@<semanticRevision>`, byte-identical to the refs the\n * driver puts on `ResolvedTarget`, so a ref can be quoted back to any tool.\n */\nimport type { Rect, SemanticNode, SemanticSnapshot, SemanticState } from './model.js';\n\n/** One line of the ref list, plus the structured fields behind it. */\nexport interface RefEntry {\n readonly ref: string;\n readonly role: string;\n readonly name: string;\n readonly depth: number;\n readonly bounds?: Rect;\n readonly flags: readonly string[];\n readonly testId?: string;\n readonly value?: string;\n}\n\n/** Formats `n8@42` for a node observed at `revision`. */\nexport function formatRef(nodeId: string, revision: number): string {\n return `${nodeId}@${revision}`;\n}\n\n/** Splits `n8@42` back into its parts; returns `null` for anything else. */\nexport function parseRef(ref: string): { readonly nodeId: string; readonly revision: number } | null {\n const at = ref.lastIndexOf('@');\n if (at <= 0) return null;\n const nodeId = ref.slice(0, at);\n const revision = Number(ref.slice(at + 1));\n if (!Number.isInteger(revision) || revision < 0) return null;\n return { nodeId, revision };\n}\n\n/** Renders a rect as `(row,column,width,height)`. */\nexport function formatBounds(bounds: Rect): string {\n return `(${bounds.row},${bounds.column},${bounds.width},${bounds.height})`;\n}\n\n/**\n * The trailing flag list of a node line: every asserted state, in the closed\n * order of the protocol's state set. Booleans render as bare names (`modal`),\n * everything else as `name=value` (`checked=mixed`, `level=2`).\n */\nexport function stateFlags(state: SemanticState | undefined): readonly string[] {\n if (state === undefined) return [];\n const flags: string[] = [];\n for (const [key, value] of Object.entries(state)) {\n if (value === undefined) continue;\n if (value === true) flags.push(key);\n else if (value === false) continue;\n else flags.push(`${key}=${String(value)}`);\n }\n return flags;\n}\n\n/** Renders one node line (without indentation). */\nexport function formatNodeLine(entry: RefEntry): string {\n const parts = [`${entry.role} ${JSON.stringify(entry.name)}`, `ref=${entry.ref}`];\n if (entry.bounds !== undefined) parts.push(`bounds=${formatBounds(entry.bounds)}`);\n return [...parts, ...entry.flags].join(' ');\n}\n\n/** Depth-first walk of a snapshot in document order, roots first. */\nexport function walkSnapshot(snapshot: SemanticSnapshot): readonly { node: SemanticNode; depth: number }[] {\n const children = new Map<string, SemanticNode[]>();\n const byId = new Map<string, SemanticNode>();\n for (const node of snapshot.nodes) {\n byId.set(node.id, node);\n const parent = node.parentId;\n if (parent === undefined) continue;\n const bucket = children.get(parent);\n if (bucket === undefined) children.set(parent, [node]);\n else bucket.push(node);\n }\n const out: { node: SemanticNode; depth: number }[] = [];\n const seen = new Set<string>();\n const visit = (node: SemanticNode, depth: number): void => {\n if (seen.has(node.id)) return;\n seen.add(node.id);\n out.push({ node, depth });\n for (const child of children.get(node.id) ?? []) visit(child, depth + 1);\n };\n for (const rootId of snapshot.rootIds) {\n const root = byId.get(rootId);\n if (root !== undefined) visit(root, 0);\n }\n // Defensive: a node whose parent was dropped still gets listed, at the root.\n for (const node of snapshot.nodes) visit(node, 0);\n return out;\n}\n\n/** Turns a snapshot into ref entries in document order. */\nexport function refEntries(snapshot: SemanticSnapshot): readonly RefEntry[] {\n return walkSnapshot(snapshot).map(({ node, depth }) => toRefEntry(node, snapshot.revision, depth));\n}\n\n/** Projects a single node into a {@link RefEntry}. */\nexport function toRefEntry(node: SemanticNode, revision: number, depth = 0): RefEntry {\n return {\n ref: formatRef(node.id, revision),\n role: node.role,\n name: node.name,\n depth,\n ...(node.bounds === undefined ? {} : { bounds: node.bounds }),\n flags: stateFlags(node.state),\n ...(node.testId === undefined ? {} : { testId: node.testId }),\n ...(node.value === undefined ? {} : { value: node.value }),\n };\n}\n\n/** Options for {@link formatCompactSnapshot}. */\nexport interface CompactSnapshotOptions {\n /** Terminal handle, e.g. `t1`. */\n readonly terminal: string;\n readonly columns: number;\n readonly rows: number;\n /** Screen revision — the cursor `terminal.capture_since` takes. */\n readonly revision: number;\n readonly semantic: SemanticSnapshot | null;\n /** Visible grid text, one entry per row. */\n readonly text: readonly string[];\n /** Cap on listed nodes; the remainder is summarised on one line. */\n readonly maxNodes?: number;\n /** Cap on rendered rows; the remainder is summarised on one line. */\n readonly maxRows?: number;\n /** Omit the `visible text:` block (the `full` variant writes it to disk). */\n readonly includeText?: boolean;\n}\n\nconst DEFAULT_MAX_NODES = 500;\n\n/** Renders the normative compact snapshot. */\nexport function formatCompactSnapshot(options: CompactSnapshotOptions): string {\n const lines = [\n `Terminal ${options.terminal} ${options.columns}x${options.rows} revision ${options.revision}`,\n `semanticTree: ${options.semantic === null ? 'unavailable' : 'available'}`,\n ];\n if (options.semantic !== null) {\n const entries = refEntries(options.semantic);\n const limit = options.maxNodes ?? DEFAULT_MAX_NODES;\n for (const entry of entries.slice(0, limit)) {\n lines.push(`${' '.repeat(entry.depth)}${formatNodeLine(entry)}`);\n }\n if (entries.length > limit) {\n lines.push(`... ${entries.length - limit} more nodes (raise maxNodes or use variant=\"full\")`);\n }\n }\n if (options.includeText !== false) {\n lines.push('visible text:');\n const maxRows = options.maxRows ?? options.text.length;\n lines.push(...options.text.slice(0, maxRows));\n if (options.text.length > maxRows) lines.push(`... ${options.text.length - maxRows} more rows`);\n }\n return lines.join('\\n');\n}\n","/**\n * The incremental view behind `terminal.capture_since`: which screen rows and\n * which semantic subtrees changed since a cursor the agent was handed earlier.\n *\n * The diff is local to this package on purpose — see NOTES.md: `@termwright/mcp`\n * may depend on the driver only, and the shape needed here (changed rows plus\n * minimal changed subtree roots, rendered in the compact ref format) is a\n * projection for agents rather than a trace-archive concern.\n */\nimport { formatNodeLine, formatRef, toRefEntry, walkSnapshot } from './format.js';\nimport type { RefEntry } from './format.js';\nimport type { SemanticNode, SemanticSnapshot } from './model.js';\n\n/** A screen row whose text differs from the baseline. */\nexport interface RowChange {\n readonly row: number;\n readonly text: string;\n}\n\n/** A changed semantic subtree, identified by the ref of its root. */\nexport interface SubtreeChange {\n readonly change: 'added' | 'removed' | 'updated';\n readonly ref: string;\n readonly role: string;\n readonly name: string;\n /** The subtree in compact ref format, one node per line, indented. */\n readonly compact: string;\n}\n\n/** Rows present in `after` but different (or absent) in `before`. */\nexport function diffRows(before: readonly string[], after: readonly string[]): readonly RowChange[] {\n const changes: RowChange[] = [];\n for (let row = 0; row < after.length; row += 1) {\n const next = after[row] ?? '';\n if (before[row] !== next) changes.push({ row, text: next });\n }\n // Rows that disappeared because the terminal shrank are reported as empty.\n for (let row = after.length; row < before.length; row += 1) {\n changes.push({ row, text: '' });\n }\n return changes;\n}\n\n/** True when two nodes differ in anything an agent could act on. */\nfunction nodeChanged(before: SemanticNode, after: SemanticNode): boolean {\n return (\n before.role !== after.role ||\n before.name !== after.name ||\n before.value !== after.value ||\n before.testId !== after.testId ||\n before.description !== after.description ||\n before.parentId !== after.parentId ||\n JSON.stringify(before.bounds ?? null) !== JSON.stringify(after.bounds ?? null) ||\n JSON.stringify(before.state ?? null) !== JSON.stringify(after.state ?? null)\n );\n}\n\nfunction indexById(snapshot: SemanticSnapshot | null): Map<string, SemanticNode> {\n const index = new Map<string, SemanticNode>();\n for (const node of snapshot?.nodes ?? []) index.set(node.id, node);\n return index;\n}\n\n/** Renders `entry` and its descendants, re-based so the root sits at column 0. */\nfunction renderSubtree(\n snapshot: SemanticSnapshot,\n rootId: string,\n walked: readonly { node: SemanticNode; depth: number }[],\n): { readonly root: RefEntry; readonly compact: string } {\n const rootIndex = walked.findIndex(({ node }) => node.id === rootId);\n const rootEntry = walked[rootIndex];\n if (rootEntry === undefined) throw new Error(`node ${rootId} vanished mid-diff`);\n const lines: string[] = [];\n let root: RefEntry | undefined;\n for (let i = rootIndex; i < walked.length; i += 1) {\n const current = walked[i];\n if (current === undefined) break;\n if (i > rootIndex && current.depth <= rootEntry.depth) break;\n const entry = toRefEntry(current.node, snapshot.revision, current.depth - rootEntry.depth);\n root ??= entry;\n lines.push(`${' '.repeat(entry.depth)}${formatNodeLine(entry)}`);\n }\n return { root: root ?? toRefEntry(rootEntry.node, snapshot.revision), compact: lines.join('\\n') };\n}\n\n/**\n * Changed subtrees between two semantic snapshots, matched by node id.\n *\n * Only *minimal roots* are reported: when a node and its parent both changed,\n * the parent's subtree already contains the child, so the child is folded in.\n * Removals are reported with the ref they had in the baseline.\n */\nexport function diffSemantic(\n before: SemanticSnapshot | null,\n after: SemanticSnapshot | null,\n): readonly SubtreeChange[] {\n if (after === null) {\n if (before === null) return [];\n return before.nodes.map((node) => ({\n change: 'removed' as const,\n ref: formatRef(node.id, before.revision),\n role: node.role,\n name: node.name,\n compact: formatNodeLine(toRefEntry(node, before.revision)),\n }));\n }\n\n const beforeIndex = indexById(before);\n const afterIndex = indexById(after);\n const walked = walkSnapshot(after);\n\n const changedIds = new Set<string>();\n for (const node of after.nodes) {\n const previous = beforeIndex.get(node.id);\n if (previous === undefined || nodeChanged(previous, node)) changedIds.add(node.id);\n }\n\n const changes: SubtreeChange[] = [];\n for (const { node } of walked) {\n if (!changedIds.has(node.id)) continue;\n const parentId = node.parentId;\n // Folded into the ancestor's subtree when the ancestor changed as well.\n if (parentId !== undefined && changedIds.has(parentId) && afterIndex.has(parentId)) continue;\n const rendered = renderSubtree(after, node.id, walked);\n changes.push({\n change: beforeIndex.has(node.id) ? 'updated' : 'added',\n ref: rendered.root.ref,\n role: node.role,\n name: node.name,\n compact: rendered.compact,\n });\n }\n\n for (const node of before?.nodes ?? []) {\n if (afterIndex.has(node.id)) continue;\n const parentId = node.parentId;\n if (parentId !== undefined && !afterIndex.has(parentId)) continue; // parent already reported\n changes.push({\n change: 'removed',\n ref: formatRef(node.id, before?.revision ?? 0),\n role: node.role,\n name: node.name,\n compact: formatNodeLine(toRefEntry(node, before?.revision ?? 0)),\n });\n }\n\n return changes;\n}\n","/**\n * Turning a tool's target arguments into a driver `Locator`.\n *\n * This module owns *no* matching logic: it picks the driver locator factory the\n * arguments describe and hands everything else — strictness, waiting, staleness,\n * candidate diagnostics — to `@termwright/driver`.\n */\nimport type { Locator, TerminalHarness } from '@termwright/driver';\nimport { usageError } from './errors.js';\nimport { definedOnly } from './objects.js';\nimport type { Loose } from './objects.js';\nimport type { SemanticRole, SemanticState } from './model.js';\n\n/**\n * The target arguments every acting tool accepts. Exactly one selector wins.\n *\n * Optional fields admit an explicit `undefined` because they arrive straight\n * from zod-parsed arguments, where an absent key is present-and-undefined.\n */\nexport interface TargetInput {\n /** A ref from a previous snapshot: `n8@42`, or `grid:1,2,9,1@7`. */\n readonly ref?: string | undefined;\n /** The Textual-style CSS dialect, e.g. `dialog button#approve:focused`. */\n readonly selector?: string | undefined;\n readonly role?: SemanticRole | undefined;\n /** Accessible name; `/…/flags` is read as a regular expression. */\n readonly name?: string | undefined;\n readonly testId?: string | undefined;\n /** Visible text (grid matching when there is no semantic tree). */\n readonly text?: string | undefined;\n /** Label text (`labelledBy`, else name). */\n readonly label?: string | undefined;\n readonly exact?: boolean | undefined;\n readonly state?: Readonly<Loose<SemanticState>> | undefined;\n /** Zero-based pick among multiple matches; strict mode applies when omitted. */\n readonly nth?: number | undefined;\n}\n\nconst REGEX_LITERAL = /^\\/(.*)\\/([gimsuy]*)$/su;\n\n/**\n * Reads `/pattern/flags` as a RegExp and anything else as a literal string —\n * the same convention the YAML snapshot format uses for names.\n */\nexport function textOrRegExp(value: string): string | RegExp {\n const match = REGEX_LITERAL.exec(value);\n if (match === null) return value;\n try {\n return new RegExp(match[1] ?? '', match[2] ?? '');\n } catch (error) {\n throw usageError(\n `invalid regular expression ${JSON.stringify(value)}: ${error instanceof Error ? error.message : String(error)}`,\n 'quote a literal string, or fix the /pattern/flags form',\n );\n }\n}\n\n/** True when the input names no target at all. */\nexport function hasTarget(input: TargetInput): boolean {\n return (\n input.ref !== undefined ||\n input.selector !== undefined ||\n input.role !== undefined ||\n input.testId !== undefined ||\n input.text !== undefined ||\n input.label !== undefined\n );\n}\n\n/**\n * Builds the locator described by `input`. Precedence is `ref`, `selector`,\n * `testId`, `role`, `label`, `text` — the order from most to least specific.\n *\n * Every branch hands straight to a driver factory; nothing here matches, waits\n * or decides staleness.\n */\nexport function buildLocator(harness: TerminalHarness, input: TargetInput): Locator {\n let locator: Locator;\n if (input.ref !== undefined) {\n // The driver resolves a ref by node identity and owns its staleness rule,\n // so two nodes with the same name stay distinct and a superseded ref fails\n // as `stale-snapshot` without this layer guessing at either.\n locator = harness.locatorForRef(input.ref);\n } else if (input.selector !== undefined) {\n locator = harness.locator(input.selector);\n } else if (input.testId !== undefined) {\n locator = harness.getByTestId(input.testId);\n } else if (input.role !== undefined) {\n locator = harness.getByRole(\n input.role,\n definedOnly({\n name: input.name === undefined ? undefined : textOrRegExp(input.name),\n exact: input.exact,\n state: input.state === undefined ? undefined : definedOnly(input.state),\n }),\n );\n } else if (input.label !== undefined) {\n locator = harness.getByLabel(textOrRegExp(input.label), definedOnly({ exact: input.exact }));\n } else if (input.text !== undefined) {\n locator = harness.getByText(textOrRegExp(input.text), definedOnly({ exact: input.exact }));\n } else {\n throw usageError(\n 'no target given',\n 'pass one of ref, selector, testId, role (+name), label or text',\n );\n }\n return input.nth === undefined ? locator : locator.nth(input.nth);\n}\n","/**\n * The tool surface from CONTRACTS.md §MCP.\n *\n * Every tool is a thin projection: validate with zod, call the public driver\n * API, render the result. There is no locator engine, no wait loop and no\n * matching heuristic in this file — those live in `@termwright/driver`, and a\n * behaviour that differs between the MCP server and the test preset would be a\n * bug in this layer.\n *\n * Each definition carries both an `inputSchema` and an `outputSchema`; the\n * server returns `structuredContent` matching the latter, and `agent-context`\n * is generated from the same objects.\n */\nimport { z } from 'zod';\nimport { defineTool } from './tool-kit.js';\nimport { renderScreenshot } from './screenshots.js';\nimport { describeImage, screenshotSchema } from './screenshot-schema.js';\nimport type { ToolContext, ToolDefinition, ToolOutcome } from './tool-kit.js';\nimport { formatCompactSnapshot, refEntries, toRefEntry } from './format.js';\nimport type { RefEntry } from './format.js';\nimport { crashSchema, describeCrash, renderCrash } from './crash.js';\nimport { diffRows, diffSemantic } from './diff.js';\nimport { LOG_LIMITS, logEntrySchema, renderLogs } from './logs.js';\nimport { usageError } from './errors.js';\nimport {\n buttonSchema,\n cellPosition,\n cursorSchema,\n exitSchema,\n modesSchema,\n refEntrySchema,\n semanticTreeState,\n signalSchema,\n stateFilter,\n targetObject,\n targetShape,\n targetShapeWithoutText,\n terminalId,\n timeoutMs,\n} from './schemas.js';\nimport type { TerminalEntry } from './sessions.js';\nimport { buildLocator, hasTarget, textOrRegExp } from './targets.js';\nimport type { TargetInput } from './targets.js';\n\n// ---------------------------------------------------------------------------\n// Shared projections\n\nconst semanticFields = {\n terminal: z.string(),\n revision: z.number().int().describe('screen revision; pass it to terminal.capture_since as cursor'),\n semanticRevision: z.number().int().nullable(),\n semanticTree: semanticTreeState,\n};\n\n/** Narrow projection of the semantic capability, as the schemas type it. */\nfunction treeState(available: boolean): 'available' | 'unavailable' {\n return available ? 'available' : 'unavailable';\n}\n\nfunction optionalTimeout(timeout: number | undefined): { timeout?: number } {\n return timeout === undefined ? {} : { timeout };\n}\n\n/**\n * Lets renders and their semantic trees pair up before a read tool reports.\n *\n * A screen revision lands before the semantic revision that belongs to it (the\n * tree arrives on the socket, the render-commit marker in the byte stream). Two\n * things go wrong without this wait: a snapshot taken right after `wait_for\n * text` reports `semanticTree: unavailable` for a program that does publish one,\n * and `capture_since` reports changed *rows* with no changed *subtrees* because\n * it caught the pair mid-flight. The driver's locators already wait this way\n * internally; this aligns the read tools with them.\n *\n * A session still waiting for its very first tree gets the longer budget. A\n * timeout is not an error — whatever is on screen is reported honestly.\n */\nasync function settleSemantics(entry: TerminalEntry): Promise<void> {\n if (!entry.harness.capabilities().semanticTree) return;\n const budget = entry.harness.semanticTree() === null ? FIRST_TREE_SETTLE_MS : PAIRING_SETTLE_MS;\n try {\n await entry.harness.waitForStable({ timeout: budget });\n } catch {\n // Report the session as it is; the compact snapshot says what it found.\n }\n}\n\n/** Budget for a session that has never published a tree. */\nconst FIRST_TREE_SETTLE_MS = 2_000;\n\n/** Budget for letting an in-flight render pair with its semantic revision. */\nconst PAIRING_SETTLE_MS = 250;\n\n/** Current screen + semantic state of one terminal, recorded for later diffs. */\nfunction capture(\n context: ToolContext,\n entry: TerminalEntry,\n): {\n readonly rows: readonly string[];\n readonly refs: readonly RefEntry[];\n readonly revision: number;\n readonly semanticRevision: number | null;\n} {\n const record = context.terminals.record(entry);\n return {\n rows: record.rows,\n refs: record.semantic === null ? [] : refEntries(record.semantic),\n revision: record.revision,\n semanticRevision: record.semanticRevision,\n };\n}\n\n/** Renders the compact snapshot for a terminal in its current state. */\nfunction compactFor(\n entry: TerminalEntry,\n rows: readonly string[],\n options: { readonly maxNodes?: number; readonly maxRows?: number; readonly includeText?: boolean } = {},\n): string {\n const screen = entry.harness.screen();\n return formatCompactSnapshot({\n terminal: entry.id,\n columns: screen.columns,\n rows: screen.rows,\n revision: screen.revision,\n semantic: entry.harness.semanticTree(),\n text: rows,\n ...options,\n });\n}\n\nfunction locatorFor(entry: TerminalEntry, args: TargetInput) {\n return buildLocator(entry.harness, args);\n}\n\n/** The crash the driver recorded for this terminal, if the child died on its own. */\nfunction crashOf(entry: TerminalEntry): ReturnType<typeof describeCrash> | undefined {\n const report = entry.harness.crashReport();\n return report === null ? undefined : describeCrash(report);\n}\n\n/** `{ ok: true }` receipt fields shared by the acting tools. */\nconst receiptFields = {\n ok: z.literal(true),\n terminal: z.string(),\n revision: z.number().int(),\n};\n\nfunction receipt(entry: TerminalEntry): { ok: true; terminal: string; revision: number } {\n return { ok: true, terminal: entry.id, revision: entry.harness.screen().revision };\n}\n\n// ---------------------------------------------------------------------------\n// Tools\n\nconst launch = defineTool({\n name: 'terminal.launch',\n title: 'Launch a terminal',\n description:\n 'Starts a program in a real pseudo-terminal and returns a terminal handle plus the first ' +\n 'snapshot. The child gets a minimal environment unless envMode is \"inherit\"; values passed ' +\n 'in env are never echoed back.',\n inputSchema: {\n command: z\n .array(z.string())\n .min(1)\n .describe('argv, e.g. [\"node\", \"app.js\"] — no shell is involved'),\n cwd: z.string().optional(),\n env: z.record(z.string(), z.string()).optional().describe('extra environment for the child'),\n envMode: z\n .enum(['replace', 'inherit'])\n .optional()\n .describe(\n 'default \"replace\": the child gets PATH, HOME, LANG, LC_ALL, SHELL, TMPDIR, USER, TERM ' +\n 'plus env. \"inherit\" hands it the whole server environment',\n ),\n columns: z.number().int().min(1).max(1000).optional().describe('default 100'),\n rows: z.number().int().min(1).max(1000).optional().describe('default 30'),\n scrollbackLines: z.number().int().min(0).max(100_000).optional(),\n semanticNegotiationMs: z.number().int().min(0).max(60_000).optional(),\n logs: z\n .array(\n z.object({\n path: z.string().min(1).describe('log file to follow for the life of the session'),\n label: z.string().optional().describe('short name shown on each entry'),\n }),\n )\n .max(8)\n .optional()\n .describe(\n 'application log files to follow. An existing file is followed from its end, so a session ' +\n 'never replays a previous run; a missing one is waited for',\n ),\n timeouts: z\n .object({\n action: z.number().int().positive().optional(),\n text: z.number().int().positive().optional(),\n idle: z.number().int().positive().optional(),\n ready: z.number().int().positive().optional(),\n exit: z.number().int().positive().optional(),\n })\n .optional(),\n },\n outputSchema: {\n ...semanticFields,\n sessionId: z.string(),\n columns: z.number().int(),\n rows: z.number().int(),\n adapter: z.object({ name: z.string(), version: z.string() }).optional(),\n capabilities: z.array(z.string()),\n platform: z.string(),\n compact: z.string(),\n },\n annotations: { openWorldHint: true },\n handler: async (context, args) => {\n const entry = await context.terminals.launch(args);\n await settleSemantics(entry);\n const capabilities = entry.harness.capabilities();\n const screen = entry.harness.screen();\n const state = capture(context, entry);\n const compact = compactFor(entry, state.rows);\n return {\n text: compact,\n data: {\n terminal: entry.id,\n sessionId: entry.harness.sessionId,\n revision: state.revision,\n semanticRevision: state.semanticRevision,\n semanticTree: treeState(capabilities.semanticTree),\n columns: screen.columns,\n rows: screen.rows,\n ...(capabilities.adapter === undefined ? {} : { adapter: capabilities.adapter }),\n capabilities: [...capabilities.capabilities],\n platform: capabilities.platform,\n compact,\n },\n };\n },\n});\n\nconst capabilities = defineTool({\n name: 'terminal.capabilities',\n title: 'Session capabilities',\n description:\n 'What this session supports: whether a semantic tree is published, which adapter publishes ' +\n 'it, and the terminal geometry. Call it before relying on role-based targeting.',\n inputSchema: { terminal: terminalId },\n outputSchema: {\n ...semanticFields,\n columns: z.number().int(),\n rows: z.number().int(),\n adapter: z.object({ name: z.string(), version: z.string() }).optional(),\n capabilities: z.array(z.string()),\n platform: z.string(),\n crash: crashSchema.optional(),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await settleSemantics(entry);\n const caps = entry.harness.capabilities();\n const crash = crashOf(entry);\n const screen = entry.harness.screen();\n const semantic = entry.harness.semanticTree();\n return {\n text:\n `Terminal ${entry.id} ${screen.columns}x${screen.rows} revision ${screen.revision}\\n` +\n `semanticTree: ${caps.semanticTree ? 'available' : 'unavailable'}\\n` +\n `adapter: ${caps.adapter === undefined ? 'none' : `${caps.adapter.name} ${caps.adapter.version}`}\\n` +\n `capabilities: ${caps.capabilities.join(', ') || 'none'}\\n` +\n `platform: ${caps.platform}` +\n (crash === undefined ? '' : `\\n${renderCrash(crash)}`),\n data: {\n terminal: entry.id,\n revision: screen.revision,\n semanticRevision: semantic?.revision ?? null,\n semanticTree: treeState(caps.semanticTree),\n columns: screen.columns,\n rows: screen.rows,\n ...(caps.adapter === undefined ? {} : { adapter: caps.adapter }),\n capabilities: [...caps.capabilities],\n platform: caps.platform,\n ...(crash === undefined ? {} : { crash }),\n },\n };\n },\n});\n\nconst snapshot = defineTool({\n name: 'terminal.snapshot',\n title: 'Snapshot the terminal',\n description:\n 'One typed view of the terminal: compact semantic refs, visible text, cursor, terminal modes ' +\n 'and scroll position. variant \"full\" writes the complete dump (text, ANSI, HTML, semantic ' +\n 'tree) to disk and returns only refs plus the file path. The returned revision is the cursor ' +\n 'for terminal.capture_since.',\n inputSchema: {\n terminal: terminalId,\n variant: z.enum(['compact', 'full']).optional().describe('default \"compact\"'),\n maxNodes: z.number().int().min(1).max(5_000).optional(),\n maxRows: z.number().int().min(1).max(10_000).optional(),\n includeText: z.boolean().optional().describe('include the visible grid text (default true)'),\n screenshot: z\n .boolean()\n .optional()\n .describe('also attach a PNG of the screen, rendered without a browser'),\n screenshotScale: z\n .number()\n .min(0.1)\n .max(3)\n .optional()\n .describe('pixel density of the PNG; default 1, 2 is retina-sharp'),\n screenshotTheme: z.enum(['dark', 'light']).optional().describe('PNG background; default dark'),\n },\n outputSchema: {\n ...semanticFields,\n cursorValue: z.number().int().describe('alias of revision, to pass to terminal.capture_since'),\n columns: z.number().int(),\n rows: z.number().int(),\n buffer: z.enum(['normal', 'alternate']),\n cursor: cursorSchema,\n modes: modesSchema,\n scroll: z.object({\n offset: z.number().int(),\n length: z.number().int(),\n retainedFloor: z.number().int(),\n }),\n refs: z.array(refEntrySchema),\n compact: z.string(),\n dumpPath: z.string().optional(),\n screenshot: screenshotSchema.optional(),\n crash: crashSchema.optional(),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await settleSemantics(entry);\n const state = capture(context, entry);\n const screen = entry.harness.screen();\n const semantic = entry.harness.semanticTree();\n const full = args.variant === 'full';\n const compact = compactFor(entry, state.rows, {\n ...(args.maxNodes === undefined ? {} : { maxNodes: args.maxNodes }),\n ...(args.maxRows === undefined ? {} : { maxRows: args.maxRows }),\n includeText: full ? false : args.includeText !== false,\n });\n let dumpPath: string | undefined;\n if (full) {\n dumpPath = await context.terminals.writeDump(\n entry,\n `snapshot-${screen.revision}.json`,\n `${JSON.stringify(\n {\n terminal: entry.id,\n revision: screen.revision,\n columns: screen.columns,\n rows: screen.rows,\n text: screen.text(),\n ansi: screen.ansi(),\n html: screen.html(),\n semantic,\n },\n null,\n 2,\n )}\\n`,\n );\n }\n const crash = crashOf(entry);\n const image =\n args.screenshot === true\n ? renderScreenshot(screen, {\n\n scale: args.screenshotScale,\n theme: args.screenshotTheme,\n })\n : undefined;\n const trailer = [\n ...(dumpPath === undefined ? [] : [`full dump: ${dumpPath}`]),\n ...(crash === undefined ? [] : [renderCrash(crash)]),\n ];\n return {\n text: trailer.length === 0 ? compact : `${compact}\\n${trailer.join('\\n')}`,\n ...(image === undefined ? {} : { images: [image] }),\n data: {\n terminal: entry.id,\n revision: screen.revision,\n cursorValue: screen.revision,\n semanticRevision: state.semanticRevision,\n semanticTree: treeState(semantic !== null),\n columns: screen.columns,\n rows: screen.rows,\n buffer: screen.buffer,\n cursor: screen.cursor,\n modes: screen.modes,\n scroll: {\n offset: entry.harness.scrollback.position(),\n length: entry.harness.scrollback.length,\n retainedFloor: entry.harness.scrollback.retainedFloor,\n },\n refs: state.refs.map((entry) => ({ ...entry, flags: [...entry.flags] })),\n compact,\n ...(dumpPath === undefined ? {} : { dumpPath }),\n ...(image === undefined ? {} : { screenshot: describeImage(image) }),\n ...(crash === undefined ? {} : { crash }),\n },\n };\n },\n});\n\nconst captureSince = defineTool({\n name: 'terminal.capture_since',\n title: 'What changed since a revision',\n description:\n 'Incremental view: the screen rows that differ and the semantic subtrees that were added, ' +\n 'removed or updated since the given cursor. The cursor must be a revision this server ' +\n 'handed out earlier (snapshot or capture_since); older cursors fail with history-truncated.',\n inputSchema: {\n terminal: terminalId,\n cursor: z.number().int().min(0).describe('revision returned by an earlier snapshot'),\n maxRows: z.number().int().min(1).max(10_000).optional(),\n maxSubtrees: z.number().int().min(1).max(1_000).optional(),\n maxLogs: z\n .number()\n .int()\n .min(0)\n .max(500)\n .optional()\n .describe(`application log entries to return; default ${LOG_LIMITS.maxPerResponse}, 0 to skip`),\n },\n outputSchema: {\n ...semanticFields,\n since: z.number().int(),\n changedRows: z.array(z.object({ row: z.number().int(), text: z.string() })),\n changedSubtrees: z.array(\n z.object({\n change: z.enum(['added', 'removed', 'updated']),\n ref: z.string(),\n role: z.string(),\n name: z.string(),\n compact: z.string(),\n }),\n ),\n logs: z.array(logEntrySchema),\n logsOmitted: z\n .number()\n .int()\n .describe('entries dropped between the cursor and the oldest one still buffered'),\n logCursor: z.number().int().describe('newest log sequence seen; advances with every capture'),\n compact: z.string(),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await settleSemantics(entry);\n const before = context.terminals.baseline(entry, args.cursor);\n const after = context.terminals.record(entry);\n const rowLimit = args.maxRows ?? 200;\n const subtreeLimit = args.maxSubtrees ?? 100;\n const changedRows = diffRows(before.rows, after.rows).slice(0, rowLimit);\n const changedSubtrees = diffSemantic(before.semantic, after.semantic).slice(0, subtreeLimit);\n // Logs resume from the sequence the baseline capture recorded, so the two\n // views of \"since the cursor\" — screen and log — line up.\n const logs = entry.logs.since(before.logSeq, args.maxLogs ?? LOG_LIMITS.maxPerResponse);\n\n const lines = [\n `Terminal ${entry.id} revision ${after.revision} (since ${args.cursor})`,\n `semanticTree: ${after.semantic === null ? 'unavailable' : 'available'}`,\n ];\n lines.push(`changed rows: ${changedRows.length}`);\n for (const row of changedRows) lines.push(` ${row.row}: ${row.text}`);\n lines.push(`changed nodes: ${changedSubtrees.length}`);\n for (const subtree of changedSubtrees) {\n const marker = subtree.change === 'added' ? '+' : subtree.change === 'removed' ? '-' : '~';\n for (const line of subtree.compact.split('\\n')) lines.push(` ${marker} ${line}`);\n }\n lines.push(renderLogs(logs));\n return {\n text: lines.join('\\n'),\n data: {\n terminal: entry.id,\n revision: after.revision,\n semanticRevision: after.semanticRevision,\n semanticTree: treeState(after.semantic !== null),\n since: args.cursor,\n changedRows: changedRows.map((row) => ({ ...row })),\n changedSubtrees: changedSubtrees.map((subtree) => ({ ...subtree })),\n logs: logs.entries.map((log) => ({ ...log })),\n logsOmitted: logs.omitted,\n logCursor: logs.cursor,\n compact: lines.join('\\n'),\n },\n };\n },\n});\n\nconst query = defineTool({\n name: 'terminal.query',\n title: 'Find matching nodes',\n description:\n 'Resolves a target to refs without acting on it. Use it to check how many nodes a locator ' +\n 'matches before clicking, or to turn a role/name into a ref.',\n inputSchema: {\n terminal: terminalId,\n ...targetShape,\n timeout: timeoutMs.optional(),\n limit: z.number().int().min(1).max(100).optional().describe('default 20'),\n },\n outputSchema: {\n terminal: z.string(),\n revision: z.number().int(),\n count: z.number().int(),\n matches: z.array(\n z.object({\n ref: z.string(),\n revision: z.number().int(),\n semantic: z.boolean(),\n role: z.string().optional(),\n name: z.string().optional(),\n bounds: refEntrySchema.shape.bounds,\n }),\n ),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await settleSemantics(entry);\n const locator = locatorFor(entry, args);\n const limit = args.limit ?? 20;\n const count = await locator.count();\n const matches: {\n ref: string;\n revision: number;\n semantic: boolean;\n role?: string;\n name?: string;\n bounds?: { row: number; column: number; width: number; height: number };\n }[] = [];\n for (let index = 0; index < Math.min(count, limit); index += 1) {\n const target = await locator.nth(index).resolve(optionalTimeout(args.timeout));\n matches.push({\n ref: target.ref,\n revision: target.revision,\n semantic: target.semantic,\n ...(target.role === undefined ? {} : { role: target.role }),\n ...(target.name === undefined ? {} : { name: target.name }),\n ...(target.rect === null ? {} : { bounds: target.rect }),\n });\n }\n const text =\n matches.length === 0\n ? `no matches (count ${count})`\n : matches\n .map(\n (match) =>\n `${match.role ?? 'generic'} ${JSON.stringify(match.name ?? '')} ref=${match.ref}`,\n )\n .join('\\n');\n return {\n text,\n data: { terminal: entry.id, revision: entry.harness.screen().revision, count, matches },\n };\n },\n});\n\nfunction pointerTool(name: 'terminal.click' | 'terminal.double_click'): ToolDefinition {\n const double = name === 'terminal.double_click';\n return defineTool({\n name,\n title: double ? 'Double-click a target' : 'Click a target',\n description:\n `Sends a real ${double ? 'double ' : ''}mouse report through the pseudo-terminal. Fails with ` +\n 'unsupported-action when the program never enabled mouse tracking. Where the platform hides ' +\n 'the mode (modes.mouseTracking \"unknown\", e.g. Windows ConPTY) the click is sent anyway, ' +\n 'encoded as SGR.',\n inputSchema: {\n terminal: terminalId,\n ...targetShape,\n button: buttonSchema.optional(),\n position: z\n .object({ rowOffset: z.number().int(), columnOffset: z.number().int() })\n .optional()\n .describe('offset inside the target rectangle'),\n timeout: timeoutMs.optional(),\n },\n outputSchema: { ...receiptFields, ref: z.string() },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n const locator = locatorFor(entry, args);\n const target = await locator.resolve(optionalTimeout(args.timeout));\n const options = {\n ...optionalTimeout(args.timeout),\n ...(args.button === undefined ? {} : { button: args.button }),\n ...(args.position === undefined ? {} : { position: args.position }),\n };\n if (double) await locator.doubleClick(options);\n else await locator.click(options);\n return {\n text: `${double ? 'double-clicked' : 'clicked'} ref=${target.ref}`,\n data: { ...receipt(entry), ref: target.ref },\n };\n },\n });\n}\n\nconst press = defineTool({\n name: 'terminal.press',\n title: 'Press keys',\n description:\n 'Sends key chords as real bytes, honouring the modes the program enabled (application cursor ' +\n 'keys, keypad). Examples: \"Enter\", \"Escape\", \"Control+K Control+U\". With a target, the node is ' +\n 'focused first.',\n inputSchema: {\n terminal: terminalId,\n keys: z.string().min(1).describe('space-separated chords, e.g. \"Control+A Home\"'),\n ...targetShape,\n timeout: timeoutMs.optional(),\n },\n outputSchema: { ...receiptFields, ref: z.string().optional() },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n if (hasTarget(args)) {\n const locator = locatorFor(entry, args);\n const target = await locator.resolve(optionalTimeout(args.timeout));\n await locator.press(args.keys, optionalTimeout(args.timeout));\n return { text: `pressed ${args.keys} on ref=${target.ref}`, data: { ...receipt(entry), ref: target.ref } };\n }\n await entry.harness.press(args.keys);\n return { text: `pressed ${args.keys}`, data: receipt(entry) };\n },\n});\n\nconst type = defineTool({\n name: 'terminal.type',\n title: 'Type text',\n description:\n 'Types text as individual keystrokes (not a paste). With a target, the node is focused first.',\n inputSchema: {\n terminal: terminalId,\n text: z.string(),\n ...targetShapeWithoutText,\n timeout: timeoutMs.optional(),\n },\n outputSchema: { ...receiptFields, ref: z.string().optional() },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n if (hasTarget(args)) {\n const locator = locatorFor(entry, args);\n const target = await locator.resolve(optionalTimeout(args.timeout));\n await locator.type(args.text, optionalTimeout(args.timeout));\n return { text: `typed into ref=${target.ref}`, data: { ...receipt(entry), ref: target.ref } };\n }\n await entry.harness.type(args.text);\n return { text: `typed ${args.text.length} characters`, data: receipt(entry) };\n },\n});\n\nconst paste = defineTool({\n name: 'terminal.paste',\n title: 'Paste text',\n description:\n 'Pastes text, wrapped in bracketed-paste markers when the program enabled that mode. Use it ' +\n 'for multi-line input instead of terminal.type.',\n inputSchema: { terminal: terminalId, text: z.string() },\n outputSchema: receiptFields,\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await entry.harness.paste(args.text);\n return { text: `pasted ${args.text.length} characters`, data: receipt(entry) };\n },\n});\n\nconst writeRaw = defineTool({\n name: 'terminal.write_raw',\n title: 'Write raw bytes',\n description:\n 'Writes bytes to the pseudo-terminal verbatim — no newline, no key encoding. The escape hatch ' +\n 'for sequences the key encoder does not model.',\n inputSchema: {\n terminal: terminalId,\n data: z.string(),\n encoding: z.enum(['utf8', 'base64']).optional().describe('default \"utf8\"'),\n },\n outputSchema: { ...receiptFields, bytes: z.number().int() },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n const bytes =\n args.encoding === 'base64' ? new Uint8Array(Buffer.from(args.data, 'base64')) : args.data;\n await entry.harness.write(bytes);\n const length = typeof bytes === 'string' ? Buffer.byteLength(bytes) : bytes.byteLength;\n return { text: `wrote ${length} bytes`, data: { ...receipt(entry), bytes: length } };\n },\n});\n\nconst drag = defineTool({\n name: 'terminal.drag',\n title: 'Drag',\n description:\n 'Drags with real mouse reports: either from one target to another (toTarget), or between two ' +\n 'cell positions inside the source target (from/to).',\n inputSchema: {\n terminal: terminalId,\n ...targetShape,\n toTarget: targetObject.optional().describe('drop target; omit when using from/to'),\n from: cellPosition.optional(),\n to: cellPosition.optional(),\n timeout: timeoutMs.optional(),\n },\n outputSchema: receiptFields,\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n const source = locatorFor(entry, args);\n if (args.toTarget !== undefined) {\n await source.dragTo(locatorFor(entry, args.toTarget), optionalTimeout(args.timeout));\n return { text: 'dragged to target', data: receipt(entry) };\n }\n if (args.from === undefined || args.to === undefined) {\n throw usageError('drag needs either toTarget, or both from and to');\n }\n await source.drag({ from: args.from, to: args.to });\n return {\n text: `dragged (${args.from.row},${args.from.column}) -> (${args.to.row},${args.to.column})`,\n data: receipt(entry),\n };\n },\n});\n\nconst wheel = defineTool({\n name: 'terminal.wheel',\n title: 'Scroll with the wheel',\n description: 'Sends wheel reports over a target. Positive deltaY scrolls down.',\n inputSchema: {\n terminal: terminalId,\n ...targetShape,\n deltaY: z.number().int(),\n deltaX: z.number().int().optional(),\n },\n outputSchema: receiptFields,\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await locatorFor(entry, args).wheel({\n deltaY: args.deltaY,\n ...(args.deltaX === undefined ? {} : { deltaX: args.deltaX }),\n });\n return { text: `wheel deltaY=${args.deltaY}`, data: receipt(entry) };\n },\n});\n\nconst resize = defineTool({\n name: 'terminal.resize',\n title: 'Resize the terminal',\n description: 'Resizes the pseudo-terminal; the child sees a real SIGWINCH.',\n inputSchema: {\n terminal: terminalId,\n columns: z.number().int().min(1).max(1000),\n rows: z.number().int().min(1).max(1000),\n },\n outputSchema: { ...receiptFields, columns: z.number().int(), rows: z.number().int() },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await entry.harness.resize({ columns: args.columns, rows: args.rows });\n return {\n text: `resized to ${args.columns}x${args.rows}`,\n data: { ...receipt(entry), columns: args.columns, rows: args.rows },\n };\n },\n});\n\nconst signal = defineTool({\n name: 'terminal.signal',\n title: 'Send a signal',\n description:\n 'Sends INT, TERM, KILL or HUP to the child. Destructive by design: terminal.close cleans up ' +\n 'without signalling.',\n inputSchema: { terminal: terminalId, signal: signalSchema },\n outputSchema: receiptFields,\n annotations: { destructiveHint: true },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n await entry.harness.signal(args.signal);\n return { text: `sent SIG${args.signal}`, data: receipt(entry) };\n },\n});\n\nconst scrollback = defineTool({\n name: 'terminal.scrollback',\n title: 'Read or move the scrollback',\n description:\n 'Emulator-side history: read a line range, search it, or move the viewport. The child sees ' +\n 'nothing — no input is sent.',\n inputSchema: {\n terminal: terminalId,\n move: z.number().int().optional().describe('lines to move the viewport; negative scrolls up'),\n from: z.number().int().min(0).optional(),\n to: z.number().int().min(0).optional(),\n search: z.string().optional().describe('literal text, or \"/pattern/flags\"'),\n limit: z.number().int().min(1).max(1000).optional().describe('max search hits (default 50)'),\n },\n outputSchema: {\n terminal: z.string(),\n length: z.number().int(),\n retainedFloor: z.number().int(),\n position: z.number().int(),\n text: z.string().optional(),\n matches: z.array(z.object({ line: z.number().int(), match: z.string() })).optional(),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n const api = entry.harness.scrollback;\n if (args.move !== undefined) api.move({ lines: args.move });\n const wantsText = args.from !== undefined || args.to !== undefined || args.search === undefined;\n const text = wantsText\n ? api.text({\n ...(args.from === undefined ? {} : { from: args.from }),\n ...(args.to === undefined ? {} : { to: args.to }),\n })\n : undefined;\n const matches =\n args.search === undefined\n ? undefined\n : api.search(textOrRegExp(args.search)).slice(0, args.limit ?? 50);\n const lines = [\n `scrollback length ${api.length} floor ${api.retainedFloor} position ${api.position()}`,\n ];\n if (matches !== undefined) {\n lines.push(...matches.map((match) => ` ${match.line}: ${match.match}`));\n }\n if (text !== undefined) lines.push(text);\n return {\n text: lines.join('\\n'),\n data: {\n terminal: entry.id,\n length: api.length,\n retainedFloor: api.retainedFloor,\n position: api.position(),\n ...(text === undefined ? {} : { text }),\n ...(matches === undefined ? {} : { matches: matches.map((match) => ({ ...match })) }),\n },\n };\n },\n});\n\nconst selectCells = defineTool({\n name: 'terminal.select_cells',\n title: 'Select a cell range',\n description: 'Selects a rectangle in the emulator (like a mouse selection). No input is sent.',\n inputSchema: { terminal: terminalId, start: cellPosition, end: cellPosition },\n outputSchema: receiptFields,\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n entry.harness.selection.selectCells({ start: args.start, end: args.end });\n return {\n text: `selected (${args.start.row},${args.start.column})-(${args.end.row},${args.end.column})`,\n data: receipt(entry),\n };\n },\n});\n\nconst copySelection = defineTool({\n name: 'terminal.copy_selection',\n title: 'Copy the selection',\n description: 'Returns the text of the current selection and optionally clears it.',\n inputSchema: { terminal: terminalId, clear: z.boolean().optional() },\n outputSchema: { terminal: z.string(), text: z.string() },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n const text = entry.harness.selection.copy();\n if (args.clear === true) entry.harness.selection.clear();\n return { text, data: { terminal: entry.id, text } };\n },\n});\n\nconst waitFor = defineTool({\n name: 'terminal.wait_for',\n title: 'Wait for a condition',\n description:\n 'Revision-driven waits — never a sleep. \"text\"/\"title\" wait for content, \"visible\"/\"hidden\"/' +\n '\"attached\" wait on a target, \"stable\" waits for renders to settle, \"idle\" for output to stop, ' +\n '\"render\" for a render after a given revision, \"exit\" for the child to exit.',\n inputSchema: {\n terminal: terminalId,\n wait: z.enum(['text', 'title', 'visible', 'hidden', 'attached', 'stable', 'idle', 'render', 'exit']),\n text: z.string().optional().describe('for wait=\"text\"; \"/pattern/flags\" is a regular expression'),\n title: z.string().optional().describe('for wait=\"title\"'),\n ...targetShapeWithoutText,\n frames: z.number().int().min(1).optional().describe('for wait=\"stable\"'),\n after: z.number().int().min(0).optional().describe('for wait=\"render\": the revision to beat'),\n timeout: timeoutMs.optional(),\n },\n outputSchema: {\n ...receiptFields,\n wait: z.string(),\n exit: exitSchema.optional(),\n },\n handler: async (context, args) => {\n const entry = context.terminals.get(args.terminal);\n const timeout = optionalTimeout(args.timeout);\n switch (args.wait) {\n case 'text': {\n if (args.text === undefined) throw usageError('wait=\"text\" needs text');\n await entry.harness.waitForText(textOrRegExp(args.text), timeout);\n break;\n }\n case 'title': {\n if (args.title === undefined) throw usageError('wait=\"title\" needs title');\n await entry.harness.waitForTitle(textOrRegExp(args.title), timeout);\n break;\n }\n case 'visible':\n case 'hidden':\n case 'attached': {\n await locatorFor(entry, args).waitFor({ state: args.wait, ...timeout });\n break;\n }\n case 'stable': {\n await entry.harness.waitForStable({\n ...(args.frames === undefined ? {} : { frames: args.frames }),\n ...timeout,\n });\n break;\n }\n case 'idle': {\n await entry.harness.waitForIdle(timeout);\n break;\n }\n case 'render': {\n if (args.after === undefined) throw usageError('wait=\"render\" needs after');\n await entry.harness.waitForRender({ after: args.after, ...timeout });\n break;\n }\n case 'exit': {\n const status = await entry.harness.waitForExit(timeout);\n return {\n text: `exited code=${String(status.code)} signal=${String(status.signal)}`,\n data: { ...receipt(entry), wait: args.wait, exit: status },\n };\n }\n }\n return { text: `wait ${args.wait} satisfied`, data: { ...receipt(entry), wait: args.wait } };\n },\n});\n\nconst close = defineTool({\n name: 'terminal.close',\n title: 'Close a terminal',\n description:\n 'Bounded physical cleanup: hangs up the pseudo-terminal and forgets the handle. Send signals ' +\n 'explicitly with terminal.signal if the child must be killed first.',\n inputSchema: { terminal: terminalId },\n outputSchema: { ok: z.literal(true), terminal: z.string(), exit: exitSchema.nullable() },\n annotations: { idempotentHint: true },\n handler: async (context, args) => {\n const entry = await context.terminals.close(args.terminal);\n return {\n text: `closed ${entry.id}`,\n data: { ok: true as const, terminal: entry.id, exit: entry.exit },\n };\n },\n});\n\n/** The live-terminal tools, in the order CONTRACTS.md §MCP lists them. */\nexport const TERMINAL_TOOLS: readonly ToolDefinition[] = Object.freeze([\n launch,\n capabilities,\n snapshot,\n captureSince,\n query,\n pointerTool('terminal.click'),\n pointerTool('terminal.double_click'),\n press,\n type,\n paste,\n writeRaw,\n drag,\n wheel,\n resize,\n signal,\n scrollback,\n selectCells,\n copySelection,\n waitFor,\n close,\n]);\n\nexport { stateFilter, targetShape, toRefEntry };\nexport type { ToolContext, ToolDefinition, ToolOutcome };\n","/**\n * How an attached image is described in `structuredContent`.\n *\n * The bytes travel as `ImageContent`; this is the part an agent can reason\n * about without decoding anything — how big the picture is, and whether every\n * glyph was embedded or some character fell back to a font the viewer may not\n * have.\n */\nimport { z } from 'zod';\nimport type { ScreenshotImage } from './screenshots.js';\n\n/** Metadata of the PNG attached to a result. */\nexport const screenshotSchema = z.object({\n width: z.number().int(),\n height: z.number().int(),\n mimeType: z.literal('image/png'),\n selfContained: z\n .boolean()\n .describe('false when a character had no embedded outline and fell back to a font'),\n fallbackCharacters: z.array(z.string()),\n});\n\n/** Projects an image into {@link screenshotSchema}, without the bytes. */\nexport function describeImage(image: ScreenshotImage): z.output<typeof screenshotSchema> {\n return {\n width: image.width,\n height: image.height,\n mimeType: image.mimeType,\n selfContained: image.selfContained,\n fallbackCharacters: [...image.fallbackCharacters],\n };\n}\n","/**\n * The zod v4 vocabulary shared by the tool schemas.\n *\n * These shapes are the single source for three things at once: runtime\n * validation before anything reaches the driver, the JSON Schema the MCP host\n * shows to a model, and the `agent-context` document. Descriptions are written\n * for an agent reading them cold.\n */\nimport { z } from 'zod';\nimport { FILTERABLE_STATES, SEMANTIC_ROLES, SIGNALS } from './model.js';\nimport type { SemanticState } from './model.js';\nimport type { Loose } from './objects.js';\n\n/** Handle of a terminal owned by the current MCP session. */\nexport const terminalId = z\n .string()\n .min(1)\n .describe('terminal handle returned by terminal.launch, e.g. \"t1\"');\n\n/** Millisecond budget for a single call; the driver applies its class default otherwise. */\nexport const timeoutMs = z\n .number()\n .int()\n .positive()\n .max(600_000)\n .describe('timeout in milliseconds; defaults to the driver timeout class for the action');\n\n/** State flags a locator may filter on. */\nexport const stateFilter = z\n .object({\n disabled: z.boolean().optional(),\n focused: z.boolean().optional(),\n selected: z.boolean().optional(),\n checked: z.union([z.boolean(), z.literal('mixed')]).optional(),\n expanded: z.boolean().optional(),\n modal: z.boolean().optional(),\n busy: z.boolean().optional(),\n hidden: z.boolean().optional(),\n readonly: z.boolean().optional(),\n })\n .describe('only nodes asserting these state flags match');\n\n/** Compile-time lock: the filter never drifts from the protocol's state set. */\nexport const STATE_FILTER_MATCHES_PROTOCOL: z.infer<typeof stateFilter> extends Loose<SemanticState>\n ? true\n : never = true;\n\n/** Zero-based viewport cell coordinate. */\nexport const cellPosition = z.object({\n row: z.number().int().min(0),\n column: z.number().int().min(0),\n});\n\n/** The target fields every acting tool accepts; exactly one selector wins. */\nexport const targetShape = {\n ref: z\n .string()\n .optional()\n .describe(\n 'ref from a previous snapshot: \"n8@42\" (semantic node) or \"grid:1,2,9,1@7\" (grid match); ' +\n 'valid only at the revision it was minted at',\n ),\n selector: z\n .string()\n .optional()\n .describe('CSS dialect: \"dialog button#approve:focused\" (role, #testId, .class, :state)'),\n role: z.enum(SEMANTIC_ROLES).optional().describe('semantic role; requires a semantic tree'),\n name: z\n .string()\n .optional()\n .describe('accessible name; \"/pattern/flags\" is read as a regular expression'),\n testId: z.string().optional().describe('author-supplied test id'),\n label: z.string().optional().describe('label text (labelledBy, else name)'),\n text: z\n .string()\n .optional()\n .describe('visible text; matches the grid when there is no semantic tree'),\n exact: z.boolean().optional().describe('exact rather than substring text matching'),\n state: stateFilter.optional(),\n nth: z\n .number()\n .int()\n .min(0)\n .optional()\n .describe('zero-based pick among matches; omit for strict mode (>1 match fails)'),\n} as const;\n\n/**\n * The same fields minus `text`, for tools whose own `text` argument means\n * something else (`terminal.type` types it, `terminal.wait_for` awaits it).\n * Those tools target by ref, selector, testId, role or label.\n */\nexport const targetShapeWithoutText = (({ text: _text, ...rest }) => rest)(targetShape);\n\n/** Same fields, as a nested object (drag destinations). */\nexport const targetObject = z.object(targetShape);\n\n/** A node as the compact format prints it, in structured form. */\nexport const refEntrySchema = z.object({\n ref: z.string(),\n role: z.string(),\n name: z.string(),\n depth: z.number().int().min(0),\n bounds: z\n .object({\n row: z.number().int(),\n column: z.number().int(),\n width: z.number().int(),\n height: z.number().int(),\n })\n .optional(),\n flags: z.array(z.string()),\n testId: z.string().optional(),\n value: z.string().optional(),\n});\n\n/** Whether the session publishes a semantic tree. */\nexport const semanticTreeState = z.enum(['available', 'unavailable']);\n\n/** Cursor and modes, so one snapshot answers \"what is on screen right now\". */\nexport const cursorSchema = z.object({\n row: z.number().int(),\n column: z.number().int(),\n visible: z.boolean(),\n shape: z.enum(['block', 'underline', 'bar']).optional(),\n});\n\nexport const modesSchema = z.object({\n /**\n * `'unknown'` means the platform hides the mode from the emulator (ConPTY on\n * Windows), not that the program disabled mouse reporting. Pointer actions\n * still work there: input goes out as SGR, which every program that enables\n * mouse reporting understands.\n */\n mouseTracking: z.enum(['none', 'x10', 'vt200', 'drag', 'any', 'unknown']),\n mouseEncoding: z.enum(['default', 'sgr', 'urxvt', 'utf8', 'unknown']),\n bracketedPaste: z.boolean(),\n applicationCursorKeys: z.boolean(),\n applicationKeypad: z.boolean(),\n /**\n * `'unknown'` has the same meaning as for the mouse fields: the platform\n * hides the mode, so the emulator cannot say whether the program asked for\n * focus events. It is not `'off'`.\n */\n focusReporting: z.enum(['on', 'off', 'unknown']),\n synchronizedOutput: z.boolean(),\n});\n\nexport const exitSchema = z.object({\n code: z.number().int().nullable(),\n signal: z.string().nullable(),\n});\n\n/** Signals `terminal.signal` accepts. */\nexport const signalSchema = z.enum(SIGNALS);\n\n/** Mouse buttons a pointer action accepts. */\nexport const buttonSchema = z.enum(['left', 'middle', 'right']);\n\n/** Roles offered to agents, for `agent-context`. */\nexport const roleEnum = z.enum(SEMANTIC_ROLES);\n\n/** State names offered to agents, for `agent-context`. */\nexport const STATE_NAMES: readonly string[] = FILTERABLE_STATES;\n","/**\n * `trace.*` — reading a recorded failure the way `terminal.*` reads a live one.\n *\n * The projections are deliberately the same: a frame prints the compact ref\n * format over reconstructed screen text, and a diff reports changed rows plus\n * changed semantic subtrees, so an agent that learned the live loop already\n * knows how to read a replay.\n *\n * Reconstruction is `@termwright/trace`'s job — `stateAt()` returns the cast\n * prefix and the nearest semantic snapshot, `renderAnsiToHtml()` replays that\n * prefix through the same headless emulator the report uses. Nothing here\n * parses asciicast or drives a terminal.\n */\nimport { z } from 'zod';\nimport { frameFromAnsi } from '@termwright/trace';\nimport type {\n StepSummary,\n TraceFrame,\n TraceLogEntry,\n TraceMeta,\n TraceReader,\n} from '@termwright/trace';\nimport { crashSchema, renderCrash } from './crash.js';\nimport type { CrashProjection } from './crash.js';\nimport { diffRows, diffSemantic } from './diff.js';\nimport { LOG_LIMITS, logEntrySchema, renderLogs } from './logs.js';\nimport type { LogEntry } from './logs.js';\nimport { usageError } from './errors.js';\nimport { formatCompactSnapshot, refEntries } from './format.js';\nimport type { SemanticSnapshot } from './model.js';\nimport { refEntrySchema, semanticTreeState } from './schemas.js';\nimport { describeImage, screenshotSchema } from './screenshot-schema.js';\nimport { renderScreenshot } from './screenshots.js';\nimport { defineTool } from './tool-kit.js';\nimport type { ToolDefinition } from './tool-kit.js';\nimport { TRACE_LIMITS } from './traces.js';\nimport type { OpenTrace } from './traces.js';\n\nconst traceId = z.string().min(1).describe('trace handle returned by trace.open, e.g. \"tr1\"');\n\nconst screenshotShape = {\n screenshot: z\n .boolean()\n .optional()\n .describe('also attach a PNG of the reconstructed frame, rendered without a browser'),\n screenshotScale: z\n .number()\n .min(0.1)\n .max(3)\n .optional()\n .describe('pixel density of the PNG; default 1, 2 is retina-sharp'),\n screenshotTheme: z.enum(['dark', 'light']).optional().describe('PNG background; default dark'),\n} as const;\n\nconst metaSchema = z.object({\n sessionId: z.string(),\n command: z.array(z.string()),\n columns: z.number().int(),\n rows: z.number().int(),\n startedAt: z.string(),\n platform: z.string(),\n semanticTree: z.boolean(),\n durationMs: z.number().optional(),\n truncated: z.boolean().optional(),\n exit: z.object({ code: z.number().int().nullable(), signal: z.string().nullable() }).optional(),\n});\n\n/**\n * The crash section of `meta.json`, projected into the shape the live tools use.\n *\n * `@termwright/trace` types this field now, so the read is direct. Its `t` is a\n * wall-clock offset and it adds `castOffset` for seeking a player; the live\n * projection carries one `timeMs`, so the cast offset is the one kept — that is\n * the timeline `trace.frame_at` and `trace.diff` already speak.\n */\nfunction crashOfMeta(meta: TraceMeta): CrashProjection | undefined {\n const crash = meta.crash;\n if (crash === undefined) return undefined;\n // The field is typed upstream, but meta.json is still external data — an\n // older writer or a hand-edited archive can carry anything. Validating keeps\n // a broken section from failing a call that has plenty else to report.\n const parsed = crashSchema.safeParse({\n exit: crash.exit,\n timeMs: crash.castOffset,\n screenTail: crash.screenTail,\n screenTailTruncated: false,\n lastSemanticRevision: crash.lastSemanticRevision ?? null,\n recentInputs: crash.recentInputs ?? [],\n diagnostics: crash.diagnosticsTail ?? [],\n });\n return parsed.success ? parsed.data : undefined;\n}\n\nfunction projectMeta(meta: TraceMeta): z.output<typeof metaSchema> {\n return {\n sessionId: meta.sessionId,\n command: [...meta.command],\n columns: meta.columns,\n rows: meta.rows,\n startedAt: meta.startedAt,\n platform: meta.platform,\n semanticTree: meta.semanticTree,\n ...(meta.durationMs === undefined ? {} : { durationMs: meta.durationMs }),\n ...(meta.truncated === undefined ? {} : { truncated: meta.truncated }),\n ...(meta.exit === undefined ? {} : { exit: { code: meta.exit.code, signal: meta.exit.signal } }),\n };\n}\n\nconst stepSchema = z.object({\n index: z.number().int(),\n stepId: z.string(),\n title: z.string(),\n parentStepId: z.string().optional(),\n status: z.enum(['passed', 'failed', 'skipped']).nullable(),\n error: z.string().optional(),\n castOffset: z.number(),\n castEndOffset: z.number().nullable(),\n});\n\nfunction projectStep(step: StepSummary, index: number): z.output<typeof stepSchema> {\n return {\n index,\n stepId: step.stepId,\n title: step.title,\n ...(step.parentStepId === undefined ? {} : { parentStepId: step.parentStepId }),\n status: step.status,\n ...(step.error === undefined ? {} : { error: step.error }),\n castOffset: step.castOffset,\n castEndOffset: step.castEndOffset,\n };\n}\n\n/** Cast markers, which the writer emits one per step. */\nasync function markersOf(reader: TraceReader): Promise<readonly { timeMs: number; label: string }[]> {\n const markers: { timeMs: number; label: string }[] = [];\n for await (const event of reader.castEvents()) {\n if (event.code === 'm') markers.push({ timeMs: event.timeMs, label: event.data });\n }\n return markers;\n}\n\n/**\n * One reconstructed moment: the cell grid, the semantic tree that paired with\n * it, and the step it fell inside.\n *\n * The grid comes from `frameFromAnsi()`, so it is a `ScreenFrame` — the same\n * shape a live `harness.screen()` has. That is what lets one screenshot\n * renderer serve both worlds.\n */\ninterface Frame {\n readonly grid: TraceFrame;\n readonly timeMs: number;\n readonly columns: number;\n readonly rows: number;\n readonly lines: readonly string[];\n readonly semantic: SemanticSnapshot | null;\n readonly semanticRevision: number | null;\n readonly step: StepSummary | null;\n /** What the program was saying about itself as the screen reached this state. */\n readonly logs: readonly LogEntry[];\n}\n\n/**\n * Projects an archived log entry into the shape the live tools use.\n *\n * `timeMs` carries the cast offset — the timeline `frame_at` and `diff` already\n * speak — and an entry from a followed file has no sequence of its own, so its\n * position in the stream stands in.\n */\nfunction fromTraceLog(entry: TraceLogEntry, index: number): LogEntry {\n return {\n seq: entry.seq ?? index + 1,\n timeMs: entry.castOffset,\n source: entry.source,\n ...(entry.label === undefined ? {} : { label: entry.label }),\n ...(entry.level === undefined ? {} : { level: entry.level }),\n message: entry.message,\n ...(entry.attrs === undefined ? {} : { attrs: { ...entry.attrs } }),\n };\n}\n\n/** Log entries recorded strictly between two cast offsets, oldest first. */\nasync function logsBetween(\n reader: TraceReader,\n fromMs: number,\n toMs: number,\n limit: number,\n): Promise<{ readonly entries: readonly LogEntry[]; readonly omitted: number }> {\n if (limit <= 0) return { entries: [], omitted: 0 };\n const window: LogEntry[] = [];\n let index = 0;\n let seen = 0;\n for await (const entry of reader.logs()) {\n if (entry.castOffset > fromMs && entry.castOffset <= toMs) {\n seen += 1;\n window.push(fromTraceLog(entry, index));\n // Newest kept: a failure is explained by the end of the window.\n if (window.length > limit) window.shift();\n }\n index += 1;\n }\n return { entries: window, omitted: seen - window.length };\n}\n\nasync function frameAt(trace: OpenTrace, timeMs: number, logWindow = 20): Promise<Frame> {\n // One reconstruction serves both halves: `stateAt` for the cast prefix and the\n // nearest semantic record, `frameFromAnsi` to replay that prefix into cells.\n const state = await trace.reader.stateAt(timeMs, { logWindow });\n const grid = await frameFromAnsi(state.castPrefix, {\n columns: state.columns,\n rows: state.rows,\n timeMs: state.timeMs,\n semanticRevision: state.nearestSemanticRevision,\n });\n return {\n grid,\n timeMs: state.timeMs,\n columns: state.columns,\n rows: state.rows,\n lines: grid.text().split('\\n'),\n semantic: (state.nearestSemantic?.snapshot as SemanticSnapshot | undefined) ?? null,\n semanticRevision: state.nearestSemanticRevision,\n step: state.step,\n logs: state.logs.map((entry, index) => fromTraceLog(entry, index)),\n };\n}\n\n/**\n * Resolves the three ways of naming a moment. Exactly one must be given: a\n * cast-timeline offset, a step from `trace.overview`, or a marker label.\n */\nasync function resolveTime(\n trace: OpenTrace,\n args: { timeMs?: number | undefined; stepIndex?: number | undefined; marker?: string | undefined },\n): Promise<number> {\n const given = [args.timeMs, args.stepIndex, args.marker].filter((value) => value !== undefined);\n if (given.length !== 1) {\n throw usageError(\n 'give exactly one of timeMs, stepIndex or marker',\n 'trace.overview lists step indexes and marker labels',\n );\n }\n if (args.timeMs !== undefined) return args.timeMs;\n if (args.stepIndex !== undefined) {\n const steps = await trace.reader.steps();\n const step = steps[args.stepIndex];\n if (step === undefined) {\n throw usageError(\n `no step ${args.stepIndex}; the trace has ${steps.length}`,\n 'call trace.overview for the step list',\n );\n }\n return step.castOffset;\n }\n const label = args.marker ?? '';\n const markers = await markersOf(trace.reader);\n const marker = markers.find((candidate) => candidate.label === label);\n if (marker === undefined) {\n throw usageError(\n `no marker ${JSON.stringify(label)}`,\n markers.length === 0\n ? 'this recording has no markers; use stepIndex or timeMs'\n : `markers: ${markers.map((candidate) => JSON.stringify(candidate.label)).join(', ')}`,\n );\n }\n return marker.timeMs;\n}\n\n/** Renders a frame in the compact format the live tools use. */\nfunction renderFrame(trace: OpenTrace, frame: Frame, maxRows: number | undefined): string {\n return formatCompactSnapshot({\n terminal: trace.id,\n columns: frame.columns,\n rows: frame.rows,\n revision: frame.semanticRevision ?? 0,\n semantic: frame.semantic,\n text: frame.lines,\n maxRows: maxRows ?? TRACE_LIMITS.maxFrameRows,\n });\n}\n\nconst open = defineTool({\n name: 'trace.open',\n title: 'Open a trace archive',\n description:\n 'Validates a .twtrace directory or zip and returns a handle plus its metadata: the recorded ' +\n 'command, viewport, duration, exit status and whether the session published a semantic tree. ' +\n 'Start every replay investigation here.',\n inputSchema: {\n path: z.string().min(1).describe('path to a .twtrace directory or zip'),\n },\n outputSchema: {\n traceId: z.string(),\n path: z.string(),\n meta: metaSchema,\n steps: z.number().int(),\n evicted: z\n .string()\n .nullable()\n .describe('handle closed to make room, if the open-trace ceiling was reached'),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n handler: async (context, args) => {\n const { trace, evicted } = await context.traces.open(args.path);\n const meta = trace.reader.meta;\n const steps = await trace.reader.steps();\n const exit = meta.exit;\n return {\n text: [\n `Trace ${trace.id} ${meta.command.join(' ')} ${meta.columns}x${meta.rows}`,\n `recorded: ${meta.startedAt} on ${meta.platform}`,\n `semanticTree: ${meta.semanticTree ? 'available' : 'unavailable'}`,\n `steps: ${steps.length}`,\n exit === undefined\n ? 'exit: not recorded'\n : `exit: code=${String(exit.code)} signal=${String(exit.signal)}`,\n ...(meta.truncated === true ? ['warning: recording was truncated at a size limit'] : []),\n ...(evicted === null ? [] : [`note: closed ${evicted} to stay within the open-trace ceiling`]),\n ].join('\\n'),\n data: {\n traceId: trace.id,\n path: trace.path,\n meta: projectMeta(meta),\n steps: steps.length,\n evicted,\n },\n };\n },\n});\n\nconst overview = defineTool({\n name: 'trace.overview',\n title: 'Summarise a trace',\n description:\n 'The shape of a recording: every step with its status and timing, the cast markers, the exit ' +\n 'status, and which step failed. Use it to pick the moment worth reconstructing before calling ' +\n 'trace.frame_at.',\n inputSchema: { traceId },\n outputSchema: {\n traceId: z.string(),\n durationMs: z.number().nullable(),\n semanticTree: semanticTreeState,\n exit: z.object({ code: z.number().int().nullable(), signal: z.string().nullable() }).nullable(),\n truncated: z.boolean(),\n steps: z.array(stepSchema),\n failedSteps: z.array(stepSchema),\n markers: z.array(z.object({ timeMs: z.number(), label: z.string() })),\n crash: crashSchema.optional(),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const trace = context.traces.get(args.traceId);\n const meta = trace.reader.meta;\n const steps = (await trace.reader.steps()).map(projectStep);\n const failedSteps = steps.filter((step) => step.status === 'failed');\n const markers = [...(await markersOf(trace.reader))];\n\n const lines = [\n `Trace ${trace.id} ${meta.command.join(' ')} ${meta.columns}x${meta.rows}`,\n `semanticTree: ${meta.semanticTree ? 'available' : 'unavailable'}`,\n `duration: ${meta.durationMs === undefined ? 'unknown' : `${meta.durationMs} ms`}`,\n `exit: ${\n meta.exit === undefined\n ? 'not recorded'\n : `code=${String(meta.exit.code)} signal=${String(meta.exit.signal)}`\n }`,\n `steps: ${steps.length}${failedSteps.length === 0 ? '' : ` (${failedSteps.length} failed)`}`,\n ];\n for (const step of steps) {\n const status = step.status ?? 'unfinished';\n const window = `${step.castOffset}..${step.castEndOffset === null ? '?' : step.castEndOffset}ms`;\n lines.push(\n ` [${step.index}] ${status} ${JSON.stringify(step.title)} ${window}` +\n (step.error === undefined ? '' : `\\n ${step.error}`),\n );\n }\n if (markers.length > 0) {\n lines.push(`markers: ${markers.map((marker) => `${marker.timeMs}ms ${marker.label}`).join(', ')}`);\n }\n const crash = crashOfMeta(meta);\n if (crash !== undefined) lines.push(renderCrash(crash));\n\n return {\n text: lines.join('\\n'),\n data: {\n traceId: trace.id,\n durationMs: meta.durationMs ?? null,\n semanticTree: meta.semanticTree ? ('available' as const) : ('unavailable' as const),\n exit: meta.exit === undefined ? null : { code: meta.exit.code, signal: meta.exit.signal },\n truncated: meta.truncated === true,\n steps,\n failedSteps,\n markers,\n ...(crash === undefined ? {} : { crash }),\n },\n };\n },\n});\n\nconst frame = defineTool({\n name: 'trace.frame_at',\n title: 'Reconstruct one moment',\n description:\n 'Rebuilds the screen at a moment — named by timeMs, stepIndex or marker — by replaying the ' +\n 'recording into a headless emulator, and pairs it with the semantic tree of the nearest ' +\n 'revision at or before that moment. Reads exactly like a live terminal.snapshot.',\n inputSchema: {\n traceId,\n timeMs: z.number().min(0).optional().describe('cast-timeline offset in milliseconds'),\n stepIndex: z.number().int().min(0).optional().describe('step index from trace.overview'),\n marker: z.string().optional().describe('cast marker label from trace.overview'),\n maxRows: z.number().int().min(1).max(10_000).optional(),\n maxLogs: z\n .number()\n .int()\n .min(0)\n .max(500)\n .optional()\n .describe('preceding application log entries to include; default 20, 0 to skip'),\n ...screenshotShape,\n },\n outputSchema: {\n traceId: z.string(),\n timeMs: z.number(),\n columns: z.number().int(),\n rows: z.number().int(),\n semanticRevision: z.number().int().nullable(),\n semanticTree: semanticTreeState,\n step: stepSchema.partial().nullable(),\n refs: z.array(refEntrySchema),\n logs: z.array(logEntrySchema),\n compact: z.string(),\n screenshot: screenshotSchema.optional(),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n const trace = context.traces.get(args.traceId);\n const at = await resolveTime(trace, args);\n const reconstructed = await frameAt(trace, at, args.maxLogs ?? 20);\n const compact = renderFrame(trace, reconstructed, args.maxRows);\n const logs =\n reconstructed.logs.length === 0\n ? ''\n : `\\n${renderLogs({ entries: reconstructed.logs, omitted: 0, cursor: 0 })}`;\n const step = reconstructed.step;\n const image =\n args.screenshot === true\n ? renderScreenshot(reconstructed.grid, {\n scale: args.screenshotScale,\n theme: args.screenshotTheme,\n })\n : undefined;\n return {\n text: `${compact}${logs}`,\n ...(image === undefined ? {} : { images: [image] }),\n data: {\n traceId: trace.id,\n timeMs: reconstructed.timeMs,\n columns: reconstructed.columns,\n rows: reconstructed.rows,\n semanticRevision: reconstructed.semanticRevision,\n semanticTree: reconstructed.semantic === null ? ('unavailable' as const) : ('available' as const),\n step: step === null ? null : projectStep(step, 0),\n refs:\n reconstructed.semantic === null\n ? []\n : refEntries(reconstructed.semantic).map((entry) => ({ ...entry, flags: [...entry.flags] })),\n logs: reconstructed.logs.map((entry) => ({ ...entry })),\n compact,\n ...(image === undefined ? {} : { screenshot: describeImage(image) }),\n },\n };\n },\n});\n\nconst diff = defineTool({\n name: 'trace.diff',\n title: 'What changed between two moments',\n description:\n 'Reconstructs two moments of a recording and reports what moved: changed screen rows and ' +\n 'changed semantic subtrees, in the same shape as terminal.capture_since on a live session.',\n inputSchema: {\n traceId,\n fromMs: z.number().min(0),\n toMs: z.number().min(0),\n maxRows: z.number().int().min(1).max(10_000).optional(),\n maxSubtrees: z.number().int().min(1).max(1_000).optional(),\n maxLogs: z\n .number()\n .int()\n .min(0)\n .max(500)\n .optional()\n .describe(`application log entries between the two moments; default ${LOG_LIMITS.maxPerResponse}, 0 to skip`),\n },\n outputSchema: {\n traceId: z.string(),\n fromMs: z.number(),\n toMs: z.number(),\n semanticTree: semanticTreeState,\n changedRows: z.array(z.object({ row: z.number().int(), text: z.string() })),\n changedSubtrees: z.array(\n z.object({\n change: z.enum(['added', 'removed', 'updated']),\n ref: z.string(),\n role: z.string(),\n name: z.string(),\n compact: z.string(),\n }),\n ),\n logs: z.array(logEntrySchema),\n logsOmitted: z.number().int(),\n compact: z.string(),\n },\n annotations: { readOnlyHint: true },\n handler: async (context, args) => {\n if (args.toMs < args.fromMs) {\n throw usageError('toMs must not precede fromMs', 'swap the two, or read trace.overview for the timeline');\n }\n const trace = context.traces.get(args.traceId);\n const before = await frameAt(trace, args.fromMs, 0);\n const after = await frameAt(trace, args.toMs, 0);\n const logs = await logsBetween(\n trace.reader,\n before.timeMs,\n after.timeMs,\n args.maxLogs ?? LOG_LIMITS.maxPerResponse,\n );\n\n const changedRows = diffRows(before.lines, after.lines).slice(\n 0,\n args.maxRows ?? TRACE_LIMITS.maxFrameRows,\n );\n const changedSubtrees = diffSemantic(before.semantic, after.semantic).slice(\n 0,\n args.maxSubtrees ?? 100,\n );\n\n const lines = [\n `Trace ${trace.id} ${before.timeMs}ms -> ${after.timeMs}ms`,\n `semanticTree: ${after.semantic === null ? 'unavailable' : 'available'}`,\n `changed rows: ${changedRows.length}`,\n ...changedRows.map((row) => ` ${row.row}: ${row.text}`),\n `changed nodes: ${changedSubtrees.length}`,\n ];\n for (const subtree of changedSubtrees) {\n const marker = subtree.change === 'added' ? '+' : subtree.change === 'removed' ? '-' : '~';\n for (const line of subtree.compact.split('\\n')) lines.push(` ${marker} ${line}`);\n }\n lines.push(renderLogs({ entries: logs.entries, omitted: logs.omitted, cursor: 0 }));\n\n return {\n text: lines.join('\\n'),\n data: {\n traceId: trace.id,\n fromMs: before.timeMs,\n toMs: after.timeMs,\n semanticTree: after.semantic === null ? ('unavailable' as const) : ('available' as const),\n changedRows: changedRows.map((row) => ({ ...row })),\n changedSubtrees: changedSubtrees.map((subtree) => ({ ...subtree })),\n logs: logs.entries.map((entry) => ({ ...entry })),\n logsOmitted: logs.omitted,\n compact: lines.join('\\n'),\n },\n };\n },\n});\n\n/** The replay tools, in the order an investigation uses them. */\nexport const TRACE_TOOLS: readonly ToolDefinition[] = Object.freeze([open, overview, frame, diff]);\n","/**\n * The tool registry: everything the server exposes, in one ordered list.\n *\n * Live-terminal tools come first (CONTRACTS.md §MCP), replay tools after. The\n * server, `agent-context` and the `skill` package all read this list, so a tool\n * is registered, documented and distributed by being added here once.\n */\nimport type { ToolDefinition } from './tool-kit.js';\nimport { TERMINAL_TOOLS } from './tools.js';\nimport { TRACE_TOOLS } from './trace-tools.js';\n\n/** Every tool this server exposes. */\nexport const TOOLS: readonly ToolDefinition[] = Object.freeze([...TERMINAL_TOOLS, ...TRACE_TOOLS]);\n\n/** Convenience lookup used by the server and by tests. */\nexport function toolByName(name: string): ToolDefinition | undefined {\n return TOOLS.find((tool) => tool.name === name);\n}\n","/** Identity reported over MCP and by `--version`. Kept in step with package.json. */\nexport const SERVER_NAME = 'termwright';\n\n/** Package version. */\nexport const SERVER_VERSION = '0.1.0';\n\n/** Version of the `agent-context` document shape (independent of the package). */\nexport const AGENT_CONTEXT_VERSION = 1;\n","/**\n * `agent-context`: one versioned JSON document describing everything an agent\n * needs to drive this server without guessing — every tool, its parameters,\n * enums and defaults, the error kinds, and the CLI exit-code taxonomy.\n *\n * It is *generated* from the zod schemas in `tools.ts`, never hand-maintained,\n * so a tool that changes its arguments changes this document in the same commit.\n * The umbrella CLI (`termwright agent-context`) imports {@link buildAgentContext}\n * rather than shelling out.\n */\nimport { z } from 'zod';\nimport { EXIT_CODES, MCP_ERROR_KINDS } from './errors.js';\nimport type { ErrorKind } from './errors.js';\nimport type { TermwrightErrorCode } from '@termwright/driver';\nimport { SEMANTIC_ROLES, SIGNALS } from './model.js';\nimport { STATE_NAMES } from './schemas.js';\nimport { MCP_LIMITS } from './sessions.js';\nimport { TOOLS } from './registry.js';\nimport { AGENT_CONTEXT_VERSION, SERVER_NAME, SERVER_VERSION } from './version.js';\n\n/** JSON Schema for one tool's input or output. */\nexport type JsonSchema = Record<string, unknown>;\n\n/** One tool, as `agent-context` describes it. */\nexport interface AgentContextTool {\n readonly name: string;\n readonly title: string;\n readonly description: string;\n readonly inputSchema: JsonSchema;\n readonly outputSchema: JsonSchema;\n readonly annotations: Readonly<Record<string, unknown>>;\n}\n\n/** The whole document. */\nexport interface AgentContext {\n readonly v: number;\n readonly server: { readonly name: string; readonly version: string };\n readonly tools: readonly AgentContextTool[];\n readonly enums: {\n readonly roles: readonly string[];\n readonly states: readonly string[];\n readonly signals: readonly string[];\n readonly errorKinds: readonly ErrorKind[];\n };\n readonly exitCodes: Readonly<Record<string, number>>;\n readonly limits: Readonly<Record<string, number>>;\n readonly conventions: readonly string[];\n}\n\n/**\n * The kinds published to agents.\n *\n * The driver's codes are listed rather than derived, because a runtime array\n * cannot be generated from a type — but {@link ERROR_KINDS_ARE_COMPLETE} fails\n * to compile if the driver adds one that is missing here, which is how\n * `not-found` will announce itself rather than quietly going undocumented.\n */\nconst DRIVER_ERROR_KINDS = [\n 'timeout',\n 'stale-snapshot',\n 'ambiguous-locator',\n 'unsupported-action',\n 'history-truncated',\n 'protocol-violation',\n 'capacity',\n 'process-exited',\n 'session-closed',\n 'not-found',\n] as const satisfies readonly TermwrightErrorCode[];\n\ntype MissingKind = Exclude<TermwrightErrorCode, (typeof DRIVER_ERROR_KINDS)[number]>;\n\n/** Compile-time lock over the driver's closed code set. */\nexport const ERROR_KINDS_ARE_COMPLETE: [MissingKind] extends [never]\n ? true\n : ['undocumented error kinds', MissingKind] = true as [MissingKind] extends [never]\n ? true\n : ['undocumented error kinds', MissingKind];\n\nconst ERROR_KINDS: readonly ErrorKind[] = [...DRIVER_ERROR_KINDS, ...MCP_ERROR_KINDS];\n\nconst CONVENTIONS = [\n 'A ref looks like n8@42: node id at semantic revision 42. It is valid only while 42 is the live ' +\n 'semantic revision; reusing it later fails with kind \"stale-snapshot\" — take a fresh snapshot.',\n 'terminal.snapshot returns a screen revision; pass it to terminal.capture_since as cursor to get ' +\n 'only the rows and semantic subtrees that changed.',\n 'Any name or text argument may be written as \"/pattern/flags\" to match as a regular expression.',\n 'Targeting precedence is ref, selector, testId, role (+name), label, text.',\n 'Locators are strict: more than one match fails with kind \"ambiguous-locator\" unless nth is given.',\n 'semanticTree \"unavailable\" means the program ships no adapter — target by text, never by role.',\n 'Errors are returned as tool results with isError set; structuredContent.error.kind is the value to ' +\n 'branch on, and structuredContent.error.suggestion says what to try next.',\n] as const;\n\nfunction toJsonSchema(shape: Record<string, z.ZodType>): JsonSchema {\n return z.toJSONSchema(z.object(shape), { io: 'input' }) as JsonSchema;\n}\n\n/** Builds the versioned document from the live tool definitions. */\nexport function buildAgentContext(): AgentContext {\n return {\n v: AGENT_CONTEXT_VERSION,\n server: { name: SERVER_NAME, version: SERVER_VERSION },\n tools: TOOLS.map((tool) => ({\n name: tool.name,\n title: tool.title,\n description: tool.description,\n inputSchema: toJsonSchema(tool.inputSchema),\n outputSchema: toJsonSchema(tool.outputSchema),\n annotations: { ...tool.annotations },\n })),\n enums: {\n roles: [...SEMANTIC_ROLES],\n states: [...STATE_NAMES],\n signals: [...SIGNALS],\n errorKinds: ERROR_KINDS,\n },\n exitCodes: { ...EXIT_CODES },\n limits: { ...MCP_LIMITS },\n conventions: [...CONVENTIONS],\n };\n}\n\n/** The one-screen cheat sheet printed by `termwright-mcp usage`. */\nexport function buildUsage(): string {\n return [\n `${SERVER_NAME} MCP server ${SERVER_VERSION} — drive terminal programs over MCP`,\n '',\n 'serve',\n ' termwright-mcp serve over stdio (what an MCP host spawns)',\n ' termwright-mcp --http --port 7333 serve Streamable HTTP on /mcp, multi-session',\n ' termwright-mcp agent-context versioned JSON: tools, params, enums, exit codes',\n ' termwright-mcp usage this page',\n ' termwright-mcp skill --out DIR emit an agent-skill package (SKILL.md + reference)',\n ' global: --json (machine-readable errors with a kind), --version, --help',\n '',\n 'typical loop',\n ' terminal.launch {command:[\"node\",\"app.js\"]} -> terminal \"t1\" + first snapshot',\n ' terminal.snapshot {terminal:\"t1\"} -> refs n8@42 + visible text + revision',\n ' terminal.click {terminal:\"t1\", ref:\"n8@42\"} -> real mouse report through the PTY',\n ' terminal.wait_for {terminal:\"t1\", wait:\"text\", text:\"Approved\"}',\n ' terminal.capture_since {terminal:\"t1\", cursor:42} -> only what changed',\n ' terminal.close {terminal:\"t1\"}',\n '',\n 'targeting ref | selector | testId | role(+name) | label | text (+ exact, state, nth)',\n `roles ${SEMANTIC_ROLES.join(' ')}`,\n `states ${STATE_NAMES.join(' ')}`,\n '',\n 'exit codes 0 ok / 1 assertion / 2 usage / 3 no-session / 4 ipc / 5 internal',\n 'error kinds ' + ERROR_KINDS.join(' '),\n ].join('\\n');\n}\n","/**\n * `skill` — emits an agent-skill package: the distribution channel into Claude\n * Code and other hosts that load skills from a directory.\n *\n * The package is generated from the same zod schemas as `agent-context`, so a\n * tool that changes its arguments changes the skill in the same commit. It is\n * three files: `SKILL.md` (what an agent reads), `agent-context.json` (the\n * machine-readable surface) and `reference.md` (the per-tool parameter list the\n * skill body links to).\n */\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { buildAgentContext, buildUsage } from './agent-context.js';\nimport type { JsonSchema } from './agent-context.js';\nimport { TOOLS } from './registry.js';\nimport { SERVER_NAME, SERVER_VERSION } from './version.js';\n\n/** One file of the emitted package, keyed by its path inside the directory. */\nexport interface SkillFile {\n readonly path: string;\n readonly contents: string;\n}\n\n/** Frontmatter description; hosts match on this when deciding to load a skill. */\nconst SKILL_DESCRIPTION =\n 'Drive terminal programs (TUIs, CLIs, REPLs) over MCP: launch one in a real pseudo-terminal, ' +\n 'read a compact accessibility-style snapshot, click and type, wait on conditions, and poll only ' +\n 'what changed. Use when asked to test, inspect, automate or debug a terminal application.';\n\nfunction renderParameters(schema: JsonSchema): string {\n const properties = schema['properties'];\n if (typeof properties !== 'object' || properties === null) return ' (no parameters)';\n const required = new Set(Array.isArray(schema['required']) ? (schema['required'] as string[]) : []);\n return Object.entries(properties as Record<string, Record<string, unknown>>)\n .map(([name, definition]) => {\n const type =\n typeof definition['type'] === 'string'\n ? definition['type']\n : Array.isArray(definition['enum'])\n ? (definition['enum'] as unknown[]).map((value) => JSON.stringify(value)).join('|')\n : 'value';\n const description =\n typeof definition['description'] === 'string' ? ` — ${definition['description']}` : '';\n return `- \\`${name}\\`${required.has(name) ? '' : '?'}: ${type}${description}`;\n })\n .join('\\n');\n}\n\n/** The skill body an agent reads before its first tool call. */\nfunction renderSkillMarkdown(): string {\n return [\n '---',\n `name: ${SERVER_NAME}`,\n `description: ${SKILL_DESCRIPTION}`,\n '---',\n '',\n `# Driving terminal programs with ${SERVER_NAME}`,\n '',\n 'The MCP server exposes one terminal per handle (`t1`, `t2`, …). Every action goes through a',\n 'real pseudo-terminal: a click is a mouse report, a keystroke is real bytes. There is no',\n 'back-channel into the application.',\n '',\n '## The loop',\n '',\n '1. `terminal.launch { command: [\"node\", \"app.js\"] }` — returns the handle and the first snapshot.',\n '2. `terminal.snapshot { terminal }` — compact refs, visible text, cursor, modes, scroll position.',\n '3. Act: `terminal.click`, `terminal.press`, `terminal.type`, `terminal.paste`, `terminal.drag`, …',\n '4. `terminal.wait_for { wait: \"text\" | \"visible\" | \"stable\" | \"idle\" | \"exit\", … }` — never sleep.',\n '5. `terminal.capture_since { cursor }` — only the rows and semantic subtrees that changed.',\n '6. `terminal.close { terminal }`.',\n '',\n '## Reading a snapshot',\n '',\n '```',\n 'Terminal t1 100x30 revision 42',\n 'semanticTree: available',\n 'dialog \"Permission\" ref=n7@42 bounds=(8,20,40,9) modal',\n ' button \"Approve\" ref=n8@42 bounds=(14,23,11,1) focused',\n 'visible text:',\n '…',\n '```',\n '',\n 'The header `revision` is the **screen** revision — that is the `cursor` for',\n '`terminal.capture_since`. A ref\\'s number is the **semantic** revision: `n8@42` is valid only',\n 'while 42 is live, and reusing it after the screen moved on fails with `stale-snapshot`. The fix',\n 'is always to snapshot again, never to retry the same ref.',\n '',\n '`semanticTree: unavailable` means the program ships no adapter. Target those by `text`; there',\n 'are no invented roles.',\n '',\n '## Targeting',\n '',\n 'Precedence: `ref`, `selector`, `testId`, `role` (+`name`), `label`, `text`. Any name or text may',\n 'be written `/pattern/flags` to match as a regular expression. Locators are strict — more than one',\n 'match fails with `ambiguous-locator` and lists the candidates; pass `nth` to disambiguate, or use',\n '`terminal.query` first to see what matches.',\n '',\n '## Investigating a recorded failure',\n '',\n 'A failing test run leaves a `.twtrace` archive. Replay it with the same vocabulary:',\n '',\n '1. `trace.open { path }` — validates the archive, returns a handle and what was recorded.',\n '2. `trace.overview { traceId }` — steps with status and timing, markers, exit, which step failed.',\n '3. `trace.frame_at { traceId, stepIndex | timeMs | marker }` — the screen at that moment, rebuilt,',\n ' with the semantic tree of the nearest revision. Reads exactly like a live snapshot.',\n '4. `trace.diff { traceId, fromMs, toMs }` — what moved between two moments.',\n '',\n 'Start at the failed step from `trace.overview`, reconstruct it, then diff against a moment before',\n 'it to see what changed. Handles are per session and the coldest is evicted at the ceiling — if one',\n 'stops resolving, call `trace.open` again.',\n '',\n '## The application’s own log',\n '',\n 'A terminal shows what a program *drew*; its log says what it *decided*. When the screen looks',\n 'right and nothing happened, the answer is usually an `error` or `warn` line, not another pixel.',\n '',\n 'Pass `logs: [{ path: \"app.log\", label: \"app\" }]` to `terminal.launch` and every',\n '`terminal.capture_since` returns the entries since your cursor, with `logsOmitted` when the',\n 'buffer overflowed and `logCursor` to resume from. An existing file is followed from its end, so',\n 'you never see the previous run.',\n '',\n 'Two things worth knowing. A followed file is polled, so a line written just now may arrive on the',\n 'next call — re-asking with the same cursor is lossless, never a reason to widen the window. And a',\n 'log is application output like any other: it can contain tokens and personal data, so treat it',\n 'with the same care as a crash screen tail.',\n '',\n 'In a replay the same view is there: `trace.frame_at` carries the entries leading up to that',\n 'moment and `trace.diff` the ones between two — so the question \"what was it saying when the',\n 'screen looked like this\" is answered the same way live and after the fact.',\n '',\n '## Reading terminal modes',\n '',\n 'A snapshot reports `modes`. Both mouse fields can read `unknown`, which means the platform hides',\n 'the mode from the emulator — Windows ConPTY does — not that the program turned mouse reporting',\n 'off. Clicks still go through there, encoded as SGR. So `unknown` is never a reason to fall back',\n 'to keyboard-only interaction; a real `none` is.',\n '',\n '## Screenshots',\n '',\n '`terminal.snapshot` and `trace.frame_at` take `screenshot: true` (plus `screenshotScale` and',\n '`screenshotTheme`) and attach a PNG. The text and the compact tree come back in the same result,',\n 'so ask for a picture only when pixels answer something the text cannot — alignment, colour, a',\n 'glyph that looks wrong. Check `structuredContent.screenshot.selfContained`: when false, some',\n 'character fell back to a font that may not exist where the image is viewed.',\n '',\n '## When the program dies',\n '',\n 'A program that exits on its own — a signal, or a non-zero code nobody asked for — leaves a crash',\n 'report. It rides along with whatever call failed next, and `terminal.capabilities` /',\n '`terminal.snapshot` show it instead of reporting a merely closed session. Read the exit status and',\n 'the screen tail before retrying: a locator that never resolved because the program is gone looks',\n 'like a timeout, and waiting longer will not bring it back. `trace.overview` shows the same section',\n 'for a recording that carries one.',\n '',\n '**The screen tail is unredacted.** It is whatever the terminal displayed at the end — a stack',\n 'trace, a config dump, an echoed password, whatever was there. Treat it like a screenshot of the',\n 'user\\'s machine: use it to diagnose, but do not paste it into issues, commit messages, chat',\n 'transcripts or anywhere else it outlives the investigation. The one thing never recorded is the',\n 'content of a paste — those carry secrets routinely, so only their size is kept.',\n '',\n '## When a call fails',\n '',\n 'Failures come back with `isError` and a text block starting `error <kind>: <message>` plus a',\n '`suggestion`. Branch on the kind: `stale-snapshot` (re-snapshot), `ambiguous-locator` (narrow the',\n 'target), `timeout` (the condition never held — read the screen excerpt), `not-found` (the path you',\n 'named holds nothing — a typo, not a broken artifact; a corrupt archive reports',\n '`protocol-violation` instead), `unsupported-action` (the',\n 'program never enabled mouse tracking, or has no semantic tree), `no-session` (bad handle),',\n '`history-truncated` (cursor too old). The same payload is in `_meta[\"io.termwright/error\"]`.',\n '',\n 'See `reference.md` for every tool and parameter, and `agent-context.json` for the machine-readable',\n 'surface (enums, defaults, exit codes).',\n '',\n '## Command line',\n '',\n '```',\n buildUsage()\n .split('\\n')\n .slice(2)\n .join('\\n')\n .trim(),\n '```',\n '',\n ].join('\\n');\n}\n\n/** The per-tool parameter reference the skill body links to. */\nfunction renderReferenceMarkdown(): string {\n const context = buildAgentContext();\n const sections = context.tools.map((tool) =>\n [\n `## ${tool.name}`,\n '',\n tool.description,\n '',\n '**Input**',\n renderParameters(tool.inputSchema),\n '',\n '**Output**',\n renderParameters(tool.outputSchema),\n '',\n ].join('\\n'),\n );\n return [\n `# ${SERVER_NAME} tool reference (${SERVER_VERSION})`,\n '',\n `Generated from the zod schemas of ${TOOLS.length} tools; do not edit by hand.`,\n '',\n ...sections,\n '## Exit codes',\n '',\n Object.entries(context.exitCodes)\n .map(([name, code]) => `- ${String(code)} — ${name}`)\n .join('\\n'),\n '',\n '## Error kinds',\n '',\n context.enums.errorKinds.map((kind) => `- \\`${kind}\\``).join('\\n'),\n '',\n ].join('\\n');\n}\n\n/** Builds the agent-skill package in memory. */\nexport function buildAgentSkill(): readonly SkillFile[] {\n return [\n { path: 'SKILL.md', contents: renderSkillMarkdown() },\n { path: 'reference.md', contents: renderReferenceMarkdown() },\n { path: 'agent-context.json', contents: `${JSON.stringify(buildAgentContext(), null, 2)}\\n` },\n ];\n}\n\n/** Writes the package into `directory`, creating it if needed. Returns the paths written. */\nexport async function writeAgentSkill(directory: string): Promise<readonly string[]> {\n await mkdir(directory, { recursive: true });\n const written: string[] = [];\n for (const file of buildAgentSkill()) {\n const path = join(directory, file.path);\n await writeFile(path, file.contents, 'utf8');\n written.push(path);\n }\n return written;\n}\n","/**\n * Server wiring: tools onto an `McpServer`, and the two transports.\n *\n * Both transports share one code path — `createTermwrightMcpServer(store)` — so\n * a tool behaves identically over stdio and over Streamable HTTP. What differs\n * is only who owns the session key: stdio has exactly one implicit session,\n * HTTP keys sessions by `Mcp-Session-Id` in our {@link SessionRegistry}.\n */\nimport { createServer } from 'node:http';\nimport type { IncomingMessage, Server, ServerResponse } from 'node:http';\nimport { randomUUID } from 'node:crypto';\nimport { CrashContextError, describeCrash } from './crash.js';\nimport { renderErrorPayload, toErrorPayload } from './errors.js';\nimport {\n InMemoryTransport,\n connectTransport,\n McpServer,\n StdioServerTransport,\n StreamableHTTPServerTransport,\n isInitializeRequest,\n} from './sdk-facade.js';\nimport type { CallToolResult, Transport } from './sdk-facade.js';\nimport { SessionRegistry, closeSessionStores, createSessionStores } from './sessions.js';\nimport type { SessionStores } from './sessions.js';\nimport { TOOLS } from './registry.js';\nimport type { ToolContext, ToolOutcome } from './tool-kit.js';\nimport { SERVER_NAME, SERVER_VERSION } from './version.js';\n\n/** Server-level instructions shown to hosts that surface them. */\nconst INSTRUCTIONS =\n 'Drive terminal programs the way a person would. terminal.launch starts a program and returns a ' +\n 'handle; terminal.snapshot gives compact refs plus visible text; act with terminal.click / press / ' +\n 'type; wait with terminal.wait_for; poll cheaply with terminal.capture_since using the revision a ' +\n 'snapshot returned. Refs like n8@42 are only valid at semantic revision 42 — re-snapshot after the ' +\n 'screen changes. Programs without a termwright adapter report semanticTree: unavailable; target ' +\n 'them by text instead of by role.';\n\n/** Builds the `CallToolResult` for a successful handler outcome. */\nfunction successResult(outcome: ToolOutcome<Record<string, unknown>>): CallToolResult {\n return {\n content: [\n { type: 'text', text: outcome.text },\n ...(outcome.images ?? []).map((image) => ({\n type: 'image' as const,\n data: image.data,\n mimeType: image.mimeType,\n })),\n ],\n structuredContent: outcome.data,\n };\n}\n\n/**\n * Attaches the crash report when the failure happened against a terminal whose\n * program died on its own.\n *\n * This lives here, once, rather than in every acting tool: the server is the\n * only place that sees both the raw arguments (which name the terminal) and\n * every thrown error. Without it a locator that never resolved because the\n * child was gone reports a bare `timeout`, which tells an agent to wait longer\n * — precisely the wrong move.\n */\nfunction withCrashContext(context: ToolContext, args: unknown, error: unknown): unknown {\n if (error instanceof CrashContextError) return error;\n const id = (args as { terminal?: unknown } | null)?.terminal;\n if (typeof id !== 'string') return error;\n const report = context.terminals.find(id)?.harness.crashReport();\n return report === undefined || report === null ? error : new CrashContextError(error, describeCrash(report));\n}\n\n/** `_meta` key carrying the structured error payload of a failed tool call. */\nexport const ERROR_META_KEY = 'io.termwright/error';\n\n/**\n * Builds the `CallToolResult` for a failure.\n *\n * The payload travels in `_meta`, not in `structuredContent`: a client that has\n * seen the tool list validates `structuredContent` against the success\n * `outputSchema`, and an error object would be rejected before the agent ever\n * saw it. The text content carries the same information in readable form —\n * typed kind, message, the driver's suggestion and its bounded candidates.\n */\nfunction errorResult(error: unknown): CallToolResult {\n const payload = toErrorPayload(error);\n return {\n isError: true,\n content: [{ type: 'text', text: renderErrorPayload(payload) }],\n _meta: { [ERROR_META_KEY]: payload },\n };\n}\n\n/** Registers every tool from {@link TOOLS} on a fresh `McpServer`. */\nexport function createTermwrightMcpServer(stores: SessionStores): McpServer {\n const server = new McpServer(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} }, instructions: INSTRUCTIONS },\n );\n const context: ToolContext = { terminals: stores.terminals, traces: stores.traces };\n\n for (const tool of TOOLS) {\n server.registerTool(\n tool.name,\n {\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: tool.outputSchema,\n annotations: tool.annotations,\n },\n async (args: unknown): Promise<CallToolResult> => {\n try {\n return successResult(await tool.handler(context, args as never));\n } catch (error) {\n return errorResult(withCrashContext(context, args, error));\n }\n },\n );\n }\n return server;\n}\n\n/** A running server plus the handle needed to shut it down. */\nexport interface RunningServer {\n readonly server: McpServer;\n readonly stores: SessionStores;\n close(): Promise<void>;\n}\n\n/** Options shared by the transports. */\nexport interface ServeOptions {\n /** Root for `variant: \"full\"` snapshot dumps. */\n readonly storageDir?: string;\n readonly maxSessions?: number;\n}\n\n/** Connects a server to a transport and returns its lifecycle handle. */\nasync function connect(stores: SessionStores, transport: Transport): Promise<RunningServer> {\n const server = createTermwrightMcpServer(stores);\n await connectTransport(server, transport);\n return {\n server,\n stores,\n close: async (): Promise<void> => {\n await closeSessionStores(stores);\n await server.close();\n },\n };\n}\n\n/** Serves the tools over stdio — the transport an MCP host spawns. */\nexport async function serveStdio(options: ServeOptions = {}): Promise<RunningServer> {\n const stores = createSessionStores({ sessionKey: 'stdio', storageDir: options.storageDir });\n return connect(stores, new StdioServerTransport());\n}\n\n/**\n * An in-process client/server pair over `InMemoryTransport`. Used by this\n * package's tests, and by anything embedding the tools without a socket.\n */\nexport async function serveInMemory(\n options: ServeOptions & { readonly sessionKey?: string } = {},\n): Promise<RunningServer & { readonly clientTransport: Transport }> {\n const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();\n const stores = createSessionStores({\n sessionKey: options.sessionKey ?? 'in-memory',\n storageDir: options.storageDir,\n });\n const running = await connect(stores, serverTransport);\n return { ...running, clientTransport };\n}\n\n/** A listening Streamable HTTP server. */\nexport interface HttpServerHandle {\n readonly http: Server;\n readonly registry: SessionRegistry<{ transport: StreamableHTTPServerTransport; server: McpServer }>;\n readonly port: number;\n close(): Promise<void>;\n}\n\n/** Default idle ceiling for an HTTP session. */\nexport const DEFAULT_IDLE_TTL_MS = 10 * 60_000;\n\n/** Options for {@link serveHttp}. */\nexport interface HttpServeOptions extends ServeOptions {\n readonly port?: number;\n readonly host?: string;\n /** Path the MCP endpoint listens on. Defaults to `/mcp`. */\n readonly path?: string;\n /**\n * Milliseconds a session may sit idle before it is torn down. Defaults to\n * {@link DEFAULT_IDLE_TTL_MS}; `0` disables expiry.\n */\n readonly idleTtlMs?: number;\n /** Injectable clock, for tests. */\n readonly now?: () => number;\n /** Where an expiry is reported. Defaults to stderr. */\n readonly log?: (message: string) => void;\n}\n\nfunction sendJson(response: ServerResponse, status: number, body: unknown): void {\n const text = JSON.stringify(body);\n response.writeHead(status, { 'content-type': 'application/json' });\n response.end(text);\n}\n\nasync function readBody(request: IncomingMessage): Promise<unknown> {\n const chunks: Buffer[] = [];\n let size = 0;\n for await (const chunk of request) {\n const buffer = Buffer.from(chunk as Buffer);\n size += buffer.byteLength;\n if (size > 4 * 1024 * 1024) throw new Error('request body too large');\n chunks.push(buffer);\n }\n if (chunks.length === 0) return undefined;\n return JSON.parse(Buffer.concat(chunks).toString('utf8'));\n}\n\n/**\n * Serves the tools over Streamable HTTP with multi-session support.\n *\n * Sessions live in {@link SessionRegistry}: `initialize` mints a session id and\n * registers a store together with its transport, every later request is routed\n * by its `Mcp-Session-Id` header, and `DELETE` (or transport close) disposes the\n * session's terminals. The ceiling is enforced here, before a transport exists.\n */\nexport async function serveHttp(options: HttpServeOptions = {}): Promise<HttpServerHandle> {\n const path = options.path ?? '/mcp';\n // stdout may be a protocol stream elsewhere; server-level notes go to stderr.\n const log = options.log ?? ((message: string): void => void process.stderr.write(`${message}\\n`));\n const registry = new SessionRegistry<{\n transport: StreamableHTTPServerTransport;\n server: McpServer;\n }>({\n ...(options.maxSessions === undefined ? {} : { maxSessions: options.maxSessions }),\n ...(options.storageDir === undefined ? {} : { storageDir: options.storageDir }),\n ...(options.now === undefined ? {} : { now: options.now }),\n idleTtlMs: options.idleTtlMs ?? DEFAULT_IDLE_TTL_MS,\n disposeAttachment: async (attachment) => {\n await attachment.transport.close();\n },\n onExpired: (key) => {\n log(`termwright: session ${key} expired after idling; terminals and traces released`);\n },\n });\n registry.startIdleSweeper();\n\n const http = createServer((request, response) => {\n void (async () => {\n try {\n const url = new URL(request.url ?? '/', 'http://localhost');\n if (url.pathname !== path) {\n sendJson(response, 404, { error: 'not found' });\n return;\n }\n const sessionId = request.headers['mcp-session-id'];\n const key = Array.isArray(sessionId) ? sessionId[0] : sessionId;\n\n if (request.method === 'DELETE') {\n if (key !== undefined) await registry.delete(key);\n response.writeHead(204).end();\n return;\n }\n\n const body = request.method === 'POST' ? await readBody(request) : undefined;\n\n if (key !== undefined) {\n const session = registry.get(key);\n if (session === undefined) {\n sendJson(response, 404, { error: 'unknown session', kind: 'no-session' });\n return;\n }\n // Every request that names a session is proof the client is alive.\n registry.touch(key);\n await session.attachment.transport.handleRequest(request, response, body);\n return;\n }\n\n if (request.method !== 'POST' || !isInitializeRequest(body)) {\n sendJson(response, 400, { error: 'missing Mcp-Session-Id', kind: 'usage' });\n return;\n }\n\n const newKey = randomUUID();\n const session = registry.create(newKey, (stores) => {\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => newKey,\n });\n const server = createTermwrightMcpServer(stores);\n transport.onclose = (): void => {\n void registry.delete(newKey);\n };\n return { transport, server };\n });\n await connectTransport(session.attachment.server, session.attachment.transport);\n await session.attachment.transport.handleRequest(request, response, body);\n } catch (error) {\n const payload = toErrorPayload(error);\n if (!response.headersSent) sendJson(response, 500, { error: payload.message, kind: payload.kind });\n else response.end();\n }\n })();\n });\n\n await new Promise<void>((resolve) => {\n http.listen(options.port ?? 0, options.host ?? '127.0.0.1', resolve);\n });\n const address = http.address();\n const port = typeof address === 'object' && address !== null ? address.port : (options.port ?? 0);\n\n return {\n http,\n registry,\n port,\n close: async (): Promise<void> => {\n registry.stopIdleSweeper();\n await registry.closeAll();\n await new Promise<void>((resolve) => {\n http.close(() => {\n resolve();\n });\n });\n },\n };\n}\n","/**\n * The single module in this package that is allowed to import\n * `@modelcontextprotocol/sdk`.\n *\n * Everything else — tools, server wiring, CLI, tests — imports from here. The\n * SDK v2 package split is therefore a change to this one file: re-point the\n * specifiers, keep the exported names, and no tool handler moves.\n *\n * Nothing SDK-shaped leaks into the package's own public surface\n * (`src/index.ts`) beyond what a host needs to connect a transport.\n */\nimport type { Client as ClientType } from '@modelcontextprotocol/sdk/client/index.js';\nimport type { McpServer as McpServerType } from '@modelcontextprotocol/sdk/server/mcp.js';\n\nexport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nexport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nexport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nexport { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';\nexport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nexport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nexport { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';\n\nexport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\n\n/**\n * Connects a server to a transport.\n *\n * The SDK is compiled without `exactOptionalPropertyTypes`, so its transport\n * classes declare `onclose?: (() => void) | undefined` while the `Transport`\n * interface declares `onclose?: () => void`. The two are the same thing at\n * runtime; the single cast that reconciles them lives here, in the SDK\n * boundary, rather than in every call site.\n */\nexport async function connectTransport(server: McpServerType, transport: unknown): Promise<void> {\n await server.connect(transport as Parameters<McpServerType['connect']>[0]);\n}\n\n/** The client-side counterpart of {@link connectTransport}, with the same rationale. */\nexport async function connectClient(client: ClientType, transport: unknown): Promise<void> {\n await client.connect(transport as Parameters<ClientType['connect']>[0]);\n}\n\nexport type { CallToolResult, ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\n","/**\n * `termwright-mcp` — the standalone binary for this package.\n *\n * Commands: serve over stdio (the default), serve Streamable HTTP, print\n * `agent-context`, print `usage`. Exit codes follow the taxonomy in\n * CONTRACTS.md §MCP: 0 ok / 1 assertion / 2 usage / 3 no-session / 4 ipc /\n * 5 internal. With `--json`, failures are one JSON object carrying `kind`.\n *\n * The umbrella `termwright` CLI (task #10) reuses {@link runCli} and the\n * generators it calls rather than spawning this binary.\n */\nimport { buildAgentContext, buildUsage } from './agent-context.js';\nimport { buildAgentSkill, writeAgentSkill } from './agent-skill.js';\nimport { EXIT_CODES, exitCodeFor, toErrorPayload, usageError } from './errors.js';\nimport { serveHttp, serveStdio } from './server.js';\nimport { SERVER_NAME, SERVER_VERSION } from './version.js';\n\n/** Where the CLI writes. Injectable so tests never touch the real streams. */\nexport interface CliIo {\n readonly out: (text: string) => void;\n readonly err: (text: string) => void;\n}\n\nconst defaultIo: CliIo = {\n out: (text) => process.stdout.write(`${text}\\n`),\n err: (text) => process.stderr.write(`${text}\\n`),\n};\n\ninterface ParsedArgs {\n readonly command: 'serve' | 'agent-context' | 'usage' | 'skill' | 'help' | 'version';\n readonly json: boolean;\n readonly http: boolean;\n readonly port: number | undefined;\n readonly host: string | undefined;\n /** Destination directory for `skill`; without it the package goes to stdout. */\n readonly out: string | undefined;\n}\n\nfunction parseArgs(argv: readonly string[]): ParsedArgs {\n let command: ParsedArgs['command'] = 'serve';\n let json = false;\n let http = false;\n let port: number | undefined;\n let host: string | undefined;\n let out: string | undefined;\n\n for (let index = 0; index < argv.length; index += 1) {\n const arg = argv[index] ?? '';\n switch (arg) {\n case '--json':\n json = true;\n break;\n case '--http':\n http = true;\n break;\n case '--port': {\n const value = Number(argv[index + 1]);\n if (!Number.isInteger(value) || value < 0 || value > 65_535) {\n throw usageError('--port needs an integer between 0 and 65535');\n }\n port = value;\n index += 1;\n break;\n }\n case '--host':\n host = argv[index + 1];\n if (host === undefined) throw usageError('--host needs a value');\n index += 1;\n break;\n case '--out':\n out = argv[index + 1];\n if (out === undefined) throw usageError('--out needs a directory');\n index += 1;\n break;\n case '--help':\n case '-h':\n command = 'help';\n break;\n case '--version':\n case '-v':\n command = 'version';\n break;\n case 'serve':\n case 'stdio':\n command = 'serve';\n break;\n case 'agent-context':\n command = 'agent-context';\n break;\n case 'usage':\n command = 'usage';\n break;\n case 'skill':\n command = 'skill';\n break;\n default:\n throw usageError(\n `unknown argument ${JSON.stringify(arg)}`,\n 'run `termwright-mcp usage` for the one-screen cheat sheet',\n );\n }\n }\n return { command, json, http, port, host, out };\n}\n\n/**\n * Runs the CLI and resolves with the process exit code. Serving blocks until\n * the transport closes, so `serve` only resolves on shutdown.\n */\nexport async function runCli(argv: readonly string[], io: CliIo = defaultIo): Promise<number> {\n // Read before parsing: a failure on a later argument must still honour --json.\n let json = argv.includes('--json');\n try {\n const args = parseArgs(argv);\n json = args.json;\n switch (args.command) {\n case 'version':\n io.out(json ? JSON.stringify({ name: SERVER_NAME, version: SERVER_VERSION }) : SERVER_VERSION);\n return EXIT_CODES.ok;\n case 'help':\n case 'usage':\n io.out(json ? JSON.stringify(buildAgentContext()) : buildUsage());\n return EXIT_CODES.ok;\n case 'agent-context':\n io.out(JSON.stringify(buildAgentContext(), null, json ? 0 : 2));\n return EXIT_CODES.ok;\n case 'skill': {\n if (args.out === undefined) {\n const files = buildAgentSkill();\n io.out(\n json\n ? JSON.stringify(Object.fromEntries(files.map((file) => [file.path, file.contents])))\n : files.map((file) => `=== ${file.path}\\n${file.contents}`).join('\\n'),\n );\n return EXIT_CODES.ok;\n }\n const written = await writeAgentSkill(args.out);\n io.out(json ? JSON.stringify({ written }) : written.join('\\n'));\n return EXIT_CODES.ok;\n }\n case 'serve': {\n if (args.http) {\n const handle = await serveHttp({\n ...(args.port === undefined ? {} : { port: args.port }),\n ...(args.host === undefined ? {} : { host: args.host }),\n });\n // stderr, never stdout: stdout may be a protocol stream.\n io.err(`${SERVER_NAME} MCP listening on http://${args.host ?? '127.0.0.1'}:${handle.port}/mcp`);\n await new Promise<void>((resolve) => {\n handle.http.on('close', resolve);\n });\n return EXIT_CODES.ok;\n }\n const running = await serveStdio();\n await new Promise<void>((resolve) => {\n const shutdown = (): void => {\n void running.close().then(resolve, resolve);\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n running.server.server.onclose = shutdown;\n });\n return EXIT_CODES.ok;\n }\n }\n } catch (error) {\n const payload = toErrorPayload(error);\n io.err(json ? JSON.stringify(payload) : `${payload.kind}: ${payload.message}`);\n if (!json && payload.suggestion !== undefined) io.err(`suggestion: ${payload.suggestion}`);\n return exitCodeFor(payload.kind);\n }\n}\n\n/** Entry point for the `termwright-mcp` bin. */\nexport async function main(): Promise<void> {\n process.exitCode = await runCli(process.argv.slice(2));\n}\n"],"mappings":"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A;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,EACR,MAAM,IAAI,EACV,MAAM,CAAC,EACP,KAAK,IAAI,EACT,KAAK;AAAA,IACR;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAGA,SAAS,0BAAkC;AACzC,QAAM,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","names":["z","frame","snapshot","snapshot","z","z","z","z","z","z","capabilities","entry","z","z","frame","z","z","mkdir","writeFile","join","type","mkdir","join","writeFile","session"]}
|