@theokit/sdk-tools 0.2.0 → 0.4.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/CHANGELOG.md +14 -0
- package/README.md +2 -0
- package/dist/index.cjs +97 -126
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -14
- package/dist/index.d.ts +25 -14
- package/dist/index.js +97 -126
- package/dist/index.js.map +1 -1
- package/package.json +11 -11
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/path-guard.ts","../src/apply-patch.ts","../src/artifact-store.ts","../src/edit-file.ts","../src/formatter.ts","../src/path-scope.ts","../src/subprocess.ts","../src/git-diff.ts","../src/glob-files.ts","../src/internal/shell-guard.ts","../src/internal/command-policy.ts","../src/internal/network-guard.ts","../src/internal/repo-map.ts","../src/internal/tool-aci.ts","../src/internal/tool-guidance.ts","../src/list-dir.ts","../src/plan-mode.ts","../src/question.ts","../src/read-file.ts","../src/run-vitest.ts","../src/search-text.ts","../src/shell-exec.ts","../src/todo-plan-nodes.ts","../src/todolist.ts","../src/truncation.ts","../src/web-fetch.ts","../src/web-search.ts","../src/web-search-brave.ts","../src/write-file.ts"],"names":["stat","basename","dirname","safePathJoin","mkdir","readFile","defineTool","z","copyFile","result","writeFile","resolve","readdir","join","ConfigurationError","lookup","dnsLookup","existsSync","walkDir","relative","DEFAULT_TIMEOUT_MS","DEFAULT_MAX_STDOUT_BYTES","spawn","BINARY_PROBE_BYTES","relativePath","open"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Canonical path-guard module (ADRs D79-D81).\n *\n * Three primitives + one typed error:\n * - `safePathJoin(base, ...parts)` — resolve THEN prefix-check (ADR D80).\n * - `assertNoSymlinkEscape(path, base)` — `realpathSync` resolves entire\n * symlink chain (EC-1 fix; Hermes v0.2 #386, #61).\n * - `sanitizeIdentifier(input, { maxLen })` — strict grammar\n * `^[a-z0-9][a-z0-9-_]*$` (ADR D81; case-insensitive on input,\n * lowercase on output).\n * - `PathTraversalError` — extends ConfigurationError with code\n * `path_traversal` (ADR D65: no new hierarchy).\n *\n * Wire at all sites where user input becomes a path. CI lint gate\n * `tests/lint/no-unguarded-path-input.test.ts` prevents regression\n * (ADR D85).\n *\n * @internal\n */\n\nimport { lstatSync, readlinkSync, realpathSync, type Stats } from \"node:fs\";\nimport { dirname, resolve, sep } from \"node:path\";\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\n/**\n * Thrown when a path operation would escape its allowed base directory.\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @internal\n */\nexport class PathTraversalError extends ConfigurationError {\n override readonly name: string = \"PathTraversalError\";\n\n constructor(input: string, resolvedPath: string) {\n super(`Path traversal attempt: ${input} → ${resolvedPath}`, {\n code: \"path_traversal\",\n });\n }\n}\n\n/**\n * Thrown when an agent tool is asked to read or write a sensitive path\n * that the blocklist forbids (`.env`, `.git/`, `node_modules/`, `.theo/`,\n * lock files). Distinct from `PathTraversalError` because the path is\n * lexically inside the project — it is just sensitive.\n *\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @public\n */\nexport class ForbiddenPathError extends ConfigurationError {\n override readonly name: string = \"ForbiddenPathError\";\n\n constructor(path: string) {\n super(\n `Path '${path}' is in the sensitive-file blocklist (.env, .git/, node_modules/, .theo/, lock files)`,\n {\n code: \"forbidden_path\",\n },\n );\n }\n}\n\n/**\n * Join `base` with `...parts` and ensure the resolved absolute path stays\n * under `base`. Resolves FIRST, then prefix-checks (ADR D80) — prevents\n * normalized-escape bypasses like `subdir/.\\\\./bar`.\n *\n * Returns the safe absolute path. Throws `PathTraversalError` if escape.\n *\n * @internal\n */\nexport function safePathJoin(base: string, ...parts: string[]): string {\n if (base === \"\") {\n throw new Error(\"safePathJoin: base must be non-empty\");\n }\n const baseResolved = resolve(base);\n const target = resolve(base, ...parts);\n if (target !== baseResolved && !target.startsWith(baseResolved + sep)) {\n throw new PathTraversalError(parts.join(\"/\"), target);\n }\n return target;\n}\n\n/**\n * Assert that `path` — including every directory component in the chain —\n * stays under `base` after symlink resolution. No-op when nothing on the\n * path exists yet.\n *\n * Two-bug history:\n * 1. **EC-1** (original fix, kept): a multi-level symlink chain A → B → C\n * must be resolved end-to-end. `realpathSync` does this in 1 syscall.\n * 2. **Defence-in-depth** (added v1.x): the previous implementation only\n * called `lstatSync(path)` on the terminal component. If an INTERMEDIATE\n * directory was a symlink (`base/inner-symlink → /outside`), `lstat` on\n * `base/inner-symlink/file.txt` followed the symlink and reported the\n * regular file — escape went undetected. Fix: walk up to the nearest\n * existing ancestor and `realpath` THAT, then re-attach the suffix and\n * check the result against the canonical base.\n *\n * @internal\n */\nexport function assertNoSymlinkEscape(path: string, base: string): void {\n // Canonical base — symlinks in the base path itself are absorbed once here.\n let baseResolved: string;\n try {\n baseResolved = realpathSync(base);\n } catch {\n // base doesn't exist as a real directory yet — fall back to lexical resolve.\n baseResolved = resolve(base);\n }\n\n // Find the deepest ancestor of `path` that exists, then realpath it.\n // Anything from there onward is \"not yet on disk\" and contributes only\n // its lexical suffix. This covers three cases:\n // - path exists (regular file or symlink at any depth) → realpath the full path\n // - path doesn't exist but intermediate dir is a symlink → realpath the ancestor\n // - nothing on the path exists → no escape risk (return)\n const resolved = realpathOfDeepestExisting(path);\n if (resolved === undefined) return; // path has no existing prefix — nothing to attack\n\n if (resolved !== baseResolved && !resolved.startsWith(baseResolved + sep)) {\n throw new PathTraversalError(`symlink ${path}`, resolved);\n }\n}\n\n/**\n * Find the deepest ancestor of `path` that exists on disk, resolve all\n * symlinks in that ancestor via `realpathSync`, and re-attach the\n * lexical suffix. Returns `undefined` when no ancestor exists.\n *\n * Handles dangling symlinks: if the terminal IS a symlink but its target\n * is missing, we still detect escape via `readlinkSync` + parent resolve.\n */\nfunction realpathOfDeepestExisting(path: string): string | undefined {\n // First try the full path — the common case.\n try {\n return realpathSync(path);\n } catch {\n // Not resolvable. Two sub-cases.\n }\n\n // Sub-case A: terminal is a dangling symlink.\n try {\n const stat: Stats = lstatSync(path);\n if (stat.isSymbolicLink()) {\n const target = readlinkSync(path);\n // Resolve target relative to the REAL parent dir, so intermediate\n // symlinks in the parent chain are absorbed.\n const parentReal = realpathOfDeepestExisting(dirname(path));\n const parentBase = parentReal ?? dirname(path);\n return resolve(parentBase, target);\n }\n } catch {\n // lstat failed too — terminal doesn't exist at all.\n }\n\n // Sub-case B: walk up to the nearest existing ancestor, then re-attach\n // the suffix lexically.\n let cursor = dirname(path);\n let suffix = path.slice(cursor.length);\n while (cursor !== dirname(cursor)) {\n try {\n const real = realpathSync(cursor);\n // Reconstruct: ancestor's realpath + remaining (still-lexical) suffix\n return resolve(real, `.${suffix}`);\n } catch {\n suffix = path.slice(dirname(cursor).length);\n cursor = dirname(cursor);\n }\n }\n // Reached filesystem root without finding any existing ancestor.\n return undefined;\n}\n\nconst LOCK_FILES = new Set([\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\", \"bun.lockb\"]);\n\n/**\n * Decide whether a project-relative path points to a known-sensitive file\n * that a coding agent must not read or write.\n *\n * Universal blocklist (works for any agent operating on a project tree):\n *\n * - `.env`, `.env.<anything>` — except `.env.example` (template safe to read)\n * - `.git/` — version control internals\n * - `node_modules/` — dependency cache (changes don't belong to the user)\n * - `.theo/` — TheoKit build artefacts / state\n * - Lock files at any depth: `pnpm-lock.yaml`, `package-lock.json`,\n * `yarn.lock`, `bun.lockb`\n *\n * Operates on path segments (forward-slash normalized). Cross-platform safe.\n *\n * Use together with `safePathJoin` + `assertNoSymlinkEscape`: the former two\n * defeat traversal, this one defeats reading a file that is lexically inside\n * the project but should not be agent-visible.\n *\n * @public\n */\nexport function isForbiddenPath(input: string): boolean {\n // Normalize: forward slashes only, strip leading \"./\"\n const normalized = input.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n if (normalized.length === 0) return false;\n\n const segments = normalized.split(\"/\").filter((s) => s.length > 0);\n if (segments.length === 0) return false;\n\n const first = segments[0]!;\n // .env.example is explicitly allowlisted (template safe to read)\n if (first === \".env.example\") return false;\n if (first === \".env\") return true;\n if (/^\\.env\\./.test(first)) return true;\n\n if (first === \".git\") return true;\n if (first === \"node_modules\") return true;\n if (first === \".theo\") return true;\n\n const basename = segments[segments.length - 1]!;\n if (LOCK_FILES.has(basename)) return true;\n\n return false;\n}\n\n// validateArtifactPath + sanitizeIdentifier + IDENTIFIER_PATTERN removed (dead code, no callers)\n","/**\n * `apply_patch` — built-in tool for coding agents.\n *\n * Parses a unified diff string and applies it to the project files.\n * Creates `.bak` backups before modifying each file.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, files_patched: string[] }`\n * - `{ ok: false, error: 'parse_error' | 'path_traversal' |\n * 'forbidden_path' | 'patch_failed' }`\n */\n\nimport { copyFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nexport interface CreateApplyPatchToolOptions {\n /** Absolute path to the project root. */\n projectRoot: string;\n}\n\nexport function createApplyPatchTool(opts: CreateApplyPatchToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"apply_patch\",\n description:\n \"Apply a unified diff patch to project files. Each file in the diff \" +\n \"is security-checked against the project root. Creates .bak backups \" +\n \"before modifying. Returns { ok, files_patched } or { ok: false, error }.\",\n inputSchema: z.object({\n patch: z.string().min(1).describe(\"Unified diff content.\"),\n }),\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: unified diff parsing is inherently complex\n handler: async ({ patch }) => {\n const hunks = parsePatch(patch);\n if (hunks.length === 0) {\n return JSON.stringify({ ok: false, error: \"parse_error\", detail: \"no file hunks found\" });\n }\n\n // Security check all paths upfront\n for (const hunk of hunks) {\n if (isForbiddenPath(hunk.file)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path: hunk.file });\n }\n try {\n const abs = safePathJoin(projectRoot, hunk.file);\n assertNoSymlinkEscape(abs, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path: hunk.file });\n }\n throw err;\n }\n }\n\n // Apply each file's hunks\n const patched: string[] = [];\n for (const hunk of hunks) {\n const absolutePath = safePathJoin(projectRoot, hunk.file);\n let content: string;\n try {\n content = await readFile(absolutePath, \"utf-8\");\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\") {\n // New file — start empty\n content = \"\";\n } else {\n throw err;\n }\n }\n\n const result = applyHunks(content, hunk.changes);\n if (result === null) {\n return JSON.stringify({\n ok: false,\n error: \"patch_failed\",\n path: hunk.file,\n detail: \"hunk context mismatch\",\n });\n }\n\n if (content !== \"\") {\n await copyFile(absolutePath, `${absolutePath}.bak`);\n }\n await mkdir(dirname(absolutePath), { recursive: true });\n await writeFile(absolutePath, result, \"utf-8\");\n patched.push(hunk.file);\n }\n\n return JSON.stringify({ ok: true, files_patched: patched });\n },\n });\n}\n\ninterface FileHunk {\n file: string;\n changes: HunkChange[];\n}\n\ninterface HunkChange {\n type: \"add\" | \"remove\" | \"context\";\n content: string;\n}\n\n/** Simple unified diff parser — extracts file paths and line changes. */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction parsePatch(patch: string): FileHunk[] {\n const lines = patch.split(\"\\n\");\n const hunks: FileHunk[] = [];\n let current: FileHunk | null = null;\n\n for (const line of lines) {\n // Detect file header: +++ b/path or +++ path\n if (line.startsWith(\"+++ \")) {\n const filePath = line.slice(4).replace(/^b\\//, \"\").trim();\n if (filePath && filePath !== \"/dev/null\") {\n current = { file: filePath, changes: [] };\n hunks.push(current);\n }\n continue;\n }\n\n if (line.startsWith(\"--- \")) continue;\n if (line.startsWith(\"@@ \")) continue;\n\n if (current === null) continue;\n\n if (line.startsWith(\"+\")) {\n current.changes.push({ type: \"add\", content: line.slice(1) });\n } else if (line.startsWith(\"-\")) {\n current.changes.push({ type: \"remove\", content: line.slice(1) });\n } else if (line.startsWith(\" \")) {\n current.changes.push({ type: \"context\", content: line.slice(1) });\n }\n }\n\n return hunks;\n}\n\n/** Apply hunk changes to file content. Returns null on context mismatch. */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction applyHunks(content: string, changes: HunkChange[]): string | null {\n const originalLines = content.split(\"\\n\");\n const result: string[] = [];\n let origIdx = 0;\n\n // Find context start\n const firstContext = changes.find((c) => c.type === \"context\" || c.type === \"remove\");\n if (firstContext) {\n const startIdx = originalLines.indexOf(firstContext.content, origIdx);\n if (startIdx === -1) return null;\n // Copy lines before context\n for (let i = 0; i < startIdx; i++) {\n result.push(originalLines[i]!);\n }\n origIdx = startIdx;\n }\n\n for (const change of changes) {\n if (change.type === \"context\") {\n if (origIdx >= originalLines.length || originalLines[origIdx] !== change.content) {\n return null; // context mismatch\n }\n result.push(change.content);\n origIdx++;\n } else if (change.type === \"remove\") {\n if (origIdx >= originalLines.length || originalLines[origIdx] !== change.content) {\n return null; // line to remove doesn't match\n }\n origIdx++;\n } else if (change.type === \"add\") {\n result.push(change.content);\n }\n }\n\n // Append remaining original lines\n while (origIdx < originalLines.length) {\n result.push(originalLines[origIdx]!);\n origIdx++;\n }\n\n return result.join(\"\\n\");\n}\n","import { mkdir, readdir, readFile, stat } from \"node:fs/promises\";\n\nimport { replaceFileAtomic } from \"@theokit/sdk/internal/persistence\";\nimport { safeFilenameForId, safePathJoin } from \"@theokit/sdk/path-safety\";\n\n/**\n * Options for {@link createSessionArtifactStore}.\n *\n * @public\n */\nexport interface SessionArtifactStoreOptions {\n /** Directory holding one file per artifact (`<dir>/<idStrategy(id)><extension>`). */\n dir: string;\n /**\n * Map an opaque artifact id to a filesystem-safe filename stem.\n * Default: `safeFilenameForId` (accepts ANY id; deterministically hashes\n * non-conforming input). The result is additionally passed through\n * `safePathJoin`, so a traversal id can never escape `dir`.\n *\n * NOTE — the default `safeFilenameForId` is CASE-FOLDING: ids differing only\n * in case (`\"Run-1\"` vs `\"run-1\"`) map to the SAME file. If your ids are\n * case-sensitive (e.g. base64), supply a case-preserving `idStrategy`.\n */\n idStrategy?: (id: string) => string;\n /** File extension (with leading dot). Default `\".md\"`. */\n extension?: string;\n}\n\n/**\n * A generic, id-keyed, atomic artifact store. Generalizes the per-run\n * session-summary writer pattern: persist an opaque text artifact under a\n * stable id, read it back, and enumerate what's stored.\n *\n * @public\n */\nexport interface SessionArtifactStore {\n /**\n * Write (overwrite) the artifact atomically; returns the resolved path.\n * Content is persisted byte-for-byte. The id is mapped via `idStrategy`\n * (default case-folding — see {@link SessionArtifactStoreOptions.idStrategy}).\n */\n write(id: string, content: string): Promise<string>;\n /** Read the artifact, or `undefined` if absent/unreadable (never throws). */\n read(id: string): Promise<string | undefined>;\n /** Whether an artifact exists for `id` (never throws). */\n has(id: string): Promise<boolean>;\n /** The filename stems of all stored artifacts (never throws; `[]` if dir absent). */\n list(): Promise<string[]>;\n /** The resolved, traversal-safe path for `id`. */\n path(id: string): string;\n}\n\n/**\n * Create a generic artifact store rooted at `dir`. Composes the shipped\n * `safeFilenameForId`/`safePathJoin` path guard + the atomic `replaceFileAtomic`\n * writer — zero new dependencies. Reads never throw; writes fail loud.\n *\n * @public\n */\nexport function createSessionArtifactStore(\n options: SessionArtifactStoreOptions,\n): SessionArtifactStore {\n const { dir } = options;\n const idStrategy = options.idStrategy ?? ((id: string) => safeFilenameForId(id));\n const extension = options.extension ?? \".md\";\n\n function path(id: string): string {\n return safePathJoin(dir, `${idStrategy(id)}${extension}`);\n }\n\n async function write(id: string, content: string): Promise<string> {\n const target = path(id);\n await mkdir(dir, { recursive: true });\n await replaceFileAtomic(target, content);\n return target;\n }\n\n async function read(id: string): Promise<string | undefined> {\n try {\n return await readFile(path(id), \"utf8\");\n } catch {\n return undefined;\n }\n }\n\n async function has(id: string): Promise<boolean> {\n // stat (not read) — O(1) existence check, no full-file load. Never throws.\n try {\n await stat(path(id));\n return true;\n } catch {\n return false;\n }\n }\n\n async function list(): Promise<string[]> {\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n return entries\n .filter((name) => name.endsWith(extension))\n .map((name) => name.slice(0, name.length - extension.length));\n }\n\n return { write, read, has, list, path };\n}\n","/**\n * `edit_file` — built-in tool for coding agents.\n *\n * Replaces a string in a project-relative file. Tries exact match first,\n * then whitespace-normalized match. Creates a `.bak` backup before editing.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, replacements: 1 }` on success\n * - `{ ok: false, error: 'no_match' | 'not_found' | 'path_traversal' |\n * 'forbidden_path' }` on refusal\n */\n\nimport { copyFile, readFile, writeFile } from \"node:fs/promises\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nexport interface CreateEditFileToolOptions {\n /** Absolute path to the project root. Every edit is gated against this boundary. */\n projectRoot: string;\n}\n\nexport function createEditFileTool(opts: CreateEditFileToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"edit_file\",\n description:\n \"Replace the first occurrence of old_string with new_string in a \" +\n \"project-relative file. Falls back to whitespace-normalized matching \" +\n \"when the exact match fails. Creates a .bak backup before editing. \" +\n \"Returns { ok, replacements } or { ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative file path.\"),\n old_string: z.string().min(1).describe(\"String to find in the file.\"),\n new_string: z.string().describe(\"Replacement string.\"),\n }),\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: unified diff parsing is inherently complex\n handler: async ({ path, old_string, new_string }) => {\n if (isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n\n let absolutePath: string;\n try {\n absolutePath = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path });\n }\n throw err;\n }\n\n let content: string;\n try {\n content = await readFile(absolutePath, \"utf-8\");\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\") {\n return JSON.stringify({ ok: false, error: \"not_found\", path });\n }\n throw err;\n }\n\n // Strategy 1: exact match\n const exactIdx = content.indexOf(old_string);\n if (exactIdx !== -1) {\n await copyFile(absolutePath, `${absolutePath}.bak`);\n const result =\n content.slice(0, exactIdx) + new_string + content.slice(exactIdx + old_string.length);\n await writeFile(absolutePath, result, \"utf-8\");\n return JSON.stringify({ ok: true, replacements: 1 });\n }\n\n // Strategy 2: whitespace-normalized match\n const normalizedContent = normalizeWhitespace(content);\n const normalizedOld = normalizeWhitespace(old_string);\n const normalizedIdx = normalizedContent.indexOf(normalizedOld);\n\n if (normalizedIdx === -1) {\n return JSON.stringify({ ok: false, error: \"no_match\", path });\n }\n\n // Find original span boundaries via character mapping\n const span = findOriginalSpan(\n content,\n normalizedContent,\n normalizedIdx,\n normalizedOld.length,\n );\n await copyFile(absolutePath, `${absolutePath}.bak`);\n const result = content.slice(0, span.start) + new_string + content.slice(span.end);\n await writeFile(absolutePath, result, \"utf-8\");\n return JSON.stringify({ ok: true, replacements: 1 });\n },\n });\n}\n\n/** Collapse runs of whitespace into a single space. */\nfunction normalizeWhitespace(s: string): string {\n return s.replace(/\\s+/g, \" \").trim();\n}\n\n/**\n * Map a position range in the whitespace-normalized string back to the\n * original string. Walks both strings in lockstep.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction findOriginalSpan(\n original: string,\n _normalized: string,\n normStart: number,\n normLen: number,\n): { start: number; end: number } {\n let origIdx = 0;\n let normIdx = 0;\n\n // Skip leading whitespace that was trimmed\n while (origIdx < original.length && /\\s/.test(original[origIdx]!)) {\n origIdx++;\n }\n\n // Walk to normStart\n while (normIdx < normStart && origIdx < original.length) {\n if (/\\s/.test(original[origIdx]!)) {\n // skip entire whitespace run in original, counts as one in normalized\n while (origIdx < original.length && /\\s/.test(original[origIdx]!)) {\n origIdx++;\n }\n normIdx++; // the collapsed space\n } else {\n origIdx++;\n normIdx++;\n }\n }\n\n const start = origIdx;\n\n // Walk normLen characters\n let walked = 0;\n while (walked < normLen && origIdx < original.length) {\n if (/\\s/.test(original[origIdx]!)) {\n while (origIdx < original.length && /\\s/.test(original[origIdx]!)) {\n origIdx++;\n }\n walked++; // the collapsed space\n } else {\n origIdx++;\n walked++;\n }\n }\n\n return { start, end: origIdx };\n}\n","/**\n * `formatter` — output formatting utilities for tool results.\n *\n * Wraps code, diffs, file lists, errors, and truncated output references.\n */\n\n/**\n * Wrap code in a fenced code block with language tag.\n */\nexport function formatCode(language: string, code: string): string {\n return `\\`\\`\\`${language}\\n${code}\\n\\`\\`\\``;\n}\n\n/**\n * Format a unified diff with +/- prefixes preserved.\n */\nexport function formatDiff(diff: string): string {\n return `\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``;\n}\n\n/**\n * Format a list of file paths as a bulleted markdown list.\n */\nexport function formatFileList(files: string[]): string {\n if (files.length === 0) return \"(no files)\";\n return files.map((f) => `- ${f}`).join(\"\\n\");\n}\n\n/**\n * Format an error message as a markdown block.\n */\nexport function formatError(message: string, code?: string): string {\n const prefix = code ? `[${code}] ` : \"\";\n return `> **Error:** ${prefix}${message}`;\n}\n\n/**\n * Format a truncated output reference.\n */\nexport function formatTruncated(overflowPath: string): string {\n return `...full output at: ${overflowPath}`;\n}\n","/**\n * Shared `safePathJoin + assertNoSymlinkEscape` helper for built-in coding\n * tools (git-diff, run-vitest, list-dir, read-file, search-text). Returns a\n * pre-formatted `path_traversal` JSON string on failure or `null` on pass.\n *\n * @internal\n */\n\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nexport function checkPathScope(path: string | undefined, projectRoot: string): string | null {\n if (path === undefined || path === \"\") return null;\n try {\n const abs = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(abs, projectRoot);\n return null;\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path });\n }\n throw err;\n }\n}\n","/**\n * Shared subprocess-watch helpers for built-in coding tools (git-diff,\n * run-vitest). Wires the on(close)/on(error) settle pattern in a single\n * place to eliminate the cross-file clone flagged by jscpd.\n *\n * @internal\n */\n\nimport type { ChildProcess } from \"node:child_process\";\n\n/**\n * Settle gate — guarantees the supplied callback fires exactly once across\n * the close/error/timeout race. Clears the timer on settle.\n */\ninterface SettleGate {\n /** True after first settle; subsequent calls are no-ops. */\n settled: () => boolean;\n /** Settle the gate, clear the timer, and call `onSettle()`. */\n fire: (onSettle: () => void) => void;\n}\n\nfunction createSettleGate(timer: NodeJS.Timeout): SettleGate {\n let done = false;\n return {\n settled: () => done,\n fire: (onSettle) => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n onSettle();\n },\n };\n}\n\n/**\n * Wire SIGKILL-on-timeout for a detached process group. Returns the settle\n * gate so caller listeners can short-circuit when the timeout already fired.\n */\nexport function armTimeoutKill<T>(\n child: ChildProcess,\n timeoutMs: number,\n onTimeout: () => T,\n resolve: (value: T) => void,\n): SettleGate {\n const timer = setTimeout(() => {\n gate.fire(() => {\n try {\n process.kill(-(child.pid ?? 0), \"SIGKILL\");\n } catch {\n /* already dead */\n }\n resolve(onTimeout());\n });\n }, timeoutMs);\n const gate = createSettleGate(timer);\n return gate;\n}\n\n/**\n * Attach a close+error pair of listeners that resolve via the supplied\n * callbacks. Honors the gate so timeout-vs-close races settle exactly once.\n */\nexport function attachChildSettlers<T>(\n child: ChildProcess,\n gate: SettleGate,\n onClose: (code: number | null) => T,\n onError: (err: Error) => T,\n resolve: (value: T) => void,\n): void {\n child.on(\"close\", (code) => {\n gate.fire(() => resolve(onClose(code)));\n });\n child.on(\"error\", (err) => {\n gate.fire(() => resolve(onError(err)));\n });\n}\n","/**\n * `git_diff` — built-in tool for coding agents.\n *\n * Returns the unified diff of the working tree (or staged changes when\n * `cached=true`). Implemented as a thin `git diff` subprocess wrapper\n * with a couple of hard limits:\n *\n * - 30s wall clock timeout (kills the process group on expiry)\n * - 5 MB stdout cap (truncate + flag `truncated=true`)\n * - Path scope validated through `safePathJoin` + `assertNoSymlinkEscape`\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, diff: string, truncated?: boolean }`\n * - `{ ok: false, error: 'not_a_repo' | 'path_traversal' | 'timeout' }`\n */\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport { checkPathScope } from \"./path-scope.js\";\nimport { armTimeoutKill, attachChildSettlers } from \"./subprocess.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_STDOUT_BYTES = 5 * 1024 * 1024;\n\nexport interface CreateGitDiffToolOptions {\n projectRoot: string;\n timeoutMs?: number;\n maxStdoutBytes?: number;\n}\n\nexport function createGitDiffTool(opts: CreateGitDiffToolOptions): CustomTool {\n const {\n projectRoot,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n maxStdoutBytes = DEFAULT_MAX_STDOUT_BYTES,\n } = opts;\n\n return defineTool({\n name: \"git_diff\",\n description:\n \"Return the unified diff of the project's working tree (or staged \" +\n \"changes when cached=true). Scoped to a single file when 'path' is \" +\n \"provided. Requires the project to be a git repository. Returns \" +\n \"{ ok, diff, truncated? } or { ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().optional().describe(\"Optional project-relative file or dir scope.\"),\n cached: z\n .boolean()\n .optional()\n .describe(\"If true, show staged changes (git diff --cached). Default false.\"),\n }),\n handler: async ({ path, cached }) => {\n if (!existsSync(join(projectRoot, \".git\"))) {\n return JSON.stringify({ ok: false, error: \"not_a_repo\" });\n }\n\n const scopeCheck = checkPathScope(path, projectRoot);\n if (scopeCheck !== null) return scopeCheck;\n\n const args = buildDiffArgs(cached, path);\n const result = await runGitProcess(projectRoot, args, timeoutMs, maxStdoutBytes);\n return formatGitResult(result, timeoutMs);\n },\n });\n}\n\nfunction buildDiffArgs(cached: boolean | undefined, path: string | undefined): string[] {\n const args = [\"diff\", \"--no-color\"];\n if (cached === true) args.push(\"--cached\");\n if (path !== undefined && path !== \"\") args.push(\"--\", path);\n return args;\n}\n\nfunction formatGitResult(result: GitProcessResult, timeoutMs: number): string {\n if (result.kind === \"timeout\") {\n return JSON.stringify({ ok: false, error: \"timeout\", timeoutMs });\n }\n if (result.kind === \"error\") {\n return JSON.stringify({ ok: false, error: \"git_failed\", stderr: result.stderr });\n }\n return JSON.stringify({ ok: true, diff: result.stdout, truncated: result.truncated });\n}\n\ntype GitProcessResult =\n | { kind: \"ok\"; stdout: string; truncated: boolean }\n | { kind: \"error\"; stderr: string }\n | { kind: \"timeout\" };\n\nfunction runGitProcess(\n cwd: string,\n args: string[],\n timeoutMs: number,\n maxStdoutBytes: number,\n): Promise<GitProcessResult> {\n return new Promise((resolve) => {\n // Detached process group so we can kill the whole tree on timeout (EC-7).\n const child = spawn(\"git\", args, { cwd, detached: true, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let stdoutBytes = 0;\n let truncated = false;\n\n const gate = armTimeoutKill<GitProcessResult>(\n child,\n timeoutMs,\n () => ({ kind: \"timeout\" }),\n resolve,\n );\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n if (stdoutBytes >= maxStdoutBytes) {\n truncated = true;\n return;\n }\n const remaining = maxStdoutBytes - stdoutBytes;\n if (chunk.length > remaining) {\n stdoutChunks.push(chunk.subarray(0, remaining));\n stdoutBytes = maxStdoutBytes;\n truncated = true;\n } else {\n stdoutChunks.push(chunk);\n stdoutBytes += chunk.length;\n }\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderrChunks.push(chunk);\n });\n\n attachChildSettlers<GitProcessResult>(\n child,\n gate,\n (code) => {\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n return code === 0 ? { kind: \"ok\", stdout, truncated } : { kind: \"error\", stderr };\n },\n (err) => ({ kind: \"error\", stderr: err.message }),\n resolve,\n );\n });\n}\n","/**\n * `glob_files` — built-in tool for coding agents.\n *\n * Lists project files matching a glob pattern. Excludes node_modules,\n * .git, and dist by default. Returns relative paths.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, files: string[], count }` (an empty match is `ok: true` with `files: []`)\n * - `{ ok: false, error: 'path_traversal' }`\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\n/** Directories excluded from traversal by default. */\nconst DEFAULT_EXCLUDES = new Set([\"node_modules\", \".git\", \"dist\", \".theo\"]);\n\nexport interface CreateGlobToolOptions {\n /** Absolute path to the project root. */\n projectRoot: string;\n}\n\nexport function createGlobTool(opts: CreateGlobToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"glob_files\",\n description:\n \"List project files matching a glob-like pattern. Excludes \" +\n \"node_modules, .git, dist, .theo by default. Returns relative \" +\n \"paths. Pattern supports * and ** wildcards. Returns { ok, files } \" +\n \"or { ok: false, error }.\",\n inputSchema: z.object({\n pattern: z.string().min(1).describe(\"Glob pattern (e.g. '**/*.ts', 'src/**/*.json').\"),\n cwd: z.string().optional().describe(\"Project-relative subdirectory to search from.\"),\n }),\n handler: async ({ pattern, cwd }) => {\n let searchRoot = projectRoot;\n\n if (cwd) {\n try {\n searchRoot = safePathJoin(projectRoot, cwd);\n assertNoSymlinkEscape(searchRoot, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path: cwd });\n }\n throw err;\n }\n }\n\n const regex = globToRegex(pattern);\n const files: string[] = [];\n\n await walkDir(searchRoot, searchRoot, regex, files);\n\n const relativePaths = files.map((f) => relative(projectRoot, f)).sort();\n return JSON.stringify({ ok: true, files: relativePaths, count: relativePaths.length });\n },\n });\n}\n\nasync function walkDir(\n base: string,\n dir: string,\n pattern: RegExp,\n results: string[],\n): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return; // directory doesn't exist or unreadable\n }\n\n for (const entry of entries) {\n if (DEFAULT_EXCLUDES.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n const relPath = relative(base, fullPath);\n\n if (entry.isDirectory()) {\n await walkDir(base, fullPath, pattern, results);\n } else if (entry.isFile() && pattern.test(relPath)) {\n results.push(fullPath);\n }\n }\n}\n\n/** Convert a simple glob pattern to a RegExp. Supports * and ** wildcards. */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction globToRegex(pattern: string): RegExp {\n let regexStr = \"\";\n let i = 0;\n while (i < pattern.length) {\n const ch = pattern[i]!;\n if (ch === \"*\" && pattern[i + 1] === \"*\") {\n // ** matches any path segment(s)\n regexStr += \".*\";\n i += 2;\n if (pattern[i] === \"/\") i++; // skip trailing slash after **\n } else if (ch === \"*\") {\n // * matches anything except /\n regexStr += \"[^/]*\";\n i++;\n } else if (ch === \"?\") {\n regexStr += \"[^/]\";\n i++;\n // biome-ignore lint/suspicious/noTemplateCurlyInString: regex escape chars, not template\n } else if (\".+^${}()|[]\\\\\".includes(ch)) {\n regexStr += `\\\\${ch}`;\n i++;\n } else {\n regexStr += ch;\n i++;\n }\n }\n return new RegExp(`^${regexStr}$`);\n}\n","/**\n * Catastrophic-command guardrail for `shell_exec` (M3-2).\n *\n * `catastrophicShellReason` is a pure, segment-aware deny-list: it splits a\n * command on top-level connectors (`;`, `&&`, `||`, pipe), strips `sudo`/`env`\n * prefixes, and matches at COMMAND POSITION (the executable, not an arbitrary\n * substring) so a mention like `echo \"rm -rf /\"` is not over-blocked. It returns\n * a human reason for the first catastrophic segment, else `null`.\n *\n * This is a heuristic GUARDRAIL, NOT a sandbox: it is bypassable by obfuscation\n * (eval/base64) and is best-effort. POSIX `/bin/sh` only; Windows PowerShell is\n * out of scope. Design: blueprint m3-catastrophic-shell. Zero new deps.\n */\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\n/** Thrown / reported when a command matches the catastrophic deny-list. */\nexport class CatastrophicCommandError extends ConfigurationError {\n override readonly name = \"CatastrophicCommandError\";\n constructor(reason: string) {\n super(`Refused a catastrophic shell command: ${reason} (shell guardrail).`, {\n code: \"catastrophic_command\",\n });\n }\n}\n\nconst SHELL_NAMES = new Set([\"sh\", \"bash\", \"zsh\", \"dash\", \"ksh\", \"ash\"]);\nconst PREFIX_TOKENS = new Set([\n \"sudo\",\n \"doas\",\n \"env\",\n \"command\",\n \"time\",\n \"nice\",\n \"nohup\",\n \"exec\",\n \"builtin\",\n]);\n\n/** Self-named function piping into itself: the classic `:(){ :|:& };:`. */\nconst FORK_BOMB = /:\\s*\\(\\s*\\)\\s*\\{[^}]*\\|[^}]*&[^}]*\\}/;\n/**\n * `> /dev/sda` and friends (NOT /dev/null|zero|stdout — those are benign).\n * `\\w*` matches the trailing device id (`sda`, `nvme0n1`); a `\\b` placed right\n * after the family token would never match a real node (word→word transition).\n */\nconst DEVICE_REDIRECT = /[>]\\s*\\/dev\\/(?:sd|nvme|hd|vd|mmcblk|disk|loop|dm-)\\w*/;\n/** Top-level system directories whose recursive delete bricks the host. */\nconst SYSTEM_DIR =\n /^\\/(?:etc|usr|bin|sbin|lib|lib64|var|boot|home|root|opt|sys|proc|dev)(?:\\/\\*?)?$/;\n\nfunction basename(p: string): string {\n const i = p.lastIndexOf(\"/\");\n return i >= 0 ? p.slice(i + 1) : p;\n}\n\nfunction unquote(t: string): string {\n if (t.length >= 2) {\n const a = t[0];\n const b = t[t.length - 1];\n if ((a === '\"' && b === '\"') || (a === \"'\" && b === \"'\")) return t.slice(1, -1);\n }\n return t;\n}\n\nfunction tokenize(s: string): string[] {\n return s.trim().split(/\\s+/).filter(Boolean);\n}\n\n/** Split on top-level connectors. Order matters: `&&`/`||` before single `|`. */\nfunction splitSegments(cmd: string): string[] {\n return cmd.split(/&&|\\|\\||;|\\|/);\n}\n\nfunction stripPrefixTokens(tokens: string[]): string[] {\n let t = tokens;\n let head = t[0];\n while (head !== undefined && PREFIX_TOKENS.has(basename(unquote(head)))) {\n t = t.slice(1);\n head = t[0];\n }\n return t;\n}\n\nfunction operandsOf(tokens: string[]): string[] {\n return tokens\n .slice(1)\n .filter((t) => !t.startsWith(\"-\"))\n .map(unquote);\n}\n\n/** Matches the shell HOME variable in `$HOME` or `${HOME}` form. */\nconst HOME_VAR = /^\\$\\{?HOME\\}?$/;\n\n/** Root / home / glob / top-level-system targets that make a recursive op catastrophic. */\nfunction isRootishPath(op: string): boolean {\n if (op === \"~\" || op === \"*\" || op === \".\" || HOME_VAR.test(op)) return true;\n let collapsed = op.replace(/\\/+/g, \"/\");\n if (collapsed.length > 1 && collapsed.endsWith(\"/\")) collapsed = collapsed.slice(0, -1);\n if (collapsed === \"/\" || collapsed === \"/*\" || collapsed === \"/.\") return true;\n return SYSTEM_DIR.test(collapsed);\n}\n\nfunction hasRecursiveForce(tokens: string[]): boolean {\n const flags = tokens.slice(1).filter((t) => t.startsWith(\"-\"));\n const recursive = flags.some(\n (f) => f === \"--recursive\" || (!f.startsWith(\"--\") && /[rR]/.test(f)),\n );\n const force = flags.some((f) => f === \"--force\" || (!f.startsWith(\"--\") && f.includes(\"f\")));\n return recursive && force;\n}\n\nfunction hasRecursiveFlag(tokens: string[]): boolean {\n return tokens\n .slice(1)\n .some(\n (t) => t === \"--recursive\" || (t.startsWith(\"-\") && !t.startsWith(\"--\") && /[rR]/.test(t)),\n );\n}\n\n/** `curl`/`wget` output piped into `sh`/`bash`/... anywhere in the command. */\nfunction isCurlPipedToShell(cmd: string): boolean {\n const segs = cmd\n .replace(/\\|\\|/g, \";\")\n .split(/[;|]/)\n .map((s) => s.trim())\n .filter(Boolean);\n let fetcher = false;\n let shell = false;\n for (const s of segs) {\n const tk = stripPrefixTokens(tokenize(s));\n const head = tk[0];\n if (head === undefined) continue;\n const c = basename(unquote(head));\n if (c === \"curl\" || c === \"wget\") fetcher = true;\n if (SHELL_NAMES.has(c)) shell = true;\n }\n return fetcher && shell;\n}\n\ntype SegmentCheck = (cmd0: string, tokens: string[], seg: string) => string | null;\n\nconst rmCheck: SegmentCheck = (cmd0, tokens) => {\n if (cmd0 !== \"rm\" || !hasRecursiveForce(tokens)) return null;\n const ops = operandsOf(tokens);\n return ops.length === 0 || ops.some(isRootishPath) ? \"rm -rf of a root/home/glob path\" : null;\n};\n\nconst mkfsCheck: SegmentCheck = (cmd0) => (cmd0.startsWith(\"mkfs\") ? \"mkfs on a device\" : null);\n\nconst ddCheck: SegmentCheck = (cmd0, tokens) => {\n if (cmd0 !== \"dd\") return null;\n return tokens.some((t) => unquote(t).startsWith(\"of=/dev/\")) ? \"dd writing to a device\" : null;\n};\n\nconst gitForceCheck: SegmentCheck = (cmd0, tokens) => {\n if (cmd0 !== \"git\" || !tokens.includes(\"push\") || tokens.includes(\"--force-with-lease\")) {\n return null;\n }\n const force =\n tokens.includes(\"--force\") ||\n tokens.some((t) => /^-[a-z]*f[a-z]*$/.test(t)) ||\n operandsOf(tokens).some((op) => /^\\+[^+]/.test(op)); // `git push origin +main` refspec\n return force ? \"git push --force\" : null;\n};\n\nconst permCheck: SegmentCheck = (cmd0, tokens) => {\n if ((cmd0 !== \"chmod\" && cmd0 !== \"chown\") || !hasRecursiveFlag(tokens)) return null;\n return operandsOf(tokens).some(isRootishPath) ? `${cmd0} -R on a root path` : null;\n};\n\nconst redirectCheck: SegmentCheck = (_cmd0, _tokens, seg) =>\n DEVICE_REDIRECT.test(seg) ? \"redirect to a device\" : null;\n\nconst SEGMENT_CHECKS: readonly SegmentCheck[] = [\n rmCheck,\n mkfsCheck,\n ddCheck,\n gitForceCheck,\n permCheck,\n redirectCheck,\n];\n\n/**\n * Returns a human reason if `cmd` contains a catastrophic command (in any\n * segment, across chains/sudo/pipes), else `null`.\n */\nexport function catastrophicShellReason(cmd: string): string | null {\n // Note: a payload nested inside `sh -c \"...\"` / `eval \"...\"` is intentionally\n // NOT re-screened — that is obfuscation/indirection, out of scope for a\n // best-effort guardrail (ADR D5). The screen matches surface command position.\n if (FORK_BOMB.test(cmd)) return \"fork bomb\";\n if (isCurlPipedToShell(cmd)) return \"curl/wget piped into a shell\";\n for (const seg of splitSegments(cmd)) {\n const tokens = stripPrefixTokens(tokenize(seg));\n const head = tokens[0];\n if (head === undefined) continue;\n const cmd0 = basename(unquote(head));\n for (const check of SEGMENT_CHECKS) {\n const reason = check(cmd0, tokens, seg);\n if (reason) return reason;\n }\n }\n return null;\n}\n","/**\n * Composable command-permission policy layer (M3-6).\n *\n * A `CommandPolicy` is a pure predicate returning a deny REASON (or `null` to\n * allow). `denyCatastrophicCommands()` COMPOSES the M3-2 `catastrophicShellReason`\n * guardrail (it does not duplicate the deny-list). `commandDenialReason` combines\n * a policy array with deny-wins semantics (the first policy returning a reason\n * denies); an empty array denies nothing. `isCommandAllowed` is the boolean view.\n *\n * Framework-agnostic: a consumer wires it at their permission layer — e.g. inside\n * an ACP `pre_tool_call` hook — `@theokit/agents` is not required. Inherits the\n * M3-2 honesty: a heuristic gate, not a sandbox. Design: blueprint m3-command-policy.\n */\n\nimport { catastrophicShellReason } from \"./shell-guard.js\";\n\n/**\n * A pure command-permission predicate: returns a non-empty deny reason, or `null`\n * to allow. NOTE: return `null` to allow — NOT `\"\"`. An empty string is treated\n * as a deny with a blank reason (`\"\" !== null`), which is almost never intended.\n */\nexport type CommandPolicy = (command: string) => string | null;\n\n/** A policy that denies catastrophic commands by composing the M3-2 guardrail. */\nexport function denyCatastrophicCommands(): CommandPolicy {\n return (command) => catastrophicShellReason(command);\n}\n\n/**\n * The first deny reason across `policies` (deny-wins), or `null` if every policy\n * allows. An empty `policies` array denies nothing (returns `null`).\n */\nexport function commandDenialReason(command: string, policies: CommandPolicy[]): string | null {\n for (const policy of policies) {\n const reason = policy(command);\n if (reason !== null) return reason;\n }\n return null;\n}\n\n/** `true` when no policy denies `command` (an empty policy array allows everything). */\nexport function isCommandAllowed(command: string, policies: CommandPolicy[]): boolean {\n return commandDenialReason(command, policies) === null;\n}\n","/**\n * SSRF guard for network tools (M3-1).\n *\n * `isBlockedIp` is a pure block-list of the canonical private/loopback/link-local/\n * CGNAT/metadata/reserved ranges (IPv4 + IPv6, with IPv4-mapped unwrap).\n * `resolveAndScreen` resolves ALL of a host's addresses and rejects if any is\n * blocked. `screenedFetch` fetches with `redirect:\"manual\"` and re-screens every\n * hop. `lookup`/`fetchImpl` are injectable so the DNS + redirect paths are\n * deterministically testable without real network access.\n *\n * Design: blueprint m3-ssrf-guard ADRs D1-D6. Node builtins only (zero new deps).\n */\n\nimport { lookup as dnsLookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\n/** Thrown when a host/redirect resolves to a blocked (private/reserved) address. */\nexport class SsrfBlockedError extends ConfigurationError {\n override readonly name = \"SsrfBlockedError\";\n constructor(host: string, detail?: string) {\n super(\n `Blocked request to \"${host}\"${detail ? ` (${detail})` : \"\"}: address is private, loopback, link-local, or reserved (SSRF guard).`,\n { code: \"ssrf_blocked\" },\n );\n }\n}\n\n/** Parse an IPv4 dotted-quad to a 32-bit unsigned integer (assumes a valid literal). */\nfunction v4ToInt(ip: string): number {\n const parts = ip.split(\".\");\n return (\n ((Number(parts[0]) << 24) |\n (Number(parts[1]) << 16) |\n (Number(parts[2]) << 8) |\n Number(parts[3])) >>>\n 0\n );\n}\n\n/** True if the IPv4 address (as int) falls inside `base/prefix`. */\nfunction inV4Cidr(ipInt: number, base: string, prefix: number): boolean {\n const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;\n return (ipInt & mask) === (v4ToInt(base) & mask);\n}\n\nconst V4_BLOCKED: ReadonlyArray<readonly [string, number]> = [\n [\"0.0.0.0\", 8], // \"this host\"\n [\"10.0.0.0\", 8], // private\n [\"100.64.0.0\", 10], // CGNAT\n [\"127.0.0.0\", 8], // loopback\n [\"169.254.0.0\", 16], // link-local + cloud metadata\n [\"172.16.0.0\", 12], // private\n [\"192.168.0.0\", 16], // private\n [\"224.0.0.0\", 4], // multicast\n [\"240.0.0.0\", 4], // reserved\n];\n\nfunction isBlockedV4(ip: string): boolean {\n const n = v4ToInt(ip);\n return V4_BLOCKED.some(([base, prefix]) => inV4Cidr(n, base, prefix));\n}\n\n/** Fold a trailing dotted-quad (`…:1.2.3.4`) into two hex hextets; `null` if invalid. */\nfunction foldDottedTail(s: string): string | null {\n const lastColon = s.lastIndexOf(\":\");\n const tail = s.slice(lastColon + 1);\n if (!tail.includes(\".\")) return s;\n if (isIP(tail) !== 4) return null;\n const o = tail.split(\".\").map(Number);\n const hi = (((o[0] as number) << 8) | (o[1] as number)).toString(16);\n const lo = (((o[2] as number) << 8) | (o[3] as number)).toString(16);\n return `${s.slice(0, lastColon + 1)}${hi}:${lo}`;\n}\n\n/** Expand a (validated) IPv6 string to exactly 8 hextet strings; `null` if malformed. */\nfunction expandHextets(s: string): string[] | null {\n const halves = s.split(\"::\");\n if (halves.length > 2) return null;\n const head = halves[0] ? halves[0].split(\":\") : [];\n const tailGroups = halves.length === 2 && halves[1] ? halves[1].split(\":\") : [];\n if (halves.length === 1) return head.length === 8 ? head : null;\n const missing = 8 - head.length - tailGroups.length;\n if (missing < 0) return null;\n return [...head, ...Array(missing).fill(\"0\"), ...tailGroups];\n}\n\n/**\n * Expand a (net.isIP-validated) IPv6 literal to its 16 bytes. Handles `::`\n * compression and a trailing dotted-quad (`::ffff:1.2.3.4`). Returns `null` if it\n * cannot be parsed (caller then fails closed).\n */\nfunction ipv6ToBytes(ip: string): number[] | null {\n const folded = foldDottedTail(ip.toLowerCase().split(\"%\")[0] ?? \"\");\n if (folded === null) return null;\n const groups = expandHextets(folded);\n if (groups === null || groups.length !== 8) return null;\n const bytes: number[] = [];\n for (const g of groups) {\n const n = Number.parseInt(g || \"0\", 16);\n bytes.push(n >> 8, n & 0xff);\n }\n return bytes;\n}\n\nfunction allZero(bytes: number[], from: number, to: number): boolean {\n for (let i = from; i < to; i += 1) if (bytes[i] !== 0) return false;\n return true;\n}\n\n/** Numeric IPv6 classification over the parsed 16 bytes (no string-prefix guesswork). */\nfunction isBlockedV6Bytes(b: number[]): boolean {\n // IPv4-mapped (::ffff:a.b.c.d, any spelling) → re-check the embedded IPv4.\n if (allZero(b, 0, 10) && b[10] === 0xff && b[11] === 0xff) {\n return isBlockedV4(`${b[12]}.${b[13]}.${b[14]}.${b[15]}`);\n }\n // ::1 loopback and :: unspecified.\n if (allZero(b, 0, 15) && (b[15] === 1 || b[15] === 0)) return true;\n // IPv4-compatible (deprecated) ::a.b.c.d → re-check embedded IPv4.\n if (allZero(b, 0, 12)) return isBlockedV4(`${b[12]}.${b[13]}.${b[14]}.${b[15]}`);\n // fe80::/10 link-local.\n if (b[0] === 0xfe && ((b[1] as number) & 0xc0) === 0x80) return true;\n // fc00::/7 unique-local.\n return ((b[0] as number) & 0xfe) === 0xfc;\n}\n\n/**\n * True if `ip` is a blocked address (private/loopback/link-local/CGNAT/metadata/\n * reserved). A non-IP literal returns `true` (fail closed — callers resolve names\n * to IPs first via {@link resolveAndScreen}).\n */\nexport function isBlockedIp(ip: string): boolean {\n const fam = isIP(ip);\n if (fam === 4) return isBlockedV4(ip);\n if (fam === 6) {\n const bytes = ipv6ToBytes(ip);\n return bytes === null ? true : isBlockedV6Bytes(bytes);\n }\n return true;\n}\n\ntype LookupFn = (host: string, opts: { all: true }) => Promise<Array<{ address: string }>>;\n\n/** Options for {@link resolveAndScreen}. */\nexport interface ResolveAndScreenOptions {\n /** DNS resolver (injectable for tests); defaults to `node:dns/promises` lookup. */\n lookup?: LookupFn;\n}\n\n/**\n * Resolve `host` to ALL its addresses and screen each. Throws {@link SsrfBlockedError}\n * if any resolved address is blocked (or if `host` is a blocked IP literal, or if\n * resolution yields no address). Returns the resolved IPs otherwise.\n */\nexport async function resolveAndScreen(\n rawHost: string,\n options: ResolveAndScreenOptions = {},\n): Promise<string[]> {\n // `URL.hostname` wraps IPv6 literals in brackets (`[::1]`) — strip them so\n // `net.isIP` recognizes the address.\n const host = rawHost.replace(/^\\[|\\]$/g, \"\");\n if (isIP(host) !== 0) {\n if (isBlockedIp(host)) throw new SsrfBlockedError(host);\n return [host];\n }\n const lookup = options.lookup ?? (dnsLookup as unknown as LookupFn);\n const addrs = await lookup(host, { all: true });\n if (addrs.length === 0) throw new SsrfBlockedError(host, \"no addresses\");\n for (const a of addrs) {\n if (isBlockedIp(a.address)) throw new SsrfBlockedError(host, a.address);\n }\n return addrs.map((a) => a.address);\n}\n\ntype FetchFn = (url: string, init?: RequestInit) => Promise<Response>;\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\n/**\n * The next URL to follow for a redirect response, or `undefined` if `res` is not a\n * followable redirect. Throws {@link SsrfBlockedError} for a non-http(s) target.\n */\nfunction redirectTarget(res: Response, current: string, originalUrl: string): string | undefined {\n const location = res.headers.get(\"location\");\n if (!REDIRECT_STATUSES.has(res.status) || !location) return undefined;\n const next = new URL(location, current);\n if (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n throw new SsrfBlockedError(originalUrl, `non-http redirect to ${next.protocol}`);\n }\n return next.href;\n}\n\n/** Options for {@link screenedFetch}. */\nexport interface ScreenedFetchOptions {\n /** Fetch implementation (injectable for tests); defaults to global `fetch`. */\n fetchImpl?: FetchFn;\n /** DNS resolver (injectable for tests). */\n lookup?: LookupFn;\n /** Max redirect hops to follow (default 5). */\n maxRedirects?: number;\n /** Skip SSRF screening entirely (opt-out for local-dev tools). Default false. */\n allowPrivateHosts?: boolean;\n /** Abort signal forwarded to fetch. */\n signal?: AbortSignal;\n}\n\n/**\n * Fetch `url` with SSRF screening: screens the host (unless `allowPrivateHosts`),\n * sets `redirect:\"manual\"`, and re-screens every redirect hop (rejecting a hop to a\n * blocked host or a non-http(s) target). Throws {@link SsrfBlockedError} on a block\n * or on exceeding `maxRedirects`.\n */\nexport async function screenedFetch(\n url: string,\n options: ScreenedFetchOptions = {},\n): Promise<Response> {\n const fetchImpl = options.fetchImpl ?? (fetch as FetchFn);\n const maxRedirects = options.maxRedirects ?? 5;\n let current = url;\n for (let hop = 0; hop <= maxRedirects; hop += 1) {\n if (!options.allowPrivateHosts) {\n await resolveAndScreen(new URL(current).hostname, { lookup: options.lookup });\n }\n const res = await fetchImpl(current, { redirect: \"manual\", signal: options.signal });\n const next = redirectTarget(res, current, url);\n if (next === undefined) return res;\n current = next;\n }\n throw new SsrfBlockedError(url, \"too many redirects\");\n}\n","/**\n * Repo-map / env-context builders for orienting an LLM coding agent (M3-3).\n *\n * `buildEnvContext(cwd)` renders a short `<env>` block (cwd, platform, node,\n * is-git, date, project docs, manifests). `buildRepoMap(cwd, opts)` renders a\n * char-bounded, depth-limited directory tree. Both are node:fs-only and NEVER\n * throw — a missing/unreadable path yields a best-effort partial string or an\n * `(unavailable)` marker (distinct from the M3-1/M3-2 guards, which throw).\n *\n * Design: blueprint m3-repo-map. Zero new dependencies. A best-effort\n * orientation aid, not a complete or secure listing (bounded + skips on error).\n */\n\nimport { type Dirent, existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface RepoMapOptions {\n /** Max characters of tree output before truncation. Default 8000. */\n budget?: number;\n /** Directory/file names to skip (merged with the built-in ignore set). */\n ignore?: string[];\n /** Max directory depth to descend. Default 4. */\n maxDepth?: number;\n}\n\nconst DEFAULT_BUDGET = 8000;\nconst DEFAULT_MAX_DEPTH = 4;\nconst PER_DIR_CAP = 200;\nconst TRUNCATED_MARKER = \"… (truncated)\";\nconst DOC_HEAD_CHARS = 200;\nconst DEFAULT_REPO_MAP_IGNORE = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \".theo\",\n \".next\",\n \"build\",\n \"coverage\",\n \"target\",\n \"out\",\n];\nconst PROJECT_DOCS = [\"AGENTS.md\", \"CLAUDE.md\", \"README.md\"];\nconst MANIFESTS = [\"package.json\", \"pyproject.toml\", \"Cargo.toml\", \"go.mod\"];\n\nfunction safeExists(p: string): boolean {\n try {\n return existsSync(p);\n } catch {\n return false;\n }\n}\n\nfunction safeReadHead(p: string, n: number): string {\n try {\n return readFileSync(p, \"utf-8\").slice(0, n).replace(/\\s+/g, \" \").trim();\n } catch {\n return \"\";\n }\n}\n\n/** Render a portable `<env>` orientation block. Never throws. */\nexport function buildEnvContext(cwd: string): string {\n const lines = [\n \"<env>\",\n ` Working directory: ${cwd}`,\n ` Platform: ${process.platform} (${process.arch})`,\n ` Node: ${process.version}`,\n ` Is git repo: ${safeExists(join(cwd, \".git\")) ? \"yes\" : \"no\"}`,\n ` Today's date: ${new Date().toDateString()}`,\n ];\n const docs = PROJECT_DOCS.filter((d) => safeExists(join(cwd, d)));\n if (docs.length > 0) {\n lines.push(` Project docs: ${docs.join(\", \")}`);\n const head = safeReadHead(join(cwd, docs[0] as string), DOC_HEAD_CHARS);\n if (head) lines.push(` ${docs[0]} (head): ${head}`);\n }\n const manifests = MANIFESTS.filter((m) => safeExists(join(cwd, m)));\n if (manifests.length > 0) lines.push(` Manifests: ${manifests.join(\", \")}`);\n lines.push(\"</env>\");\n return lines.join(\"\\n\");\n}\n\n/** dirs-first, then alphabetical. Symlinks count as leaves (not followed). */\nfunction compareEntries(a: Dirent, b: Dirent): number {\n const ad = a.isDirectory() ? 0 : 1;\n const bd = b.isDirectory() ? 0 : 1;\n return ad !== bd ? ad - bd : a.name.localeCompare(b.name);\n}\n\nfunction visibleEntries(dir: string, ignore: Set<string>): Dirent[] {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n return entries.filter((e) => !ignore.has(e.name) && !e.name.startsWith(\".\")).sort(compareEntries);\n}\n\ninterface WalkCtx {\n ignore: Set<string>;\n maxDepth: number;\n budget: number;\n lines: string[];\n used: number;\n truncated: boolean;\n}\n\n/** Append a line if it fits the budget; flag truncation and return false otherwise. */\nfunction pushLine(ctx: WalkCtx, line: string): boolean {\n if (ctx.used + line.length + 1 > ctx.budget) {\n ctx.truncated = true;\n return false;\n }\n ctx.lines.push(line);\n ctx.used += line.length + 1;\n return true;\n}\n\n/** Emit one entry (and recurse into a real sub-dir). Returns false when budget is hit. */\nfunction emitEntry(ctx: WalkCtx, dir: string, e: Dirent, depth: number, indent: string): boolean {\n const isDir = e.isDirectory(); // symlink-to-dir → false → treated as a leaf, not followed\n if (!pushLine(ctx, `${indent}${isDir ? `${e.name}/` : e.name}`)) return false;\n if (isDir && depth + 1 < ctx.maxDepth) return walkDir(ctx, join(dir, e.name), depth + 1);\n return true;\n}\n\nfunction walkDir(ctx: WalkCtx, dir: string, depth: number): boolean {\n const entries = visibleEntries(dir, ctx.ignore);\n const shown = entries.slice(0, PER_DIR_CAP);\n const indent = \" \".repeat(depth);\n for (const e of shown) {\n if (!emitEntry(ctx, dir, e, depth, indent)) return false;\n }\n if (entries.length > shown.length) {\n return pushLine(ctx, `${indent}… (${entries.length - shown.length} more)`);\n }\n return true;\n}\n\n/** Render a char-bounded, depth-limited directory tree. Never throws. */\nexport function buildRepoMap(cwd: string, opts: RepoMapOptions = {}): string {\n try {\n if (!existsSync(cwd) || !statSync(cwd).isDirectory()) {\n return `(unavailable: ${cwd} is not a readable directory)`;\n }\n } catch {\n return `(unavailable: ${cwd})`;\n }\n\n const ctx: WalkCtx = {\n ignore: new Set([...DEFAULT_REPO_MAP_IGNORE, ...(opts.ignore ?? [])]),\n maxDepth: opts.maxDepth ?? DEFAULT_MAX_DEPTH,\n budget: opts.budget ?? DEFAULT_BUDGET,\n lines: [],\n used: 0,\n truncated: false,\n };\n walkDir(ctx, cwd, 0);\n return ctx.truncated ? `${ctx.lines.join(\"\\n\")}\\n${TRUNCATED_MARKER}` : ctx.lines.join(\"\\n\");\n}\n","/**\n * ACI (Agent-Computer Interface) helpers for tools (M3-5).\n *\n * `withDescription(tool, description)` immutably overrides a tool's LLM-facing\n * description (the wording that drives tool-selection accuracy) — returning a\n * NEW `CustomTool` and leaving the original untouched. `renderToolList(tools)`\n * renders a `<tools>` block FROM THE SAME `CustomTool[]` the agent runs, so the\n * rendered list cannot drift from the real tools (single source of truth).\n *\n * Both are pure, zero-dependency, and never throw. The `<tools>` block is a\n * system-prompt orientation aid — NOT the provider tool-call schema (that stays\n * each tool's `inputSchema`). Design: blueprint m3-aci-tools.\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\n/**\n * Return a new `CustomTool` with `description` replaced. Preserves\n * name/inputSchema/handler; does NOT mutate the original tool.\n */\nexport function withDescription(tool: CustomTool, description: string): CustomTool {\n return {\n name: tool.name,\n description,\n inputSchema: tool.inputSchema,\n handler: tool.handler,\n };\n}\n\n/** XML-escape for the `<tools>` block. `&` MUST be replaced first (no double-escape). */\nfunction esc(s: string): string {\n // String() guards the never-throw contract against an untyped/`as any` caller\n // passing a non-string name/description.\n return String(s).replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\n\n/**\n * Render a `<tools>` block (name + description per tool) from the agent's actual\n * `CustomTool[]` — single source of truth, so an overridden/added/removed tool\n * is reflected automatically. An empty array yields `<tools></tools>`. Never throws.\n */\nexport function renderToolList(tools: CustomTool[]): string {\n if (tools.length === 0) return \"<tools></tools>\";\n const lines = [\"<tools>\"];\n for (const t of tools) {\n lines.push(\n \" <tool>\",\n ` <name>${esc(t.name)}</name>`,\n ` <description>${esc(t.description)}</description>`,\n \" </tool>\",\n );\n }\n lines.push(\"</tools>\");\n return lines.join(\"\\n\");\n}\n","/**\n * Rich-error guidance for tool failures (M3-4).\n *\n * `withToolResultGuidance(tool, guidance)` wraps a `CustomTool` so a failing\n * `{ ok: false, error }` JSON result gains an LLM-actionable `guidance` string\n * telling the model how to self-correct. The injection is ADDITIVE (only on\n * `ok:false`), IDEMPOTENT (never overwrites an existing `guidance`), and\n * NEVER-THROW (a non-JSON / non-object / `ok:true` / unknown-code result is\n * returned unchanged). Composes over the existing built-in tools (and custom\n * tools) — no factory edits required.\n *\n * Design: blueprint m3-rich-errors. Zero new dependencies (JSON transform).\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\n/** Maps a tool error code to a short, LLM-actionable self-correction hint. */\nexport type ToolGuidanceMap = Record<string, string>;\n\n/** Curated hints for the common cross-tool error codes. Consumers may extend. */\nexport const DEFAULT_TOOL_GUIDANCE: ToolGuidanceMap = {\n not_found:\n \"The path does not exist. Use `list_dir` or `glob_files` to find the correct path, then retry.\",\n path_traversal: \"That path escapes the project root. Use a path inside the project directory.\",\n forbidden_path:\n \"That path is a protected file (.env, .git, lock files, etc.). Choose a different, non-sensitive path.\",\n no_match:\n \"The search text was not found verbatim. Re-read the file with `read_file` and copy the exact text (including whitespace/indentation) before editing.\",\n timeout: \"The operation timed out. Narrow the scope or pass a larger `timeout_ms`.\",\n invalid_url: \"The URL is malformed. Provide a full absolute http(s):// URL.\",\n ssrf_blocked: \"That host is private/loopback/reserved and is blocked. Use a public URL.\",\n catastrophic_command:\n \"That command is blocked as catastrophic. Use a safer, scoped command (e.g. a relative path instead of `/`).\",\n binary_file: \"The file is binary and cannot be read as text. Use a tool suited to binary data.\",\n too_large:\n \"The target is too large to process directly. Use a bounded range or a narrower scope.\",\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Pure: parse a tool handler's JSON output and ADD a `guidance` hint when the\n * result is an `{ ok: false, error }` object whose code has a hint and that does\n * not already carry guidance. Any other input is returned UNCHANGED (never throws).\n */\nexport function injectGuidance(handlerOutput: string, guidance: ToolGuidanceMap): string {\n let parsed: unknown;\n try {\n parsed = JSON.parse(handlerOutput);\n } catch {\n return handlerOutput; // non-JSON tool output → passthrough\n }\n if (!isRecord(parsed) || parsed.ok !== false) return handlerOutput;\n if (\"guidance\" in parsed) return handlerOutput; // idempotent — never touch an existing key\n const code = parsed.error;\n if (typeof code !== \"string\") return handlerOutput;\n const hint = guidance[code];\n if (!hint) return handlerOutput; // unknown code → no guidance\n return JSON.stringify({ ...parsed, guidance: hint });\n}\n\n/**\n * Wrap a `CustomTool` so its failed results gain a `guidance` hint from `guidance`.\n * Preserves name/description/inputSchema; only the handler output is augmented.\n */\nexport function withToolResultGuidance(tool: CustomTool, guidance: ToolGuidanceMap): CustomTool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n handler: async (input) => injectGuidance(await tool.handler(input), guidance),\n };\n}\n\n/** `withToolResultGuidance` pre-bound to {@link DEFAULT_TOOL_GUIDANCE}. */\nexport function withDefaultGuidance(tool: CustomTool): CustomTool {\n return withToolResultGuidance(tool, DEFAULT_TOOL_GUIDANCE);\n}\n","/**\n * `list_dir` — built-in tool for coding agents.\n *\n * Returns the direct entries of a project-relative directory. Hardened\n * against the same four bug families as `read_file` plus the\n * **EC-6 unbounded output** failure mode: in a project with 10k files,\n * a naive listing returns a 5 MB JSON payload that freezes the browser\n * and (more importantly) blows past the LLM context window.\n *\n * Defaults:\n * - `max = 500` entries (override via factory option `{ max }`)\n * - Result includes `{ truncated: boolean, totalCount: number }` so the\n * agent can decide whether to drill deeper or call `search_text` instead\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, entries: Array<{ name, type }>, truncated, totalCount }`\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' | 'not_found' }`\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nconst DEFAULT_MAX_ENTRIES = 500;\n\nexport interface CreateListDirToolOptions {\n /** Absolute path to the project root. Every listing is gated against this boundary. */\n projectRoot: string;\n /** Maximum number of entries returned per call. Default 500. */\n max?: number;\n}\n\nexport function createListDirTool(opts: CreateListDirToolOptions): CustomTool {\n const { projectRoot, max = DEFAULT_MAX_ENTRIES } = opts;\n\n return defineTool({\n name: \"list_dir\",\n description:\n `Return the direct entries of a project-relative directory. ` +\n `Refuses paths outside the project root or in the sensitive-file ` +\n `blocklist (.env, .git/, node_modules/, .theo/, lock files). Caps ` +\n `at ${String(max)} entries by default; result carries truncated + totalCount.`,\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative directory path. Use '.' for root.\"),\n }),\n handler: async ({ path }) => {\n const relative = path === \"\" || path === \".\" ? \".\" : path;\n if (relative !== \".\" && isForbiddenPath(relative)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n const boundary = resolveDirBoundary(relative, projectRoot, path);\n if (\"error\" in boundary) return boundary.error;\n const readResult = await readDirSafe(boundary.absolutePath, path);\n if (\"error\" in readResult) return readResult.error;\n return formatListing(readResult.dirents, max);\n },\n });\n}\n\nfunction resolveDirBoundary(\n relative: string,\n projectRoot: string,\n originalPath: string,\n): { absolutePath: string } | { error: string } {\n try {\n const absolutePath = relative === \".\" ? projectRoot : safePathJoin(projectRoot, relative);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n return { absolutePath };\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return { error: JSON.stringify({ ok: false, error: \"path_traversal\", path: originalPath }) };\n }\n throw err;\n }\n}\n\nasync function readDirSafe(\n absolutePath: string,\n originalPath: string,\n): Promise<{ dirents: Dirent[] } | { error: string }> {\n try {\n const dirents = await readdir(absolutePath, { withFileTypes: true });\n return { dirents };\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n return { error: JSON.stringify({ ok: false, error: \"not_found\", path: originalPath }) };\n }\n throw err;\n }\n}\n\nfunction formatListing(dirents: Dirent[], max: number): string {\n const totalCount = dirents.length;\n const truncated = totalCount > max;\n const entries = dirents.slice(0, max).map((d) => ({\n name: d.name,\n type: d.isDirectory() ? (\"directory\" as const) : (\"file\" as const),\n }));\n return JSON.stringify({ ok: true, entries, truncated, totalCount });\n}\n","/**\n * `plan_mode` — tool for toggling between normal and planning mode.\n *\n * In plan mode, the agent focuses on outlining steps rather than executing them.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, mode: string, message: string }`\n * - `{ ok: false, error: \"invalid_action\" }`\n *\n * Opt-in persistence (M4-4): `createPlanModeTool({ artifactStore })` returns a\n * variant whose async handler persists the submitted `plan` on `exit`.\n */\n\nimport type { SessionArtifactStore } from \"./artifact-store.js\";\n\ntype Mode = \"normal\" | \"plan\";\n\nconst PLAN_INSTRUCTIONS = [\n \"You are now in PLAN MODE.\",\n \"Outline the steps you will take before executing any code changes.\",\n \"Number each step. Include file paths and what will change.\",\n \"Do NOT make any edits or tool calls other than reading files.\",\n \"When ready, use plan_mode with action 'exit' to return to normal mode.\",\n].join(\"\\n\");\n\nconst NORMAL_INSTRUCTIONS = \"Returned to NORMAL MODE. You may now execute changes.\";\n\nexport interface PlanModeTool {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: { action: string }) => string;\n /** Expose current mode for testing. */\n currentMode: () => Mode;\n}\n\n/**\n * Plan-mode tool with opt-in artifact persistence (M4-4). Same surface as\n * {@link PlanModeTool} but the handler is ASYNC (it may write to the store) and\n * accepts an optional `plan` to persist on `exit`.\n *\n * @public\n */\nexport interface PlanModeToolWithStore {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: { action: string; plan?: string }) => Promise<string>;\n currentMode: () => Mode;\n}\n\n/**\n * Options for the persistence-enabled {@link createPlanModeTool} overload.\n *\n * @public\n */\nexport interface PlanModeToolOptions {\n /** Store the submitted `plan` is persisted to on `exit`. */\n artifactStore: SessionArtifactStore;\n /** Artifact id under which the plan is stored. Default `\"plan\"`. */\n artifactId?: string;\n}\n\nconst DESCRIPTION =\n \"Toggle between normal and plan mode. \" +\n \"Actions: 'enter' (switch to plan mode), 'exit' (return to normal), 'status' (check current mode). \" +\n \"Returns { ok, mode, message }.\";\n\nfunction planModeSchema(withPlan: boolean): unknown {\n const properties: Record<string, unknown> = {\n action: {\n type: \"string\",\n enum: [\"enter\", \"exit\", \"status\"],\n description: \"The action to perform.\",\n },\n };\n if (withPlan) {\n properties.plan = {\n type: \"string\",\n description: \"On 'exit', the plan text to persist to the artifact store.\",\n };\n }\n return { type: \"object\" as const, properties, required: [\"action\"] };\n}\n\nfunction renderMode(action: string, mode: Mode): string | undefined {\n switch (action) {\n case \"enter\":\n return JSON.stringify({ ok: true, mode, message: PLAN_INSTRUCTIONS });\n case \"exit\":\n return JSON.stringify({ ok: true, mode, message: NORMAL_INSTRUCTIONS });\n case \"status\":\n return JSON.stringify({ ok: true, mode, message: `Current mode: ${mode}` });\n default:\n return undefined;\n }\n}\n\nfunction invalidAction(action: string): string {\n return JSON.stringify({\n ok: false,\n error: \"invalid_action\",\n message: `Unknown action '${action}'. Valid: enter, exit, status.`,\n });\n}\n\nexport function createPlanModeTool(): PlanModeTool;\nexport function createPlanModeTool(options: PlanModeToolOptions): PlanModeToolWithStore;\nexport function createPlanModeTool(\n options?: PlanModeToolOptions,\n): PlanModeTool | PlanModeToolWithStore {\n let mode: Mode = \"normal\";\n\n if (options === undefined) {\n return {\n name: \"plan_mode\",\n description: DESCRIPTION,\n inputSchema: planModeSchema(false),\n handler: (input: { action: string }): string => {\n if (input.action === \"enter\") mode = \"plan\";\n else if (input.action === \"exit\") mode = \"normal\";\n return renderMode(input.action, mode) ?? invalidAction(input.action);\n },\n currentMode: () => mode,\n };\n }\n\n const { artifactStore, artifactId = \"plan\" } = options;\n return {\n name: \"plan_mode\",\n description: DESCRIPTION,\n inputSchema: planModeSchema(true),\n handler: async (input: { action: string; plan?: string }): Promise<string> => {\n if (input.action === \"enter\") {\n mode = \"plan\";\n return JSON.stringify({ ok: true, mode, message: PLAN_INSTRUCTIONS });\n }\n if (input.action === \"exit\") {\n mode = \"normal\";\n // Persist only a non-empty plan (EC-1); enter/status never persist (EC-2).\n if (typeof input.plan === \"string\" && input.plan.length > 0) {\n const path = await artifactStore.write(artifactId, input.plan);\n return JSON.stringify({\n ok: true,\n mode,\n message: NORMAL_INSTRUCTIONS,\n persisted: true,\n path,\n });\n }\n return JSON.stringify({ ok: true, mode, message: NORMAL_INSTRUCTIONS, persisted: false });\n }\n return renderMode(input.action, mode) ?? invalidAction(input.action);\n },\n currentMode: () => mode,\n };\n}\n","/**\n * `question` — interactive tool that asks the user a question and waits for a response.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, answer: string }`\n * - `{ ok: false, error: \"timeout\" }`\n */\n\nexport interface QuestionToolOptions {\n /** Callback that presents a question to the user and resolves with their answer. */\n askUser: (question: string) => Promise<string>;\n /** Maximum time to wait for user response in ms. Default: 300_000 (5 min). */\n timeoutMs?: number;\n}\n\nexport interface QuestionTool {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: { question: string }) => Promise<string>;\n}\n\nexport function createQuestionTool(opts: QuestionToolOptions): QuestionTool {\n const timeoutMs = opts.timeoutMs ?? 300_000;\n\n return {\n name: \"question\",\n description:\n \"Ask the user a question and wait for their response. \" +\n \"Use when you need clarification or confirmation before proceeding. \" +\n \"Returns { ok, answer } or { ok: false, error: 'timeout' }.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n question: { type: \"string\", description: \"The question to ask the user.\" },\n },\n required: [\"question\"],\n },\n handler: async (input: { question: string }): Promise<string> => {\n const timeout = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(\"timeout\")), timeoutMs);\n });\n\n try {\n const answer = await Promise.race([opts.askUser(input.question), timeout]);\n return JSON.stringify({ ok: true, answer });\n } catch (err) {\n if (err instanceof Error && err.message === \"timeout\") {\n return JSON.stringify({\n ok: false,\n error: \"timeout\",\n message: \"User did not respond within timeout.\",\n });\n }\n throw err;\n }\n },\n };\n}\n","/**\n * `read_file` — built-in tool for coding agents.\n *\n * Reads a project-relative file as UTF-8 and returns its contents.\n * Hardened against the four bug families a coding agent normally hits:\n *\n * 1. **Path traversal** — `safePathJoin` rejects literal `..`,\n * normalised escape, absolute segments, null-byte injection.\n * 2. **Symlink escape** — `assertNoSymlinkEscape` follows the full\n * chain (and any intermediate symlinks; defence-in-depth fix v1.x).\n * 3. **Sensitive files** — `isForbiddenPath` blocks `.env*` (except\n * `.env.example`), `.git/`, `node_modules/`, `.theo/`, lock files.\n * 4. **Binary files** — null-byte check on the first 8 KB. PNG/JPEG/\n * compiled binaries return a structured `binary_file` error\n * instead of garbled UTF-8 (EC-5 from the TheoKit Studio review).\n *\n * Return shape (always a JSON string the LLM consumes):\n * - `{ ok: true, content: string }` on success\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' |\n * 'binary_file' | 'not_found' | 'too_large' }` on refusal\n *\n * The handler intentionally never throws on a \"user mistake\"\n * (traversal / forbidden / not found). Throwing reserved for SDK-side\n * mistakes that should crash the agent loop (input parse errors).\n */\n\nimport { type FileHandle, open } from \"node:fs/promises\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\n/** Max single-file read size, in bytes. 5 MB ceiling — enough for any source file. */\nconst MAX_FILE_SIZE = 5 * 1024 * 1024;\n\n/** Byte window inspected for null bytes when deciding binary vs text. */\nconst BINARY_PROBE_BYTES = 8 * 1024;\n\nexport interface CreateReadFileToolOptions {\n /** Absolute path to the project root. Every read is gated against this boundary. */\n projectRoot: string;\n}\n\nexport function createReadFileTool(opts: CreateReadFileToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"read_file\",\n description:\n \"Read a single project-relative text file as UTF-8. Refuses paths \" +\n \"that escape the project root, are in the sensitive-file blocklist \" +\n \"(.env, .git/, node_modules/, .theo/, lock files), or contain a null \" +\n \"byte in the first 8 KB (binary file). Returns { ok, content } or \" +\n \"{ ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative file path.\"),\n }),\n handler: async ({ path }) => {\n if (isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n const boundary = resolveBoundary(path, projectRoot);\n if (\"error\" in boundary) return boundary.error;\n const opened = await openHandleSafe(boundary.absolutePath, path);\n if (\"error\" in opened) return opened.error;\n try {\n return await readContent(opened.handle, path);\n } finally {\n await opened.handle.close();\n }\n },\n });\n}\n\nfunction resolveBoundary(\n path: string,\n projectRoot: string,\n): { absolutePath: string } | { error: string } {\n try {\n const absolutePath = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n return { absolutePath };\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return { error: JSON.stringify({ ok: false, error: \"path_traversal\", path }) };\n }\n throw err;\n }\n}\n\nasync function openHandleSafe(\n absolutePath: string,\n path: string,\n): Promise<{ handle: FileHandle } | { error: string }> {\n try {\n const handle = await open(absolutePath, \"r\");\n return { handle };\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\") {\n return { error: JSON.stringify({ ok: false, error: \"not_found\", path }) };\n }\n throw err;\n }\n}\n\nasync function readContent(handle: FileHandle, path: string): Promise<string> {\n const stat = await handle.stat();\n if (stat.size > MAX_FILE_SIZE) {\n return JSON.stringify({\n ok: false,\n error: \"too_large\",\n path,\n size: stat.size,\n limit: MAX_FILE_SIZE,\n });\n }\n if (await isBinaryProbe(handle, Number(stat.size))) {\n return JSON.stringify({ ok: false, error: \"binary_file\", path, size: stat.size });\n }\n const content = await handle.readFile({ encoding: \"utf-8\" });\n return JSON.stringify({ ok: true, content, size: stat.size });\n}\n\nasync function isBinaryProbe(handle: FileHandle, size: number): Promise<boolean> {\n const probeLen = Math.min(BINARY_PROBE_BYTES, size);\n if (probeLen <= 0) return false;\n const probe = Buffer.alloc(probeLen);\n const { bytesRead } = await handle.read(probe, 0, probeLen, 0);\n for (let i = 0; i < bytesRead; i += 1) {\n if (probe[i] === 0) return true;\n }\n return false;\n}\n","/**\n * `run_vitest` — built-in tool for coding agents.\n *\n * Runs vitest against an optional file/pattern scope and returns the\n * parsed JSON report. Hardened against the same subprocess failure\n * modes as `git_diff`:\n *\n * - 120s wall clock timeout (vitest can be slow on first run)\n * - Process group kill on timeout (EC-7 — defeats vitest workers as\n * grandchildren of the spawned shell)\n * - **EC-12**: vitest stdout may contain deprecation warnings BEFORE\n * the JSON payload. The parser scans line-by-line and extracts the\n * LAST valid JSON object, not the first.\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, summary: { numTotalTests, numPassedTests, numFailedTests, success } }`\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' | 'timeout' |\n * 'no_vitest' | 'unparseable_output' }`\n *\n * Implementation note: invokes vitest via `npx --no-install vitest`. The\n * `--no-install` avoids the agent triggering a multi-megabyte download\n * mid-turn if vitest is missing — the tool fails cleanly with\n * `no_vitest` instead.\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport { isForbiddenPath } from \"./internal/path-guard.js\";\nimport { checkPathScope } from \"./path-scope.js\";\nimport { armTimeoutKill, attachChildSettlers } from \"./subprocess.js\";\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst DEFAULT_MAX_STDOUT_BYTES = 10 * 1024 * 1024;\n\nexport interface CreateRunVitestToolOptions {\n projectRoot: string;\n timeoutMs?: number;\n maxStdoutBytes?: number;\n}\n\nexport interface VitestSummary {\n numTotalTests?: number;\n numPassedTests?: number;\n numFailedTests?: number;\n success?: boolean;\n}\n\nexport function createRunVitestTool(opts: CreateRunVitestToolOptions): CustomTool {\n const {\n projectRoot,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n maxStdoutBytes = DEFAULT_MAX_STDOUT_BYTES,\n } = opts;\n\n return defineTool({\n name: \"run_vitest\",\n description:\n \"Run the project's vitest suite, optionally scoped to a file or \" +\n \"pattern via 'path'. Returns parsed { ok, summary } or { ok: false, \" +\n \"error }. Vitest stdout warnings are stripped — the parser extracts \" +\n \"the trailing JSON report.\",\n inputSchema: z.object({\n path: z\n .string()\n .optional()\n .describe(\"Optional vitest pattern or file path (project-relative).\"),\n }),\n handler: async ({ path }) => {\n const scopeError = validateVitestScope(path, projectRoot);\n if (scopeError !== null) return scopeError;\n\n const args = [\"--no-install\", \"vitest\", \"run\", \"--reporter=json\"];\n if (path !== undefined && path !== \"\") args.push(path);\n\n const result = await runProcess(projectRoot, \"npx\", args, timeoutMs, maxStdoutBytes);\n return formatVitestResult(result, timeoutMs);\n },\n });\n}\n\nfunction validateVitestScope(path: string | undefined, projectRoot: string): string | null {\n if (path !== undefined && path !== \"\" && isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n return checkPathScope(path, projectRoot);\n}\n\nfunction formatVitestResult(result: ProcessResult, timeoutMs: number): string {\n if (result.kind === \"timeout\") {\n return JSON.stringify({ ok: false, error: \"timeout\", timeoutMs });\n }\n if (result.kind === \"spawn_error\") {\n return JSON.stringify({ ok: false, error: \"no_vitest\", detail: result.message });\n }\n const summary = extractTrailingJson(result.stdout) as VitestSummary | null;\n if (summary === null) {\n return JSON.stringify({\n ok: false,\n error: \"unparseable_output\",\n stderrPreview: result.stderr.slice(0, 500),\n });\n }\n return JSON.stringify({ ok: true, summary });\n}\n\n/**\n * Find the LAST line in `stdout` that parses as a JSON object. Vitest\n * prepends node deprecation warnings to its JSON reporter output — if\n * we naively `JSON.parse(stdout)` we get a SyntaxError. Workaround: walk\n * lines bottom-up and return the first one that parses.\n *\n * Exported for direct unit testing without spawning vitest.\n */\nexport function extractTrailingJson(stdout: string): unknown {\n const lines = stdout.split(/\\r?\\n/);\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const line = lines[i]!.trim();\n if (line.length === 0) continue;\n if (line[0] !== \"{\" && line[0] !== \"[\") continue;\n try {\n return JSON.parse(line) as unknown;\n } catch {\n // not valid JSON — keep looking\n }\n }\n return null;\n}\n\nfunction appendCapped(chunks: Buffer[], chunk: Buffer, current: number, cap: number): number {\n if (current >= cap) return current;\n const remaining = cap - current;\n if (chunk.length > remaining) {\n chunks.push(chunk.subarray(0, remaining));\n return cap;\n }\n chunks.push(chunk);\n return current + chunk.length;\n}\n\ntype ProcessResult =\n | { kind: \"ok\"; stdout: string; stderr: string; exitCode: number }\n | { kind: \"timeout\" }\n | { kind: \"spawn_error\"; message: string };\n\nfunction runProcess(\n cwd: string,\n command: string,\n args: string[],\n timeoutMs: number,\n maxStdoutBytes: number,\n): Promise<ProcessResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n cwd,\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let stdoutBytes = 0;\n\n const gate = armTimeoutKill<ProcessResult>(\n child,\n timeoutMs,\n () => ({ kind: \"timeout\" }),\n resolve,\n );\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n stdoutBytes = appendCapped(stdoutChunks, chunk, stdoutBytes, maxStdoutBytes);\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderrChunks.push(chunk);\n });\n\n attachChildSettlers<ProcessResult>(\n child,\n gate,\n (code) => ({\n kind: \"ok\",\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n exitCode: code ?? 0,\n }),\n (err) => ({ kind: \"spawn_error\", message: err.message }),\n resolve,\n );\n });\n}\n","/**\n * `search_text` — built-in tool for coding agents.\n *\n * Literal text search across the project tree (recursive). Sensible\n * defaults:\n *\n * - Skips forbidden directories (`.env`, `.git/`, `node_modules/`,\n * `.theo/`) so the agent never wastes context on dependency soup\n * or VCS internals.\n * - Skips files larger than `maxFileSize` (default 1 MB) and binary\n * files (null-byte detection on first 8 KB) so a megabyte of\n * minified JS never blows up the result.\n * - Caps total matches at `maxMatches` (default 100) — the agent\n * should refine the query if it gets close to the cap.\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, matches: Array<{ file, line, preview }>, truncated, totalMatches }`\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' | 'not_found' }`\n *\n * Implementation note: this is a plain JS recursive walk. For very\n * large repos a future iteration can shell out to `rg` (ripgrep) when\n * present, but the JS path stays as the dependency-free fallback.\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, relative as relativePath } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nconst DEFAULT_MAX_MATCHES = 100;\nconst DEFAULT_MAX_FILE_SIZE = 1024 * 1024; // 1 MB\nconst BINARY_PROBE_BYTES = 8 * 1024;\nconst PREVIEW_MAX = 200;\n\nexport interface CreateSearchTextToolOptions {\n projectRoot: string;\n /** Cap on total matches returned. Default 100. */\n maxMatches?: number;\n /** Skip files larger than this (bytes). Default 1 MB. */\n maxFileSize?: number;\n}\n\ninterface Match {\n file: string;\n line: number;\n preview: string;\n}\n\nexport function createSearchTextTool(opts: CreateSearchTextToolOptions): CustomTool {\n const {\n projectRoot,\n maxMatches = DEFAULT_MAX_MATCHES,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n } = opts;\n\n return defineTool({\n name: \"search_text\",\n description:\n `Search the project tree for a literal text query. Skips sensitive ` +\n `dirs (.env/.git/node_modules/.theo), binary files, and files over ` +\n `1 MB. Returns up to ${String(maxMatches)} matches as { file, line, preview }. ` +\n `Use 'path' to scope the search to a subdirectory.`,\n inputSchema: z.object({\n query: z.string().min(1).describe(\"Literal text to search for. Case-sensitive.\"),\n path: z\n .string()\n .optional()\n .describe(\"Optional project-relative directory to scope the search.\"),\n }),\n handler: async ({ query, path }) => {\n const scope = resolveSearchScope(path, projectRoot);\n if (\"error\" in scope) return scope.error;\n const state: SearchState = {\n matches: [],\n totalMatches: 0,\n truncated: false,\n query,\n maxMatches,\n maxFileSize,\n projectRoot,\n };\n await walk(scope.scopeAbs, state);\n return JSON.stringify({\n ok: true,\n matches: state.matches,\n truncated: state.truncated,\n totalMatches: state.totalMatches,\n });\n },\n });\n}\n\ninterface SearchState {\n matches: Match[];\n totalMatches: number;\n truncated: boolean;\n query: string;\n maxMatches: number;\n maxFileSize: number;\n projectRoot: string;\n}\n\nfunction resolveSearchScope(\n path: string | undefined,\n projectRoot: string,\n): { scopeAbs: string } | { error: string } {\n const scopeRel = path === undefined || path === \"\" || path === \".\" ? \".\" : path;\n try {\n const scopeAbs = scopeRel === \".\" ? projectRoot : safePathJoin(projectRoot, scopeRel);\n assertNoSymlinkEscape(scopeAbs, projectRoot);\n return { scopeAbs };\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return { error: JSON.stringify({ ok: false, error: \"path_traversal\", path }) };\n }\n throw err;\n }\n}\n\nasync function handleEntry(entry: Dirent, absDir: string, state: SearchState): Promise<void> {\n const entryAbs = join(absDir, entry.name);\n const entryRel = relativePath(state.projectRoot, entryAbs);\n if (isForbiddenPath(entryRel)) return;\n if (entry.isDirectory()) {\n await walk(entryAbs, state);\n return;\n }\n if (entry.isFile()) await scanFile(entryAbs, entryRel, state);\n}\n\nasync function walk(absDir: string, state: SearchState): Promise<void> {\n if (state.truncated) return;\n const entries = await readEntriesQuiet(absDir);\n if (entries === null) return;\n for (const entry of entries) {\n if (state.truncated) return;\n await handleEntry(entry, absDir, state);\n }\n}\n\nasync function readEntriesQuiet(absDir: string): Promise<Dirent[] | null> {\n try {\n return await readdir(absDir, { withFileTypes: true });\n } catch {\n return null;\n }\n}\n\nasync function readBufferQuiet(absPath: string): Promise<Buffer | null> {\n try {\n return await readFile(absPath);\n } catch {\n return null;\n }\n}\n\nfunction isBinaryBuffer(buffer: Buffer): boolean {\n const probeEnd = Math.min(buffer.length, BINARY_PROBE_BYTES);\n for (let i = 0; i < probeEnd; i += 1) {\n if (buffer[i] === 0) return true;\n }\n return false;\n}\n\nfunction recordMatch(state: SearchState, file: string, line: number, lineText: string): boolean {\n state.totalMatches += 1;\n if (state.matches.length < state.maxMatches) {\n state.matches.push({\n file,\n line,\n preview: lineText.length > PREVIEW_MAX ? `${lineText.slice(0, PREVIEW_MAX)}…` : lineText,\n });\n return true;\n }\n state.truncated = true;\n return false;\n}\n\nasync function scanFile(absPath: string, relPath: string, state: SearchState): Promise<void> {\n const buffer = await readBufferQuiet(absPath);\n if (buffer === null || buffer.length > state.maxFileSize) return;\n if (isBinaryBuffer(buffer)) return;\n const lines = buffer.toString(\"utf-8\").split(\"\\n\");\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i]!;\n if (!line.includes(state.query)) continue;\n if (!recordMatch(state, relPath, i + 1, line)) return;\n }\n}\n","/**\n * `shell_exec` — built-in tool for coding agents.\n *\n * Executes a shell command via `/bin/sh -c` with a configurable timeout\n * and output size cap.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, stdout, stderr, exit_code }`\n * - `{ ok: false, error: 'timeout' | 'exec_failed' }`\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport { CatastrophicCommandError, catastrophicShellReason } from \"./internal/shell-guard.js\";\nimport { armTimeoutKill, attachChildSettlers } from \"./subprocess.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 300_000; // 5 minutes hard ceiling\nconst MAX_OUTPUT_BYTES = 5 * 1024 * 1024; // 5 MB\n\nexport interface CreateShellToolOptions {\n /** Absolute path to the project root. Commands execute in this cwd. */\n projectRoot: string;\n /** Default timeout in ms. Capped at 300s. */\n defaultTimeoutMs?: number;\n /**\n * Opt out of the catastrophic-command guardrail. Default `false` (the\n * guardrail screens every command before spawn). Set `true` only when the\n * agent legitimately needs destructive power flows — it is a heuristic\n * guardrail, not a sandbox.\n */\n allowCatastrophic?: boolean;\n}\n\nexport function createShellTool(opts: CreateShellToolOptions): CustomTool {\n const { projectRoot, defaultTimeoutMs = DEFAULT_TIMEOUT_MS, allowCatastrophic = false } = opts;\n\n return defineTool({\n name: \"shell_exec\",\n description:\n \"Execute a shell command in the project directory. Returns stdout, \" +\n \"stderr, and exit code. Default timeout 30s, max 5 minutes. Output \" +\n \"capped at 5 MB. Returns { ok, stdout, stderr, exit_code } or \" +\n \"{ ok: false, error }.\",\n inputSchema: z.object({\n command: z.string().min(1).describe(\"Shell command to execute.\"),\n timeout_ms: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Timeout in milliseconds (default 30000, max 300000).\"),\n }),\n handler: async ({ command, timeout_ms }) => {\n if (!allowCatastrophic) {\n const reason = catastrophicShellReason(command);\n if (reason) {\n // Construct the typed error so its `code` is the single source of the\n // error string (mirrors web_fetch's SsrfBlockedError handling).\n const err = new CatastrophicCommandError(reason);\n return JSON.stringify({ ok: false, error: err.code, reason });\n }\n }\n const timeoutMs = Math.min(timeout_ms ?? defaultTimeoutMs, MAX_TIMEOUT_MS);\n const result = await runShell(projectRoot, command, timeoutMs);\n return result;\n },\n });\n}\n\ntype ShellResult =\n | { kind: \"ok\"; stdout: string; stderr: string; exitCode: number | null }\n | { kind: \"timeout\" }\n | { kind: \"error\"; message: string };\n\nfunction runShell(cwd: string, command: string, timeoutMs: number): Promise<string> {\n return new Promise((resolve) => {\n const child = spawn(\"/bin/sh\", [\"-c\", command], {\n cwd,\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let stdoutBytes = 0;\n let stderrBytes = 0;\n let _truncated = false;\n\n const gate = armTimeoutKill<ShellResult>(\n child,\n timeoutMs,\n () => ({ kind: \"timeout\" }),\n (result) => resolve(formatResult(result, timeoutMs)),\n );\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n if (stdoutBytes >= MAX_OUTPUT_BYTES) {\n _truncated = true;\n return;\n }\n const remaining = MAX_OUTPUT_BYTES - stdoutBytes;\n if (chunk.length > remaining) {\n stdoutChunks.push(chunk.subarray(0, remaining));\n stdoutBytes = MAX_OUTPUT_BYTES;\n _truncated = true;\n } else {\n stdoutChunks.push(chunk);\n stdoutBytes += chunk.length;\n }\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n if (stderrBytes >= MAX_OUTPUT_BYTES) return;\n const remaining = MAX_OUTPUT_BYTES - stderrBytes;\n if (chunk.length > remaining) {\n stderrChunks.push(chunk.subarray(0, remaining));\n stderrBytes = MAX_OUTPUT_BYTES;\n } else {\n stderrChunks.push(chunk);\n stderrBytes += chunk.length;\n }\n });\n\n attachChildSettlers<ShellResult>(\n child,\n gate,\n (code) => ({\n kind: \"ok\",\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n exitCode: code,\n }),\n (err) => ({ kind: \"error\", message: err.message }),\n (result) => resolve(formatResult(result, timeoutMs)),\n );\n });\n}\n\nfunction formatResult(result: ShellResult, timeoutMs: number): string {\n if (result.kind === \"timeout\") {\n return JSON.stringify({ ok: false, error: \"timeout\", timeout_ms: timeoutMs });\n }\n if (result.kind === \"error\") {\n return JSON.stringify({ ok: false, error: \"exec_failed\", message: result.message });\n }\n return JSON.stringify({\n ok: true,\n stdout: result.stdout,\n stderr: result.stderr,\n exit_code: result.exitCode,\n });\n}\n","import type { TodoItem } from \"./todolist.js\";\n\n/**\n * A flat plan-render node — the stable shape a UI/plan layer consumes. Mirrors\n * the `TodoItem` status union; `label` is the item title.\n *\n * @public\n */\nexport interface PlanNode {\n id: string;\n label: string;\n status: \"pending\" | \"in_progress\" | \"done\";\n}\n\n/**\n * Convert structured todo items (from a `todolist` tool result's `items`, M4-5)\n * into versioned `PlanNode`s for rendering. Pure: projects EXACTLY\n * `{ id, label, status }` (timestamps are intentionally dropped), preserving\n * input order. Replaces consumer-side hand-rolled mappers.\n *\n * @public\n */\nexport function todoItemsToPlanNodes(items: readonly TodoItem[]): PlanNode[] {\n return items.map((item) => ({ id: item.id, label: item.title, status: item.status }));\n}\n","/**\n * `todolist` — in-session task tracking for multi-step work.\n *\n * The agent uses this to plan complex tasks and track progress.\n * Inspired by OpenCode's todo.ts and Claude Code's TodoWrite.\n *\n * Actions:\n * - add(title) → add a new todo item\n * - complete(id) → mark an item done\n * - remove(id) → remove an item\n * - list() → show all items with status\n * - clear_completed() → remove all done items\n */\n\nexport interface TodoItem {\n id: string;\n title: string;\n status: \"pending\" | \"in_progress\" | \"done\";\n createdAt: number;\n completedAt?: number;\n}\n\nexport interface TodolistTool {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: TodoInput) => string;\n /** Expose items for testing. */\n getItems: () => TodoItem[];\n}\n\ntype TodoInput =\n | { action: \"add\"; title: string }\n | { action: \"complete\"; id: string }\n | { action: \"in_progress\"; id: string }\n | { action: \"remove\"; id: string }\n | { action: \"list\" }\n | { action: \"clear_completed\" };\n\nfunction ok(data: Record<string, unknown>): string {\n return JSON.stringify({ ok: true, ...data });\n}\n\nfunction fail(data: Record<string, unknown>): string {\n return JSON.stringify({ ok: false, ...data });\n}\n\nfunction requireId(input: TodoInput): string | null {\n if (!(\"id\" in input) || !input.id) return null;\n return input.id;\n}\n\nexport function createTodolistTool(): TodolistTool {\n const items: TodoItem[] = [];\n let nextId = 1;\n\n function genId(): string {\n return `todo-${nextId++}`;\n }\n\n function findById(id: string): TodoItem | undefined {\n return items.find((i) => i.id === id);\n }\n\n // M4-5: every list-bearing success result carries BOTH the human `items_summary`\n // (for the LLM) AND the structured `items` snapshot (for programmatic consumers\n // that render a plan/UI). Previously only `items_summary` was emitted, so a\n // consumer parsing the result could never recover structured items.\n function listResult(extra: Record<string, unknown>): string {\n return ok({ ...extra, items: [...items], items_summary: formatList() });\n }\n\n function formatList(): string {\n if (items.length === 0) return \"No tasks. Use action 'add' to create one.\";\n const lines = items.map((item) => {\n const icon = item.status === \"done\" ? \"[x]\" : item.status === \"in_progress\" ? \"[>]\" : \"[ ]\";\n return `${icon} ${item.id}: ${item.title}`;\n });\n const pending = items.filter((i) => i.status === \"pending\").length;\n const inProg = items.filter((i) => i.status === \"in_progress\").length;\n const done = items.filter((i) => i.status === \"done\").length;\n lines.push(`\\n${done}/${items.length} done | ${inProg} in progress | ${pending} pending`);\n return lines.join(\"\\n\");\n }\n\n function handleAdd(input: TodoInput): string {\n if (!(\"title\" in input) || !input.title) return fail({ error: \"missing_title\" });\n const item: TodoItem = {\n id: genId(),\n title: input.title,\n status: \"pending\",\n createdAt: Date.now(),\n };\n items.push(item);\n return listResult({ id: item.id, message: `Added: ${item.title}` });\n }\n\n function handleSetStatus(input: TodoInput, status: \"in_progress\" | \"done\"): string {\n const id = requireId(input);\n if (!id) return fail({ error: \"missing_id\" });\n const item = findById(id);\n if (!item) return fail({ error: \"not_found\", id });\n item.status = status;\n if (status === \"done\") item.completedAt = Date.now();\n const verb = status === \"done\" ? \"Completed\" : \"Started\";\n return listResult({ message: `${verb}: ${item.title}` });\n }\n\n function handleRemove(input: TodoInput): string {\n const id = requireId(input);\n if (!id) return fail({ error: \"missing_id\" });\n const idx = items.findIndex((i) => i.id === id);\n if (idx === -1) return fail({ error: \"not_found\", id });\n const removed = items.splice(idx, 1)[0]!;\n return listResult({ message: `Removed: ${removed.title}` });\n }\n\n function handleClearCompleted(): string {\n const before = items.length;\n const kept = items.filter((i) => i.status !== \"done\");\n items.length = 0;\n items.push(...kept);\n return listResult({ message: `Cleared ${before - items.length} completed items` });\n }\n\n const actions: Record<string, (input: TodoInput) => string> = {\n add: handleAdd,\n in_progress: (input) => handleSetStatus(input, \"in_progress\"),\n complete: (input) => handleSetStatus(input, \"done\"),\n remove: handleRemove,\n list: () => listResult({}),\n clear_completed: handleClearCompleted,\n };\n\n return {\n name: \"todolist\",\n description:\n \"Track multi-step task progress. \" +\n \"Actions: 'add' (create task with title), 'complete' (mark done by id), \" +\n \"'in_progress' (mark started by id), 'remove' (delete by id), \" +\n \"'list' (show all), 'clear_completed' (remove done items). \" +\n \"Returns { ok, items, items_summary } (items = structured array; items_summary = formatted text).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n action: {\n type: \"string\",\n enum: [\"add\", \"complete\", \"in_progress\", \"remove\", \"list\", \"clear_completed\"],\n description: \"The action to perform.\",\n },\n title: {\n type: \"string\",\n description: \"Title for a new todo item (required for 'add').\",\n },\n id: {\n type: \"string\",\n description: \"ID of the todo item (required for 'complete', 'in_progress', 'remove').\",\n },\n },\n required: [\"action\"],\n },\n handler: (input: TodoInput): string => {\n const action = actions[input.action];\n if (!action) return fail({ error: \"invalid_action\" });\n return action(input);\n },\n getItems: () => [...items],\n };\n}\n","/**\n * `truncateOutput` — utility for truncating large tool output.\n *\n * When output exceeds `maxBytes`, writes the full content to a temp file\n * and returns a truncated version with a reference to the full output.\n *\n * Return shape:\n * - `{ content: string, truncated: false }`\n * - `{ content: string, truncated: true, overflowPath: string }`\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface TruncationOptions {\n /** Maximum output size in bytes before truncation. Default: 30_000. */\n maxBytes?: number;\n /** Directory for overflow files. Default: \".theocode/tool-output\". */\n outputDir?: string;\n}\n\nexport interface TruncationResult {\n /** The (possibly truncated) content. */\n content: string;\n /** Whether the output was truncated. */\n truncated: boolean;\n /** Path to the full output file, present only when truncated. */\n overflowPath?: string;\n}\n\nexport function truncateOutput(output: string, opts?: TruncationOptions): TruncationResult {\n const maxBytes = opts?.maxBytes ?? 30_000;\n const outputDir = opts?.outputDir ?? \".theocode/tool-output\";\n\n // EC-3: strict > comparison — exactly at limit is NOT truncated\n const byteLength = Buffer.byteLength(output, \"utf-8\");\n if (byteLength <= maxBytes) {\n return { content: output, truncated: false };\n }\n\n // Write full output to overflow file\n mkdirSync(outputDir, { recursive: true });\n const filename = `overflow-${Date.now()}.txt`;\n const overflowPath = join(outputDir, filename);\n writeFileSync(overflowPath, output, \"utf-8\");\n\n // Truncate to maxBytes (approximate — cut at byte boundary then trim to valid UTF-8)\n const truncated = Buffer.from(output, \"utf-8\").subarray(0, maxBytes).toString(\"utf-8\");\n const trailer = `\\n\\n[Output truncated. Full output: ${overflowPath}]`;\n\n return {\n content: truncated + trailer,\n truncated: true,\n overflowPath,\n };\n}\n","/**\n * `web_fetch` — built-in tool for coding agents.\n *\n * Fetches a URL via native `fetch()`. Rejects non-http(s) protocols.\n * Size-capped at 1 MB response body.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, content, status_code, content_type }`\n * - `{ ok: false, error: 'invalid_url' | 'fetch_failed' |\n * 'timeout' | 'too_large' }`\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\n\nimport { SsrfBlockedError, screenedFetch } from \"./internal/network-guard.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_BODY_BYTES = 1 * 1024 * 1024; // 1 MB\n\nexport interface CreateWebFetchToolOptions {\n /** Default timeout in ms. */\n defaultTimeoutMs?: number;\n /**\n * Opt out of the SSRF guard (default `false`). When `true`, requests to\n * private/loopback/link-local/metadata addresses are NOT blocked — use only for\n * trusted local-dev tooling.\n */\n allowPrivateHosts?: boolean;\n}\n\nexport function createWebFetchTool(opts?: CreateWebFetchToolOptions): CustomTool {\n const defaultTimeoutMs = opts?.defaultTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n const allowPrivateHosts = opts?.allowPrivateHosts ?? false;\n\n return defineTool({\n name: \"web_fetch\",\n description:\n \"Fetch content from a URL via HTTP/HTTPS. Rejects non-http(s) URLs. \" +\n \"Response body capped at 1 MB. Returns { ok, content, status_code } \" +\n \"or { ok: false, error }.\",\n inputSchema: z.object({\n url: z.string().min(1).describe(\"URL to fetch (http or https only).\"),\n timeout_ms: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Timeout in milliseconds (default 30000).\"),\n }),\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: fetch with guards\n handler: async ({ url, timeout_ms }) => {\n // Validate protocol\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return JSON.stringify({ ok: false, error: \"invalid_url\", url });\n }\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return JSON.stringify({\n ok: false,\n error: \"invalid_url\",\n url,\n detail: \"only http and https protocols allowed\",\n });\n }\n\n const timeoutMs = timeout_ms ?? defaultTimeoutMs;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await screenedFetch(url, {\n signal: controller.signal,\n allowPrivateHosts,\n });\n clearTimeout(timer);\n\n // Check content-length header before downloading\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && Number(contentLength) > MAX_BODY_BYTES) {\n return JSON.stringify({\n ok: false,\n error: \"too_large\",\n url,\n size: Number(contentLength),\n limit: MAX_BODY_BYTES,\n });\n }\n\n const buffer = await response.arrayBuffer();\n if (buffer.byteLength > MAX_BODY_BYTES) {\n return JSON.stringify({\n ok: false,\n error: \"too_large\",\n url,\n size: buffer.byteLength,\n limit: MAX_BODY_BYTES,\n });\n }\n\n const content = new TextDecoder(\"utf-8\").decode(buffer);\n const contentType = response.headers.get(\"content-type\") ?? undefined;\n\n return JSON.stringify({\n ok: true,\n content,\n status_code: response.status,\n content_type: contentType,\n });\n } catch (err) {\n clearTimeout(timer);\n if (err instanceof SsrfBlockedError) {\n return JSON.stringify({ ok: false, error: \"ssrf_blocked\", url, reason: err.message });\n }\n const e = err as { name?: string; message?: string };\n if (e.name === \"AbortError\") {\n return JSON.stringify({ ok: false, error: \"timeout\", url, timeout_ms: timeoutMs });\n }\n return JSON.stringify({\n ok: false,\n error: \"fetch_failed\",\n url,\n message: e.message ?? \"unknown\",\n });\n }\n },\n });\n}\n","/**\n * `web_search` — built-in tool for coding agents.\n *\n * Accepts a search callback via DIP (consumer provides the search\n * provider). The tool itself is provider-agnostic.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, results: Array<{ title, url, snippet }> }`\n * - `{ ok: false, error: 'search_failed' | 'no_provider' }`\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\n\nexport interface WebSearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\nexport type WebSearchCallback = (query: string, maxResults: number) => Promise<WebSearchResult[]>;\n\nexport interface CreateWebSearchToolOptions {\n /** Search provider callback — consumer injects the implementation. */\n search: WebSearchCallback;\n /** Default max results if not specified by the LLM. */\n defaultMaxResults?: number;\n}\n\nexport function createWebSearchTool(opts: CreateWebSearchToolOptions): CustomTool {\n const { search, defaultMaxResults = 5 } = opts;\n\n return defineTool({\n name: \"web_search\",\n description:\n \"Search the web for a query. Returns a list of results with title, \" +\n \"URL, and snippet. The search provider is injected by the consumer. \" +\n \"Returns { ok, results } or { ok: false, error }.\",\n inputSchema: z.object({\n query: z.string().min(1).describe(\"Search query.\"),\n max_results: z\n .number()\n .int()\n .positive()\n .max(20)\n .optional()\n .describe(\"Maximum results to return (default 5, max 20).\"),\n }),\n handler: async ({ query, max_results }) => {\n const maxResults = max_results ?? defaultMaxResults;\n\n try {\n const results = await search(query, maxResults);\n return JSON.stringify({\n ok: true,\n results: results.slice(0, maxResults),\n count: Math.min(results.length, maxResults),\n });\n } catch (err) {\n const e = err as { message?: string };\n return JSON.stringify({\n ok: false,\n error: \"search_failed\",\n message: e.message ?? \"unknown\",\n });\n }\n },\n });\n}\n","/**\n * Brave Search adapter for `createWebSearchTool` (M3-7).\n *\n * `createBraveWebSearchAdapter()` returns a `WebSearchCallback` that queries the\n * Brave Search API using an env-driven key (`BRAVE_API_KEY`). It plugs into the\n * provider-agnostic `createWebSearchTool` via its callback seam — the tool is NOT\n * modified. The `fetch` impl is injectable (default `globalThis.fetch`) so the\n * adapter is offline-testable; a plain fetch (not `screenedFetch`) is used because\n * the endpoint host is fixed (no SSRF surface) and `screenedFetch` cannot carry\n * the required auth header. Zero new dependencies. Design: blueprint m3-websearch-adapter.\n */\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\nimport type { WebSearchCallback, WebSearchResult } from \"./web-search.js\";\n\nconst BRAVE_ENDPOINT = \"https://api.search.brave.com/res/v1/web/search\";\n\ntype FetchLike = (url: string, init?: RequestInit) => Promise<Response>;\n\nexport interface CreateBraveWebSearchAdapterOptions {\n /** Brave API key. Defaults to `process.env.BRAVE_API_KEY`. */\n apiKey?: string;\n /** Injectable fetch (default `globalThis.fetch`) — set in tests for offline runs. */\n fetchImpl?: FetchLike;\n /** Override the Brave endpoint (self-host / test). */\n endpoint?: string;\n}\n\ninterface BraveResult {\n title?: unknown;\n url?: unknown;\n description?: unknown;\n}\n\n/**\n * Build a `WebSearchCallback` backed by the Brave Search API. Throws a typed\n * `ConfigurationError` (\"no_api_key\") at creation when no key is available.\n */\nexport function createBraveWebSearchAdapter(\n opts: CreateBraveWebSearchAdapterOptions = {},\n): WebSearchCallback {\n const apiKey = opts.apiKey ?? process.env.BRAVE_API_KEY;\n if (!apiKey) {\n throw new ConfigurationError(\"BRAVE_API_KEY is not set (pass { apiKey } or set the env var).\", {\n code: \"no_api_key\",\n });\n }\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const endpoint = opts.endpoint ?? BRAVE_ENDPOINT;\n // Validate the endpoint at creation (fail-early symmetry with the key check).\n const base = new URL(endpoint);\n\n return async (query: string, maxResults: number): Promise<WebSearchResult[]> => {\n const url = new URL(base);\n url.searchParams.set(\"q\", query);\n url.searchParams.set(\"count\", String(maxResults));\n const res = await fetchImpl(url.toString(), {\n headers: { \"X-Subscription-Token\": apiKey, Accept: \"application/json\" },\n });\n if (!res.ok) throw new Error(`brave_search_failed: HTTP ${res.status}`);\n const json = (await res.json()) as { web?: { results?: BraveResult[] } } | null;\n const results = json?.web?.results ?? [];\n return results.map((r) => ({\n title: String(r?.title ?? \"\"),\n url: String(r?.url ?? \"\"),\n snippet: String(r?.description ?? \"\"),\n }));\n };\n}\n","/**\n * `write_file` — built-in tool for coding agents.\n *\n * Writes UTF-8 content to a project-relative path. Creates parent\n * directories recursively. Refuses binary-file overwrites, path\n * traversal, and sensitive paths.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, path, bytes }` on success\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' |\n * 'binary_file' }` on refusal\n */\n\nimport { mkdir, open, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\n/** Byte window inspected for null bytes when deciding binary vs text. */\nconst BINARY_PROBE_BYTES = 8 * 1024;\n\nexport interface CreateWriteFileToolOptions {\n /** Absolute path to the project root. Every write is gated against this boundary. */\n projectRoot: string;\n}\n\nexport function createWriteFileTool(opts: CreateWriteFileToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"write_file\",\n description:\n \"Write UTF-8 content to a project-relative file. Creates parent \" +\n \"directories recursively. Refuses paths that escape the project root, \" +\n \"sensitive files (.env, .git/, node_modules/, .theo/, lock files), \" +\n \"and binary-file overwrites. Returns { ok, path, bytes } or \" +\n \"{ ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative file path.\"),\n content: z.string().describe(\"UTF-8 content to write.\"),\n }),\n handler: async ({ path, content }) => {\n if (isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n\n let absolutePath: string;\n try {\n absolutePath = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path });\n }\n throw err;\n }\n\n // Binary file guard: probe existing file for null bytes before overwriting\n if (await isBinaryFile(absolutePath)) {\n return JSON.stringify({ ok: false, error: \"binary_file\", path });\n }\n\n await mkdir(dirname(absolutePath), { recursive: true });\n await writeFile(absolutePath, content, \"utf-8\");\n const bytes = Buffer.byteLength(content, \"utf-8\");\n\n return JSON.stringify({ ok: true, path, bytes });\n },\n });\n}\n\nasync function isBinaryFile(absolutePath: string): Promise<boolean> {\n let handle: import(\"node:fs/promises\").FileHandle | undefined;\n try {\n handle = await open(absolutePath, \"r\");\n } catch {\n return false; // file doesn't exist yet — not binary\n }\n try {\n const stat = await handle.stat();\n const probeLen = Math.min(BINARY_PROBE_BYTES, Number(stat.size));\n if (probeLen <= 0) return false;\n const probe = Buffer.alloc(probeLen);\n const { bytesRead } = await handle.read(probe, 0, probeLen, 0);\n for (let i = 0; i < bytesRead; i += 1) {\n if (probe[i] === 0) return true;\n }\n return false;\n } finally {\n await handle.close();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/path-guard.ts","../src/apply-patch.ts","../src/artifact-store.ts","../src/edit-file.ts","../src/formatter.ts","../src/path-scope.ts","../src/subprocess.ts","../src/git-diff.ts","../src/glob-files.ts","../src/internal/shell-guard.ts","../src/internal/command-policy.ts","../src/internal/network-guard.ts","../src/internal/repo-map.ts","../src/internal/tool-aci.ts","../src/internal/tool-guidance.ts","../src/list-dir.ts","../src/plan-mode.ts","../src/question.ts","../src/read-file.ts","../src/run-vitest.ts","../src/search-text.ts","../src/shell-exec.ts","../src/todo-plan-nodes.ts","../src/todolist.ts","../src/truncation.ts","../src/web-fetch.ts","../src/web-search.ts","../src/web-search-brave.ts","../src/write-file.ts"],"names":["stat","dirname","safePathJoin","mkdir","readFile","defineTool","z","copyFile","result","writeFile","resolve","readdir","join","ConfigurationError","lookup","dnsLookup","existsSync","walkDir","relative","DEFAULT_TIMEOUT_MS","DEFAULT_MAX_STDOUT_BYTES","spawn","BINARY_PROBE_BYTES","relativePath","open"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Canonical path-guard module (ADRs D79-D81).\n *\n * Three primitives + one typed error:\n * - `safePathJoin(base, ...parts)` — resolve THEN prefix-check (ADR D80).\n * - `assertNoSymlinkEscape(path, base)` — `realpathSync` resolves entire\n * symlink chain (EC-1 fix; Hermes v0.2 #386, #61).\n * - `sanitizeIdentifier(input, { maxLen })` — strict grammar\n * `^[a-z0-9][a-z0-9-_]*$` (ADR D81; case-insensitive on input,\n * lowercase on output).\n * - `PathTraversalError` — extends ConfigurationError with code\n * `path_traversal` (ADR D65: no new hierarchy).\n *\n * Wire at all sites where user input becomes a path. CI lint gate\n * `tests/lint/no-unguarded-path-input.test.ts` prevents regression\n * (ADR D85).\n *\n * @internal\n */\n\nimport { lstatSync, readlinkSync, realpathSync, type Stats } from \"node:fs\";\nimport { dirname, resolve, sep } from \"node:path\";\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\n/**\n * Thrown when a path operation would escape its allowed base directory.\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @internal\n */\nexport class PathTraversalError extends ConfigurationError {\n override readonly name: string = \"PathTraversalError\";\n\n constructor(input: string, resolvedPath: string) {\n super(`Path traversal attempt: ${input} → ${resolvedPath}`, {\n code: \"path_traversal\",\n });\n }\n}\n\n/**\n * Thrown when an agent tool is asked to read or write a sensitive path\n * that the blocklist forbids (`.env`, `.git/`, `node_modules/`, `.theo/`,\n * lock files). Distinct from `PathTraversalError` because the path is\n * lexically inside the project — it is just sensitive.\n *\n * Extends `ConfigurationError` (no new error hierarchy per ADR D65).\n *\n * @public\n */\nexport class ForbiddenPathError extends ConfigurationError {\n override readonly name: string = \"ForbiddenPathError\";\n\n constructor(path: string) {\n super(\n `Path '${path}' is in the sensitive-file blocklist (.env, .git/, node_modules/, .theo/, lock files)`,\n {\n code: \"forbidden_path\",\n },\n );\n }\n}\n\n/**\n * Join `base` with `...parts` and ensure the resolved absolute path stays\n * under `base`. Resolves FIRST, then prefix-checks (ADR D80) — prevents\n * normalized-escape bypasses like `subdir/.\\\\./bar`.\n *\n * Returns the safe absolute path. Throws `PathTraversalError` if escape.\n *\n * @internal\n */\nexport function safePathJoin(base: string, ...parts: string[]): string {\n if (base === \"\") {\n throw new Error(\"safePathJoin: base must be non-empty\");\n }\n const baseResolved = resolve(base);\n const target = resolve(base, ...parts);\n if (target !== baseResolved && !target.startsWith(baseResolved + sep)) {\n throw new PathTraversalError(parts.join(\"/\"), target);\n }\n return target;\n}\n\n/**\n * Assert that `path` — including every directory component in the chain —\n * stays under `base` after symlink resolution. No-op when nothing on the\n * path exists yet.\n *\n * Two-bug history:\n * 1. **EC-1** (original fix, kept): a multi-level symlink chain A → B → C\n * must be resolved end-to-end. `realpathSync` does this in 1 syscall.\n * 2. **Defence-in-depth** (added v1.x): the previous implementation only\n * called `lstatSync(path)` on the terminal component. If an INTERMEDIATE\n * directory was a symlink (`base/inner-symlink → /outside`), `lstat` on\n * `base/inner-symlink/file.txt` followed the symlink and reported the\n * regular file — escape went undetected. Fix: walk up to the nearest\n * existing ancestor and `realpath` THAT, then re-attach the suffix and\n * check the result against the canonical base.\n *\n * @internal\n */\nexport function assertNoSymlinkEscape(path: string, base: string): void {\n // Canonical base — symlinks in the base path itself are absorbed once here.\n let baseResolved: string;\n try {\n baseResolved = realpathSync(base);\n } catch {\n // base doesn't exist as a real directory yet — fall back to lexical resolve.\n baseResolved = resolve(base);\n }\n\n // Find the deepest ancestor of `path` that exists, then realpath it.\n // Anything from there onward is \"not yet on disk\" and contributes only\n // its lexical suffix. This covers three cases:\n // - path exists (regular file or symlink at any depth) → realpath the full path\n // - path doesn't exist but intermediate dir is a symlink → realpath the ancestor\n // - nothing on the path exists → no escape risk (return)\n const resolved = realpathOfDeepestExisting(path);\n if (resolved === undefined) return; // path has no existing prefix — nothing to attack\n\n if (resolved !== baseResolved && !resolved.startsWith(baseResolved + sep)) {\n throw new PathTraversalError(`symlink ${path}`, resolved);\n }\n}\n\n/**\n * Find the deepest ancestor of `path` that exists on disk, resolve all\n * symlinks in that ancestor via `realpathSync`, and re-attach the\n * lexical suffix. Returns `undefined` when no ancestor exists.\n *\n * Handles dangling symlinks: if the terminal IS a symlink but its target\n * is missing, we still detect escape via `readlinkSync` + parent resolve.\n */\nfunction realpathOfDeepestExisting(path: string): string | undefined {\n // First try the full path — the common case.\n try {\n return realpathSync(path);\n } catch {\n // Not resolvable. Two sub-cases.\n }\n\n // Sub-case A: terminal is a dangling symlink.\n try {\n const stat: Stats = lstatSync(path);\n if (stat.isSymbolicLink()) {\n const target = readlinkSync(path);\n // Resolve target relative to the REAL parent dir, so intermediate\n // symlinks in the parent chain are absorbed.\n const parentReal = realpathOfDeepestExisting(dirname(path));\n const parentBase = parentReal ?? dirname(path);\n return resolve(parentBase, target);\n }\n } catch {\n // lstat failed too — terminal doesn't exist at all.\n }\n\n // Sub-case B: walk up to the nearest existing ancestor, then re-attach\n // the suffix lexically.\n let cursor = dirname(path);\n let suffix = path.slice(cursor.length);\n while (cursor !== dirname(cursor)) {\n try {\n const real = realpathSync(cursor);\n // Reconstruct: ancestor's realpath + remaining (still-lexical) suffix\n return resolve(real, `.${suffix}`);\n } catch {\n suffix = path.slice(dirname(cursor).length);\n cursor = dirname(cursor);\n }\n }\n // Reached filesystem root without finding any existing ancestor.\n return undefined;\n}\n\nconst LOCK_FILES = new Set([\"pnpm-lock.yaml\", \"package-lock.json\", \"yarn.lock\", \"bun.lockb\"]);\n\n/**\n * Decide whether a project-relative path points to a known-sensitive file\n * that a coding agent must not read or write.\n *\n * Universal blocklist (works for any agent operating on a project tree):\n *\n * - `.env`, `.env.<anything>` — except `.env.example` (template safe to read)\n * - `.git/` — version control internals\n * - `node_modules/` — dependency cache (changes don't belong to the user)\n * - `.theo/` — TheoKit build artefacts / state\n * - Lock files at any depth: `pnpm-lock.yaml`, `package-lock.json`,\n * `yarn.lock`, `bun.lockb`\n *\n * Operates on path segments (forward-slash normalized). Cross-platform safe.\n *\n * Use together with `safePathJoin` + `assertNoSymlinkEscape`: the former two\n * defeat traversal, this one defeats reading a file that is lexically inside\n * the project but should not be agent-visible.\n *\n * @public\n */\nexport function isForbiddenPath(input: string): boolean {\n // Normalize: forward slashes only, strip leading \"./\"\n const normalized = input.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n if (normalized.length === 0) return false;\n\n const segments = normalized.split(\"/\").filter((s) => s.length > 0);\n if (segments.length === 0) return false;\n\n const first = segments[0]!;\n // .env.example is explicitly allowlisted (template safe to read)\n if (first === \".env.example\") return false;\n if (first === \".env\") return true;\n if (/^\\.env\\./.test(first)) return true;\n\n if (first === \".git\") return true;\n if (first === \"node_modules\") return true;\n if (first === \".theo\") return true;\n\n const basename = segments[segments.length - 1]!;\n if (LOCK_FILES.has(basename)) return true;\n\n return false;\n}\n\n// validateArtifactPath + sanitizeIdentifier + IDENTIFIER_PATTERN removed (dead code, no callers)\n","/**\n * `apply_patch` — built-in tool for coding agents.\n *\n * Parses a unified diff string and applies it to the project files.\n * Creates `.bak` backups before modifying each file.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, files_patched: string[] }`\n * - `{ ok: false, error: 'parse_error' | 'path_traversal' |\n * 'forbidden_path' | 'patch_failed' }`\n */\n\nimport { copyFile, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nexport interface CreateApplyPatchToolOptions {\n /** Absolute path to the project root. */\n projectRoot: string;\n}\n\nexport function createApplyPatchTool(opts: CreateApplyPatchToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"apply_patch\",\n description:\n \"Apply a unified diff patch to project files. Each file in the diff \" +\n \"is security-checked against the project root. Creates .bak backups \" +\n \"before modifying. Returns { ok, files_patched } or { ok: false, error }.\",\n inputSchema: z.object({\n patch: z.string().min(1).describe(\"Unified diff content.\"),\n }),\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: unified diff parsing is inherently complex\n handler: async ({ patch }) => {\n const hunks = parsePatch(patch);\n if (hunks.length === 0) {\n return JSON.stringify({ ok: false, error: \"parse_error\", detail: \"no file hunks found\" });\n }\n\n // Security check all paths upfront\n for (const hunk of hunks) {\n if (isForbiddenPath(hunk.file)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path: hunk.file });\n }\n try {\n const abs = safePathJoin(projectRoot, hunk.file);\n assertNoSymlinkEscape(abs, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path: hunk.file });\n }\n throw err;\n }\n }\n\n // Apply each file's hunks\n const patched: string[] = [];\n for (const hunk of hunks) {\n const absolutePath = safePathJoin(projectRoot, hunk.file);\n let content: string;\n try {\n content = await readFile(absolutePath, \"utf-8\");\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\") {\n // New file — start empty\n content = \"\";\n } else {\n throw err;\n }\n }\n\n const result = applyHunks(content, hunk.changes);\n if (result === null) {\n return JSON.stringify({\n ok: false,\n error: \"patch_failed\",\n path: hunk.file,\n detail: \"hunk context mismatch\",\n });\n }\n\n if (content !== \"\") {\n await copyFile(absolutePath, `${absolutePath}.bak`);\n }\n await mkdir(dirname(absolutePath), { recursive: true });\n await writeFile(absolutePath, result, \"utf-8\");\n patched.push(hunk.file);\n }\n\n return JSON.stringify({ ok: true, files_patched: patched });\n },\n });\n}\n\ninterface FileHunk {\n file: string;\n changes: HunkChange[];\n}\n\ninterface HunkChange {\n type: \"add\" | \"remove\" | \"context\";\n content: string;\n}\n\n/** Simple unified diff parser — extracts file paths and line changes. */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction parsePatch(patch: string): FileHunk[] {\n const lines = patch.split(\"\\n\");\n const hunks: FileHunk[] = [];\n let current: FileHunk | null = null;\n\n for (const line of lines) {\n // Detect file header: +++ b/path or +++ path\n if (line.startsWith(\"+++ \")) {\n const filePath = line.slice(4).replace(/^b\\//, \"\").trim();\n if (filePath && filePath !== \"/dev/null\") {\n current = { file: filePath, changes: [] };\n hunks.push(current);\n }\n continue;\n }\n\n if (line.startsWith(\"--- \")) continue;\n if (line.startsWith(\"@@ \")) continue;\n\n if (current === null) continue;\n\n if (line.startsWith(\"+\")) {\n current.changes.push({ type: \"add\", content: line.slice(1) });\n } else if (line.startsWith(\"-\")) {\n current.changes.push({ type: \"remove\", content: line.slice(1) });\n } else if (line.startsWith(\" \")) {\n current.changes.push({ type: \"context\", content: line.slice(1) });\n }\n }\n\n return hunks;\n}\n\n/** Apply hunk changes to file content. Returns null on context mismatch. */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction applyHunks(content: string, changes: HunkChange[]): string | null {\n const originalLines = content.split(\"\\n\");\n const result: string[] = [];\n let origIdx = 0;\n\n // Find context start\n const firstContext = changes.find((c) => c.type === \"context\" || c.type === \"remove\");\n if (firstContext) {\n const startIdx = originalLines.indexOf(firstContext.content, origIdx);\n if (startIdx === -1) return null;\n // Copy lines before context\n for (let i = 0; i < startIdx; i++) {\n result.push(originalLines[i]!);\n }\n origIdx = startIdx;\n }\n\n for (const change of changes) {\n if (change.type === \"context\") {\n if (origIdx >= originalLines.length || originalLines[origIdx] !== change.content) {\n return null; // context mismatch\n }\n result.push(change.content);\n origIdx++;\n } else if (change.type === \"remove\") {\n if (origIdx >= originalLines.length || originalLines[origIdx] !== change.content) {\n return null; // line to remove doesn't match\n }\n origIdx++;\n } else if (change.type === \"add\") {\n result.push(change.content);\n }\n }\n\n // Append remaining original lines\n while (origIdx < originalLines.length) {\n result.push(originalLines[origIdx]!);\n origIdx++;\n }\n\n return result.join(\"\\n\");\n}\n","import { mkdir, readdir, readFile, stat } from \"node:fs/promises\";\n\nimport { replaceFileAtomic } from \"@theokit/sdk/internal/persistence\";\nimport { safeFilenameForId, safePathJoin } from \"@theokit/sdk/path-safety\";\n\n/**\n * Options for {@link createSessionArtifactStore}.\n *\n * @public\n */\nexport interface SessionArtifactStoreOptions {\n /** Directory holding one file per artifact (`<dir>/<idStrategy(id)><extension>`). */\n dir: string;\n /**\n * Map an opaque artifact id to a filesystem-safe filename stem.\n * Default: `safeFilenameForId` (accepts ANY id; deterministically hashes\n * non-conforming input). The result is additionally passed through\n * `safePathJoin`, so a traversal id can never escape `dir`.\n *\n * NOTE — the default `safeFilenameForId` is CASE-FOLDING: ids differing only\n * in case (`\"Run-1\"` vs `\"run-1\"`) map to the SAME file. If your ids are\n * case-sensitive (e.g. base64), supply a case-preserving `idStrategy`.\n */\n idStrategy?: (id: string) => string;\n /** File extension (with leading dot). Default `\".md\"`. */\n extension?: string;\n}\n\n/**\n * A generic, id-keyed, atomic artifact store. Generalizes the per-run\n * session-summary writer pattern: persist an opaque text artifact under a\n * stable id, read it back, and enumerate what's stored.\n *\n * @public\n */\nexport interface SessionArtifactStore {\n /**\n * Write (overwrite) the artifact atomically; returns the resolved path.\n * Content is persisted byte-for-byte. The id is mapped via `idStrategy`\n * (default case-folding — see {@link SessionArtifactStoreOptions.idStrategy}).\n */\n write(id: string, content: string): Promise<string>;\n /** Read the artifact, or `undefined` if absent/unreadable (never throws). */\n read(id: string): Promise<string | undefined>;\n /** Whether an artifact exists for `id` (never throws). */\n has(id: string): Promise<boolean>;\n /** The filename stems of all stored artifacts (never throws; `[]` if dir absent). */\n list(): Promise<string[]>;\n /** The resolved, traversal-safe path for `id`. */\n path(id: string): string;\n}\n\n/**\n * Create a generic artifact store rooted at `dir`. Composes the shipped\n * `safeFilenameForId`/`safePathJoin` path guard + the atomic `replaceFileAtomic`\n * writer — zero new dependencies. Reads never throw; writes fail loud.\n *\n * @public\n */\nexport function createSessionArtifactStore(\n options: SessionArtifactStoreOptions,\n): SessionArtifactStore {\n const { dir } = options;\n const idStrategy = options.idStrategy ?? ((id: string) => safeFilenameForId(id));\n const extension = options.extension ?? \".md\";\n\n function path(id: string): string {\n return safePathJoin(dir, `${idStrategy(id)}${extension}`);\n }\n\n async function write(id: string, content: string): Promise<string> {\n const target = path(id);\n await mkdir(dir, { recursive: true });\n await replaceFileAtomic(target, content);\n return target;\n }\n\n async function read(id: string): Promise<string | undefined> {\n try {\n return await readFile(path(id), \"utf8\");\n } catch {\n return undefined;\n }\n }\n\n async function has(id: string): Promise<boolean> {\n // stat (not read) — O(1) existence check, no full-file load. Never throws.\n try {\n await stat(path(id));\n return true;\n } catch {\n return false;\n }\n }\n\n async function list(): Promise<string[]> {\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n return entries\n .filter((name) => name.endsWith(extension))\n .map((name) => name.slice(0, name.length - extension.length));\n }\n\n return { write, read, has, list, path };\n}\n","/**\n * `edit_file` — built-in tool for coding agents.\n *\n * Replaces a string in a project-relative file. Tries exact match first,\n * then whitespace-normalized match. Creates a `.bak` backup before editing.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, replacements: 1 }` on success\n * - `{ ok: false, error: 'no_match' | 'not_found' | 'path_traversal' |\n * 'forbidden_path' }` on refusal\n */\n\nimport { copyFile, readFile, writeFile } from \"node:fs/promises\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nexport interface CreateEditFileToolOptions {\n /** Absolute path to the project root. Every edit is gated against this boundary. */\n projectRoot: string;\n}\n\nexport function createEditFileTool(opts: CreateEditFileToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"edit_file\",\n description:\n \"Make an exact string replacement in a project-relative file. Replaces the FIRST occurrence \" +\n \"of old_string with new_string (a whitespace-normalized fallback is attempted if the exact \" +\n \"match fails) and writes a .bak backup first. Read the file first so old_string matches the \" +\n \"on-disk text exactly; include enough surrounding context to make it unique — only the first \" +\n \"match is replaced, so a too-short old_string can edit the wrong location. old_string must be \" +\n \"non-empty and differ from new_string; to change every occurrence, call edit_file repeatedly. \" +\n \"Returns { ok, replacements } or { ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative file path.\"),\n old_string: z.string().min(1).describe(\"String to find in the file.\"),\n new_string: z.string().describe(\"Replacement string.\"),\n }),\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: unified diff parsing is inherently complex\n handler: async ({ path, old_string, new_string }) => {\n // A no-op edit (old === new) cannot change the file; refuse early so the description's\n // \"old_string must differ from new_string\" precondition is enforced, not just documented.\n if (old_string === new_string) {\n return JSON.stringify({ ok: false, error: \"no_change\", path });\n }\n if (isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n\n let absolutePath: string;\n try {\n absolutePath = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path });\n }\n throw err;\n }\n\n let content: string;\n try {\n content = await readFile(absolutePath, \"utf-8\");\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\") {\n return JSON.stringify({ ok: false, error: \"not_found\", path });\n }\n throw err;\n }\n\n // Strategy 1: exact match\n const exactIdx = content.indexOf(old_string);\n if (exactIdx !== -1) {\n await copyFile(absolutePath, `${absolutePath}.bak`);\n const result =\n content.slice(0, exactIdx) + new_string + content.slice(exactIdx + old_string.length);\n await writeFile(absolutePath, result, \"utf-8\");\n return JSON.stringify({ ok: true, replacements: 1 });\n }\n\n // Strategy 2: whitespace-normalized match\n const normalizedContent = normalizeWhitespace(content);\n const normalizedOld = normalizeWhitespace(old_string);\n const normalizedIdx = normalizedContent.indexOf(normalizedOld);\n\n if (normalizedIdx === -1) {\n return JSON.stringify({ ok: false, error: \"no_match\", path });\n }\n\n // Find original span boundaries via character mapping\n const span = findOriginalSpan(\n content,\n normalizedContent,\n normalizedIdx,\n normalizedOld.length,\n );\n await copyFile(absolutePath, `${absolutePath}.bak`);\n const result = content.slice(0, span.start) + new_string + content.slice(span.end);\n await writeFile(absolutePath, result, \"utf-8\");\n return JSON.stringify({ ok: true, replacements: 1 });\n },\n });\n}\n\n/** Collapse runs of whitespace into a single space. */\nfunction normalizeWhitespace(s: string): string {\n return s.replace(/\\s+/g, \" \").trim();\n}\n\n/**\n * Map a position range in the whitespace-normalized string back to the\n * original string. Walks both strings in lockstep.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction findOriginalSpan(\n original: string,\n _normalized: string,\n normStart: number,\n normLen: number,\n): { start: number; end: number } {\n let origIdx = 0;\n let normIdx = 0;\n\n // Skip leading whitespace that was trimmed\n while (origIdx < original.length && /\\s/.test(original[origIdx]!)) {\n origIdx++;\n }\n\n // Walk to normStart\n while (normIdx < normStart && origIdx < original.length) {\n if (/\\s/.test(original[origIdx]!)) {\n // skip entire whitespace run in original, counts as one in normalized\n while (origIdx < original.length && /\\s/.test(original[origIdx]!)) {\n origIdx++;\n }\n normIdx++; // the collapsed space\n } else {\n origIdx++;\n normIdx++;\n }\n }\n\n const start = origIdx;\n\n // Walk normLen characters\n let walked = 0;\n while (walked < normLen && origIdx < original.length) {\n if (/\\s/.test(original[origIdx]!)) {\n while (origIdx < original.length && /\\s/.test(original[origIdx]!)) {\n origIdx++;\n }\n walked++; // the collapsed space\n } else {\n origIdx++;\n walked++;\n }\n }\n\n return { start, end: origIdx };\n}\n","/**\n * `formatter` — output formatting utilities for tool results.\n *\n * Wraps code, diffs, file lists, errors, and truncated output references.\n */\n\n/**\n * Wrap code in a fenced code block with language tag.\n */\nexport function formatCode(language: string, code: string): string {\n return `\\`\\`\\`${language}\\n${code}\\n\\`\\`\\``;\n}\n\n/**\n * Format a unified diff with +/- prefixes preserved.\n */\nexport function formatDiff(diff: string): string {\n return `\\`\\`\\`diff\\n${diff}\\n\\`\\`\\``;\n}\n\n/**\n * Format a list of file paths as a bulleted markdown list.\n */\nexport function formatFileList(files: string[]): string {\n if (files.length === 0) return \"(no files)\";\n return files.map((f) => `- ${f}`).join(\"\\n\");\n}\n\n/**\n * Format an error message as a markdown block.\n */\nexport function formatError(message: string, code?: string): string {\n const prefix = code ? `[${code}] ` : \"\";\n return `> **Error:** ${prefix}${message}`;\n}\n\n/**\n * Format a truncated output reference.\n */\nexport function formatTruncated(overflowPath: string): string {\n return `...full output at: ${overflowPath}`;\n}\n","/**\n * Shared `safePathJoin + assertNoSymlinkEscape` helper for built-in coding\n * tools (git-diff, run-vitest, list-dir, read-file, search-text). Returns a\n * pre-formatted `path_traversal` JSON string on failure or `null` on pass.\n *\n * @internal\n */\n\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nexport function checkPathScope(path: string | undefined, projectRoot: string): string | null {\n if (path === undefined || path === \"\") return null;\n try {\n const abs = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(abs, projectRoot);\n return null;\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path });\n }\n throw err;\n }\n}\n","/**\n * Shared subprocess-watch helpers for built-in coding tools (git-diff,\n * run-vitest). Wires the on(close)/on(error) settle pattern in a single\n * place to eliminate the cross-file clone flagged by jscpd.\n *\n * @internal\n */\n\nimport type { ChildProcess } from \"node:child_process\";\n\n/**\n * Settle gate — guarantees the supplied callback fires exactly once across\n * the close/error/timeout race. Clears the timer on settle.\n */\ninterface SettleGate {\n /** True after first settle; subsequent calls are no-ops. */\n settled: () => boolean;\n /** Settle the gate, clear the timer, and call `onSettle()`. */\n fire: (onSettle: () => void) => void;\n}\n\nfunction createSettleGate(timer: NodeJS.Timeout): SettleGate {\n let done = false;\n return {\n settled: () => done,\n fire: (onSettle) => {\n if (done) return;\n done = true;\n clearTimeout(timer);\n onSettle();\n },\n };\n}\n\n/**\n * Wire SIGKILL-on-timeout for a detached process group. Returns the settle\n * gate so caller listeners can short-circuit when the timeout already fired.\n */\nexport function armTimeoutKill<T>(\n child: ChildProcess,\n timeoutMs: number,\n onTimeout: () => T,\n resolve: (value: T) => void,\n): SettleGate {\n const timer = setTimeout(() => {\n gate.fire(() => {\n try {\n process.kill(-(child.pid ?? 0), \"SIGKILL\");\n } catch {\n /* already dead */\n }\n resolve(onTimeout());\n });\n }, timeoutMs);\n const gate = createSettleGate(timer);\n return gate;\n}\n\n/**\n * Attach a close+error pair of listeners that resolve via the supplied\n * callbacks. Honors the gate so timeout-vs-close races settle exactly once.\n */\nexport function attachChildSettlers<T>(\n child: ChildProcess,\n gate: SettleGate,\n onClose: (code: number | null) => T,\n onError: (err: Error) => T,\n resolve: (value: T) => void,\n): void {\n child.on(\"close\", (code) => {\n gate.fire(() => resolve(onClose(code)));\n });\n child.on(\"error\", (err) => {\n gate.fire(() => resolve(onError(err)));\n });\n}\n","/**\n * `git_diff` — built-in tool for coding agents.\n *\n * Returns the unified diff of the working tree (or staged changes when\n * `cached=true`). Implemented as a thin `git diff` subprocess wrapper\n * with a couple of hard limits:\n *\n * - 30s wall clock timeout (kills the process group on expiry)\n * - 5 MB stdout cap (truncate + flag `truncated=true`)\n * - Path scope validated through `safePathJoin` + `assertNoSymlinkEscape`\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, diff: string, truncated?: boolean }`\n * - `{ ok: false, error: 'not_a_repo' | 'path_traversal' | 'timeout' }`\n */\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport { checkPathScope } from \"./path-scope.js\";\nimport { armTimeoutKill, attachChildSettlers } from \"./subprocess.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_STDOUT_BYTES = 5 * 1024 * 1024;\n\nexport interface CreateGitDiffToolOptions {\n projectRoot: string;\n timeoutMs?: number;\n maxStdoutBytes?: number;\n}\n\nexport function createGitDiffTool(opts: CreateGitDiffToolOptions): CustomTool {\n const {\n projectRoot,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n maxStdoutBytes = DEFAULT_MAX_STDOUT_BYTES,\n } = opts;\n\n return defineTool({\n name: \"git_diff\",\n description:\n \"Return the unified diff of the project's working tree (or staged \" +\n \"changes when cached=true). Scoped to a single file when 'path' is \" +\n \"provided. Requires the project to be a git repository. Returns \" +\n \"{ ok, diff, truncated? } or { ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().optional().describe(\"Optional project-relative file or dir scope.\"),\n cached: z\n .boolean()\n .optional()\n .describe(\"If true, show staged changes (git diff --cached). Default false.\"),\n }),\n handler: async ({ path, cached }) => {\n if (!existsSync(join(projectRoot, \".git\"))) {\n return JSON.stringify({ ok: false, error: \"not_a_repo\" });\n }\n\n const scopeCheck = checkPathScope(path, projectRoot);\n if (scopeCheck !== null) return scopeCheck;\n\n const args = buildDiffArgs(cached, path);\n const result = await runGitProcess(projectRoot, args, timeoutMs, maxStdoutBytes);\n return formatGitResult(result, timeoutMs);\n },\n });\n}\n\nfunction buildDiffArgs(cached: boolean | undefined, path: string | undefined): string[] {\n const args = [\"diff\", \"--no-color\"];\n if (cached === true) args.push(\"--cached\");\n if (path !== undefined && path !== \"\") args.push(\"--\", path);\n return args;\n}\n\nfunction formatGitResult(result: GitProcessResult, timeoutMs: number): string {\n if (result.kind === \"timeout\") {\n return JSON.stringify({ ok: false, error: \"timeout\", timeoutMs });\n }\n if (result.kind === \"error\") {\n return JSON.stringify({ ok: false, error: \"git_failed\", stderr: result.stderr });\n }\n return JSON.stringify({ ok: true, diff: result.stdout, truncated: result.truncated });\n}\n\ntype GitProcessResult =\n | { kind: \"ok\"; stdout: string; truncated: boolean }\n | { kind: \"error\"; stderr: string }\n | { kind: \"timeout\" };\n\nfunction runGitProcess(\n cwd: string,\n args: string[],\n timeoutMs: number,\n maxStdoutBytes: number,\n): Promise<GitProcessResult> {\n return new Promise((resolve) => {\n // Detached process group so we can kill the whole tree on timeout (EC-7).\n const child = spawn(\"git\", args, { cwd, detached: true, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let stdoutBytes = 0;\n let truncated = false;\n\n const gate = armTimeoutKill<GitProcessResult>(\n child,\n timeoutMs,\n () => ({ kind: \"timeout\" }),\n resolve,\n );\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n if (stdoutBytes >= maxStdoutBytes) {\n truncated = true;\n return;\n }\n const remaining = maxStdoutBytes - stdoutBytes;\n if (chunk.length > remaining) {\n stdoutChunks.push(chunk.subarray(0, remaining));\n stdoutBytes = maxStdoutBytes;\n truncated = true;\n } else {\n stdoutChunks.push(chunk);\n stdoutBytes += chunk.length;\n }\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderrChunks.push(chunk);\n });\n\n attachChildSettlers<GitProcessResult>(\n child,\n gate,\n (code) => {\n const stdout = Buffer.concat(stdoutChunks).toString(\"utf-8\");\n const stderr = Buffer.concat(stderrChunks).toString(\"utf-8\");\n return code === 0 ? { kind: \"ok\", stdout, truncated } : { kind: \"error\", stderr };\n },\n (err) => ({ kind: \"error\", stderr: err.message }),\n resolve,\n );\n });\n}\n","/**\n * `glob_files` — built-in tool for coding agents.\n *\n * Lists project files matching a glob pattern. Excludes node_modules,\n * .git, and dist by default. Returns relative paths.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, files: string[], count }` (an empty match is `ok: true` with `files: []`)\n * - `{ ok: false, error: 'path_traversal' }`\n */\n\nimport { readdir } from \"node:fs/promises\";\nimport { join, relative } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\n/** Directories excluded from traversal by default. */\nconst DEFAULT_EXCLUDES = new Set([\"node_modules\", \".git\", \"dist\", \".theo\"]);\n\nexport interface CreateGlobToolOptions {\n /** Absolute path to the project root. */\n projectRoot: string;\n}\n\nexport function createGlobTool(opts: CreateGlobToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"glob_files\",\n description:\n \"Find files by glob pattern across the project — fast at any repo size. Use glob_files when \" +\n \"you know the filename SHAPE; use search_text when you know the file CONTENT; use read_file \" +\n \"when you know the exact path. The pattern supports * and ** wildcards (e.g. '**/*.ts', \" +\n \"'src/**/*.json'); node_modules/.git/dist/.theo are excluded and results are relative paths. \" +\n \"Returns { ok, files } or { ok: false, error }.\",\n inputSchema: z.object({\n pattern: z.string().min(1).describe(\"Glob pattern (e.g. '**/*.ts', 'src/**/*.json').\"),\n cwd: z.string().optional().describe(\"Project-relative subdirectory to search from.\"),\n }),\n handler: async ({ pattern, cwd }) => {\n let searchRoot = projectRoot;\n\n if (cwd) {\n try {\n searchRoot = safePathJoin(projectRoot, cwd);\n assertNoSymlinkEscape(searchRoot, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path: cwd });\n }\n throw err;\n }\n }\n\n const regex = globToRegex(pattern);\n const files: string[] = [];\n\n await walkDir(searchRoot, searchRoot, regex, files);\n\n const relativePaths = files.map((f) => relative(projectRoot, f)).sort();\n return JSON.stringify({ ok: true, files: relativePaths, count: relativePaths.length });\n },\n });\n}\n\nasync function walkDir(\n base: string,\n dir: string,\n pattern: RegExp,\n results: string[],\n): Promise<void> {\n let entries: import(\"node:fs\").Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return; // directory doesn't exist or unreadable\n }\n\n for (const entry of entries) {\n if (DEFAULT_EXCLUDES.has(entry.name)) continue;\n\n const fullPath = join(dir, entry.name);\n const relPath = relative(base, fullPath);\n\n if (entry.isDirectory()) {\n await walkDir(base, fullPath, pattern, results);\n } else if (entry.isFile() && pattern.test(relPath)) {\n results.push(fullPath);\n }\n }\n}\n\n/** Convert a simple glob pattern to a RegExp. Supports * and ** wildcards. */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: parser logic\nfunction globToRegex(pattern: string): RegExp {\n let regexStr = \"\";\n let i = 0;\n while (i < pattern.length) {\n const ch = pattern[i]!;\n if (ch === \"*\" && pattern[i + 1] === \"*\") {\n // ** matches any path segment(s)\n regexStr += \".*\";\n i += 2;\n if (pattern[i] === \"/\") i++; // skip trailing slash after **\n } else if (ch === \"*\") {\n // * matches anything except /\n regexStr += \"[^/]*\";\n i++;\n } else if (ch === \"?\") {\n regexStr += \"[^/]\";\n i++;\n // biome-ignore lint/suspicious/noTemplateCurlyInString: regex escape chars, not template\n } else if (\".+^${}()|[]\\\\\".includes(ch)) {\n regexStr += `\\\\${ch}`;\n i++;\n } else {\n regexStr += ch;\n i++;\n }\n }\n return new RegExp(`^${regexStr}$`);\n}\n","/**\n * Catastrophic-command guardrail for `shell_exec` (M3-2; hardened V3-1).\n *\n * `catastrophicShellReason` is a pure, segment-aware deny-list ported from\n * theocode's security-reviewed `shell-guard.ts` (the proven spec: 42-blocked +\n * 24-allowed corpus, 0 misses / 0 false-positives). It splits a command on shell\n * separators (`;`, `&&`, `||`, `|`, `&`, newline), inspects EVERY segment (so a\n * chained `rm -rf <safe>; rm -rf /` cannot hide), and matches at COMMAND POSITION\n * (the executable, not an arbitrary substring) so a mention like `echo \"rm -rf /\"`\n * is not over-blocked. Returns a human reason for the first catastrophic segment,\n * else `null`.\n *\n * Categories: recursive-force `rm` of an absolute/home/parent path; destructive git\n * (force-push, `reset --hard`, `clean -fd`); remote-code-execution (curl/wget piped\n * OR command-substitution `$( )` / `<( )` / eval / source); disk/raw-device wipe\n * (mkfs, `dd of=/dev/`, `truncate /dev/`, `> /dev/<blockdev>`); recursive chmod/chown\n * of a root path (SDK extra); fork bomb; `find -delete` / `-exec rm`; secret-file\n * exfiltration over the network.\n *\n * This is a heuristic GUARDRAIL, NOT a sandbox: it is bypassable by deep obfuscation\n * (base64/env-indirection) and is best-effort. POSIX `/bin/sh` only; Windows\n * PowerShell is out of scope. True isolation needs a container.\n * referencia: .claude/knowledge-base/references/theocode-shell-guard/server-lib/shell-guard.ts\n */\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\n/** Thrown / reported when a command matches the catastrophic deny-list. */\nexport class CatastrophicCommandError extends ConfigurationError {\n override readonly name = \"CatastrophicCommandError\";\n constructor(reason: string) {\n super(`Refused a catastrophic shell command: ${reason} (shell guardrail).`, {\n code: \"catastrophic_command\",\n });\n }\n}\n\n/** Strip a single layer of surrounding quotes from a token (so `\"/\"` -> `/`). */\nfunction unquote(token: string): string {\n return token.replace(/^(['\"])(.*)\\1$/, \"$2\").replace(/^['\"]|['\"]$/g, \"\");\n}\n\n/**\n * Split a command line into statement segments on shell separators\n * (`;`, `&&`, `||`, `|`, `&`, newline). The rm screen inspects EVERY segment (C1).\n * Quote-aware splitting is out of scope (a guardrail, not a parser).\n */\nfunction commandSegments(command: string): string[] {\n return command\n .split(/&&|\\|\\||[;|&\\n]/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\n/** Arg tokens of a segment whose command is `name` (after an optional `sudo`); `null` otherwise. */\nfunction commandArgs(segment: string, name: string): string[] | null {\n const tokens = segment.split(/\\s+/);\n let i = 0;\n if (tokens[i] === \"sudo\") i += 1;\n if (tokens[i] !== name) return null; // must be the COMMAND, not a substring/arg\n return tokens.slice(i + 1);\n}\n\n/** Every segment whose command is `name` -> its arg list. */\nfunction commandSegmentsNamed(command: string, name: string): string[][] {\n return commandSegments(command)\n .map((s) => commandArgs(s, name))\n .filter((args): args is string[] => args !== null);\n}\n\n/** Does an arg list carry BOTH a recursive and a force flag, in ANY position/spelling? */\nfunction isRecursiveForce(args: string[]): boolean {\n const flags = args.filter((t) => t.startsWith(\"-\")).join(\" \");\n if (flags.length === 0) return false;\n const recursive = /-[a-z]*r/i.test(flags) || /--recursive/.test(flags);\n const force = /-[a-z]*f/i.test(flags) || /--force/.test(flags);\n return recursive && force;\n}\n\n/** Does an arg list carry a recursive flag (for chmod/chown -R)? */\nfunction isRecursive(args: string[]): boolean {\n const flags = args.filter((t) => t.startsWith(\"-\")).join(\" \");\n return /-[a-z]*r/i.test(flags) || /--recursive/.test(flags);\n}\n\n/** Absolute paths that are safe to recursively delete (scratch/throwaway). */\nconst SAFE_ABSOLUTE_TARGET = /^\\/(tmp|var\\/tmp)(\\/|$)/;\n\n/** True when an arg list targets root, home, `$HOME`, an absolute path, or `..`. */\nfunction targetsDangerousPath(args: string[]): boolean {\n const targets = args.filter((token) => token.length > 0 && !token.startsWith(\"-\")).map(unquote);\n return targets.some((raw) => {\n const t = raw.replace(/\\/+/g, \"/\"); // collapse `//` -> `/` (SDK extra)\n if (t === \"/dev/null\" || SAFE_ABSOLUTE_TARGET.test(t)) return false;\n return (\n /^\\/($|\\*)/.test(t) || // \"/\" or \"/*\"\n /^\\/[^/]/.test(t) || // an absolute path like /etc, /usr/local, /home/user/x\n t === \"~\" ||\n t.startsWith(\"~/\") ||\n /\\$\\{?HOME\\b\\}?/.test(t) || // $HOME or ${HOME}\n t === \"..\" ||\n t.startsWith(\"../\") ||\n t.includes(\"/..\") ||\n t === \"*\"\n );\n });\n}\n\n/** mkfs / dd-to-device / truncate-device / redirect-to-blockdev (families incl. SDK extras). */\nconst DEVICE_WIPE = [\n /\\bmkfs(\\.\\w+)?\\b/,\n /\\bdd\\b[^\\n]*\\bof=\\/dev\\//,\n /\\btruncate\\b[^\\n]*\\s\\/dev\\//,\n />\\s*\\/dev\\/(sd|nvme|hd|vd|mmcblk|disk|loop|dm-)/,\n];\n\n/** A single catastrophic-category screen: returns a reason or `null`. */\ntype CategoryCheck = (cmd: string) => string | null;\n\n/** Remote code execution: a remote download fed into an interpreter (pipe / `$( )` / `<( )` / eval / source). */\nconst checkRemoteExec: CategoryCheck = (cmd) =>\n /\\b(curl|wget|fetch)\\b[^\\n]*\\|\\s*(sudo\\s+)?(sh|bash|zsh|dash|python[0-9.]*|node|ruby|perl)\\b/i.test(\n cmd,\n ) ||\n /(\\$\\(|<\\()\\s*(sudo\\s+)?(curl|wget|fetch)\\b/i.test(cmd) ||\n /\\b(eval|source)\\b[^\\n]*\\b(curl|wget|fetch)\\b/i.test(cmd)\n ? \"executes a remote download (pipe / command-substitution / eval) — remote code execution\"\n : null;\n\n/** Disk / raw block-device wipe (mkfs, dd-to-device, truncate-device, redirect-to-blockdev). */\nconst checkDeviceWipe: CategoryCheck = (cmd) =>\n DEVICE_WIPE.some((re) => re.test(cmd)) ? \"writes to a raw block device / formats a disk\" : null;\n\n/** Fork bomb. */\nconst checkForkBomb: CategoryCheck = (cmd) =>\n /:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/.test(cmd) ? \"fork bomb\" : null;\n\n/** Destructive git: force-push (NOT --force-with-lease), hard reset, aggressive clean. */\nconst checkDestructiveGit: CategoryCheck = (cmd) => {\n if (/\\bgit\\b[^\\n]*\\bpush\\b[^\\n]*(--force(?!-with-lease)\\b|\\s-f\\b|\\s\\+\\S)/.test(cmd)) {\n return \"git force-push (overwrites remote history)\";\n }\n if (/\\bgit\\b[^\\n]*\\breset\\b[^\\n]*--hard\\b/.test(cmd)) {\n return \"git reset --hard (discards committed and working changes)\";\n }\n if (/\\bgit\\b[^\\n]*\\bclean\\b[^\\n]*(-[a-z]*f[a-z]*d|-[a-z]*d[a-z]*f)/.test(cmd)) {\n return \"git clean -fd (permanently deletes untracked files)\";\n }\n return null;\n};\n\n/** Recursive force-delete of a path outside the workspace — checked on EVERY rm segment (C1). */\nconst checkRm: CategoryCheck = (cmd) =>\n commandSegmentsNamed(cmd, \"rm\").some((a) => isRecursiveForce(a) && targetsDangerousPath(a))\n ? \"recursive force-delete of an absolute, home, or parent path\"\n : null;\n\n/** Recursive chmod/chown of a root/home/parent path (SDK extra — not in theocode). */\nconst checkPerm: CategoryCheck = (cmd) =>\n ([\"chmod\", \"chown\"] as const).some((name) =>\n commandSegmentsNamed(cmd, name).some((a) => isRecursive(a) && targetsDangerousPath(a)),\n )\n ? \"recursive permission change on an absolute, home, or parent path\"\n : null;\n\n/** find with -delete / -exec rm targeting an absolute or home root. */\nconst checkFind: CategoryCheck = (cmd) =>\n /\\bfind\\s+(\\/\\S*|~\\S*|\\$\\{?HOME\\}?\\S*)\\s[^\\n]*(-delete\\b|-exec\\s+rm\\b)/.test(cmd)\n ? \"find -delete / -exec rm on an absolute or home path\"\n : null;\n\n/** Exfiltration: a secret/credential file referenced together with a network sender. */\nconst checkExfiltration: CategoryCheck = (cmd) => {\n const touchesSecret =\n /(^|[\\s/'\"])(\\.env(\\.\\w+)?|id_rsa|id_ed25519|\\.ssh(\\/|\\b)|credentials|\\.aws(\\/|\\b)|\\.npmrc)\\b/.test(\n cmd,\n );\n const sendsNetwork =\n /\\b(curl|wget|nc|netcat|scp|ftp|telnet)\\b/.test(cmd) || /\\bpython[0-9.]*\\s+-m\\s+http/.test(cmd);\n return touchesSecret && sendsNetwork\n ? \"sends a secret/credential file over the network (exfiltration)\"\n : null;\n};\n\nconst CATEGORY_CHECKS: readonly CategoryCheck[] = [\n checkRemoteExec,\n checkDeviceWipe,\n checkForkBomb,\n checkDestructiveGit,\n checkRm,\n checkPerm,\n checkFind,\n checkExfiltration,\n];\n\n/**\n * Return a human-readable reason when `command` is catastrophic/irreversible, or `null`.\n * The message is surfaced to the model so it self-corrects.\n */\nexport function catastrophicShellReason(command: string): string | null {\n const cmd = command.trim();\n if (cmd.length === 0) return null;\n for (const check of CATEGORY_CHECKS) {\n const reason = check(cmd);\n if (reason) return reason;\n }\n return null;\n}\n","/**\n * Composable command-permission policy layer (M3-6).\n *\n * A `CommandPolicy` is a pure predicate returning a deny REASON (or `null` to\n * allow). `denyCatastrophicCommands()` COMPOSES the M3-2 `catastrophicShellReason`\n * guardrail (it does not duplicate the deny-list). `commandDenialReason` combines\n * a policy array with deny-wins semantics (the first policy returning a reason\n * denies); an empty array denies nothing. `isCommandAllowed` is the boolean view.\n *\n * Framework-agnostic: a consumer wires it at their permission layer — e.g. inside\n * an ACP `pre_tool_call` hook — `@theokit/agents` is not required. Inherits the\n * M3-2 honesty: a heuristic gate, not a sandbox. Design: blueprint m3-command-policy.\n */\n\nimport { catastrophicShellReason } from \"./shell-guard.js\";\n\n/**\n * A pure command-permission predicate: returns a non-empty deny reason, or `null`\n * to allow. NOTE: return `null` to allow — NOT `\"\"`. An empty string is treated\n * as a deny with a blank reason (`\"\" !== null`), which is almost never intended.\n */\nexport type CommandPolicy = (command: string) => string | null;\n\n/** A policy that denies catastrophic commands by composing the M3-2 guardrail. */\nexport function denyCatastrophicCommands(): CommandPolicy {\n return (command) => catastrophicShellReason(command);\n}\n\n/**\n * The first deny reason across `policies` (deny-wins), or `null` if every policy\n * allows. An empty `policies` array denies nothing (returns `null`).\n */\nexport function commandDenialReason(command: string, policies: CommandPolicy[]): string | null {\n for (const policy of policies) {\n const reason = policy(command);\n if (reason !== null) return reason;\n }\n return null;\n}\n\n/** `true` when no policy denies `command` (an empty policy array allows everything). */\nexport function isCommandAllowed(command: string, policies: CommandPolicy[]): boolean {\n return commandDenialReason(command, policies) === null;\n}\n","/**\n * SSRF guard for network tools (M3-1).\n *\n * `isBlockedIp` is a pure block-list of the canonical private/loopback/link-local/\n * CGNAT/metadata/reserved ranges (IPv4 + IPv6, with IPv4-mapped unwrap).\n * `resolveAndScreen` resolves ALL of a host's addresses and rejects if any is\n * blocked. `screenedFetch` fetches with `redirect:\"manual\"` and re-screens every\n * hop. `lookup`/`fetchImpl` are injectable so the DNS + redirect paths are\n * deterministically testable without real network access.\n *\n * Design: blueprint m3-ssrf-guard ADRs D1-D6. Node builtins only (zero new deps).\n */\n\nimport { lookup as dnsLookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\n/** Thrown when a host/redirect resolves to a blocked (private/reserved) address. */\nexport class SsrfBlockedError extends ConfigurationError {\n override readonly name = \"SsrfBlockedError\";\n constructor(host: string, detail?: string) {\n super(\n `Blocked request to \"${host}\"${detail ? ` (${detail})` : \"\"}: address is private, loopback, link-local, or reserved (SSRF guard).`,\n { code: \"ssrf_blocked\" },\n );\n }\n}\n\n/** Parse an IPv4 dotted-quad to a 32-bit unsigned integer (assumes a valid literal). */\nfunction v4ToInt(ip: string): number {\n const parts = ip.split(\".\");\n return (\n ((Number(parts[0]) << 24) |\n (Number(parts[1]) << 16) |\n (Number(parts[2]) << 8) |\n Number(parts[3])) >>>\n 0\n );\n}\n\n/** True if the IPv4 address (as int) falls inside `base/prefix`. */\nfunction inV4Cidr(ipInt: number, base: string, prefix: number): boolean {\n const mask = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;\n return (ipInt & mask) === (v4ToInt(base) & mask);\n}\n\nconst V4_BLOCKED: ReadonlyArray<readonly [string, number]> = [\n [\"0.0.0.0\", 8], // \"this host\"\n [\"10.0.0.0\", 8], // private\n [\"100.64.0.0\", 10], // CGNAT\n [\"127.0.0.0\", 8], // loopback\n [\"169.254.0.0\", 16], // link-local + cloud metadata\n [\"172.16.0.0\", 12], // private\n [\"192.168.0.0\", 16], // private\n [\"224.0.0.0\", 4], // multicast\n [\"240.0.0.0\", 4], // reserved\n];\n\nfunction isBlockedV4(ip: string): boolean {\n const n = v4ToInt(ip);\n return V4_BLOCKED.some(([base, prefix]) => inV4Cidr(n, base, prefix));\n}\n\n/** Fold a trailing dotted-quad (`…:1.2.3.4`) into two hex hextets; `null` if invalid. */\nfunction foldDottedTail(s: string): string | null {\n const lastColon = s.lastIndexOf(\":\");\n const tail = s.slice(lastColon + 1);\n if (!tail.includes(\".\")) return s;\n if (isIP(tail) !== 4) return null;\n const o = tail.split(\".\").map(Number);\n const hi = (((o[0] as number) << 8) | (o[1] as number)).toString(16);\n const lo = (((o[2] as number) << 8) | (o[3] as number)).toString(16);\n return `${s.slice(0, lastColon + 1)}${hi}:${lo}`;\n}\n\n/** Expand a (validated) IPv6 string to exactly 8 hextet strings; `null` if malformed. */\nfunction expandHextets(s: string): string[] | null {\n const halves = s.split(\"::\");\n if (halves.length > 2) return null;\n const head = halves[0] ? halves[0].split(\":\") : [];\n const tailGroups = halves.length === 2 && halves[1] ? halves[1].split(\":\") : [];\n if (halves.length === 1) return head.length === 8 ? head : null;\n const missing = 8 - head.length - tailGroups.length;\n if (missing < 0) return null;\n return [...head, ...Array(missing).fill(\"0\"), ...tailGroups];\n}\n\n/**\n * Expand a (net.isIP-validated) IPv6 literal to its 16 bytes. Handles `::`\n * compression and a trailing dotted-quad (`::ffff:1.2.3.4`). Returns `null` if it\n * cannot be parsed (caller then fails closed).\n */\nfunction ipv6ToBytes(ip: string): number[] | null {\n const folded = foldDottedTail(ip.toLowerCase().split(\"%\")[0] ?? \"\");\n if (folded === null) return null;\n const groups = expandHextets(folded);\n if (groups === null || groups.length !== 8) return null;\n const bytes: number[] = [];\n for (const g of groups) {\n const n = Number.parseInt(g || \"0\", 16);\n bytes.push(n >> 8, n & 0xff);\n }\n return bytes;\n}\n\nfunction allZero(bytes: number[], from: number, to: number): boolean {\n for (let i = from; i < to; i += 1) if (bytes[i] !== 0) return false;\n return true;\n}\n\n/** Numeric IPv6 classification over the parsed 16 bytes (no string-prefix guesswork). */\nfunction isBlockedV6Bytes(b: number[]): boolean {\n // IPv4-mapped (::ffff:a.b.c.d, any spelling) → re-check the embedded IPv4.\n if (allZero(b, 0, 10) && b[10] === 0xff && b[11] === 0xff) {\n return isBlockedV4(`${b[12]}.${b[13]}.${b[14]}.${b[15]}`);\n }\n // ::1 loopback and :: unspecified.\n if (allZero(b, 0, 15) && (b[15] === 1 || b[15] === 0)) return true;\n // IPv4-compatible (deprecated) ::a.b.c.d → re-check embedded IPv4.\n if (allZero(b, 0, 12)) return isBlockedV4(`${b[12]}.${b[13]}.${b[14]}.${b[15]}`);\n // fe80::/10 link-local.\n if (b[0] === 0xfe && ((b[1] as number) & 0xc0) === 0x80) return true;\n // fc00::/7 unique-local.\n return ((b[0] as number) & 0xfe) === 0xfc;\n}\n\n/**\n * True if `ip` is a blocked address (private/loopback/link-local/CGNAT/metadata/\n * reserved). A non-IP literal returns `true` (fail closed — callers resolve names\n * to IPs first via {@link resolveAndScreen}).\n */\nexport function isBlockedIp(ip: string): boolean {\n const fam = isIP(ip);\n if (fam === 4) return isBlockedV4(ip);\n if (fam === 6) {\n const bytes = ipv6ToBytes(ip);\n return bytes === null ? true : isBlockedV6Bytes(bytes);\n }\n return true;\n}\n\ntype LookupFn = (host: string, opts: { all: true }) => Promise<Array<{ address: string }>>;\n\n/** Options for {@link resolveAndScreen}. */\nexport interface ResolveAndScreenOptions {\n /** DNS resolver (injectable for tests); defaults to `node:dns/promises` lookup. */\n lookup?: LookupFn;\n}\n\n/**\n * Resolve `host` to ALL its addresses and screen each. Throws {@link SsrfBlockedError}\n * if any resolved address is blocked (or if `host` is a blocked IP literal, or if\n * resolution yields no address). Returns the resolved IPs otherwise.\n */\nexport async function resolveAndScreen(\n rawHost: string,\n options: ResolveAndScreenOptions = {},\n): Promise<string[]> {\n // `URL.hostname` wraps IPv6 literals in brackets (`[::1]`) — strip them so\n // `net.isIP` recognizes the address.\n const host = rawHost.replace(/^\\[|\\]$/g, \"\");\n if (isIP(host) !== 0) {\n if (isBlockedIp(host)) throw new SsrfBlockedError(host);\n return [host];\n }\n const lookup = options.lookup ?? (dnsLookup as unknown as LookupFn);\n const addrs = await lookup(host, { all: true });\n if (addrs.length === 0) throw new SsrfBlockedError(host, \"no addresses\");\n for (const a of addrs) {\n if (isBlockedIp(a.address)) throw new SsrfBlockedError(host, a.address);\n }\n return addrs.map((a) => a.address);\n}\n\ntype FetchFn = (url: string, init?: RequestInit) => Promise<Response>;\nconst REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\n\n/**\n * The next URL to follow for a redirect response, or `undefined` if `res` is not a\n * followable redirect. Throws {@link SsrfBlockedError} for a non-http(s) target.\n */\nfunction redirectTarget(res: Response, current: string, originalUrl: string): string | undefined {\n const location = res.headers.get(\"location\");\n if (!REDIRECT_STATUSES.has(res.status) || !location) return undefined;\n const next = new URL(location, current);\n if (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n throw new SsrfBlockedError(originalUrl, `non-http redirect to ${next.protocol}`);\n }\n return next.href;\n}\n\n/** Options for {@link screenedFetch}. */\nexport interface ScreenedFetchOptions {\n /** Fetch implementation (injectable for tests); defaults to global `fetch`. */\n fetchImpl?: FetchFn;\n /** DNS resolver (injectable for tests). */\n lookup?: LookupFn;\n /** Max redirect hops to follow (default 5). */\n maxRedirects?: number;\n /** Skip SSRF screening entirely (opt-out for local-dev tools). Default false. */\n allowPrivateHosts?: boolean;\n /** Abort signal forwarded to fetch. */\n signal?: AbortSignal;\n}\n\n/**\n * Fetch `url` with SSRF screening: screens the host (unless `allowPrivateHosts`),\n * sets `redirect:\"manual\"`, and re-screens every redirect hop (rejecting a hop to a\n * blocked host or a non-http(s) target). Throws {@link SsrfBlockedError} on a block\n * or on exceeding `maxRedirects`.\n */\nexport async function screenedFetch(\n url: string,\n options: ScreenedFetchOptions = {},\n): Promise<Response> {\n const fetchImpl = options.fetchImpl ?? (fetch as FetchFn);\n const maxRedirects = options.maxRedirects ?? 5;\n let current = url;\n for (let hop = 0; hop <= maxRedirects; hop += 1) {\n if (!options.allowPrivateHosts) {\n await resolveAndScreen(new URL(current).hostname, { lookup: options.lookup });\n }\n const res = await fetchImpl(current, { redirect: \"manual\", signal: options.signal });\n const next = redirectTarget(res, current, url);\n if (next === undefined) return res;\n current = next;\n }\n throw new SsrfBlockedError(url, \"too many redirects\");\n}\n","/**\n * Repo-map / env-context builders for orienting an LLM coding agent (M3-3).\n *\n * `buildEnvContext(cwd)` renders a short `<env>` block (cwd, platform, node,\n * is-git, date, project docs, manifests). `buildRepoMap(cwd, opts)` renders a\n * char-bounded, depth-limited directory tree. Both are node:fs-only and NEVER\n * throw — a missing/unreadable path yields a best-effort partial string or an\n * `(unavailable)` marker (distinct from the M3-1/M3-2 guards, which throw).\n *\n * Design: blueprint m3-repo-map. Zero new dependencies. A best-effort\n * orientation aid, not a complete or secure listing (bounded + skips on error).\n */\n\nimport { type Dirent, existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface RepoMapOptions {\n /** Max characters of tree output before truncation. Default 8000. */\n budget?: number;\n /** Directory/file names to skip (merged with the built-in ignore set). */\n ignore?: string[];\n /** Max directory depth to descend. Default 4. */\n maxDepth?: number;\n}\n\nconst DEFAULT_BUDGET = 8000;\nconst DEFAULT_MAX_DEPTH = 4;\nconst PER_DIR_CAP = 200;\nconst TRUNCATED_MARKER = \"… (truncated)\";\nconst DOC_HEAD_CHARS = 200;\nconst DEFAULT_REPO_MAP_IGNORE = [\n \"node_modules\",\n \".git\",\n \"dist\",\n \".theo\",\n \".next\",\n \"build\",\n \"coverage\",\n \"target\",\n \"out\",\n];\nconst PROJECT_DOCS = [\"AGENTS.md\", \"CLAUDE.md\", \"README.md\"];\nconst MANIFESTS = [\"package.json\", \"pyproject.toml\", \"Cargo.toml\", \"go.mod\"];\n\nfunction safeExists(p: string): boolean {\n try {\n return existsSync(p);\n } catch {\n return false;\n }\n}\n\nfunction safeReadHead(p: string, n: number): string {\n try {\n return readFileSync(p, \"utf-8\").slice(0, n).replace(/\\s+/g, \" \").trim();\n } catch {\n return \"\";\n }\n}\n\n/** Render a portable `<env>` orientation block. Never throws. */\nexport function buildEnvContext(cwd: string): string {\n const lines = [\n \"<env>\",\n ` Working directory: ${cwd}`,\n ` Platform: ${process.platform} (${process.arch})`,\n ` Node: ${process.version}`,\n ` Is git repo: ${safeExists(join(cwd, \".git\")) ? \"yes\" : \"no\"}`,\n ` Today's date: ${new Date().toDateString()}`,\n ];\n const docs = PROJECT_DOCS.filter((d) => safeExists(join(cwd, d)));\n if (docs.length > 0) {\n lines.push(` Project docs: ${docs.join(\", \")}`);\n const head = safeReadHead(join(cwd, docs[0] as string), DOC_HEAD_CHARS);\n if (head) lines.push(` ${docs[0]} (head): ${head}`);\n }\n const manifests = MANIFESTS.filter((m) => safeExists(join(cwd, m)));\n if (manifests.length > 0) lines.push(` Manifests: ${manifests.join(\", \")}`);\n lines.push(\"</env>\");\n return lines.join(\"\\n\");\n}\n\n/** dirs-first, then alphabetical. Symlinks count as leaves (not followed). */\nfunction compareEntries(a: Dirent, b: Dirent): number {\n const ad = a.isDirectory() ? 0 : 1;\n const bd = b.isDirectory() ? 0 : 1;\n return ad !== bd ? ad - bd : a.name.localeCompare(b.name);\n}\n\nfunction visibleEntries(dir: string, ignore: Set<string>): Dirent[] {\n let entries: Dirent[];\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return [];\n }\n return entries.filter((e) => !ignore.has(e.name) && !e.name.startsWith(\".\")).sort(compareEntries);\n}\n\ninterface WalkCtx {\n ignore: Set<string>;\n maxDepth: number;\n budget: number;\n lines: string[];\n used: number;\n truncated: boolean;\n}\n\n/** Append a line if it fits the budget; flag truncation and return false otherwise. */\nfunction pushLine(ctx: WalkCtx, line: string): boolean {\n if (ctx.used + line.length + 1 > ctx.budget) {\n ctx.truncated = true;\n return false;\n }\n ctx.lines.push(line);\n ctx.used += line.length + 1;\n return true;\n}\n\n/** Emit one entry (and recurse into a real sub-dir). Returns false when budget is hit. */\nfunction emitEntry(ctx: WalkCtx, dir: string, e: Dirent, depth: number, indent: string): boolean {\n const isDir = e.isDirectory(); // symlink-to-dir → false → treated as a leaf, not followed\n if (!pushLine(ctx, `${indent}${isDir ? `${e.name}/` : e.name}`)) return false;\n if (isDir && depth + 1 < ctx.maxDepth) return walkDir(ctx, join(dir, e.name), depth + 1);\n return true;\n}\n\nfunction walkDir(ctx: WalkCtx, dir: string, depth: number): boolean {\n const entries = visibleEntries(dir, ctx.ignore);\n const shown = entries.slice(0, PER_DIR_CAP);\n const indent = \" \".repeat(depth);\n for (const e of shown) {\n if (!emitEntry(ctx, dir, e, depth, indent)) return false;\n }\n if (entries.length > shown.length) {\n return pushLine(ctx, `${indent}… (${entries.length - shown.length} more)`);\n }\n return true;\n}\n\n/** Render a char-bounded, depth-limited directory tree. Never throws. */\nexport function buildRepoMap(cwd: string, opts: RepoMapOptions = {}): string {\n try {\n if (!existsSync(cwd) || !statSync(cwd).isDirectory()) {\n return `(unavailable: ${cwd} is not a readable directory)`;\n }\n } catch {\n return `(unavailable: ${cwd})`;\n }\n\n const ctx: WalkCtx = {\n ignore: new Set([...DEFAULT_REPO_MAP_IGNORE, ...(opts.ignore ?? [])]),\n maxDepth: opts.maxDepth ?? DEFAULT_MAX_DEPTH,\n budget: opts.budget ?? DEFAULT_BUDGET,\n lines: [],\n used: 0,\n truncated: false,\n };\n walkDir(ctx, cwd, 0);\n return ctx.truncated ? `${ctx.lines.join(\"\\n\")}\\n${TRUNCATED_MARKER}` : ctx.lines.join(\"\\n\");\n}\n","/**\n * ACI (Agent-Computer Interface) helpers for tools (M3-5).\n *\n * `withDescription(tool, description)` immutably overrides a tool's LLM-facing\n * description (the wording that drives tool-selection accuracy) — returning a\n * NEW `CustomTool` and leaving the original untouched. `renderToolList(tools)`\n * renders a `<tools>` block FROM THE SAME `CustomTool[]` the agent runs, so the\n * rendered list cannot drift from the real tools (single source of truth).\n *\n * Both are pure, zero-dependency, and never throw. The `<tools>` block is a\n * system-prompt orientation aid — NOT the provider tool-call schema (that stays\n * each tool's `inputSchema`). Design: blueprint m3-aci-tools.\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\n/**\n * Return a new `CustomTool` with `description` replaced. Preserves\n * name/inputSchema/handler; does NOT mutate the original tool.\n */\nexport function withDescription(tool: CustomTool, description: string): CustomTool {\n return {\n name: tool.name,\n description,\n inputSchema: tool.inputSchema,\n handler: tool.handler,\n };\n}\n\n/** XML-escape for the `<tools>` block. `&` MUST be replaced first (no double-escape). */\nfunction esc(s: string): string {\n // String() guards the never-throw contract against an untyped/`as any` caller\n // passing a non-string name/description.\n return String(s).replaceAll(\"&\", \"&\").replaceAll(\"<\", \"<\").replaceAll(\">\", \">\");\n}\n\n/**\n * Render a `<tools>` block (name + description per tool) from the agent's actual\n * `CustomTool[]` — single source of truth, so an overridden/added/removed tool\n * is reflected automatically. An empty array yields `<tools></tools>`. Never throws.\n */\nexport function renderToolList(tools: CustomTool[]): string {\n if (tools.length === 0) return \"<tools></tools>\";\n const lines = [\"<tools>\"];\n for (const t of tools) {\n lines.push(\n \" <tool>\",\n ` <name>${esc(t.name)}</name>`,\n ` <description>${esc(t.description)}</description>`,\n \" </tool>\",\n );\n }\n lines.push(\"</tools>\");\n return lines.join(\"\\n\");\n}\n","/**\n * Rich-error guidance for tool failures (M3-4).\n *\n * `withToolResultGuidance(tool, guidance)` wraps a `CustomTool` so a failing\n * `{ ok: false, error }` JSON result gains an LLM-actionable `guidance` string\n * telling the model how to self-correct. The injection is ADDITIVE (only on\n * `ok:false`), IDEMPOTENT (never overwrites an existing `guidance`), and\n * NEVER-THROW (a non-JSON / non-object / `ok:true` / unknown-code result is\n * returned unchanged). Composes over the existing built-in tools (and custom\n * tools) — no factory edits required.\n *\n * Design: blueprint m3-rich-errors. Zero new dependencies (JSON transform).\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\n/** Maps a tool error code to a short, LLM-actionable self-correction hint. */\nexport type ToolGuidanceMap = Record<string, string>;\n\n/** Curated hints for the common cross-tool error codes. Consumers may extend. */\nexport const DEFAULT_TOOL_GUIDANCE: ToolGuidanceMap = {\n not_found:\n \"The path does not exist. Use `list_dir` or `glob_files` to find the correct path, then retry.\",\n path_traversal: \"That path escapes the project root. Use a path inside the project directory.\",\n forbidden_path:\n \"That path is a protected file (.env, .git, lock files, etc.). Choose a different, non-sensitive path.\",\n no_match:\n \"The search text was not found verbatim. Re-read the file with `read_file` and copy the exact text (including whitespace/indentation) before editing.\",\n timeout: \"The operation timed out. Narrow the scope or pass a larger `timeout_ms`.\",\n invalid_url: \"The URL is malformed. Provide a full absolute http(s):// URL.\",\n ssrf_blocked: \"That host is private/loopback/reserved and is blocked. Use a public URL.\",\n catastrophic_command:\n \"That command is blocked as catastrophic. Use a safer, scoped command (e.g. a relative path instead of `/`).\",\n binary_file: \"The file is binary and cannot be read as text. Use a tool suited to binary data.\",\n too_large:\n \"The target is too large to process directly. Use a bounded range or a narrower scope.\",\n};\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Pure: parse a tool handler's JSON output and ADD a `guidance` hint when the\n * result is an `{ ok: false, error }` object whose code has a hint and that does\n * not already carry guidance. Any other input is returned UNCHANGED (never throws).\n */\nexport function injectGuidance(handlerOutput: string, guidance: ToolGuidanceMap): string {\n let parsed: unknown;\n try {\n parsed = JSON.parse(handlerOutput);\n } catch {\n return handlerOutput; // non-JSON tool output → passthrough\n }\n if (!isRecord(parsed) || parsed.ok !== false) return handlerOutput;\n if (\"guidance\" in parsed) return handlerOutput; // idempotent — never touch an existing key\n const code = parsed.error;\n if (typeof code !== \"string\") return handlerOutput;\n const hint = guidance[code];\n if (!hint) return handlerOutput; // unknown code → no guidance\n return JSON.stringify({ ...parsed, guidance: hint });\n}\n\n/**\n * Wrap a `CustomTool` so its failed results gain a `guidance` hint from `guidance`.\n * Preserves name/description/inputSchema; only the handler output is augmented.\n */\nexport function withToolResultGuidance(tool: CustomTool, guidance: ToolGuidanceMap): CustomTool {\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n handler: async (input) => injectGuidance(await tool.handler(input), guidance),\n };\n}\n\n/** `withToolResultGuidance` pre-bound to {@link DEFAULT_TOOL_GUIDANCE}. */\nexport function withDefaultGuidance(tool: CustomTool): CustomTool {\n return withToolResultGuidance(tool, DEFAULT_TOOL_GUIDANCE);\n}\n","/**\n * `list_dir` — built-in tool for coding agents.\n *\n * Returns the direct entries of a project-relative directory. Hardened\n * against the same four bug families as `read_file` plus the\n * **EC-6 unbounded output** failure mode: in a project with 10k files,\n * a naive listing returns a 5 MB JSON payload that freezes the browser\n * and (more importantly) blows past the LLM context window.\n *\n * Defaults:\n * - `max = 500` entries (override via factory option `{ max }`)\n * - Result includes `{ truncated: boolean, totalCount: number }` so the\n * agent can decide whether to drill deeper or call `search_text` instead\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, entries: Array<{ name, type }>, truncated, totalCount }`\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' | 'not_found' }`\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nconst DEFAULT_MAX_ENTRIES = 500;\n\nexport interface CreateListDirToolOptions {\n /** Absolute path to the project root. Every listing is gated against this boundary. */\n projectRoot: string;\n /** Maximum number of entries returned per call. Default 500. */\n max?: number;\n}\n\nexport function createListDirTool(opts: CreateListDirToolOptions): CustomTool {\n const { projectRoot, max = DEFAULT_MAX_ENTRIES } = opts;\n\n return defineTool({\n name: \"list_dir\",\n description:\n `Return the direct entries of a project-relative directory. ` +\n `Refuses paths outside the project root or in the sensitive-file ` +\n `blocklist (.env, .git/, node_modules/, .theo/, lock files). Caps ` +\n `at ${String(max)} entries by default; result carries truncated + totalCount.`,\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative directory path. Use '.' for root.\"),\n }),\n handler: async ({ path }) => {\n const relative = path === \"\" || path === \".\" ? \".\" : path;\n if (relative !== \".\" && isForbiddenPath(relative)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n const boundary = resolveDirBoundary(relative, projectRoot, path);\n if (\"error\" in boundary) return boundary.error;\n const readResult = await readDirSafe(boundary.absolutePath, path);\n if (\"error\" in readResult) return readResult.error;\n return formatListing(readResult.dirents, max);\n },\n });\n}\n\nfunction resolveDirBoundary(\n relative: string,\n projectRoot: string,\n originalPath: string,\n): { absolutePath: string } | { error: string } {\n try {\n const absolutePath = relative === \".\" ? projectRoot : safePathJoin(projectRoot, relative);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n return { absolutePath };\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return { error: JSON.stringify({ ok: false, error: \"path_traversal\", path: originalPath }) };\n }\n throw err;\n }\n}\n\nasync function readDirSafe(\n absolutePath: string,\n originalPath: string,\n): Promise<{ dirents: Dirent[] } | { error: string }> {\n try {\n const dirents = await readdir(absolutePath, { withFileTypes: true });\n return { dirents };\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n return { error: JSON.stringify({ ok: false, error: \"not_found\", path: originalPath }) };\n }\n throw err;\n }\n}\n\nfunction formatListing(dirents: Dirent[], max: number): string {\n const totalCount = dirents.length;\n const truncated = totalCount > max;\n const entries = dirents.slice(0, max).map((d) => ({\n name: d.name,\n type: d.isDirectory() ? (\"directory\" as const) : (\"file\" as const),\n }));\n return JSON.stringify({ ok: true, entries, truncated, totalCount });\n}\n","/**\n * `plan_mode` — tool for toggling between normal and planning mode.\n *\n * In plan mode, the agent focuses on outlining steps rather than executing them.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, mode: string, message: string }`\n * - `{ ok: false, error: \"invalid_action\" }`\n *\n * Opt-in persistence (M4-4): `createPlanModeTool({ artifactStore })` returns a\n * variant whose async handler persists the submitted `plan` on `exit`.\n */\n\nimport type { SessionArtifactStore } from \"./artifact-store.js\";\n\ntype Mode = \"normal\" | \"plan\";\n\nconst PLAN_INSTRUCTIONS = [\n \"You are now in PLAN MODE.\",\n \"Outline the steps you will take before executing any code changes.\",\n \"Number each step. Include file paths and what will change.\",\n \"Do NOT make any edits or tool calls other than reading files.\",\n \"When ready, use plan_mode with action 'exit' to return to normal mode.\",\n].join(\"\\n\");\n\nconst NORMAL_INSTRUCTIONS = \"Returned to NORMAL MODE. You may now execute changes.\";\n\nexport interface PlanModeTool {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: { action: string }) => string;\n /** Expose current mode for testing. */\n currentMode: () => Mode;\n}\n\n/**\n * Plan-mode tool with opt-in artifact persistence (M4-4). Same surface as\n * {@link PlanModeTool} but the handler is ASYNC (it may write to the store) and\n * accepts an optional `plan` to persist on `exit`.\n *\n * @public\n */\nexport interface PlanModeToolWithStore {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: { action: string; plan?: string }) => Promise<string>;\n currentMode: () => Mode;\n}\n\n/**\n * Options for the persistence-enabled {@link createPlanModeTool} overload.\n *\n * @public\n */\nexport interface PlanModeToolOptions {\n /** Store the submitted `plan` is persisted to on `exit`. */\n artifactStore: SessionArtifactStore;\n /** Artifact id under which the plan is stored. Default `\"plan\"`. */\n artifactId?: string;\n}\n\nconst DESCRIPTION =\n \"Toggle between normal and plan mode. \" +\n \"Actions: 'enter' (switch to plan mode), 'exit' (return to normal), 'status' (check current mode). \" +\n \"Returns { ok, mode, message }.\";\n\nfunction planModeSchema(withPlan: boolean): unknown {\n const properties: Record<string, unknown> = {\n action: {\n type: \"string\",\n enum: [\"enter\", \"exit\", \"status\"],\n description: \"The action to perform.\",\n },\n };\n if (withPlan) {\n properties.plan = {\n type: \"string\",\n description: \"On 'exit', the plan text to persist to the artifact store.\",\n };\n }\n return { type: \"object\" as const, properties, required: [\"action\"] };\n}\n\nfunction renderMode(action: string, mode: Mode): string | undefined {\n switch (action) {\n case \"enter\":\n return JSON.stringify({ ok: true, mode, message: PLAN_INSTRUCTIONS });\n case \"exit\":\n return JSON.stringify({ ok: true, mode, message: NORMAL_INSTRUCTIONS });\n case \"status\":\n return JSON.stringify({ ok: true, mode, message: `Current mode: ${mode}` });\n default:\n return undefined;\n }\n}\n\nfunction invalidAction(action: string): string {\n return JSON.stringify({\n ok: false,\n error: \"invalid_action\",\n message: `Unknown action '${action}'. Valid: enter, exit, status.`,\n });\n}\n\nexport function createPlanModeTool(): PlanModeTool;\nexport function createPlanModeTool(options: PlanModeToolOptions): PlanModeToolWithStore;\nexport function createPlanModeTool(\n options?: PlanModeToolOptions,\n): PlanModeTool | PlanModeToolWithStore {\n let mode: Mode = \"normal\";\n\n if (options === undefined) {\n return {\n name: \"plan_mode\",\n description: DESCRIPTION,\n inputSchema: planModeSchema(false),\n handler: (input: { action: string }): string => {\n if (input.action === \"enter\") mode = \"plan\";\n else if (input.action === \"exit\") mode = \"normal\";\n return renderMode(input.action, mode) ?? invalidAction(input.action);\n },\n currentMode: () => mode,\n };\n }\n\n const { artifactStore, artifactId = \"plan\" } = options;\n return {\n name: \"plan_mode\",\n description: DESCRIPTION,\n inputSchema: planModeSchema(true),\n handler: async (input: { action: string; plan?: string }): Promise<string> => {\n if (input.action === \"enter\") {\n mode = \"plan\";\n return JSON.stringify({ ok: true, mode, message: PLAN_INSTRUCTIONS });\n }\n if (input.action === \"exit\") {\n mode = \"normal\";\n // Persist only a non-empty plan (EC-1); enter/status never persist (EC-2).\n if (typeof input.plan === \"string\" && input.plan.length > 0) {\n const path = await artifactStore.write(artifactId, input.plan);\n return JSON.stringify({\n ok: true,\n mode,\n message: NORMAL_INSTRUCTIONS,\n persisted: true,\n path,\n });\n }\n return JSON.stringify({ ok: true, mode, message: NORMAL_INSTRUCTIONS, persisted: false });\n }\n return renderMode(input.action, mode) ?? invalidAction(input.action);\n },\n currentMode: () => mode,\n };\n}\n","/**\n * `question` — interactive tool that asks the user a question and waits for a response.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, answer: string }`\n * - `{ ok: false, error: \"timeout\" }`\n */\n\nexport interface QuestionToolOptions {\n /** Callback that presents a question to the user and resolves with their answer. */\n askUser: (question: string) => Promise<string>;\n /** Maximum time to wait for user response in ms. Default: 300_000 (5 min). */\n timeoutMs?: number;\n}\n\nexport interface QuestionTool {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: { question: string }) => Promise<string>;\n}\n\nexport function createQuestionTool(opts: QuestionToolOptions): QuestionTool {\n const timeoutMs = opts.timeoutMs ?? 300_000;\n\n return {\n name: \"question\",\n description:\n \"Ask the user a question and wait for their response. \" +\n \"Use when you need clarification or confirmation before proceeding. \" +\n \"Returns { ok, answer } or { ok: false, error: 'timeout' }.\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n question: { type: \"string\", description: \"The question to ask the user.\" },\n },\n required: [\"question\"],\n },\n handler: async (input: { question: string }): Promise<string> => {\n const timeout = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error(\"timeout\")), timeoutMs);\n });\n\n try {\n const answer = await Promise.race([opts.askUser(input.question), timeout]);\n return JSON.stringify({ ok: true, answer });\n } catch (err) {\n if (err instanceof Error && err.message === \"timeout\") {\n return JSON.stringify({\n ok: false,\n error: \"timeout\",\n message: \"User did not respond within timeout.\",\n });\n }\n throw err;\n }\n },\n };\n}\n","/**\n * `read_file` — built-in tool for coding agents.\n *\n * Reads a project-relative file as UTF-8 and returns its contents.\n * Hardened against the four bug families a coding agent normally hits:\n *\n * 1. **Path traversal** — `safePathJoin` rejects literal `..`,\n * normalised escape, absolute segments, null-byte injection.\n * 2. **Symlink escape** — `assertNoSymlinkEscape` follows the full\n * chain (and any intermediate symlinks; defence-in-depth fix v1.x).\n * 3. **Sensitive files** — `isForbiddenPath` blocks `.env*` (except\n * `.env.example`), `.git/`, `node_modules/`, `.theo/`, lock files.\n * 4. **Binary files** — null-byte check on the first 8 KB. PNG/JPEG/\n * compiled binaries return a structured `binary_file` error\n * instead of garbled UTF-8 (EC-5 from the TheoKit Studio review).\n *\n * Return shape (always a JSON string the LLM consumes):\n * - `{ ok: true, content: string }` on success\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' |\n * 'binary_file' | 'not_found' | 'too_large' }` on refusal\n *\n * The handler intentionally never throws on a \"user mistake\"\n * (traversal / forbidden / not found). Throwing reserved for SDK-side\n * mistakes that should crash the agent loop (input parse errors).\n */\n\nimport { type FileHandle, open } from \"node:fs/promises\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\n/** Max single-file read size, in bytes. 5 MB ceiling — enough for any source file. */\nconst MAX_FILE_SIZE = 5 * 1024 * 1024;\n\n/** Byte window inspected for null bytes when deciding binary vs text. */\nconst BINARY_PROBE_BYTES = 8 * 1024;\n\nexport interface CreateReadFileToolOptions {\n /** Absolute path to the project root. Every read is gated against this boundary. */\n projectRoot: string;\n}\n\nexport function createReadFileTool(opts: CreateReadFileToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"read_file\",\n description:\n \"Read a project-relative text file as UTF-8. ALWAYS read a file before you edit it \" +\n \"(edit_file) or overwrite it (write_file), so your old_string / new content matches the \" +\n \"real bytes exactly. Returns the WHOLE file (there is no offset or line-range parameter); \" +\n \"to locate a symbol inside a large file, use search_text instead of re-reading. Refuses \" +\n \"paths that escape the project root, sensitive files (.env, .git/, node_modules/, .theo/, \" +\n \"lock files), and binary files (null byte in the first 8 KB); caps at 5 MB. Returns \" +\n \"{ ok, content, size } or { ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative file path.\"),\n }),\n handler: async ({ path }) => {\n if (isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n const boundary = resolveBoundary(path, projectRoot);\n if (\"error\" in boundary) return boundary.error;\n const opened = await openHandleSafe(boundary.absolutePath, path);\n if (\"error\" in opened) return opened.error;\n try {\n return await readContent(opened.handle, path);\n } finally {\n await opened.handle.close();\n }\n },\n });\n}\n\nfunction resolveBoundary(\n path: string,\n projectRoot: string,\n): { absolutePath: string } | { error: string } {\n try {\n const absolutePath = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n return { absolutePath };\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return { error: JSON.stringify({ ok: false, error: \"path_traversal\", path }) };\n }\n throw err;\n }\n}\n\nasync function openHandleSafe(\n absolutePath: string,\n path: string,\n): Promise<{ handle: FileHandle } | { error: string }> {\n try {\n const handle = await open(absolutePath, \"r\");\n return { handle };\n } catch (err) {\n const e = err as { code?: string };\n if (e.code === \"ENOENT\") {\n return { error: JSON.stringify({ ok: false, error: \"not_found\", path }) };\n }\n throw err;\n }\n}\n\nasync function readContent(handle: FileHandle, path: string): Promise<string> {\n const stat = await handle.stat();\n if (stat.size > MAX_FILE_SIZE) {\n return JSON.stringify({\n ok: false,\n error: \"too_large\",\n path,\n size: stat.size,\n limit: MAX_FILE_SIZE,\n });\n }\n if (await isBinaryProbe(handle, Number(stat.size))) {\n return JSON.stringify({ ok: false, error: \"binary_file\", path, size: stat.size });\n }\n const content = await handle.readFile({ encoding: \"utf-8\" });\n return JSON.stringify({ ok: true, content, size: stat.size });\n}\n\nasync function isBinaryProbe(handle: FileHandle, size: number): Promise<boolean> {\n const probeLen = Math.min(BINARY_PROBE_BYTES, size);\n if (probeLen <= 0) return false;\n const probe = Buffer.alloc(probeLen);\n const { bytesRead } = await handle.read(probe, 0, probeLen, 0);\n for (let i = 0; i < bytesRead; i += 1) {\n if (probe[i] === 0) return true;\n }\n return false;\n}\n","/**\n * `run_vitest` — built-in tool for coding agents.\n *\n * Runs vitest against an optional file/pattern scope and returns the\n * parsed JSON report. Hardened against the same subprocess failure\n * modes as `git_diff`:\n *\n * - 120s wall clock timeout (vitest can be slow on first run)\n * - Process group kill on timeout (EC-7 — defeats vitest workers as\n * grandchildren of the spawned shell)\n * - **EC-12**: vitest stdout may contain deprecation warnings BEFORE\n * the JSON payload. The parser scans line-by-line and extracts the\n * LAST valid JSON object, not the first.\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, summary: { numTotalTests, numPassedTests, numFailedTests, success } }`\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' | 'timeout' |\n * 'no_vitest' | 'unparseable_output' }`\n *\n * Implementation note: invokes vitest via `npx --no-install vitest`. The\n * `--no-install` avoids the agent triggering a multi-megabyte download\n * mid-turn if vitest is missing — the tool fails cleanly with\n * `no_vitest` instead.\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport { isForbiddenPath } from \"./internal/path-guard.js\";\nimport { checkPathScope } from \"./path-scope.js\";\nimport { armTimeoutKill, attachChildSettlers } from \"./subprocess.js\";\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst DEFAULT_MAX_STDOUT_BYTES = 10 * 1024 * 1024;\n\nexport interface CreateRunVitestToolOptions {\n projectRoot: string;\n timeoutMs?: number;\n maxStdoutBytes?: number;\n}\n\nexport interface VitestSummary {\n numTotalTests?: number;\n numPassedTests?: number;\n numFailedTests?: number;\n success?: boolean;\n}\n\nexport function createRunVitestTool(opts: CreateRunVitestToolOptions): CustomTool {\n const {\n projectRoot,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n maxStdoutBytes = DEFAULT_MAX_STDOUT_BYTES,\n } = opts;\n\n return defineTool({\n name: \"run_vitest\",\n description:\n \"Run the project's vitest suite, optionally scoped to a file or \" +\n \"pattern via 'path'. Returns parsed { ok, summary } or { ok: false, \" +\n \"error }. Vitest stdout warnings are stripped — the parser extracts \" +\n \"the trailing JSON report.\",\n inputSchema: z.object({\n path: z\n .string()\n .optional()\n .describe(\"Optional vitest pattern or file path (project-relative).\"),\n }),\n handler: async ({ path }) => {\n const scopeError = validateVitestScope(path, projectRoot);\n if (scopeError !== null) return scopeError;\n\n const args = [\"--no-install\", \"vitest\", \"run\", \"--reporter=json\"];\n if (path !== undefined && path !== \"\") args.push(path);\n\n const result = await runProcess(projectRoot, \"npx\", args, timeoutMs, maxStdoutBytes);\n return formatVitestResult(result, timeoutMs);\n },\n });\n}\n\nfunction validateVitestScope(path: string | undefined, projectRoot: string): string | null {\n if (path !== undefined && path !== \"\" && isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n return checkPathScope(path, projectRoot);\n}\n\nfunction formatVitestResult(result: ProcessResult, timeoutMs: number): string {\n if (result.kind === \"timeout\") {\n return JSON.stringify({ ok: false, error: \"timeout\", timeoutMs });\n }\n if (result.kind === \"spawn_error\") {\n return JSON.stringify({ ok: false, error: \"no_vitest\", detail: result.message });\n }\n const summary = extractTrailingJson(result.stdout) as VitestSummary | null;\n if (summary === null) {\n return JSON.stringify({\n ok: false,\n error: \"unparseable_output\",\n stderrPreview: result.stderr.slice(0, 500),\n });\n }\n return JSON.stringify({ ok: true, summary });\n}\n\n/**\n * Find the LAST line in `stdout` that parses as a JSON object. Vitest\n * prepends node deprecation warnings to its JSON reporter output — if\n * we naively `JSON.parse(stdout)` we get a SyntaxError. Workaround: walk\n * lines bottom-up and return the first one that parses.\n *\n * Exported for direct unit testing without spawning vitest.\n */\nexport function extractTrailingJson(stdout: string): unknown {\n const lines = stdout.split(/\\r?\\n/);\n for (let i = lines.length - 1; i >= 0; i -= 1) {\n const line = lines[i]!.trim();\n if (line.length === 0) continue;\n if (line[0] !== \"{\" && line[0] !== \"[\") continue;\n try {\n return JSON.parse(line) as unknown;\n } catch {\n // not valid JSON — keep looking\n }\n }\n return null;\n}\n\nfunction appendCapped(chunks: Buffer[], chunk: Buffer, current: number, cap: number): number {\n if (current >= cap) return current;\n const remaining = cap - current;\n if (chunk.length > remaining) {\n chunks.push(chunk.subarray(0, remaining));\n return cap;\n }\n chunks.push(chunk);\n return current + chunk.length;\n}\n\ntype ProcessResult =\n | { kind: \"ok\"; stdout: string; stderr: string; exitCode: number }\n | { kind: \"timeout\" }\n | { kind: \"spawn_error\"; message: string };\n\nfunction runProcess(\n cwd: string,\n command: string,\n args: string[],\n timeoutMs: number,\n maxStdoutBytes: number,\n): Promise<ProcessResult> {\n return new Promise((resolve) => {\n const child = spawn(command, args, {\n cwd,\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let stdoutBytes = 0;\n\n const gate = armTimeoutKill<ProcessResult>(\n child,\n timeoutMs,\n () => ({ kind: \"timeout\" }),\n resolve,\n );\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n stdoutBytes = appendCapped(stdoutChunks, chunk, stdoutBytes, maxStdoutBytes);\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n stderrChunks.push(chunk);\n });\n\n attachChildSettlers<ProcessResult>(\n child,\n gate,\n (code) => ({\n kind: \"ok\",\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n exitCode: code ?? 0,\n }),\n (err) => ({ kind: \"spawn_error\", message: err.message }),\n resolve,\n );\n });\n}\n","/**\n * `search_text` — built-in tool for coding agents.\n *\n * Literal text search across the project tree (recursive). Sensible\n * defaults:\n *\n * - Skips forbidden directories (`.env`, `.git/`, `node_modules/`,\n * `.theo/`) so the agent never wastes context on dependency soup\n * or VCS internals.\n * - Skips files larger than `maxFileSize` (default 1 MB) and binary\n * files (null-byte detection on first 8 KB) so a megabyte of\n * minified JS never blows up the result.\n * - Caps total matches at `maxMatches` (default 100) — the agent\n * should refine the query if it gets close to the cap.\n *\n * Result shape (always a JSON string):\n * - `{ ok: true, matches: Array<{ file, line, preview }>, truncated, totalMatches }`\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' | 'not_found' }`\n *\n * Implementation note: this is a plain JS recursive walk. For very\n * large repos a future iteration can shell out to `rg` (ripgrep) when\n * present, but the JS path stays as the dependency-free fallback.\n */\n\nimport type { Dirent } from \"node:fs\";\nimport { readdir, readFile } from \"node:fs/promises\";\nimport { join, relative as relativePath } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\nconst DEFAULT_MAX_MATCHES = 100;\nconst DEFAULT_MAX_FILE_SIZE = 1024 * 1024; // 1 MB\nconst BINARY_PROBE_BYTES = 8 * 1024;\nconst PREVIEW_MAX = 200;\n\nexport interface CreateSearchTextToolOptions {\n projectRoot: string;\n /** Cap on total matches returned. Default 100. */\n maxMatches?: number;\n /** Skip files larger than this (bytes). Default 1 MB. */\n maxFileSize?: number;\n}\n\ninterface Match {\n file: string;\n line: number;\n preview: string;\n}\n\nexport function createSearchTextTool(opts: CreateSearchTextToolOptions): CustomTool {\n const {\n projectRoot,\n maxMatches = DEFAULT_MAX_MATCHES,\n maxFileSize = DEFAULT_MAX_FILE_SIZE,\n } = opts;\n\n return defineTool({\n name: \"search_text\",\n description:\n `Search file CONTENTS for a LITERAL, CASE-SENSITIVE query across the project tree (the query ` +\n `is matched as a substring, not a regex). Use search_text when you know the content; use ` +\n `glob_files when you know the filename shape; use read_file when you know the exact path. ` +\n `Skips sensitive dirs (.env/.git/node_modules/.theo), binary files, and files over 1 MB; ` +\n `'path' scopes the search to a subdirectory. Returns up to ${String(maxMatches)} matches as ` +\n `{ file, line, preview } — cite locations to the user as file:line. Returns { ok, matches } ` +\n `or { ok: false, error }.`,\n inputSchema: z.object({\n query: z.string().min(1).describe(\"Literal text to search for. Case-sensitive.\"),\n path: z\n .string()\n .optional()\n .describe(\"Optional project-relative directory to scope the search.\"),\n }),\n handler: async ({ query, path }) => {\n const scope = resolveSearchScope(path, projectRoot);\n if (\"error\" in scope) return scope.error;\n const state: SearchState = {\n matches: [],\n totalMatches: 0,\n truncated: false,\n query,\n maxMatches,\n maxFileSize,\n projectRoot,\n };\n await walk(scope.scopeAbs, state);\n return JSON.stringify({\n ok: true,\n matches: state.matches,\n truncated: state.truncated,\n totalMatches: state.totalMatches,\n });\n },\n });\n}\n\ninterface SearchState {\n matches: Match[];\n totalMatches: number;\n truncated: boolean;\n query: string;\n maxMatches: number;\n maxFileSize: number;\n projectRoot: string;\n}\n\nfunction resolveSearchScope(\n path: string | undefined,\n projectRoot: string,\n): { scopeAbs: string } | { error: string } {\n const scopeRel = path === undefined || path === \"\" || path === \".\" ? \".\" : path;\n try {\n const scopeAbs = scopeRel === \".\" ? projectRoot : safePathJoin(projectRoot, scopeRel);\n assertNoSymlinkEscape(scopeAbs, projectRoot);\n return { scopeAbs };\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return { error: JSON.stringify({ ok: false, error: \"path_traversal\", path }) };\n }\n throw err;\n }\n}\n\nasync function handleEntry(entry: Dirent, absDir: string, state: SearchState): Promise<void> {\n const entryAbs = join(absDir, entry.name);\n const entryRel = relativePath(state.projectRoot, entryAbs);\n if (isForbiddenPath(entryRel)) return;\n if (entry.isDirectory()) {\n await walk(entryAbs, state);\n return;\n }\n if (entry.isFile()) await scanFile(entryAbs, entryRel, state);\n}\n\nasync function walk(absDir: string, state: SearchState): Promise<void> {\n if (state.truncated) return;\n const entries = await readEntriesQuiet(absDir);\n if (entries === null) return;\n for (const entry of entries) {\n if (state.truncated) return;\n await handleEntry(entry, absDir, state);\n }\n}\n\nasync function readEntriesQuiet(absDir: string): Promise<Dirent[] | null> {\n try {\n return await readdir(absDir, { withFileTypes: true });\n } catch {\n return null;\n }\n}\n\nasync function readBufferQuiet(absPath: string): Promise<Buffer | null> {\n try {\n return await readFile(absPath);\n } catch {\n return null;\n }\n}\n\nfunction isBinaryBuffer(buffer: Buffer): boolean {\n const probeEnd = Math.min(buffer.length, BINARY_PROBE_BYTES);\n for (let i = 0; i < probeEnd; i += 1) {\n if (buffer[i] === 0) return true;\n }\n return false;\n}\n\nfunction recordMatch(state: SearchState, file: string, line: number, lineText: string): boolean {\n state.totalMatches += 1;\n if (state.matches.length < state.maxMatches) {\n state.matches.push({\n file,\n line,\n preview: lineText.length > PREVIEW_MAX ? `${lineText.slice(0, PREVIEW_MAX)}…` : lineText,\n });\n return true;\n }\n state.truncated = true;\n return false;\n}\n\nasync function scanFile(absPath: string, relPath: string, state: SearchState): Promise<void> {\n const buffer = await readBufferQuiet(absPath);\n if (buffer === null || buffer.length > state.maxFileSize) return;\n if (isBinaryBuffer(buffer)) return;\n const lines = buffer.toString(\"utf-8\").split(\"\\n\");\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i]!;\n if (!line.includes(state.query)) continue;\n if (!recordMatch(state, relPath, i + 1, line)) return;\n }\n}\n","/**\n * `shell_exec` — built-in tool for coding agents.\n *\n * Executes a shell command via `/bin/sh -c` with a configurable timeout\n * and output size cap.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, stdout, stderr, exit_code }`\n * - `{ ok: false, error: 'timeout' | 'exec_failed' }`\n */\n\nimport { spawn } from \"node:child_process\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport { CatastrophicCommandError, catastrophicShellReason } from \"./internal/shell-guard.js\";\nimport { armTimeoutKill, attachChildSettlers } from \"./subprocess.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_TIMEOUT_MS = 300_000; // 5 minutes hard ceiling\nconst MAX_OUTPUT_BYTES = 5 * 1024 * 1024; // 5 MB\n\nexport interface CreateShellToolOptions {\n /** Absolute path to the project root. Commands execute in this cwd. */\n projectRoot: string;\n /** Default timeout in ms. Capped at 300s. */\n defaultTimeoutMs?: number;\n /**\n * Opt out of the catastrophic-command guardrail. Default `false` (the\n * guardrail screens every command before spawn). Set `true` only when the\n * agent legitimately needs destructive power flows — it is a heuristic\n * guardrail, not a sandbox.\n */\n allowCatastrophic?: boolean;\n}\n\nexport function createShellTool(opts: CreateShellToolOptions): CustomTool {\n const { projectRoot, defaultTimeoutMs = DEFAULT_TIMEOUT_MS, allowCatastrophic = false } = opts;\n\n return defineTool({\n name: \"shell_exec\",\n description:\n \"Execute a shell command in the project directory. Use this for terminal operations — running \" +\n \"tests, git, package managers, build tools. Do NOT use it for file operations (reading, \" +\n \"writing, editing, finding files): prefer the specialized read_file/write_file/edit_file/\" +\n \"glob_files/search_text tools, which are path-checked and safer. Only commit, push, or change \" +\n \"git state when the user explicitly asks. timeout_ms defaults to 30000 (max 300000); \" +\n \"stdout/stderr are capped (~5 MB). Returns { ok, stdout, stderr, exit_code } or \" +\n \"{ ok: false, error }.\",\n inputSchema: z.object({\n command: z.string().min(1).describe(\"Shell command to execute.\"),\n timeout_ms: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Timeout in milliseconds (default 30000, max 300000).\"),\n }),\n handler: async ({ command, timeout_ms }) => {\n if (!allowCatastrophic) {\n const reason = catastrophicShellReason(command);\n if (reason) {\n // Construct the typed error so its `code` is the single source of the\n // error string (mirrors web_fetch's SsrfBlockedError handling).\n const err = new CatastrophicCommandError(reason);\n return JSON.stringify({ ok: false, error: err.code, reason });\n }\n }\n const timeoutMs = Math.min(timeout_ms ?? defaultTimeoutMs, MAX_TIMEOUT_MS);\n const result = await runShell(projectRoot, command, timeoutMs);\n return result;\n },\n });\n}\n\ntype ShellResult =\n | { kind: \"ok\"; stdout: string; stderr: string; exitCode: number | null }\n | { kind: \"timeout\" }\n | { kind: \"error\"; message: string };\n\nfunction runShell(cwd: string, command: string, timeoutMs: number): Promise<string> {\n return new Promise((resolve) => {\n const child = spawn(\"/bin/sh\", [\"-c\", command], {\n cwd,\n detached: true,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let stdoutBytes = 0;\n let stderrBytes = 0;\n let _truncated = false;\n\n const gate = armTimeoutKill<ShellResult>(\n child,\n timeoutMs,\n () => ({ kind: \"timeout\" }),\n (result) => resolve(formatResult(result, timeoutMs)),\n );\n\n child.stdout.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n if (stdoutBytes >= MAX_OUTPUT_BYTES) {\n _truncated = true;\n return;\n }\n const remaining = MAX_OUTPUT_BYTES - stdoutBytes;\n if (chunk.length > remaining) {\n stdoutChunks.push(chunk.subarray(0, remaining));\n stdoutBytes = MAX_OUTPUT_BYTES;\n _truncated = true;\n } else {\n stdoutChunks.push(chunk);\n stdoutBytes += chunk.length;\n }\n });\n\n child.stderr.on(\"data\", (chunk: Buffer) => {\n if (gate.settled()) return;\n if (stderrBytes >= MAX_OUTPUT_BYTES) return;\n const remaining = MAX_OUTPUT_BYTES - stderrBytes;\n if (chunk.length > remaining) {\n stderrChunks.push(chunk.subarray(0, remaining));\n stderrBytes = MAX_OUTPUT_BYTES;\n } else {\n stderrChunks.push(chunk);\n stderrBytes += chunk.length;\n }\n });\n\n attachChildSettlers<ShellResult>(\n child,\n gate,\n (code) => ({\n kind: \"ok\",\n stdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n stderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n exitCode: code,\n }),\n (err) => ({ kind: \"error\", message: err.message }),\n (result) => resolve(formatResult(result, timeoutMs)),\n );\n });\n}\n\nfunction formatResult(result: ShellResult, timeoutMs: number): string {\n if (result.kind === \"timeout\") {\n return JSON.stringify({ ok: false, error: \"timeout\", timeout_ms: timeoutMs });\n }\n if (result.kind === \"error\") {\n return JSON.stringify({ ok: false, error: \"exec_failed\", message: result.message });\n }\n return JSON.stringify({\n ok: true,\n stdout: result.stdout,\n stderr: result.stderr,\n exit_code: result.exitCode,\n });\n}\n","import type { TodoItem } from \"./todolist.js\";\n\n/**\n * A flat plan-render node — the stable shape a UI/plan layer consumes. Mirrors\n * the `TodoItem` status union; `label` is the item title.\n *\n * @public\n */\nexport interface PlanNode {\n id: string;\n label: string;\n status: \"pending\" | \"in_progress\" | \"done\";\n}\n\n/**\n * Convert structured todo items (from a `todolist` tool result's `items`, M4-5)\n * into versioned `PlanNode`s for rendering. Pure: projects EXACTLY\n * `{ id, label, status }` (timestamps are intentionally dropped), preserving\n * input order. Replaces consumer-side hand-rolled mappers.\n *\n * @public\n */\nexport function todoItemsToPlanNodes(items: readonly TodoItem[]): PlanNode[] {\n return items.map((item) => ({ id: item.id, label: item.title, status: item.status }));\n}\n","/**\n * `todolist` — in-session task tracking for multi-step work.\n *\n * The agent uses this to plan complex tasks and track progress.\n * Inspired by OpenCode's todo.ts and Claude Code's TodoWrite.\n *\n * Actions:\n * - add(title) → add a new todo item\n * - complete(id) → mark an item done\n * - remove(id) → remove an item\n * - list() → show all items with status\n * - clear_completed() → remove all done items\n */\n\nexport interface TodoItem {\n id: string;\n title: string;\n status: \"pending\" | \"in_progress\" | \"done\";\n createdAt: number;\n completedAt?: number;\n}\n\nexport interface TodolistTool {\n name: string;\n description: string;\n inputSchema: unknown;\n handler: (input: TodoInput) => string;\n /** Expose items for testing. */\n getItems: () => TodoItem[];\n}\n\ntype TodoInput =\n | { action: \"add\"; title: string }\n | { action: \"complete\"; id: string }\n | { action: \"in_progress\"; id: string }\n | { action: \"remove\"; id: string }\n | { action: \"list\" }\n | { action: \"clear_completed\" };\n\nfunction ok(data: Record<string, unknown>): string {\n return JSON.stringify({ ok: true, ...data });\n}\n\nfunction fail(data: Record<string, unknown>): string {\n return JSON.stringify({ ok: false, ...data });\n}\n\nfunction requireId(input: TodoInput): string | null {\n if (!(\"id\" in input) || !input.id) return null;\n return input.id;\n}\n\nexport function createTodolistTool(): TodolistTool {\n const items: TodoItem[] = [];\n let nextId = 1;\n\n function genId(): string {\n return `todo-${nextId++}`;\n }\n\n function findById(id: string): TodoItem | undefined {\n return items.find((i) => i.id === id);\n }\n\n // M4-5: every list-bearing success result carries BOTH the human `items_summary`\n // (for the LLM) AND the structured `items` snapshot (for programmatic consumers\n // that render a plan/UI). Previously only `items_summary` was emitted, so a\n // consumer parsing the result could never recover structured items.\n function listResult(extra: Record<string, unknown>): string {\n return ok({ ...extra, items: [...items], items_summary: formatList() });\n }\n\n function formatList(): string {\n if (items.length === 0) return \"No tasks. Use action 'add' to create one.\";\n const lines = items.map((item) => {\n const icon = item.status === \"done\" ? \"[x]\" : item.status === \"in_progress\" ? \"[>]\" : \"[ ]\";\n return `${icon} ${item.id}: ${item.title}`;\n });\n const pending = items.filter((i) => i.status === \"pending\").length;\n const inProg = items.filter((i) => i.status === \"in_progress\").length;\n const done = items.filter((i) => i.status === \"done\").length;\n lines.push(`\\n${done}/${items.length} done | ${inProg} in progress | ${pending} pending`);\n return lines.join(\"\\n\");\n }\n\n function handleAdd(input: TodoInput): string {\n if (!(\"title\" in input) || !input.title) return fail({ error: \"missing_title\" });\n const item: TodoItem = {\n id: genId(),\n title: input.title,\n status: \"pending\",\n createdAt: Date.now(),\n };\n items.push(item);\n return listResult({ id: item.id, message: `Added: ${item.title}` });\n }\n\n function handleSetStatus(input: TodoInput, status: \"in_progress\" | \"done\"): string {\n const id = requireId(input);\n if (!id) return fail({ error: \"missing_id\" });\n const item = findById(id);\n if (!item) return fail({ error: \"not_found\", id });\n item.status = status;\n if (status === \"done\") item.completedAt = Date.now();\n const verb = status === \"done\" ? \"Completed\" : \"Started\";\n return listResult({ message: `${verb}: ${item.title}` });\n }\n\n function handleRemove(input: TodoInput): string {\n const id = requireId(input);\n if (!id) return fail({ error: \"missing_id\" });\n const idx = items.findIndex((i) => i.id === id);\n if (idx === -1) return fail({ error: \"not_found\", id });\n const removed = items.splice(idx, 1)[0]!;\n return listResult({ message: `Removed: ${removed.title}` });\n }\n\n function handleClearCompleted(): string {\n const before = items.length;\n const kept = items.filter((i) => i.status !== \"done\");\n items.length = 0;\n items.push(...kept);\n return listResult({ message: `Cleared ${before - items.length} completed items` });\n }\n\n const actions: Record<string, (input: TodoInput) => string> = {\n add: handleAdd,\n in_progress: (input) => handleSetStatus(input, \"in_progress\"),\n complete: (input) => handleSetStatus(input, \"done\"),\n remove: handleRemove,\n list: () => listResult({}),\n clear_completed: handleClearCompleted,\n };\n\n return {\n name: \"todolist\",\n description:\n \"Create and maintain a structured task list for the current session — tracks progress and \" +\n \"keeps a multi-step plan visible across turns. Use it proactively when the work has 3+ steps \" +\n \"or the user gave multiple tasks; skip it for a single trivial step. Keep exactly ONE item \" +\n \"'in_progress' at a time, and mark 'complete' only after the work is actually done. \" +\n \"Actions: 'add' (create with title), 'in_progress' (mark started by id), 'complete' (mark done \" +\n \"by id), 'remove' (delete by id), 'list' (show all), 'clear_completed' (remove done items). \" +\n \"Returns { ok, items, items_summary } (items = structured array; items_summary = formatted text).\",\n inputSchema: {\n type: \"object\" as const,\n properties: {\n action: {\n type: \"string\",\n enum: [\"add\", \"complete\", \"in_progress\", \"remove\", \"list\", \"clear_completed\"],\n description: \"The action to perform.\",\n },\n title: {\n type: \"string\",\n description: \"Title for a new todo item (required for 'add').\",\n },\n id: {\n type: \"string\",\n description: \"ID of the todo item (required for 'complete', 'in_progress', 'remove').\",\n },\n },\n required: [\"action\"],\n },\n handler: (input: TodoInput): string => {\n const action = actions[input.action];\n if (!action) return fail({ error: \"invalid_action\" });\n return action(input);\n },\n getItems: () => [...items],\n };\n}\n","/**\n * `truncateOutput` — utility for truncating large tool output.\n *\n * When output exceeds `maxBytes`, writes the full content to a temp file\n * and returns a truncated version with a reference to the full output.\n *\n * Return shape:\n * - `{ content: string, truncated: false }`\n * - `{ content: string, truncated: true, overflowPath: string }`\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface TruncationOptions {\n /** Maximum output size in bytes before truncation. Default: 30_000. */\n maxBytes?: number;\n /** Directory for overflow files. Default: \".theocode/tool-output\". */\n outputDir?: string;\n}\n\nexport interface TruncationResult {\n /** The (possibly truncated) content. */\n content: string;\n /** Whether the output was truncated. */\n truncated: boolean;\n /** Path to the full output file, present only when truncated. */\n overflowPath?: string;\n}\n\nexport function truncateOutput(output: string, opts?: TruncationOptions): TruncationResult {\n const maxBytes = opts?.maxBytes ?? 30_000;\n const outputDir = opts?.outputDir ?? \".theocode/tool-output\";\n\n // EC-3: strict > comparison — exactly at limit is NOT truncated\n const byteLength = Buffer.byteLength(output, \"utf-8\");\n if (byteLength <= maxBytes) {\n return { content: output, truncated: false };\n }\n\n // Write full output to overflow file\n mkdirSync(outputDir, { recursive: true });\n const filename = `overflow-${Date.now()}.txt`;\n const overflowPath = join(outputDir, filename);\n writeFileSync(overflowPath, output, \"utf-8\");\n\n // Truncate to maxBytes (approximate — cut at byte boundary then trim to valid UTF-8)\n const truncated = Buffer.from(output, \"utf-8\").subarray(0, maxBytes).toString(\"utf-8\");\n const trailer = `\\n\\n[Output truncated. Full output: ${overflowPath}]`;\n\n return {\n content: truncated + trailer,\n truncated: true,\n overflowPath,\n };\n}\n","/**\n * `web_fetch` — built-in tool for coding agents.\n *\n * Fetches a URL via native `fetch()`. Rejects non-http(s) protocols.\n * Size-capped at 1 MB response body.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, content, status_code, content_type }`\n * - `{ ok: false, error: 'invalid_url' | 'fetch_failed' |\n * 'timeout' | 'too_large' }`\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\n\nimport { SsrfBlockedError, screenedFetch } from \"./internal/network-guard.js\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst MAX_BODY_BYTES = 1 * 1024 * 1024; // 1 MB\n\nexport interface CreateWebFetchToolOptions {\n /** Default timeout in ms. */\n defaultTimeoutMs?: number;\n /**\n * Opt out of the SSRF guard (default `false`). When `true`, requests to\n * private/loopback/link-local/metadata addresses are NOT blocked — use only for\n * trusted local-dev tooling.\n */\n allowPrivateHosts?: boolean;\n}\n\nexport function createWebFetchTool(opts?: CreateWebFetchToolOptions): CustomTool {\n const defaultTimeoutMs = opts?.defaultTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n const allowPrivateHosts = opts?.allowPrivateHosts ?? false;\n\n return defineTool({\n name: \"web_fetch\",\n description:\n \"Fetch the contents of a URL via HTTP/HTTPS. Use only for URLs the user provided or that you \" +\n \"are confident help with the task; never invent or guess URLs. Rejects non-http(s) URLs and \" +\n \"is SSRF-guarded by default (private/loopback/link-local/cloud-metadata hosts are refused \" +\n \"with an ssrf_blocked error). The response body is capped at 1 MB. Returns \" +\n \"{ ok, content, status_code, content_type } or { ok: false, error }.\",\n inputSchema: z.object({\n url: z.string().min(1).describe(\"URL to fetch (http or https only).\"),\n timeout_ms: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Timeout in milliseconds (default 30000).\"),\n }),\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: fetch with guards\n handler: async ({ url, timeout_ms }) => {\n // Validate protocol\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return JSON.stringify({ ok: false, error: \"invalid_url\", url });\n }\n\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return JSON.stringify({\n ok: false,\n error: \"invalid_url\",\n url,\n detail: \"only http and https protocols allowed\",\n });\n }\n\n const timeoutMs = timeout_ms ?? defaultTimeoutMs;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await screenedFetch(url, {\n signal: controller.signal,\n allowPrivateHosts,\n });\n clearTimeout(timer);\n\n // Check content-length header before downloading\n const contentLength = response.headers.get(\"content-length\");\n if (contentLength && Number(contentLength) > MAX_BODY_BYTES) {\n return JSON.stringify({\n ok: false,\n error: \"too_large\",\n url,\n size: Number(contentLength),\n limit: MAX_BODY_BYTES,\n });\n }\n\n const buffer = await response.arrayBuffer();\n if (buffer.byteLength > MAX_BODY_BYTES) {\n return JSON.stringify({\n ok: false,\n error: \"too_large\",\n url,\n size: buffer.byteLength,\n limit: MAX_BODY_BYTES,\n });\n }\n\n const content = new TextDecoder(\"utf-8\").decode(buffer);\n const contentType = response.headers.get(\"content-type\") ?? undefined;\n\n return JSON.stringify({\n ok: true,\n content,\n status_code: response.status,\n content_type: contentType,\n });\n } catch (err) {\n clearTimeout(timer);\n if (err instanceof SsrfBlockedError) {\n return JSON.stringify({ ok: false, error: \"ssrf_blocked\", url, reason: err.message });\n }\n const e = err as { name?: string; message?: string };\n if (e.name === \"AbortError\") {\n return JSON.stringify({ ok: false, error: \"timeout\", url, timeout_ms: timeoutMs });\n }\n return JSON.stringify({\n ok: false,\n error: \"fetch_failed\",\n url,\n message: e.message ?? \"unknown\",\n });\n }\n },\n });\n}\n","/**\n * `web_search` — built-in tool for coding agents.\n *\n * Accepts a search callback via DIP (consumer provides the search\n * provider). The tool itself is provider-agnostic.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, results: Array<{ title, url, snippet }> }`\n * - `{ ok: false, error: 'search_failed' | 'no_provider' }`\n */\n\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\n\nexport interface WebSearchResult {\n title: string;\n url: string;\n snippet: string;\n}\n\nexport type WebSearchCallback = (query: string, maxResults: number) => Promise<WebSearchResult[]>;\n\nexport interface CreateWebSearchToolOptions {\n /** Search provider callback — consumer injects the implementation. */\n search: WebSearchCallback;\n /** Default max results if not specified by the LLM. */\n defaultMaxResults?: number;\n}\n\nexport function createWebSearchTool(opts: CreateWebSearchToolOptions): CustomTool {\n const { search, defaultMaxResults = 5 } = opts;\n\n return defineTool({\n name: \"web_search\",\n description:\n \"Search the web for a query — use when you need current information beyond the repo or your \" +\n \"training cutoff (library docs, an error message, an API). Returns a list of results with \" +\n \"title, URL, and snippet; follow up with web_fetch on a promising result to read it in full. \" +\n \"The search provider is injected by the consumer. \" +\n \"Returns { ok, results } or { ok: false, error }.\",\n inputSchema: z.object({\n query: z.string().min(1).describe(\"Search query.\"),\n max_results: z\n .number()\n .int()\n .positive()\n .max(20)\n .optional()\n .describe(\"Maximum results to return (default 5, max 20).\"),\n }),\n handler: async ({ query, max_results }) => {\n const maxResults = max_results ?? defaultMaxResults;\n\n try {\n const results = await search(query, maxResults);\n return JSON.stringify({\n ok: true,\n results: results.slice(0, maxResults),\n count: Math.min(results.length, maxResults),\n });\n } catch (err) {\n const e = err as { message?: string };\n return JSON.stringify({\n ok: false,\n error: \"search_failed\",\n message: e.message ?? \"unknown\",\n });\n }\n },\n });\n}\n","/**\n * Brave Search adapter for `createWebSearchTool` (M3-7).\n *\n * `createBraveWebSearchAdapter()` returns a `WebSearchCallback` that queries the\n * Brave Search API using an env-driven key (`BRAVE_API_KEY`). It plugs into the\n * provider-agnostic `createWebSearchTool` via its callback seam — the tool is NOT\n * modified. The `fetch` impl is injectable (default `globalThis.fetch`) so the\n * adapter is offline-testable; a plain fetch (not `screenedFetch`) is used because\n * the endpoint host is fixed (no SSRF surface) and `screenedFetch` cannot carry\n * the required auth header. Zero new dependencies. Design: blueprint m3-websearch-adapter.\n */\n\nimport { ConfigurationError } from \"@theokit/sdk\";\n\nimport type { WebSearchCallback, WebSearchResult } from \"./web-search.js\";\n\nconst BRAVE_ENDPOINT = \"https://api.search.brave.com/res/v1/web/search\";\n\ntype FetchLike = (url: string, init?: RequestInit) => Promise<Response>;\n\nexport interface CreateBraveWebSearchAdapterOptions {\n /** Brave API key. Defaults to `process.env.BRAVE_API_KEY`. */\n apiKey?: string;\n /** Injectable fetch (default `globalThis.fetch`) — set in tests for offline runs. */\n fetchImpl?: FetchLike;\n /** Override the Brave endpoint (self-host / test). */\n endpoint?: string;\n}\n\ninterface BraveResult {\n title?: unknown;\n url?: unknown;\n description?: unknown;\n}\n\n/**\n * Build a `WebSearchCallback` backed by the Brave Search API. Throws a typed\n * `ConfigurationError` (\"no_api_key\") at creation when no key is available.\n */\nexport function createBraveWebSearchAdapter(\n opts: CreateBraveWebSearchAdapterOptions = {},\n): WebSearchCallback {\n const apiKey = opts.apiKey ?? process.env.BRAVE_API_KEY;\n if (!apiKey) {\n throw new ConfigurationError(\"BRAVE_API_KEY is not set (pass { apiKey } or set the env var).\", {\n code: \"no_api_key\",\n });\n }\n const fetchImpl = opts.fetchImpl ?? globalThis.fetch;\n const endpoint = opts.endpoint ?? BRAVE_ENDPOINT;\n // Validate the endpoint at creation (fail-early symmetry with the key check).\n const base = new URL(endpoint);\n\n return async (query: string, maxResults: number): Promise<WebSearchResult[]> => {\n const url = new URL(base);\n url.searchParams.set(\"q\", query);\n url.searchParams.set(\"count\", String(maxResults));\n const res = await fetchImpl(url.toString(), {\n headers: { \"X-Subscription-Token\": apiKey, Accept: \"application/json\" },\n });\n if (!res.ok) throw new Error(`brave_search_failed: HTTP ${res.status}`);\n const json = (await res.json()) as { web?: { results?: BraveResult[] } } | null;\n const results = json?.web?.results ?? [];\n return results.map((r) => ({\n title: String(r?.title ?? \"\"),\n url: String(r?.url ?? \"\"),\n snippet: String(r?.description ?? \"\"),\n }));\n };\n}\n","/**\n * `write_file` — built-in tool for coding agents.\n *\n * Writes UTF-8 content to a project-relative path. Creates parent\n * directories recursively. Refuses binary-file overwrites, path\n * traversal, and sensitive paths.\n *\n * Return shape (always a JSON string):\n * - `{ ok: true, path, bytes }` on success\n * - `{ ok: false, error: 'path_traversal' | 'forbidden_path' |\n * 'binary_file' }` on refusal\n */\n\nimport { mkdir, open, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport type { CustomTool } from \"@theokit/sdk\";\n\nimport { defineTool } from \"@theokit/sdk\";\nimport { z } from \"zod\";\nimport {\n assertNoSymlinkEscape,\n ForbiddenPathError,\n isForbiddenPath,\n PathTraversalError,\n safePathJoin,\n} from \"./internal/path-guard.js\";\n\n/** Byte window inspected for null bytes when deciding binary vs text. */\nconst BINARY_PROBE_BYTES = 8 * 1024;\n\nexport interface CreateWriteFileToolOptions {\n /** Absolute path to the project root. Every write is gated against this boundary. */\n projectRoot: string;\n}\n\nexport function createWriteFileTool(opts: CreateWriteFileToolOptions): CustomTool {\n const { projectRoot } = opts;\n\n return defineTool({\n name: \"write_file\",\n description:\n \"Write UTF-8 content to a project-relative file, creating parent directories as needed. \" +\n \"OVERWRITES any existing file at the path. Prefer editing an existing file with edit_file \" +\n \"over rewriting it; use write_file to create a NEW file or fully replace a small one. If the \" +\n \"file already exists, read_file it first so you do not discard content you have not seen. \" +\n \"Refuses paths that escape the project root, sensitive files (.env, .git/, node_modules/, \" +\n \".theo/, lock files), and binary-file overwrites. Returns { ok, path, bytes } or \" +\n \"{ ok: false, error }.\",\n inputSchema: z.object({\n path: z.string().min(1).describe(\"Project-relative file path.\"),\n content: z.string().describe(\"UTF-8 content to write.\"),\n }),\n handler: async ({ path, content }) => {\n if (isForbiddenPath(path)) {\n return JSON.stringify({ ok: false, error: \"forbidden_path\", path });\n }\n\n let absolutePath: string;\n try {\n absolutePath = safePathJoin(projectRoot, path);\n assertNoSymlinkEscape(absolutePath, projectRoot);\n } catch (err) {\n if (err instanceof PathTraversalError || err instanceof ForbiddenPathError) {\n return JSON.stringify({ ok: false, error: \"path_traversal\", path });\n }\n throw err;\n }\n\n // Binary file guard: probe existing file for null bytes before overwriting\n if (await isBinaryFile(absolutePath)) {\n return JSON.stringify({ ok: false, error: \"binary_file\", path });\n }\n\n await mkdir(dirname(absolutePath), { recursive: true });\n await writeFile(absolutePath, content, \"utf-8\");\n const bytes = Buffer.byteLength(content, \"utf-8\");\n\n return JSON.stringify({ ok: true, path, bytes });\n },\n });\n}\n\nasync function isBinaryFile(absolutePath: string): Promise<boolean> {\n let handle: import(\"node:fs/promises\").FileHandle | undefined;\n try {\n handle = await open(absolutePath, \"r\");\n } catch {\n return false; // file doesn't exist yet — not binary\n }\n try {\n const stat = await handle.stat();\n const probeLen = Math.min(BINARY_PROBE_BYTES, Number(stat.size));\n if (probeLen <= 0) return false;\n const probe = Buffer.alloc(probeLen);\n const { bytesRead } = await handle.read(probe, 0, probeLen, 0);\n for (let i = 0; i < bytesRead; i += 1) {\n if (probe[i] === 0) return true;\n }\n return false;\n } finally {\n await handle.close();\n }\n}\n"]}
|