@agentproto/corpus-cli 0.1.0-alpha.2 → 0.1.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.mjs +17 -0
- package/dist/cli.mjs.map +1 -1
- package/package.json +3 -3
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/preset-manifest.ts","../src/registry/preset-loader.ts","../src/ports/local-fs.adapter.ts","../src/scaffold/bare.ts","../src/commands/_shared.ts","../src/commands/init.ts","../src/commands/validate.ts","../src/commands/lint.ts","../src/ports/os-identity.adapter.ts","../src/commands/events.ts","../src/ports/video-hosts.ts","../src/ports/browser-fetcher.adapter.ts","../src/ports/scrape-mcp-fetcher.adapter.ts","../src/ports/ytdlp-whisper-fetcher.adapter.ts","../src/ports/stt.port.ts","../src/ports/assemblyai-stt.adapter.ts","../src/ports/chunked-stt.adapter.ts","../src/ports/http-readability-fetcher.adapter.ts","../src/ports/composite-fetcher.ts","../src/ports/throttle-fetcher.adapter.ts","../src/ports/browser-mcp-connect.ts","../src/commands/import-web.ts","../src/ports/anthropic-distiller.ts","../src/ports/cli-agent-distiller.ts","../src/ports/cli-engines.ts","../src/ports/usage-telemetry.ts","../src/commands/distill.ts","../src/commands/knowledge.ts","../src/ports/mcp-http-client.ts","../src/ports/mcp-sink.adapter.ts","../src/commands/sync.ts","../src/version.ts","../src/cli.ts"],"names":["path","readFile","__filename","__dirname","msg","count","CorpusWorkspaceReader","systemClock","z","MCP_TEXT_BLOCK","join","rm","readdir","resolve","execFileAsync","promisify","execFile","stat","mkdtemp","tmpdir","matter","parse","basename","RPC_RESPONSE","CALL_RESULT","StreamableHttpMcpClient","isRefinedKind","r","dirname","fileURLToPath","readFileSync","argv"],"mappings":"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","file":"cli.mjs","sourcesContent":["/**\n * Corpus preset manifest — `agentproto/corpus-preset/v1`.\n *\n * Preset packages declare what they provide in either:\n * - their `package.json` under the `agentproto-corpus-preset` key, OR\n * - a standalone `agentproto-corpus-preset.json` next to package.json.\n *\n * Example (in @agentproto/corpus-presets's package.json):\n *\n * {\n * \"name\": \"@agentproto/corpus-presets\",\n * \"agentproto-corpus-preset\": {\n * \"schema\": \"agentproto/corpus-preset/v1\",\n * \"presets\": [\n * {\n * \"slug\": \"marketing\",\n * \"entry\": \"./dist/marketing/index.mjs\",\n * \"export\": \"MarketingCorpusPreset\",\n * \"description\": \"Marketing knowledge corpus — principles, patterns, critiques.\"\n * }\n * ]\n * }\n * }\n *\n * The corpus CLI walks every package listed in\n * `~/.agentproto/config.json` under `corpusPresetPackages[]` (default:\n * `[\"@agentproto/corpus-presets\"]`), collects every preset they\n * declare, and resolves `corpus init <slug>` against the merged set.\n */\n\nimport { z } from \"zod\"\n\nexport const CORPUS_PRESET_MANIFEST_SCHEMA = \"agentproto/corpus-preset/v1\" as const\n\nconst PresetEntrySchema = z\n .object({\n /** The slug `corpus init <slug>` matches. */\n slug: z.string().regex(/^[a-z][a-z0-9-]*$/),\n /** Path to the entry module, relative to the preset package root. */\n entry: z.string().min(1),\n /** Named export inside `entry` — the CorpusPreset constant. */\n export: z.string().min(1),\n /** Free-form description; shown when listing available slugs. */\n description: z.string().optional(),\n })\n .loose()\n\nexport const CorpusPresetManifestSchema = z\n .object({\n schema: z.literal(CORPUS_PRESET_MANIFEST_SCHEMA),\n presets: z.array(PresetEntrySchema).default([]),\n })\n .loose()\n\nexport type CorpusPresetManifest = z.infer<typeof CorpusPresetManifestSchema>\nexport type CorpusPresetEntry = z.infer<typeof PresetEntrySchema>\n","/**\n * Preset discovery — walk every configured preset package, read its\n * manifest, build a flat slug → preset-entry map.\n *\n * Configured packages come from `~/.agentproto/config.json`:\n *\n * { \"corpusPresetPackages\": [\"@agentproto/corpus-presets\",\n * \"@vendor/corpus-presets\"] }\n *\n * Default when the config is missing or empty: just\n * `@agentproto/corpus-presets`.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { createRequire } from \"node:module\"\nimport { dirname, join } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport type { CorpusPreset } from \"@agentproto/corpus\"\nimport {\n CorpusPresetManifestSchema,\n type CorpusPresetEntry,\n type CorpusPresetManifest,\n} from \"./preset-manifest.js\"\n\nconst DEFAULT_PRESET_PACKAGES = [\"@agentproto/corpus-presets\"] as const\n\nexport interface ResolvedPresetEntry extends CorpusPresetEntry {\n /** npm package the entry was discovered in. */\n readonly packageName: string\n /** Absolute path to the package root (where the manifest was read from). */\n readonly packageRoot: string\n}\n\n/**\n * Discover every preset declared across the configured preset\n * packages. Returns a flat map slug → entry. If two packages declare\n * the same slug, last-write-wins (later packages in the config override).\n */\nexport async function discoverPresets(): Promise<\n Map<string, ResolvedPresetEntry>\n> {\n const packages = await readConfiguredPresetPackages()\n const out = new Map<string, ResolvedPresetEntry>()\n for (const pkg of packages) {\n const result = await readPresetManifest(pkg)\n if (!result) continue\n const { manifest, packageRoot } = result\n for (const entry of manifest.presets) {\n out.set(entry.slug, {\n ...entry,\n packageName: pkg,\n packageRoot,\n })\n }\n }\n return out\n}\n\n/**\n * Load a single preset by slug. Returns null if no configured package\n * declares it. Throws if the entry exists but its module/export\n * doesn't load.\n */\nexport async function loadPreset(\n slug: string\n): Promise<CorpusPreset | null> {\n const presets = await discoverPresets()\n const entry = presets.get(slug)\n if (!entry) return null\n\n const abs = entry.entry.startsWith(\".\")\n ? join(entry.packageRoot, entry.entry)\n : entry.entry\n const url = entry.entry.startsWith(\".\") ? pathToFileURL(abs).href : entry.entry\n const mod = (await import(url)) as Record<string, unknown>\n const exported = mod[entry.export]\n if (!exported || typeof exported !== \"object\") {\n throw new Error(\n `corpus-presets: '${entry.packageName}' entry '${entry.entry}' has no object export '${entry.export}' (got ${typeof exported}).`\n )\n }\n return exported as CorpusPreset\n}\n\n/**\n * Resolve `<pkg>/package.json` from both the CLI's own location AND\n * the user's cwd, so locally-installed preset packages work.\n */\nasync function readPresetManifest(\n packageName: string\n): Promise<{ manifest: CorpusPresetManifest; packageRoot: string } | null> {\n const packageJsonPath = resolvePackageJson(packageName)\n if (!packageJsonPath) return null\n const packageRoot = dirname(packageJsonPath)\n\n // 1. Standalone agentproto-corpus-preset.json wins if present.\n const standalonePath = join(packageRoot, \"agentproto-corpus-preset.json\")\n const standalone = await readJsonIfExists(standalonePath)\n if (standalone !== undefined) {\n return {\n manifest: CorpusPresetManifestSchema.parse(standalone),\n packageRoot,\n }\n }\n\n // 2. Fall back to package.json#agentproto-corpus-preset.\n const pkgJson = (await readJsonIfExists(packageJsonPath)) as\n | { \"agentproto-corpus-preset\"?: unknown }\n | undefined\n const block = pkgJson?.[\"agentproto-corpus-preset\"]\n if (block && typeof block === \"object\") {\n return {\n manifest: CorpusPresetManifestSchema.parse(block),\n packageRoot,\n }\n }\n\n return null\n}\n\nfunction resolvePackageJson(packageName: string): string | null {\n const candidates = [\n import.meta.url,\n pathToFileURL(join(process.cwd(), \"package.json\")).href,\n ]\n for (const root of candidates) {\n try {\n return createRequire(root).resolve(`${packageName}/package.json`)\n } catch {\n // try next root\n }\n }\n return null\n}\n\nasync function readJsonIfExists(path: string): Promise<unknown> {\n try {\n const raw = await readFile(path, \"utf8\")\n return JSON.parse(raw)\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return undefined\n throw err\n }\n}\n\ninterface AgentprotoConfig {\n corpusPresetPackages?: readonly string[]\n}\n\nasync function readConfiguredPresetPackages(): Promise<readonly string[]> {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n const path = join(base, \"config.json\")\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as AgentprotoConfig\n const list = parsed.corpusPresetPackages\n if (Array.isArray(list) && list.length > 0) return list\n } catch {\n // ENOENT or parse error — fall through to default\n }\n return DEFAULT_PRESET_PACKAGES\n}\n","/**\n * NodeFsAdapter — `FsPort` implementation backed by node:fs.\n *\n * Atomic writes via temp + rename (the same posix pattern every\n * mature tool uses). Recursive `walk` skips hidden segments\n * (anything beginning with `.`). Advisory locks via lockfiles in\n * `.corpus-locks/` next to the target — single-process safe; for\n * multi-process the lockfile owner pid is recorded so callers can\n * see who holds the lock.\n */\n\nimport { randomBytes } from \"node:crypto\"\nimport {\n appendFile,\n mkdir,\n readFile,\n readdir,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { existsSync } from \"node:fs\"\nimport type {\n FsPort,\n FsLockHandle,\n FsStat,\n} from \"@agentproto/corpus\"\n\nexport interface NodeFsAdapterOptions {\n /**\n * Absolute path to the workspace root. All FsPort paths are\n * resolved relative to this — the kit never sees host filesystem\n * paths.\n */\n readonly root: string\n}\n\nexport class NodeFsAdapter implements FsPort {\n private readonly root: string\n\n constructor(opts: NodeFsAdapterOptions) {\n this.root = opts.root\n }\n\n async exists(p: string): Promise<boolean> {\n try {\n await stat(this.resolve(p))\n return true\n } catch {\n return false\n }\n }\n\n async readFile(p: string): Promise<string> {\n return await readFile(this.resolve(p), \"utf8\")\n }\n\n /**\n * Atomic write: write to `${target}.tmp-{nonce}`, fsync, rename.\n * Rename is atomic on the same filesystem. Creates parent dirs as\n * needed (most callers expect mkdir -p semantics).\n */\n async writeFile(p: string, content: string): Promise<void> {\n const target = this.resolve(p)\n await mkdir(path.dirname(target), { recursive: true })\n const tmp = `${target}.tmp-${randomBytes(8).toString(\"hex\")}`\n await writeFile(tmp, content, \"utf8\")\n await rename(tmp, target)\n }\n\n async appendFile(p: string, content: string): Promise<void> {\n const target = this.resolve(p)\n await mkdir(path.dirname(target), { recursive: true })\n await appendFile(target, content, \"utf8\")\n }\n\n async readdir(p: string): Promise<readonly string[]> {\n const target = this.resolve(p)\n const entries = await readdir(target)\n return entries\n }\n\n async walk(p: string): Promise<readonly string[]> {\n const out: string[] = []\n const start = this.resolve(p)\n const rootForRelative = start\n const visit = async (dir: string): Promise<void> => {\n let entries: string[] = []\n try {\n entries = await readdir(dir)\n } catch {\n return\n }\n for (const ent of entries) {\n // Skip hidden segments — matches the FsPort contract.\n if (ent.startsWith(\".\")) continue\n const full = path.join(dir, ent)\n const s = await stat(full)\n if (s.isDirectory()) {\n await visit(full)\n } else if (s.isFile()) {\n const rel = path.relative(rootForRelative, full).split(path.sep).join(\"/\")\n out.push(rel)\n }\n }\n }\n await visit(start)\n return out\n }\n\n async stat(p: string): Promise<FsStat | null> {\n try {\n const s = await stat(this.resolve(p))\n return {\n kind: s.isDirectory() ? \"directory\" : \"file\",\n bytes: s.isFile() ? s.size : undefined,\n modifiedAt: s.mtime,\n }\n } catch {\n return null\n }\n }\n\n /**\n * Advisory lock via a lockfile. Spins waiting for the lockfile to\n * disappear, then creates it with exclusive flag. Released by\n * deleting it. Single-process safe; multi-process semi-safe (the\n * write is best-effort exclusive — adequate for the corpus's\n * promote-entry transaction which is rare and short-lived).\n */\n async lock(p: string): Promise<FsLockHandle> {\n const target = this.resolve(p)\n const lockDir = path.join(path.dirname(target), \".corpus-locks\")\n await mkdir(lockDir, { recursive: true })\n const lockFile = path.join(lockDir, path.basename(target) + \".lock\")\n const myToken = `${process.pid}-${randomBytes(4).toString(\"hex\")}`\n\n // Spin until we acquire. Cheap polling is fine for corpus\n // workloads — transactions are < 1s.\n while (true) {\n if (!existsSync(lockFile)) {\n try {\n await writeFile(lockFile, myToken, { encoding: \"utf8\", flag: \"wx\" })\n // Race: verify our token is the one that landed.\n const written = await readFile(lockFile, \"utf8\").catch(() => \"\")\n if (written === myToken) break\n } catch {\n // Lost the race — fall through and retry.\n }\n }\n await new Promise((r) => setTimeout(r, 25))\n }\n return {\n release: async () => {\n try {\n await rm(lockFile, { force: true })\n } catch {\n // Lockfile already gone — no-op.\n }\n },\n }\n }\n\n // ── Helpers ────────────────────────────────────────────────────\n\n /**\n * Resolve a workspace-relative path to an absolute host path.\n * Refuses to climb out of the workspace root (defense against\n * `../../etc/passwd`-style abuse) — the corpus kit's paths must\n * stay inside the workspace.\n */\n private resolve(p: string): string {\n const normalized = path.posix.normalize(\"/\" + p.replace(/^\\/+/, \"\"))\n // Drop the leading \"/\" so path.join joins correctly under root.\n const rel = normalized.slice(1)\n if (rel.startsWith(\"..\")) {\n throw new Error(\n `NodeFsAdapter: path \"${p}\" escapes the workspace root \"${this.root}\"`\n )\n }\n return path.join(this.root, rel)\n }\n}\n","/**\n * Bare corpus scaffold — the domain-agnostic starting point for `corpus init`.\n *\n * Emits ONLY the AIP-10 skeleton: a neutral `knowledge.workspace/v1` manifest +\n * the standard folder structure (kept by `.gitkeep`). No operators, playbooks,\n * workflows, routines, or seed entries — those are opt-in starters (`--with`) or\n * a full preset (`--preset`). This is what you want for a fresh research corpus:\n * structure without someone else's domain boilerplate.\n */\n\n/** kebab/slug → Title Case for the manifest title. */\nfunction titleCase(name: string): string {\n return name\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, c => c.toUpperCase())\n}\n\n/** The six generic AIP-10 entry kinds (no domain-specific PlaybookCase). */\nconst ENTRY_KINDS = [\n \"principles\",\n \"patterns\",\n \"critiques\",\n \"examples\",\n \"summaries\",\n \"timelines\",\n] as const\n\n/** Neutral, schema-valid `knowledge.workspace/v1` manifest. */\nfunction bareManifest(name: string): string {\n const title = titleCase(name)\n return `---\nschema: knowledge.workspace/v1\nname: ${name}\ntitle: ${title}\ndescription: >-\n ${title} knowledge corpus (AIP-10). Sources are scraped + content-hashed and\n immutable; entries are distilled, curated, mutable claims that cite them.\n This manifest is intentionally domain-agnostic — tune entityTypes, lints, and\n metadata.corpus to fit the domain.\nversion: 1.0.0\nentityTypes:\n - { name: Principle, description: \"Durable expert rule\" }\n - { name: Example, description: \"Concrete source-derived example\" }\n - { name: Pattern, description: \"Reusable transferable mechanic\" }\n - { name: Critique, description: \"Negative example or failure mode\" }\n - { name: Summary, description: \"Compressed source synthesis\" }\n - { name: Timeline, description: \"Time-sensitive evolution\" }\nsources:\n retention: forever\n signing: optional\n hashAlgo: sha256\n authorityDefault: secondary\nlints:\n - { id: require-source-on-examples, kind: require-source, appliesTo: Example, severity: error }\n - { id: broken-ref-all, kind: broken-ref, appliesTo: \"*\", severity: error }\n - { id: orphan-all, kind: orphan, appliesTo: \"*\", severity: info }\ncuration:\n tone: \"neutral, expert, source-backed\"\n depth: medium\n autoLink: byName\n conflictResolution: authority\nqueryHints:\n preferRecent: true\n preferAuthoritative: true\nmetadata:\n corpus:\n # \"flat\" → entries/<kind>/<slug>.md (matches the scaffolded dirs).\n # Set \"dated\" for entries/<kind>/<year>/<slug>.md on high-volume corpora.\n entryLayout: flat\n---\n\n# ${title}\n\nNeutral AIP-10 knowledge workspace.\n\n- \\`sources/\\` — scraped source snapshots (immutable provenance: \\`captured_at\\` + \\`content_hash\\`)\n- \\`entries/<kind>/\\` — distilled, curated claims that cite sources\n- \\`collections/\\` — AIP-18 curation collections (candidates, etc.)\n\nPopulate with \\`corpus import-web\\` → \\`corpus distill\\` → \\`corpus knowledge\\`.\n`\n}\n\n/** Opt-in starter surfaces (`--with`): the AIP integration dirs. */\nexport const STARTER_SURFACES: Record<string, { dir: string; aip: string }> = {\n operators: { dir: \"operators\", aip: \"AIP-9 (OPERATOR.md per operator)\" },\n playbooks: { dir: \"playbooks\", aip: \"AIP-12 (PLAYBOOK.md per playbook)\" },\n workflows: { dir: \"workflows\", aip: \"AIP-15 (WORKFLOW.md per workflow)\" },\n routines: { dir: \"routines\", aip: \"AIP-41 (ROUTINE.md per routine)\" },\n}\n\n/**\n * Build the bare workspace file set (path → content). Dirs are materialised via\n * `.gitkeep`. `withStarters` adds opt-in integration surfaces, each kept with a\n * `.gitkeep` + a README pointing at its AIP.\n */\nexport function buildBareWorkspace(\n name: string,\n withStarters: readonly string[] = []\n): Record<string, string> {\n const files: Record<string, string> = {\n \"KNOWLEDGE.md\": bareManifest(name),\n \"sources/.gitkeep\": \"\",\n \"collections/.gitkeep\": \"\",\n }\n for (const kind of ENTRY_KINDS) files[`entries/${kind}/.gitkeep`] = \"\"\n\n for (const s of withStarters) {\n const surface = STARTER_SURFACES[s]\n if (!surface) continue\n files[`${surface.dir}/.gitkeep`] = \"\"\n files[`${surface.dir}/README.md`] =\n `# ${titleCase(s)}\\n\\n` +\n `Opt-in starter surface. Add one file per item: ${surface.aip}.\\n`\n }\n return files\n}\n","/**\n * Shared helpers across CLI commands. Schema bundle loading +\n * common path resolution.\n */\n\nimport { readFileSync } from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport type { AipSchemaBundle } from \"@agentproto/corpus\"\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\n/**\n * Resolve the AgentProto specs root. When running from source (vitest,\n * pnpm dev), the specs live a few levels up alongside the TS packages.\n * When running from a published binary, the schemas are bundled next\n * to the CLI under `share/schemas/aip-XX/draft/`. We try both.\n */\nfunction findSpecsRoot(): string {\n const candidates = [\n // published binary: schemas bundled beside the CLI at dist/specs/resources\n // (copied from the repo's specs/resources by scripts/bundle-specs.mjs at build).\n path.resolve(__dirname, \"specs/resources\"),\n // source-tree (vendored): packages/corpus-cli/src/commands → ts repo's own specs/resources\n path.resolve(__dirname, \"../../../../specs/resources\"),\n // dist-tree (vendored): packages/corpus-cli/dist → ts repo's own specs/resources\n path.resolve(__dirname, \"../../../specs/resources\"),\n // source-tree (sibling agentproto repo): up to projects/agentproto/agentproto/specs/resources\n path.resolve(__dirname, \"../../../../../agentproto/specs/resources\"),\n // dist-tree (sibling agentproto repo): up to projects/agentproto/agentproto/specs/resources\n path.resolve(__dirname, \"../../../../agentproto/specs/resources\"),\n // global install: share/agentproto-specs/resources next to the bin\n path.resolve(__dirname, \"../share/agentproto-specs/resources\"),\n ]\n for (const c of candidates) {\n try {\n readFileSync(path.join(c, \"aip-10\", \"draft\", \"KNOWLEDGE.schema.json\"))\n return c\n } catch {\n // not this candidate\n }\n }\n throw new Error(\n \"corpus-cli: could not locate AgentProto spec schemas. Re-install or set CORPUS_SPECS_ROOT.\"\n )\n}\n\nlet _specsRoot: string | undefined\n/**\n * Resolve the specs root lazily and memoize it. Commands that never read\n * schemas (init, --help, --version) must not trip the \"not found\" error\n * just by importing this module, so resolution is deferred to first use.\n */\nfunction getSpecsRoot(): string {\n if (_specsRoot === undefined) {\n _specsRoot = process.env.CORPUS_SPECS_ROOT || findSpecsRoot()\n }\n return _specsRoot\n}\n\nfunction loadSchema(aip: number, doctype: string): unknown {\n return JSON.parse(\n readFileSync(\n path.join(getSpecsRoot(), `aip-${aip}`, \"draft\", `${doctype}.schema.json`),\n \"utf8\"\n )\n )\n}\n\nexport function loadAipSchemaBundle(): AipSchemaBundle {\n return {\n schemas: {\n knowledge: loadSchema(10, \"KNOWLEDGE\"),\n collection: loadSchema(18, \"COLLECTION\"),\n playbook: loadSchema(12, \"PLAYBOOK\"),\n operator: loadSchema(9, \"OPERATOR\"),\n workflow: loadSchema(15, \"WORKFLOW\"),\n routine: loadSchema(41, \"ROUTINE\"),\n },\n externals: [loadSchema(16, \"IO\"), loadSchema(17, \"RUNNER\")],\n }\n}\n\n/**\n * Resolve the workspace path argument. Accepts an explicit path or\n * defaults to cwd. Returns absolute path.\n */\nexport function resolveWorkspacePath(arg: string | undefined): string {\n if (!arg) return process.cwd()\n return path.resolve(process.cwd(), arg)\n}\n\nexport type ExitCode = 0 | 1 | 2\n\nexport function fail(msg: string, code: ExitCode = 1): ExitCode {\n process.stderr.write(`corpus: ${msg}\\n`)\n return code\n}\n","/**\n * `corpus init <name> [path]` — scaffold a new AIP-10 corpus.\n *\n * BARE BY DEFAULT: emits a neutral `knowledge.workspace/v1` manifest + the\n * AIP-10 folder structure (kept by `.gitkeep`), nothing else. This is what you\n * want for a fresh research corpus — structure without a domain's boilerplate.\n *\n * corpus init <name> [path] # bare scaffold\n * corpus init <name> [path] --with operators,playbooks # + opt-in surfaces\n * corpus init <name> [path] --preset marketing # seed a full preset\n * corpus init --list # list available presets\n *\n * Presets are discovered via manifests:\n * - Default: scans `@agentproto/corpus-presets`.\n * - Configurable: `corpusPresetPackages[]` in `~/.agentproto/config.json`.\n */\n\nimport {\n discoverPresets,\n loadPreset,\n} from \"../registry/preset-loader.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { buildBareWorkspace, STARTER_SURFACES } from \"../scaffold/bare.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runInit(args: readonly string[]): Promise<ExitCode> {\n const positionals: string[] = []\n let listOnly = false\n let presetSlug: string | undefined\n const withStarters: string[] = []\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a === undefined) continue\n if (a === \"--list\" || a === \"-l\") {\n listOnly = true\n } else if (a === \"--preset\" || a === \"-p\") {\n presetSlug = args[++i]\n } else if (a.startsWith(\"--preset=\")) {\n presetSlug = a.slice(\"--preset=\".length)\n } else if (a === \"--with\" || a === \"-w\") {\n withStarters.push(...splitList(args[++i]))\n } else if (a.startsWith(\"--with=\")) {\n withStarters.push(...splitList(a.slice(\"--with=\".length)))\n } else {\n positionals.push(a)\n }\n }\n\n if (listOnly) {\n return runList()\n }\n\n const [name, pathArg] = positionals\n if (!name) {\n return fail(\n `init requires a <name> argument.\\n` +\n ` corpus init <name> [path] # bare AIP-10 scaffold (default)\\n` +\n ` corpus init <name> [path] --with operators,playbooks\\n` +\n ` corpus init <name> [path] --preset <slug> # seed a full preset\\n` +\n `Run \\`corpus init --list\\` for available presets.`,\n 2\n )\n }\n\n // Validate any requested starter surfaces up front.\n const unknown = withStarters.filter(s => !(s in STARTER_SURFACES))\n if (unknown.length) {\n return fail(\n `init: unknown --with surface(s): ${unknown.join(\", \")}. ` +\n `Known: ${Object.keys(STARTER_SURFACES).join(\", \")}.`,\n 2\n )\n }\n\n const target = resolveWorkspacePath(pathArg)\n const fs = new NodeFsAdapter({ root: target })\n\n // Guard: refuse to clobber a workspace that already exists.\n if (await fs.exists(\"KNOWLEDGE.md\")) {\n return fail(\n `init: refusing to overwrite an existing workspace at ${target}. Delete KNOWLEDGE.md first if you really want to re-init.`,\n 1\n )\n }\n\n // ── Preset path (opt-in) ──\n if (presetSlug) {\n const preset = await loadPreset(presetSlug)\n if (!preset) {\n const available = await formatAvailable()\n return fail(\n `init: preset \"${presetSlug}\" not found in any configured package.\\n${available}`,\n 2\n )\n }\n let count = 0\n for (const [rel, content] of Object.entries(preset.files)) {\n await fs.writeFile(rel, content)\n count++\n }\n // Optional bootstrap hook for presets that need more than file writes.\n if (preset.bootstrap) {\n await preset.bootstrap({\n workspacePath: \"\",\n write: (rel, content) => fs.writeFile(rel, content),\n })\n }\n process.stdout.write(\n `corpus: initialized \"${preset.slug}\" preset (${preset.title}) at ${target}\\n` +\n ` ${count} files written\\n` +\n `Try: corpus validate ${pathArg ?? \".\"}\\n` +\n ` corpus lint ${pathArg ?? \".\"}\\n`\n )\n return 0\n }\n\n // ── Bare path (default) ──\n const files = buildBareWorkspace(name, withStarters)\n let count = 0\n for (const [rel, content] of Object.entries(files)) {\n await fs.writeFile(rel, content)\n count++\n }\n const withNote = withStarters.length\n ? ` (+ starters: ${withStarters.join(\", \")})`\n : \"\"\n process.stdout.write(\n `corpus: initialized bare corpus \"${name}\"${withNote} at ${target}\\n` +\n ` ${count} files written — neutral KNOWLEDGE.md + AIP-10 structure\\n` +\n `Try: corpus import-web ${pathArg ?? \".\"} --urls-file urls.txt\\n` +\n ` corpus validate ${pathArg ?? \".\"}\\n`\n )\n return 0\n}\n\nfunction splitList(v: string | undefined): string[] {\n return (v ?? \"\")\n .split(\",\")\n .map(s => s.trim())\n .filter(Boolean)\n}\n\nasync function runList(): Promise<ExitCode> {\n const presets = await discoverPresets()\n if (presets.size === 0) {\n process.stdout.write(\n \"corpus init: no presets discovered. Configure corpusPresetPackages[] in ~/.agentproto/config.json or install @agentproto/corpus-presets.\\n\"\n )\n return 0\n }\n for (const entry of presets.values()) {\n process.stdout.write(`• ${entry.slug} (${entry.packageName})\\n`)\n if (entry.description) {\n process.stdout.write(` ${entry.description}\\n`)\n }\n }\n return 0\n}\n\nasync function formatAvailable(): Promise<string> {\n const presets = await discoverPresets()\n if (presets.size === 0) {\n return \"No presets discovered. Configure corpusPresetPackages[] in ~/.agentproto/config.json or install @agentproto/corpus-presets.\"\n }\n const slugs = [...presets.keys()].sort()\n return `Available slugs: ${slugs.join(\", \")} (run \\`corpus init --list\\` for details).`\n}\n","/**\n * `corpus validate [path]` — JSON Schema check across every AIP file.\n */\n\nimport {\n CorpusValidator,\n CorpusWorkspaceReader,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, loadAipSchemaBundle, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runValidate(args: readonly string[]): Promise<ExitCode> {\n const target = resolveWorkspacePath(args[0])\n const fs = new NodeFsAdapter({ root: target })\n\n if (!(await fs.exists(\"KNOWLEDGE.md\"))) {\n return fail(\n `validate: no KNOWLEDGE.md at ${target}. Run \\`corpus init marketing\\` to scaffold one.`,\n 1\n )\n }\n\n const snapshot = await new CorpusWorkspaceReader({ fs }).read(\"\")\n const validator = new CorpusValidator({ bundle: loadAipSchemaBundle() })\n const result = validator.validateWorkspace(snapshot)\n\n const counts = countBucket(snapshot)\n process.stdout.write(\n `corpus: scanned ${counts.total} files (${counts.summary})\\n`\n )\n\n if (result.issues.length === 0) {\n process.stdout.write(\"corpus: all files conform to AIP schemas ✓\\n\")\n return 0\n }\n\n const errors = result.issues.filter((i) => i.severity === \"error\")\n const warns = result.issues.filter((i) => i.severity === \"warn\")\n const infos = result.issues.filter((i) => i.severity === \"info\")\n\n for (const i of result.issues) {\n const tag = i.severity === \"error\" ? \"ERROR\" : i.severity === \"warn\" ? \"WARN \" : \"INFO \"\n process.stdout.write(` ${tag} ${i.path}${i.instancePath}: ${i.message}\\n`)\n }\n process.stdout.write(\n `corpus: ${errors.length} error${errors.length === 1 ? \"\" : \"s\"}, ` +\n `${warns.length} warning${warns.length === 1 ? \"\" : \"s\"}, ` +\n `${infos.length} info\\n`\n )\n return result.valid ? 0 : 1\n}\n\nfunction countBucket(s: {\n workspace: unknown\n sources: readonly unknown[]\n entries: readonly unknown[]\n collections: readonly unknown[]\n collectionItems: readonly unknown[]\n playbooks: readonly unknown[]\n operators: readonly unknown[]\n workflows: readonly unknown[]\n routines: readonly unknown[]\n unknown: readonly unknown[]\n}): { total: number; summary: string } {\n const parts: string[] = []\n if (s.workspace) parts.push(\"1 workspace\")\n if (s.sources.length) parts.push(`${s.sources.length} sources`)\n if (s.entries.length) parts.push(`${s.entries.length} entries`)\n if (s.collections.length) parts.push(`${s.collections.length} collections`)\n if (s.collectionItems.length)\n parts.push(`${s.collectionItems.length} items`)\n if (s.playbooks.length) parts.push(`${s.playbooks.length} playbooks`)\n if (s.operators.length) parts.push(`${s.operators.length} operators`)\n if (s.workflows.length) parts.push(`${s.workflows.length} workflows`)\n if (s.routines.length) parts.push(`${s.routines.length} routines`)\n if (s.unknown.length) parts.push(`${s.unknown.length} unknown`)\n const total =\n (s.workspace ? 1 : 0) +\n s.sources.length +\n s.entries.length +\n s.collections.length +\n s.collectionItems.length +\n s.playbooks.length +\n s.operators.length +\n s.workflows.length +\n s.routines.length +\n s.unknown.length\n return { total, summary: parts.join(\", \") }\n}\n","/**\n * `corpus lint [path]` — run lints declared in KNOWLEDGE.md.\n */\n\nimport {\n CorpusLinter,\n CorpusWorkspaceReader,\n systemClock,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runLint(args: readonly string[]): Promise<ExitCode> {\n const target = resolveWorkspacePath(args[0])\n const fs = new NodeFsAdapter({ root: target })\n\n if (!(await fs.exists(\"KNOWLEDGE.md\"))) {\n return fail(\n `lint: no KNOWLEDGE.md at ${target}. Run \\`corpus init marketing\\` to scaffold one.`,\n 1\n )\n }\n\n const snapshot = await new CorpusWorkspaceReader({ fs }).read(\"\")\n const report = new CorpusLinter({ clock: systemClock }).lint(snapshot)\n\n if (report.issues.length === 0) {\n process.stdout.write(\"corpus: lint clean ✓\\n\")\n return 0\n }\n\n for (const i of report.issues) {\n const tag =\n i.severity === \"error\"\n ? \"ERROR\"\n : i.severity === \"warn\"\n ? \"WARN \"\n : \"INFO \"\n process.stdout.write(` ${tag} [${i.lintId}] ${i.path}: ${i.message}\\n`)\n }\n process.stdout.write(\n `corpus: ${report.errorCount} error${report.errorCount === 1 ? \"\" : \"s\"}, ` +\n `${report.warnCount} warning${report.warnCount === 1 ? \"\" : \"s\"}, ` +\n `${report.infoCount} info\\n`\n )\n // Non-zero exit only on errors — warnings/infos don't fail CI by default.\n return report.errorCount > 0 ? 1 : 0\n}\n","/**\n * OsIdentityAdapter — `IdentityPort` resolved from OS user + cwd.\n *\n * Local-topology identity model:\n * - principal = `ws://users/{os-user}`\n * - identityTree = [\n * `ws://users/{os-user}`,\n * `ws://workspaces/{workspace-dir-name}`,\n * ]\n *\n * Roles + guilds + orgs don't exist locally — single-user, single-\n * workspace machine. Scope-policy in the corpus adapter matches\n * against this minimal tree, so AIP-10 `appliesTo` entries scoped\n * narrower than `ws://users/...` or `ws://workspaces/...` are\n * invisible to the local user. That's the intended local-topology\n * semantics: you only see what's scoped to you or your workspace.\n */\n\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport type {\n CallerIdentity,\n IdentityPort,\n} from \"@agentproto/corpus\"\n\nexport interface OsIdentityAdapterOptions {\n readonly workspaceRoot: string\n /** Override the OS user (useful for tests). Falls back to os.userInfo(). */\n readonly userOverride?: string\n}\n\nexport class OsIdentityAdapter implements IdentityPort {\n private readonly cached: CallerIdentity\n\n constructor(opts: OsIdentityAdapterOptions) {\n // Env vars win over os.userInfo() — matches Unix convention (env is\n // explicit intent, OS detection is fallback). Also keeps tests\n // deterministic across CI environments where the OS user differs.\n const user =\n opts.userOverride ??\n process.env.USER ??\n process.env.USERNAME ??\n safeGetUser() ??\n \"anonymous\"\n const wsName = path.basename(opts.workspaceRoot) || \"default\"\n this.cached = Object.freeze({\n principal: `ws://users/${slugify(user)}`,\n identityTree: Object.freeze([\n `ws://users/${slugify(user)}`,\n `ws://workspaces/${slugify(wsName)}`,\n ]),\n displayName: user,\n })\n }\n\n async resolve(): Promise<CallerIdentity> {\n return this.cached\n }\n}\n\nfunction safeGetUser(): string | undefined {\n try {\n return os.userInfo().username\n } catch {\n return undefined\n }\n}\n\nfunction slugify(s: string): string {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\")\n .slice(0, 64) || \"anonymous\"\n}\n","/**\n * `corpus events:emit <kind> --payload <json> [path]` — append to _log.md\n * `corpus events:tail [path]` — print _log.md\n */\n\nimport {\n CorpusEventEmitter,\n systemClock,\n type CorpusEventKind,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { OsIdentityAdapter } from \"../ports/os-identity.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nconst KNOWN_EVENT_KINDS: ReadonlySet<string> = new Set<CorpusEventKind>([\n \"corpus.candidate.discovered\",\n \"corpus.candidate.analyzed\",\n \"corpus.candidate.approved\",\n \"corpus.candidate.rejected\",\n \"corpus.entry.promoted\",\n \"corpus.entry.deprecated\",\n \"corpus.entry.archived\",\n \"corpus.gap.opened\",\n \"corpus.gap.resolved\",\n \"playbook.shadow.registered\",\n \"playbook.activated\",\n \"playbook.archived\",\n])\n\nexport async function runEventsEmit(\n args: readonly string[]\n): Promise<ExitCode> {\n // First positional = kind, last positional = path (optional), rest in --flags\n const positionals: string[] = []\n let payloadStr: string | undefined\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n if (a === \"--payload\") {\n payloadStr = args[++i]\n } else if (a.startsWith(\"--payload=\")) {\n payloadStr = a.slice(\"--payload=\".length)\n } else if (a.startsWith(\"--\")) {\n return fail(`events:emit: unknown flag ${a}`, 2)\n } else {\n positionals.push(a)\n }\n }\n\n const [kind, pathArg] = positionals\n if (!kind) {\n return fail(\n \"events:emit requires a <kind> argument. Try `corpus events:emit corpus.entry.promoted --payload '{\\\"slug\\\":\\\"foo\\\"}'`.\",\n 2\n )\n }\n if (!KNOWN_EVENT_KINDS.has(kind)) {\n process.stderr.write(\n `corpus: warning — \"${kind}\" is not in the standard event taxonomy. Emitting anyway.\\n`\n )\n }\n if (!payloadStr) {\n return fail(\n \"events:emit requires --payload <json>. Pass at least `--payload '{}'`.\",\n 2\n )\n }\n let payload: Record<string, unknown>\n try {\n payload = JSON.parse(payloadStr)\n } catch (e) {\n return fail(\n `events:emit: --payload must be valid JSON (${\n e instanceof Error ? e.message : String(e)\n })`,\n 2\n )\n }\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n return fail(\"events:emit: --payload must be a JSON object\", 2)\n }\n\n const target = resolveWorkspacePath(pathArg)\n const fs = new NodeFsAdapter({ root: target })\n if (!(await fs.exists(\"KNOWLEDGE.md\"))) {\n return fail(\n `events:emit: no KNOWLEDGE.md at ${target}. Run \\`corpus init marketing\\` first.`,\n 1\n )\n }\n\n const emitter = new CorpusEventEmitter({\n fs,\n clock: systemClock,\n identity: new OsIdentityAdapter({ workspaceRoot: target }),\n workspaceRoot: \"\",\n })\n const event = await emitter.emit(kind as CorpusEventKind, payload)\n process.stdout.write(\n `corpus: emitted ${event.kind} at ${event.at} by ${event.actor}\\n`\n )\n return 0\n}\n\nexport async function runEventsTail(\n args: readonly string[]\n): Promise<ExitCode> {\n const target = resolveWorkspacePath(args[0])\n const fs = new NodeFsAdapter({ root: target })\n if (!(await fs.exists(\"_log.md\"))) {\n process.stdout.write(\n `corpus: _log.md does not exist yet at ${target}. Emit an event to create it.\\n`\n )\n return 0\n }\n const content = await fs.readFile(\"_log.md\")\n process.stdout.write(content)\n if (!content.endsWith(\"\\n\")) process.stdout.write(\"\\n\")\n return 0\n}\n\n","/**\n * Shared video-host detection. Video URLs belong to the transcription\n * fetcher (yt-dlp → STT); the readability fetchers MUST refuse them, so a\n * failed transcription is skipped-and-retried rather than silently\n * falling through to scrape a JS-rendered watch page (which yields the\n * page chrome — \"About Press Copyright…\" — not the talk).\n */\n\nexport const VIDEO_HOSTS: ReadonlySet<string> = new Set([\n \"youtube.com\",\n \"www.youtube.com\",\n \"m.youtube.com\",\n \"music.youtube.com\",\n \"youtu.be\",\n \"vimeo.com\",\n])\n\nexport function isVideoUrl(\n url: string,\n extraHosts?: ReadonlySet<string>\n): boolean {\n let host: string\n try {\n host = new URL(url).hostname\n } catch {\n return false\n }\n const bare = host.replace(/^www\\./, \"\")\n return (\n VIDEO_HOSTS.has(host) ||\n VIDEO_HOSTS.has(bare) ||\n (extraHosts?.has(host) ?? false) ||\n (extraHosts?.has(bare) ?? false)\n )\n}\n","/**\n * BrowserMcpFetcher — a FetcherPort that extracts ARTICLE text through\n * the user's authenticated browser (chrome-devtools-mcp). Use it for\n * pages that a plain HTTP fetch can't read: login-walled, consent-walled,\n * or JS-rendered (SPA) content. For public static articles the cheaper\n * HttpReadabilityFetcher suffices; for video, YtDlpWhisperFetcher handles\n * transcription — this fetcher does NOT touch video.\n *\n * navigate_page(url) → evaluate_script(readability) → { title, text }\n *\n * (It used to also scrape YouTube captions, but YouTube's caption APIs\n * are pot/SABR-gated and unreliable; transcription via YtDlpWhisperFetcher\n * replaced that path entirely.)\n *\n * The browser is injected as a minimal structural `BrowserMcpLike` (just\n * `callTool`, matching `@agentproto/driver-mcp`'s `McpClient`), so this\n * adapter has no hard MCP-SDK dependency and is unit-testable with a fake\n * client. The CLI wires the real chrome-devtools-mcp client.\n */\n\nimport { z } from \"zod\"\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\n/** The fetched-source payload the in-browser script returns. */\nconst FETCHED_PAYLOAD = z\n .object({\n title: z.string(),\n text: z.string(),\n kind: z.enum([\"video\", \"article\", \"page\", \"unknown\"]).catch(\"unknown\"),\n language: z.string().optional().catch(undefined),\n via: z.string().optional().catch(undefined),\n })\n .loose()\n\n/** An MCP `content` text block. */\nconst MCP_TEXT_BLOCK = z.object({ type: z.literal(\"text\"), text: z.string() }).loose()\n\n/** Minimal MCP client surface — matches `@agentproto/driver-mcp`'s `McpClient`. */\nexport interface BrowserMcpLike {\n callTool(args: {\n name: string\n arguments: Record<string, unknown>\n }): Promise<{ content?: unknown; structuredContent?: unknown; isError?: boolean }>\n}\n\nexport interface BrowserMcpFetcherOptions {\n readonly browser: BrowserMcpLike\n /** chrome-devtools-mcp tool names — overridable if a host renames them. */\n readonly navigateToolName?: string\n readonly evaluateToolName?: string\n}\n\n// In-page readability extraction, serialised for evaluate_script. Runs in\n// the navigated page's context (cookies/session apply).\nconst READABILITY_FN = `() => {\n const title = document.title || \"\";\n const article = document.querySelector(\"article\") || document.querySelector(\"main\");\n const root = article || document.body;\n const text = (root?.innerText || \"\").replace(/\\\\n{3,}/g, \"\\\\n\\\\n\").trim().slice(0, 200000);\n const lang = document.documentElement.getAttribute(\"lang\") || undefined;\n return { title, text, kind: \"article\", language: lang, via: \"readability\" };\n}`\n\nexport class BrowserMcpFetcher implements FetcherPort {\n private readonly browser: BrowserMcpLike\n private readonly navigateTool: string\n private readonly evaluateTool: string\n\n constructor(opts: BrowserMcpFetcherOptions) {\n this.browser = opts.browser\n this.navigateTool = opts.navigateToolName ?? \"navigate_page\"\n this.evaluateTool = opts.evaluateToolName ?? \"evaluate_script\"\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (isVideoUrl(url)) return null // videos → transcription, not page scrape\n\n await this.browser.callTool({\n name: this.navigateTool,\n arguments: { url },\n })\n const result = await this.browser.callTool({\n name: this.evaluateTool,\n arguments: { function: READABILITY_FN },\n })\n const extracted = parseEvaluateResult(result)\n if (!extracted || !extracted.text.trim()) return null\n return extracted\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\n/**\n * chrome-devtools-mcp returns the script's return value either as\n * `structuredContent`, or serialised inside a `content` text block.\n * Parse defensively across both shapes.\n */\nfunction parseEvaluateResult(result: {\n content?: unknown\n structuredContent?: unknown\n}): FetchedSource | null {\n return (\n coerceFetched(result.structuredContent) ??\n coerceFetched(extractText(result.content))\n )\n}\n\nfunction coerceFetched(value: unknown): FetchedSource | null {\n let obj = value\n if (typeof obj === \"string\") {\n try {\n obj = JSON.parse(obj)\n } catch {\n return null\n }\n }\n const parsed = FETCHED_PAYLOAD.safeParse(obj)\n if (!parsed.success) return null\n const { title, text, kind, language, via } = parsed.data\n return {\n title,\n text,\n kind,\n ...(language ? { language } : {}),\n ...(via ? { via } : {}),\n }\n}\n\n/** Pull a text payload out of an MCP `content` array (or string). */\nfunction extractText(content: unknown): string | null {\n if (typeof content === \"string\") return content\n if (Array.isArray(content)) {\n for (const block of content) {\n const parsed = MCP_TEXT_BLOCK.safeParse(block)\n if (parsed.success) return parsed.data.text\n }\n }\n return null\n}\n","/**\n * ScrapeMcpFetcher — a FetcherPort that delegates article/page fetching to\n * any MCP server exposing a `scrape(url)` tool (e.g. the browser project's\n * tiered router: HTTP → Chromium → Camofox stealth → agent, with cookie\n * injection and auto-escalation on bot-walls). The browser stack is reached\n * over MCP, so this stays vendor-neutral — corpus-cli never imports it.\n *\n * scrape(url) → { title, markdown } → FetchedSource\n *\n * It does NOT touch video URLs (YtDlpWhisperFetcher owns those) and returns\n * `null` for a blocked / empty page so the importer skips-with-warning\n * rather than aborting the batch.\n *\n * The MCP client is injected as the minimal structural `BrowserMcpLike`\n * (just `callTool`), the same surface `BrowserMcpFetcher` consumes — so this\n * adapter has no MCP-SDK dependency and is unit-testable with a fake client.\n */\n\nimport { z } from \"zod\"\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport type { BrowserMcpLike } from \"./browser-fetcher.adapter.js\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\n/**\n * The fields we read off the `scrape` tool's result. A purifying scrape\n * server returns `title` + `markdown`; we tolerate a raw-`html`-only server\n * by stripping tags as a last resort. Everything else is left opaque.\n */\nconst SCRAPE_PAYLOAD = z\n .object({\n title: z.string().optional().catch(undefined),\n markdown: z.string().optional().catch(undefined),\n html: z.string().optional().catch(undefined),\n language: z.string().optional().catch(undefined),\n tierUsed: z.union([z.string(), z.number()]).optional().catch(undefined),\n })\n .loose()\n\nconst MCP_TEXT_BLOCK = z\n .object({ type: z.literal(\"text\"), text: z.string() })\n .loose()\n\nexport interface ScrapeMcpFetcherOptions {\n readonly client: BrowserMcpLike\n /** Tool name on the MCP server — overridable if a host renames it. */\n readonly scrapeToolName?: string\n}\n\nexport class ScrapeMcpFetcher implements FetcherPort {\n private readonly client: BrowserMcpLike\n private readonly toolName: string\n\n constructor(opts: ScrapeMcpFetcherOptions) {\n this.client = opts.client\n this.toolName = opts.scrapeToolName ?? \"scrape\"\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (isVideoUrl(url)) return null // let the transcription fetcher handle video\n\n let res: Awaited<ReturnType<BrowserMcpLike[\"callTool\"]>>\n try {\n res = await this.client.callTool({\n name: this.toolName,\n arguments: { url },\n })\n } catch {\n // Transient MCP/transport failure → skip this URL (resumable re-run\n // retries it), don't abort the whole batch.\n return null\n }\n if (res.isError) return null\n\n const payload = extractPayload(res)\n if (!payload) return null\n\n const text = (payload.markdown?.trim() || stripTags(payload.html)).trim()\n if (!text) return null // blocked / empty page → skip\n\n return {\n title: payload.title?.trim() || url,\n text,\n kind: \"article\",\n ...(payload.language ? { language: payload.language } : {}),\n via: payload.tierUsed ? `scrape:${payload.tierUsed}` : \"scrape\",\n }\n }\n}\n\n/** Read the scrape result from `structuredContent`, else a JSON text block. */\nfunction extractPayload(res: {\n content?: unknown\n structuredContent?: unknown\n}): z.infer<typeof SCRAPE_PAYLOAD> | null {\n if (res.structuredContent && typeof res.structuredContent === \"object\") {\n const parsed = SCRAPE_PAYLOAD.safeParse(res.structuredContent)\n if (parsed.success) return parsed.data\n }\n if (Array.isArray(res.content)) {\n for (const block of res.content) {\n const text = MCP_TEXT_BLOCK.safeParse(block)\n if (!text.success) continue\n try {\n const parsed = SCRAPE_PAYLOAD.safeParse(JSON.parse(text.data.text))\n if (parsed.success) return parsed.data\n } catch {\n // Non-JSON text block — treat the raw text as the content itself.\n return { markdown: text.data.text }\n }\n }\n }\n return null\n}\n\n/** Last-resort tag strip for a server that returns only raw HTML. */\nfunction stripTags(html: string | undefined): string {\n if (!html) return \"\"\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n}\n","/**\n * YtDlpWhisperFetcher — a FetcherPort for video URLs that does NOT rely\n * on captions (YouTube's caption/transcript APIs are pot/SABR-gated and\n * frequently unavailable). Instead it pulls the audio with yt-dlp and\n * transcribes it with an injected SttPort (Whisper). Captions-independent\n * and robust: works whether or not the video has subtitles.\n *\n * video URL → yt-dlp -f bestaudio -x (mp3) → SttPort.transcribe → text\n *\n * yt-dlp handles the pot token / SABR negotiation / signature itself, so\n * no browser or cookies are needed for public videos. Non-video URLs\n * resolve to `null` so this fetcher composes ahead of a readability\n * fetcher (see CompositeFetcher).\n *\n * The yt-dlp invocation is injected as `download` so the adapter is unit-\n * testable with a fake downloader + fake SttPort — no binary, no network.\n */\n\nimport { execFile } from \"node:child_process\"\nimport { mkdtemp, readdir, readFile, rm } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { promisify } from \"node:util\"\nimport { z } from \"zod\"\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport type { SttPort } from \"./stt.port.js\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\nconst execFileAsync = promisify(execFile)\n\n/** yt-dlp's `.info.json` — only the fields we use. */\nconst YTDLP_INFO = z\n .object({ title: z.string().optional(), language: z.string().optional() })\n .loose()\n\nexport interface AudioDownload {\n readonly audioPath: string\n readonly title: string\n readonly language?: string\n /** Remove the temp working dir. Always called by the fetcher. */\n cleanup(): Promise<void>\n}\n\n/** Pull a URL's audio to a local file. Injectable for tests. */\nexport type AudioDownloader = (url: string) => Promise<AudioDownload>\n\nexport interface YtDlpWhisperFetcherOptions {\n readonly stt: SttPort\n /** Defaults to a yt-dlp subprocess downloader. */\n readonly download?: AudioDownloader\n /** Path to the yt-dlp binary (default: \"yt-dlp\" on PATH). */\n readonly ytDlpBin?: string\n /** Treat these hostnames as video (in addition to the YouTube/Vimeo set). */\n readonly extraVideoHosts?: readonly string[]\n /**\n * Skip videos longer than this many seconds, BEFORE downloading\n * (yt-dlp `--match-filter \"duration <= N\"`). A filtered video pulls no\n * bytes and resolves to `null` (skipped), so a stray 40-hour stream\n * can't blow up the batch. Omit for no cap — long media is segmented by\n * `ChunkedStt`, so length alone is not a blocker.\n */\n readonly maxDurationSec?: number\n /**\n * Read cookies from a local browser (`chrome`, `firefox`, `chrome:Profile 1`)\n * — passed to yt-dlp as `--cookies-from-browser`. Authenticated requests\n * sidestep YouTube's \"confirm you're not a bot\" rate-limit that public\n * fetches hit after a burst of downloads.\n */\n readonly cookiesFromBrowser?: string\n /** Path to a Netscape cookies.txt — passed to yt-dlp as `--cookies`. */\n readonly cookiesFile?: string\n}\n\nexport class YtDlpWhisperFetcher implements FetcherPort {\n private readonly stt: SttPort\n private readonly download: AudioDownloader\n private readonly extraHosts: ReadonlySet<string> | undefined\n\n constructor(opts: YtDlpWhisperFetcherOptions) {\n this.stt = opts.stt\n this.download =\n opts.download ??\n defaultYtDlpDownloader(opts.ytDlpBin ?? \"yt-dlp\", {\n maxDurationSec: opts.maxDurationSec,\n cookiesFromBrowser: opts.cookiesFromBrowser,\n cookiesFile: opts.cookiesFile,\n })\n this.extraHosts = opts.extraVideoHosts\n ? new Set(opts.extraVideoHosts)\n : undefined\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (!isVideoUrl(url, this.extraHosts)) return null // let a readability fetcher handle it\n\n let dl: AudioDownload\n try {\n dl = await this.download(url)\n } catch (e) {\n // Per-video download failure (geo-block, private, removed, or a\n // YouTube bot-check) → skip, don't abort the batch. Surface it so a\n // run that silently downloads nothing is diagnosable (e.g. the\n // bot-check that --cookies-from-browser fixes) rather than looking\n // like \"0 videos found\".\n process.stderr.write(`corpus: download failed for ${url} — skipped (${msg(e)})\\n`)\n return null\n }\n try {\n const t = await this.stt.transcribe(dl.audioPath)\n if (!t.text.trim()) return null\n return {\n title: dl.title || url,\n text: t.text,\n kind: \"video\",\n ...(t.language ?? dl.language\n ? { language: t.language ?? dl.language }\n : {}),\n via: \"transcription\",\n }\n } catch (e) {\n // A transcription failure on ONE video must not abort the whole\n // batch (the STT layer already retries transient blips). Skip it and\n // let the resumable importer retry on the next run — EXCEPT for an\n // auth/config error, which would fail every video, so we surface it\n // loudly rather than silently dropping the entire run.\n if (isAuthError(e)) throw e\n process.stderr.write(\n `corpus: transcription failed for ${url} — skipped (${msg(e)})\\n`\n )\n return null\n } finally {\n await dl.cleanup().catch(() => {})\n }\n }\n}\n\nfunction msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e)\n}\n\n/** A 401/403 or \"api key\" error fails every video — abort, don't skip. */\nfunction isAuthError(e: unknown): boolean {\n const m = msg(e).toLowerCase()\n return (\n m.includes(\" 401\") ||\n m.includes(\" 403\") ||\n m.includes(\"unauthorized\") ||\n m.includes(\"forbidden\") ||\n m.includes(\"api key\") ||\n m.includes(\"api_key\")\n )\n}\n\n// ── Default yt-dlp subprocess downloader ────────────────────────────\n\nfunction defaultYtDlpDownloader(\n bin: string,\n opts?: {\n readonly maxDurationSec?: number\n readonly cookiesFromBrowser?: string\n readonly cookiesFile?: string\n }\n): AudioDownloader {\n return async (url: string): Promise<AudioDownload> => {\n const dir = await mkdtemp(join(tmpdir(), \"corpus-ytdlp-\"))\n const cleanup = () => rm(dir, { recursive: true, force: true })\n try {\n // `--match-filter` is evaluated before the media is fetched, so an\n // over-length video pulls zero bytes — it just yields no output file,\n // which the caller treats as a skip.\n const durationGuard =\n opts?.maxDurationSec && opts.maxDurationSec > 0\n ? [\"--match-filter\", `duration <= ${Math.floor(opts.maxDurationSec)}`]\n : []\n // Authenticate via local browser cookies (or a cookies.txt) to dodge\n // YouTube's bot-check rate-limit on bursts of public downloads.\n const cookieArgs = opts?.cookiesFromBrowser\n ? [\"--cookies-from-browser\", opts.cookiesFromBrowser]\n : opts?.cookiesFile\n ? [\"--cookies\", opts.cookiesFile]\n : []\n await execFileAsync(\n bin,\n [\n \"-f\", \"bestaudio\",\n \"-x\", \"--audio-format\", \"mp3\", \"--audio-quality\", \"64K\",\n \"--no-playlist\", \"--no-progress\",\n ...durationGuard,\n ...cookieArgs,\n \"--write-info-json\",\n \"-o\", join(dir, \"track.%(ext)s\"),\n url,\n ],\n { maxBuffer: 16 * 1024 * 1024 }\n )\n const files = await readdir(dir)\n const audio = files.find(f => f === \"track.mp3\") ??\n files.find(f => /\\.(mp3|m4a|opus|webm|ogg|wav)$/i.test(f))\n if (!audio) throw new Error(\"yt-dlp produced no audio file\")\n\n let title = url\n let language: string | undefined\n const infoName = files.find(f => f.endsWith(\".info.json\"))\n if (infoName) {\n try {\n const info = YTDLP_INFO.parse(\n JSON.parse(await readFile(join(dir, infoName), \"utf-8\"))\n )\n if (info.title) title = info.title\n if (info.language) language = info.language\n } catch {\n // info json optional — fall back to url as title\n }\n }\n return {\n audioPath: join(dir, audio),\n title,\n ...(language ? { language } : {}),\n cleanup,\n }\n } catch (e) {\n await cleanup().catch(() => {})\n throw e\n }\n }\n}\n","/**\n * SttPort — speech-to-text boundary the YtDlpWhisperFetcher consumes.\n *\n * Keeps the fetcher pure of any STT-vendor specifics: it hands a local\n * audio file path to `transcribe()` and gets back text. The CLI wires a\n * concrete impl (OpenAI Whisper here; swap for a self-hosted whisper.cpp\n * or Deepgram impl without touching the fetcher).\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { basename } from \"node:path\"\nimport { normalizeLanguageTag } from \"@agentproto/corpus\"\nimport { z } from \"zod\"\n\n/** The Whisper verbose_json fields we read. */\nconst WHISPER_RESPONSE = z\n .object({ text: z.string().optional(), language: z.string().optional() })\n .loose()\n\nexport interface Transcript {\n readonly text: string\n /** BCP-47 language, when the engine detects it. */\n readonly language?: string\n}\n\nexport interface SttPort {\n transcribe(audioPath: string): Promise<Transcript>\n}\n\nconst WHISPER_MAX_BYTES = 25 * 1024 * 1024 // OpenAI hard cap\n\nexport interface OpenAiWhisperSttOptions {\n readonly apiKey: string\n /** Default \"whisper-1\". */\n readonly model?: string\n /** Override base URL (proxy / Azure). Default OpenAI. */\n readonly baseUrl?: string\n}\n\n/**\n * OpenAI Whisper STT. Posts the audio file to /audio/transcriptions with\n * `response_format=verbose_json` so we recover the detected language.\n *\n * Files above OpenAI's 25 MB cap throw a clear error — the caller should\n * have downloaded at a lower bitrate (the fetcher uses 64 kbps mono) or\n * chunk long media. We surface the size rather than letting the API 413.\n */\nexport class OpenAiWhisperStt implements SttPort {\n private readonly apiKey: string\n private readonly model: string\n private readonly baseUrl: string\n\n constructor(opts: OpenAiWhisperSttOptions) {\n this.apiKey = opts.apiKey\n this.model = opts.model ?? \"whisper-1\"\n this.baseUrl = (opts.baseUrl ?? \"https://api.openai.com/v1\").replace(/\\/+$/, \"\")\n }\n\n async transcribe(audioPath: string): Promise<Transcript> {\n const bytes = await readFile(audioPath)\n if (bytes.byteLength > WHISPER_MAX_BYTES) {\n throw new Error(\n `audio ${basename(audioPath)} is ${(bytes.byteLength / 1024 / 1024).toFixed(1)} MB — over Whisper's 25 MB cap. Lower the bitrate or chunk the media.`\n )\n }\n const form = new FormData()\n form.append(\"file\", new Blob([bytes]), basename(audioPath))\n form.append(\"model\", this.model)\n form.append(\"response_format\", \"verbose_json\")\n\n const res = await this.postWithRetry(form)\n if (!res.ok) {\n const body = await res.text().catch(() => \"\")\n throw new Error(`Whisper STT ${res.status} ${res.statusText}: ${body.slice(0, 200)}`)\n }\n const data = WHISPER_RESPONSE.parse(await res.json())\n const language = normalizeLanguageTag(data.language)\n return {\n text: (data.text ?? \"\").trim(),\n ...(language ? { language } : {}),\n }\n }\n\n /**\n * POST the audio with bounded retry. Transcribing a long talk fans out\n * into many segment uploads (see ChunkedStt), so a single transient\n * network blip (\"fetch failed\") or a 429 / 5xx must not abort the whole\n * batch. Network errors and retryable statuses back off and retry;\n * client errors (401 auth, 400 bad request) return immediately so a real\n * misconfiguration still surfaces loudly.\n */\n private async postWithRetry(form: FormData, attempts = 4): Promise<Response> {\n const url = `${this.baseUrl}/audio/transcriptions`\n let lastErr: unknown\n for (let i = 0; i < attempts; i++) {\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { authorization: `Bearer ${this.apiKey}` },\n body: form,\n })\n if (res.status !== 429 && res.status < 500) return res\n lastErr = new Error(`Whisper STT ${res.status} ${res.statusText}`)\n } catch (e) {\n lastErr = e // network-level failure (undici \"fetch failed\", reset, timeout)\n }\n if (i < attempts - 1) await delay(500 * 2 ** i) // 0.5s, 1s, 2s\n }\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr))\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","/**\n * AssemblyAiStt — a diarizing SttPort. Where OpenAiWhisperStt returns a\n * flat transcript, this returns SPEAKER-LABELLED text (`Speaker A: … /\n * Speaker B: …`) via AssemblyAI's `speaker_labels`. Use it ad-hoc for\n * multi-speaker videos (interviews, mock interviews, panels, \"day in the\n * life\") where the content only makes sense if you know who said what.\n *\n * Same `SttPort` contract — the diarized layout lives in `text`, so it\n * drops straight into YtDlpWhisperFetcher without any other change.\n *\n * Flow: upload audio → create transcript(speaker_labels) → poll → format\n * utterances. No 25 MB cap (unlike Whisper), so long videos are fine; the\n * trade-off is latency (~a third of audio duration) — slower than Whisper.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { z } from \"zod\"\nimport type { SttPort, Transcript } from \"./stt.port.js\"\n\nexport interface AssemblyAiSttOptions {\n readonly apiKey: string\n readonly baseUrl?: string\n readonly pollIntervalMs?: number\n readonly maxWaitMs?: number\n readonly sleep?: (ms: number) => Promise<void>\n}\n\nconst UPLOAD_RESPONSE = z.object({ upload_url: z.string() })\n\nconst AAI_TRANSCRIPT = z\n .object({\n id: z.string(),\n status: z.enum([\"queued\", \"processing\", \"completed\", \"error\"]),\n text: z.string().optional(),\n language_code: z.string().optional(),\n error: z.string().optional(),\n utterances: z\n .array(z.object({ speaker: z.string(), text: z.string() }))\n .nullish(),\n })\n .loose()\n\ntype AaiTranscript = z.infer<typeof AAI_TRANSCRIPT>\n\nexport class AssemblyAiStt implements SttPort {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly pollIntervalMs: number\n private readonly maxWaitMs: number\n private readonly sleep: (ms: number) => Promise<void>\n\n constructor(opts: AssemblyAiSttOptions) {\n this.apiKey = opts.apiKey\n this.baseUrl = (opts.baseUrl ?? \"https://api.assemblyai.com/v2\").replace(/\\/+$/, \"\")\n this.pollIntervalMs = opts.pollIntervalMs ?? 3000\n this.maxWaitMs = opts.maxWaitMs ?? 15 * 60 * 1000\n this.sleep = opts.sleep ?? ((ms: number) => new Promise(r => setTimeout(r, ms)))\n }\n\n async transcribe(audioPath: string): Promise<Transcript> {\n const bytes = await readFile(audioPath)\n\n // 1. Upload the audio bytes.\n const up = await fetch(`${this.baseUrl}/upload`, {\n method: \"POST\",\n headers: { authorization: this.apiKey, \"content-type\": \"application/octet-stream\" },\n body: bytes,\n })\n if (!up.ok) throw new Error(`AssemblyAI upload ${up.status}: ${(await up.text()).slice(0, 200)}`)\n const { upload_url } = UPLOAD_RESPONSE.parse(await up.json())\n\n // 2. Create a diarized transcript job.\n const created = await this.post(\"/transcript\", {\n audio_url: upload_url,\n speaker_labels: true,\n language_detection: true,\n })\n const id = created.id\n\n // 3. Poll until done.\n const deadline = this.maxWaitMs\n let waited = 0\n let job = created\n while (job.status !== \"completed\" && job.status !== \"error\") {\n if (waited >= deadline) throw new Error(`AssemblyAI transcript ${id} timed out after ${deadline} ms`)\n await this.sleep(this.pollIntervalMs)\n waited += this.pollIntervalMs\n job = await this.get(`/transcript/${id}`)\n }\n if (job.status === \"error\") throw new Error(`AssemblyAI transcript failed: ${job.error ?? \"unknown\"}`)\n\n return {\n text: formatDiarized(job),\n ...(job.language_code ? { language: job.language_code } : {}),\n }\n }\n\n private async post(path: string, body: unknown): Promise<AaiTranscript> {\n const r = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: { authorization: this.apiKey, \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n if (!r.ok) throw new Error(`AssemblyAI POST ${path} ${r.status}: ${(await r.text()).slice(0, 200)}`)\n return AAI_TRANSCRIPT.parse(await r.json())\n }\n\n private async get(path: string): Promise<AaiTranscript> {\n const r = await fetch(`${this.baseUrl}${path}`, { headers: { authorization: this.apiKey } })\n if (!r.ok) throw new Error(`AssemblyAI GET ${path} ${r.status}: ${(await r.text()).slice(0, 200)}`)\n return AAI_TRANSCRIPT.parse(await r.json())\n }\n}\n\n/** Join utterances as `Speaker A: …` blocks; fall back to flat text. */\nfunction formatDiarized(job: AaiTranscript): string {\n if (job.utterances && job.utterances.length > 0) {\n return job.utterances\n .map(u => `Speaker ${u.speaker}: ${u.text.trim()}`)\n .join(\"\\n\\n\")\n .trim()\n }\n return (job.text ?? \"\").trim()\n}\n","/**\n * ChunkedStt — a SttPort decorator that makes a capped engine handle\n * arbitrarily long audio. Whisper rejects files over 25 MB, so a\n * multi-hour talk (full course, masterclass, panel) can't be sent in one\n * request. This wrapper splits oversized audio into time segments with\n * ffmpeg, transcribes each through the wrapped engine, and concatenates\n * the text back into a single transcript.\n *\n * transcribe(path) → ≤cap ? base.transcribe(path)\n * : ffmpeg segment → base.transcribe(eachPart) → join\n *\n * The cap is a vendor concern (Whisper's limit), so handling it belongs in\n * the STT layer rather than the fetcher — the fetcher stays pure and the\n * concrete `OpenAiWhisperStt` stays a single-request transcriber. Splitting\n * is injected as `split` so the decorator is unit-testable with a fake\n * splitter + fake base engine — no ffmpeg, no network.\n *\n * Segmenting uses `-c copy` (stream copy, no re-encode): fast, and each\n * segment is a self-contained valid file. At the fetcher's 64 kbps a 20-min\n * segment is ~9.6 MB — comfortably under the 25 MB cap with margin for\n * VBR drift.\n */\n\nimport { execFile } from \"node:child_process\"\nimport { mkdtemp, readdir, rm, stat } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { extname, join } from \"node:path\"\nimport { promisify } from \"node:util\"\nimport type { SttPort, Transcript } from \"./stt.port.js\"\n\nconst execFileAsync = promisify(execFile)\n\n/**\n * Split a local audio file into ≤`segmentSeconds` parts inside `outDir`,\n * returning the segment paths in playback order. Injectable for tests.\n */\nexport type AudioSplitter = (\n audioPath: string,\n segmentSeconds: number,\n outDir: string\n) => Promise<string[]>\n\nexport interface ChunkedSttOptions {\n /** The engine each (sub-cap) part is transcribed through. */\n readonly base: SttPort\n /**\n * Split anything strictly larger than this. Default 24 MB — just under\n * Whisper's 25 MB hard cap so VBR drift never pushes a part over.\n */\n readonly maxBytes?: number\n /** Segment length when splitting. Default 1200 s (20 min). */\n readonly segmentSeconds?: number\n /** Defaults to an ffmpeg segment-muxer splitter. */\n readonly split?: AudioSplitter\n /** Path to the ffmpeg binary (default: \"ffmpeg\" on PATH). */\n readonly ffmpegBin?: string\n}\n\nconst DEFAULT_MAX_BYTES = 24 * 1024 * 1024\nconst DEFAULT_SEGMENT_SECONDS = 1200\n\nexport class ChunkedStt implements SttPort {\n private readonly base: SttPort\n private readonly maxBytes: number\n private readonly segmentSeconds: number\n private readonly split: AudioSplitter\n\n constructor(opts: ChunkedSttOptions) {\n this.base = opts.base\n this.maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES\n this.segmentSeconds = opts.segmentSeconds ?? DEFAULT_SEGMENT_SECONDS\n this.split = opts.split ?? defaultFfmpegSplitter(opts.ffmpegBin ?? \"ffmpeg\")\n }\n\n async transcribe(audioPath: string): Promise<Transcript> {\n const { size } = await stat(audioPath)\n if (size <= this.maxBytes) return this.base.transcribe(audioPath)\n\n const dir = await mkdtemp(join(tmpdir(), \"corpus-stt-chunk-\"))\n try {\n const parts = await this.split(audioPath, this.segmentSeconds, dir)\n if (parts.length === 0) {\n // Splitter produced nothing — fall back to a single attempt so the\n // base engine surfaces its own (clear) over-cap error rather than\n // us silently dropping the source.\n return this.base.transcribe(audioPath)\n }\n const texts: string[] = []\n let language: string | undefined\n let failed = 0\n let firstErr: unknown\n for (const part of parts) {\n try {\n const t = await this.base.transcribe(part)\n if (t.text.trim()) texts.push(t.text.trim())\n language ??= t.language\n } catch (e) {\n // One segment failing (after the base engine's own retries) must\n // not discard the whole multi-hour transcript — keep the rest.\n failed++\n firstErr ??= e\n }\n }\n // Every segment failing usually means a systemic error (auth, quota) —\n // rethrow so the caller can surface/skip it, rather than silently\n // writing an empty transcript.\n if (texts.length === 0) {\n throw firstErr ?? new Error(\"all audio segments failed transcription\")\n }\n if (failed > 0) {\n process.stderr.write(\n `corpus: ${failed}/${parts.length} audio segments failed — partial transcript\\n`\n )\n }\n return {\n text: texts.join(\"\\n\\n\"),\n ...(language ? { language } : {}),\n }\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n }\n}\n\n// ── Default ffmpeg segment-muxer splitter ───────────────────────────\n\nfunction defaultFfmpegSplitter(bin: string): AudioSplitter {\n return async (audioPath, segmentSeconds, outDir) => {\n const ext = extname(audioPath) || \".mp3\"\n await execFileAsync(\n bin,\n [\n \"-hide_banner\", \"-loglevel\", \"error\",\n \"-i\", audioPath,\n \"-f\", \"segment\",\n \"-segment_time\", String(segmentSeconds),\n \"-c\", \"copy\",\n join(outDir, `part%03d${ext}`),\n ],\n { maxBuffer: 16 * 1024 * 1024 }\n )\n // ffmpeg names parts part000, part001, … — lexical sort = playback order.\n const files = (await readdir(outDir))\n .filter(f => f.startsWith(\"part\") && f.endsWith(ext))\n .sort()\n return files.map(f => join(outDir, f))\n }\n}\n","/**\n * HttpReadabilityFetcher — a browser-free FetcherPort for articles:\n * plain `fetch` + a lightweight readability extraction (prefer\n * <article>/<main>, strip chrome). Validated to pull ~35k chars from a\n * real corpus article. Returns `null` for non-HTML or empty bodies so a\n * video or authed-browser fetcher can take those.\n *\n * No JS execution — so it won't get SPA-only content; for login-walled\n * or JS-rendered pages, compose a BrowserMcpFetcher ahead of/after this.\n */\n\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\nexport interface HttpReadabilityFetcherOptions {\n readonly userAgent?: string\n readonly maxChars?: number\n}\n\nconst DEFAULT_UA =\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0 Safari/537.36\"\n\nexport class HttpReadabilityFetcher implements FetcherPort {\n private readonly ua: string\n private readonly maxChars: number\n\n constructor(opts: HttpReadabilityFetcherOptions = {}) {\n this.ua = opts.userAgent ?? DEFAULT_UA\n this.maxChars = opts.maxChars ?? 200_000\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n // Video URLs belong to the transcription fetcher. Never scrape a\n // watch page here — a failed transcription must skip, not fall\n // through to YouTube's page chrome.\n if (isVideoUrl(url)) return null\n\n let res: Response\n try {\n res = await fetch(url, {\n headers: { \"user-agent\": this.ua, \"accept-language\": \"en,fr;q=0.8\" },\n redirect: \"follow\",\n })\n } catch {\n return null\n }\n if (!res.ok) return null\n const ct = res.headers.get(\"content-type\") ?? \"\"\n if (!ct.includes(\"text/html\") && !ct.includes(\"application/xhtml\")) return null\n\n const html = await res.text()\n const title = decodeEntities(\n (html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)?.[1] ?? \"\").trim()\n )\n const lang = html.match(/<html[^>]*\\blang=[\"']?([a-zA-Z-]+)/i)?.[1]\n const text = extractReadable(html).slice(0, this.maxChars)\n if (!text.trim()) return null\n\n return {\n title: title || url,\n text,\n kind: \"article\",\n ...(lang ? { language: lang } : {}),\n via: \"readability\",\n }\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nfunction extractReadable(html: string): string {\n // Prefer the main content region; fall back to <body>.\n const region =\n html.match(/<article[\\s\\S]*?<\\/article>/i)?.[0] ??\n html.match(/<main[\\s\\S]*?<\\/main>/i)?.[0] ??\n html.match(/<body[\\s\\S]*?<\\/body>/i)?.[0] ??\n html\n return decodeEntities(\n region\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<(nav|header|footer|aside|form)[\\s\\S]*?<\\/\\1>/gi, \" \")\n .replace(/<[^>]+>/g, \" \")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n ).trim()\n}\n\nfunction decodeEntities(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/ /g, \" \")\n .replace(/&#(\\d+);/g, (_, n) => String.fromCharCode(Number(n)))\n}\n","/**\n * CompositeFetcher — tries child fetchers in order, first non-null wins.\n *\n * Lets the importer route by URL without itself knowing the routing:\n * new CompositeFetcher([ ytDlpWhisper, browserReadability ])\n * sends videos to whisper (the readability one returns null for them is\n * never reached because whisper handled it) and everything else falls\n * through to readability. A child that THROWS aborts (hard failure);\n * a child that returns null means \"not mine, try the next\".\n */\n\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\n\nexport class CompositeFetcher implements FetcherPort {\n private readonly children: readonly FetcherPort[]\n\n constructor(children: readonly FetcherPort[]) {\n this.children = children\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n for (const child of this.children) {\n const result = await child.fetch(url)\n if (result) return result\n }\n return null\n }\n}\n","/**\n * ThrottleFetcher — wraps a FetcherPort to enforce a minimum interval\n * between fetches (rate limiting). The importer already calls fetch\n * serially (one URL at a time), so this adds the *pacing* that protects\n * against YouTube anti-abuse blocks and Whisper RPM limits when running\n * a large batch.\n *\n * `now` + `sleep` are injectable so the throttle is unit-testable without\n * real timers.\n */\n\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\n\nexport interface ThrottleFetcherOptions {\n /** Minimum milliseconds between the START of consecutive fetches. */\n readonly minIntervalMs: number\n readonly now?: () => number\n readonly sleep?: (ms: number) => Promise<void>\n}\n\nexport class ThrottleFetcher implements FetcherPort {\n private readonly inner: FetcherPort\n private readonly minIntervalMs: number\n private readonly now: () => number\n private readonly sleep: (ms: number) => Promise<void>\n private lastStart = 0\n private started = false\n\n constructor(inner: FetcherPort, opts: ThrottleFetcherOptions) {\n this.inner = inner\n this.minIntervalMs = Math.max(0, opts.minIntervalMs)\n this.now = opts.now ?? (() => Date.now())\n this.sleep =\n opts.sleep ?? ((ms: number) => new Promise(r => setTimeout(r, ms)))\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (this.minIntervalMs > 0 && this.started) {\n const wait = this.minIntervalMs - (this.now() - this.lastStart)\n if (wait > 0) await this.sleep(wait)\n }\n this.started = true\n this.lastStart = this.now()\n return this.inner.fetch(url)\n }\n}\n","/**\n * connectBrowserMcp — connect to a chrome-devtools-mcp server over MCP\n * streamable-HTTP and return a `BrowserMcpLike` (just `callTool`).\n *\n * ────────────────────────────────────────────────────────────────────\n * TODO(live): this is the ONE environment-coupled seam. It implements a\n * minimal JSON-RPC-over-HTTP client good enough for the common daemon\n * setup, but the exact transport details depend on how YOUR daemon\n * exposes chrome-devtools-mcp. Verify against the running daemon:\n *\n * 1. Response framing — streamable HTTP MAY reply with `text/event-\n * stream` (SSE) rather than a single JSON body. `parseRpcResponse`\n * handles both, but confirm the SSE `data:` framing matches.\n * 2. Session header — the spec uses `Mcp-Session-Id`; some servers\n * omit it (stateless). We echo it back when present.\n * 3. initialize params — protocolVersion / clientInfo may need to\n * match the server's expected version.\n *\n * If your daemon proxies the browser through a different surface (e.g.\n * the @guilde/tunnel `/mcp` or an agentproto driver), swap this file's\n * impl — the `BrowserMcpLike` contract the fetcher consumes is stable.\n * ────────────────────────────────────────────────────────────────────\n */\n\nimport { z } from \"zod\"\nimport type { BrowserMcpLike } from \"./browser-fetcher.adapter.js\"\n\n/** A JSON-RPC response envelope (result/error opaque). */\nconst RPC_RESPONSE = z\n .object({ result: z.unknown().optional(), error: z.unknown().optional() })\n .loose()\n\n/** An MCP `tools/call` result (content blocks left opaque). */\nconst CALL_RESULT = z\n .object({\n content: z.unknown().optional(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n })\n .loose()\n\nexport interface ConnectBrowserMcpOptions {\n /** chrome-devtools-mcp streamable-HTTP endpoint, e.g. http://127.0.0.1:9223/mcp */\n readonly endpoint: string\n /** Extra headers (auth tokens, etc.). */\n readonly headers?: Record<string, string>\n readonly protocolVersion?: string\n}\n\nconst PROTOCOL_VERSION = \"2025-06-18\"\n\nexport async function connectBrowserMcp(\n opts: ConnectBrowserMcpOptions\n): Promise<BrowserMcpLike> {\n const client = new StreamableHttpMcpClient(opts)\n await client.initialize()\n return client\n}\n\nclass StreamableHttpMcpClient implements BrowserMcpLike {\n private id = 0\n private sessionId: string | undefined\n private readonly endpoint: string\n private readonly headers: Record<string, string>\n private readonly protocolVersion: string\n\n constructor(opts: ConnectBrowserMcpOptions) {\n this.endpoint = opts.endpoint\n this.headers = opts.headers ?? {}\n this.protocolVersion = opts.protocolVersion ?? PROTOCOL_VERSION\n }\n\n async initialize(): Promise<void> {\n const res = await this.post({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"initialize\",\n params: {\n protocolVersion: this.protocolVersion,\n capabilities: {},\n clientInfo: { name: \"corpus-cli\", version: \"0.1.0\" },\n },\n })\n // initialized notification (no id, no response expected)\n await this.post(\n { jsonrpc: \"2.0\", method: \"notifications/initialized\", params: {} },\n { expectResponse: false }\n )\n if (res?.error) {\n throw new Error(`initialize failed: ${JSON.stringify(res.error)}`)\n }\n }\n\n async callTool(args: {\n name: string\n arguments: Record<string, unknown>\n }): Promise<{ content?: unknown; structuredContent?: unknown; isError?: boolean }> {\n const res = await this.post({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"tools/call\",\n params: { name: args.name, arguments: args.arguments },\n })\n if (res?.error) {\n throw new Error(`tools/call ${args.name} failed: ${JSON.stringify(res.error)}`)\n }\n const parsed = CALL_RESULT.safeParse(res?.result ?? {})\n return parsed.success ? parsed.data : {}\n }\n\n private async post(\n body: Record<string, unknown>,\n opts: { expectResponse?: boolean } = {}\n ): Promise<{ result?: unknown; error?: unknown } | null> {\n const res = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n ...(this.sessionId ? { \"mcp-session-id\": this.sessionId } : {}),\n ...this.headers,\n },\n body: JSON.stringify(body),\n })\n\n const sid = res.headers.get(\"mcp-session-id\")\n if (sid) this.sessionId = sid\n\n if (opts.expectResponse === false) return null\n if (!res.ok) {\n throw new Error(`MCP HTTP ${res.status} ${res.statusText}`)\n }\n return parseRpcResponse(await res.text(), res.headers.get(\"content-type\"))\n }\n}\n\n/** Handle both a single JSON body and SSE (`event:`/`data:`) framing. */\nfunction parseRpcResponse(\n text: string,\n contentType: string | null\n): { result?: unknown; error?: unknown } | null {\n if (!text.trim()) return null\n const isSse = (contentType ?? \"\").includes(\"text/event-stream\")\n if (!isSse) {\n const parsed = RPC_RESPONSE.safeParse(JSON.parse(text))\n return parsed.success ? parsed.data : null\n }\n // SSE: take the last `data:` line that parses to a JSON-RPC response.\n let last: { result?: unknown; error?: unknown } | null = null\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim()\n if (!trimmed.startsWith(\"data:\")) continue\n const payload = trimmed.slice(\"data:\".length).trim()\n if (!payload || payload === \"[DONE]\") continue\n try {\n last = JSON.parse(payload)\n } catch {\n // skip non-JSON data frames\n }\n }\n return last\n}\n","/**\n * `corpus import-web [workspace]` — import a list of URLs into the\n * corpus workspace as AIP-10 sources + discovered candidates, fetching\n * each URL's text through the user's authenticated browser.\n *\n * corpus import-web ./corpora/recruiting \\\n * --urls-file ./urls.txt \\\n * --browser-mcp http://127.0.0.1:9223/mcp \\\n * --tags recruiting --lang en\n *\n * Pipeline: WebImporter (FetcherPort ← BrowserMcpFetcher) → ImporterRunner\n * writes `sources/web/<batch>/<slug>.md` + appends `_candidates.yaml`.\n * Pushing the resulting candidates into a knowledge engine (RAG) is the\n * SEPARATE corpus promote/WriterPort step — not this command.\n *\n * The only external connection is the chrome-devtools-mcp browser\n * endpoint; everything else is local filesystem.\n */\n\nimport { readFile, readdir } from \"node:fs/promises\"\nimport type { Dirent } from \"node:fs\"\nimport { z } from \"zod\"\n\n/** Source frontmatter — just the URL provenance used for resume de-dup. */\nconst SOURCE_URL_FRONTMATTER = z\n .object({\n metadata: z\n .object({\n corpus: z\n .object({\n originalUrl: z.string().optional().catch(undefined),\n importerSourceUrl: z.string().optional().catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\nimport { join } from \"node:path\"\nimport matter from \"gray-matter\"\nimport {\n ImporterRunner,\n WebImporter,\n systemClock,\n} from \"@agentproto/corpus\"\nimport type { FetcherPort } from \"@agentproto/corpus\"\nimport {\n BrowserMcpFetcher,\n type BrowserMcpLike,\n} from \"../ports/browser-fetcher.adapter.js\"\nimport { ScrapeMcpFetcher } from \"../ports/scrape-mcp-fetcher.adapter.js\"\nimport { YtDlpWhisperFetcher } from \"../ports/ytdlp-whisper-fetcher.adapter.js\"\nimport { OpenAiWhisperStt, type SttPort } from \"../ports/stt.port.js\"\nimport { AssemblyAiStt } from \"../ports/assemblyai-stt.adapter.js\"\nimport { ChunkedStt } from \"../ports/chunked-stt.adapter.js\"\nimport { HttpReadabilityFetcher } from \"../ports/http-readability-fetcher.adapter.js\"\nimport { CompositeFetcher } from \"../ports/composite-fetcher.js\"\nimport { ThrottleFetcher } from \"../ports/throttle-fetcher.adapter.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { OsIdentityAdapter } from \"../ports/os-identity.adapter.js\"\nimport { connectBrowserMcp } from \"../ports/browser-mcp-connect.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\ninterface ParsedArgs {\n workspace: string | undefined\n urlsFile: string | undefined\n urls: string[]\n tags: string[]\n lang: string | undefined\n max: number | undefined\n maxDurationSec: number | undefined\n cookiesFromBrowser: string | undefined\n cookiesFile: string | undefined\n throttleMs: number\n force: boolean\n diarize: boolean\n browserMcp: string | undefined\n scrapeMcp: string | undefined\n importerId: string\n dryRun: boolean\n}\n\nfunction parse(args: readonly string[]): ParsedArgs {\n const out: ParsedArgs = {\n workspace: undefined,\n urlsFile: undefined,\n urls: [],\n tags: [],\n lang: undefined,\n max: undefined,\n maxDurationSec: undefined,\n cookiesFromBrowser: undefined,\n cookiesFile: undefined,\n throttleMs: 2000,\n force: false,\n diarize: false,\n browserMcp: process.env.BROWSER_MCP_URL,\n scrapeMcp: process.env.SCRAPE_MCP_URL,\n importerId: \"web\",\n dryRun: false,\n }\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--urls-file\": out.urlsFile = next(); break\n case \"--url\": { const v = next(); if (v) out.urls.push(v); break }\n case \"--tags\": { const v = next(); if (v) out.tags.push(...v.split(\",\").map(s => s.trim()).filter(Boolean)); break }\n case \"--lang\": out.lang = next(); break\n case \"--max\": { const v = next(); if (v) out.max = Number(v); break }\n case \"--max-duration\": { const v = next(); if (v) out.maxDurationSec = Number(v); break }\n case \"--cookies-from-browser\": out.cookiesFromBrowser = next(); break\n case \"--cookies\": out.cookiesFile = next(); break\n case \"--throttle\": { const v = next(); if (v) out.throttleMs = Number(v); break }\n case \"--force\": out.force = true; break\n case \"--diarize\": out.diarize = true; break\n case \"--browser-mcp\": out.browserMcp = next(); break\n case \"--scrape-mcp\": out.scrapeMcp = next(); break\n case \"--importer-id\": out.importerId = next() ?? \"web\"; break\n case \"--dry-run\": out.dryRun = true; break\n default:\n if (!a.startsWith(\"-\") && out.workspace === undefined) out.workspace = a\n }\n }\n return out\n}\n\nasync function readUrls(parsed: ParsedArgs): Promise<string[]> {\n const fromFile: string[] = []\n if (parsed.urlsFile) {\n const raw = await readFile(parsed.urlsFile, \"utf-8\")\n for (const line of raw.split(\"\\n\")) {\n const url = line.trim()\n // Tolerate \"Title — https://…\" lines (the brief's format): take the URL.\n const m = url.match(/https?:\\/\\/\\S+/)\n if (m) fromFile.push(m[0])\n }\n }\n // Dedupe input while preserving order.\n const seen = new Set<string>()\n return [...fromFile, ...parsed.urls].filter(u => (seen.has(u) ? false : seen.add(u)))\n}\n\n/**\n * Scan already-ingested source URLs from the workspace — the corpus is\n * the source of truth for \"what's done\". Reads every `sources/**/*.md`\n * frontmatter and collects `metadata.corpus.originalUrl`. Re-running\n * import-web skips these, so batching is just \"re-run with --max N until\n * empty\" — resumable by construction, no separate state file.\n */\nasync function scanIngestedUrls(workspaceRoot: string): Promise<Set<string>> {\n const seen = new Set<string>()\n const sourcesDir = join(workspaceRoot, \"sources\")\n let entries: Dirent[]\n try {\n entries = await readdir(sourcesDir, {\n recursive: true,\n withFileTypes: true,\n })\n } catch {\n return seen // no sources/ yet\n }\n for (const e of entries) {\n if (!e.isFile() || !e.name.endsWith(\".md\")) continue\n try {\n const raw = await readFile(join(e.parentPath, e.name), \"utf-8\")\n const fm = SOURCE_URL_FRONTMATTER.parse(matter(raw).data)\n const url =\n fm.metadata?.corpus?.originalUrl ?? fm.metadata?.corpus?.importerSourceUrl\n if (url) seen.add(url)\n } catch {\n // unreadable / non-frontmatter file — ignore\n }\n }\n return seen\n}\n\nexport async function runImportWeb(args: readonly string[]): Promise<ExitCode> {\n const parsed = parse(args)\n const target = resolveWorkspacePath(parsed.workspace)\n const urls = await readUrls(parsed)\n\n if (urls.length === 0) {\n return fail(\"import-web requires --urls-file <path> and/or one or more --url <u>.\", 2)\n }\n\n // Resume: skip URLs already ingested (their source records originalUrl).\n // --force re-fetches everything.\n const done = parsed.force ? new Set<string>() : await scanIngestedUrls(target)\n const todo = urls.filter(u => !done.has(u))\n const batch = parsed.max !== undefined ? todo.slice(0, parsed.max) : todo\n const remaining = todo.length - batch.length\n\n const plan =\n ` workspace: ${target}\\n` +\n ` urls: ${urls.length} total · ${done.size && !parsed.force ? `${urls.length - todo.length} already ingested · ` : \"\"}${todo.length} to do\\n` +\n ` this run: ${batch.length}${parsed.max !== undefined ? ` (--max ${parsed.max})` : \"\"} · ${remaining} remaining after\\n` +\n ` video stt: ${parsed.diarize ? \"AssemblyAI (speaker-labelled)\" : \"Whisper\"}\\n` +\n ` throttle: ${parsed.throttleMs} ms between fetches\\n`\n\n if (batch.length === 0) {\n process.stdout.write(`import-web → ${target}\\n nothing to do — all ${urls.length} URLs already ingested.\\n`)\n return 0\n }\n\n if (parsed.dryRun) {\n process.stdout.write(`import-web (dry run)\\n${plan}`)\n for (const u of batch.slice(0, 20)) process.stdout.write(` - ${u}\\n`)\n if (batch.length > 20) process.stdout.write(` … +${batch.length - 20} more\\n`)\n return 0\n }\n process.stdout.write(`import-web\\n${plan}`)\n\n // Build the fetcher chain (first non-null wins):\n // 1. videos → yt-dlp audio → Whisper (captions-independent; needs OPENAI_API_KEY)\n // 2. articles→ authed browser readability (only if --browser-mcp given)\n // 3. articles→ plain HTTP readability (browser-free fallback)\n const chain: FetcherPort[] = []\n\n // Pick the video STT: --diarize → AssemblyAI (speaker-labelled, for\n // multi-speaker interviews/panels), else OpenAI Whisper (flat, cheaper,\n // faster). Both satisfy SttPort, so the fetcher is identical.\n let stt: SttPort | undefined\n if (parsed.diarize) {\n const aaiKey = process.env.ASSEMBLYAI_API_KEY\n if (aaiKey) stt = new AssemblyAiStt({ apiKey: aaiKey })\n else\n process.stderr.write(\n \"corpus: --diarize needs ASSEMBLYAI_API_KEY — video URLs will be skipped.\\n\"\n )\n } else {\n const openaiKey = process.env.OPENAI_API_KEY\n // Wrap Whisper in ChunkedStt so multi-hour media (full courses,\n // masterclasses) gets ffmpeg-segmented under the 25 MB cap instead of\n // being rejected. AssemblyAI has no such cap, so it stays unwrapped.\n if (openaiKey)\n stt = new ChunkedStt({ base: new OpenAiWhisperStt({ apiKey: openaiKey }) })\n else\n process.stderr.write(\n \"corpus: OPENAI_API_KEY not set — video URLs will be skipped (no transcription).\\n\"\n )\n }\n if (stt)\n chain.push(\n new YtDlpWhisperFetcher({\n stt,\n ...(parsed.maxDurationSec\n ? { maxDurationSec: parsed.maxDurationSec }\n : {}),\n ...(parsed.cookiesFromBrowser\n ? { cookiesFromBrowser: parsed.cookiesFromBrowser }\n : {}),\n ...(parsed.cookiesFile ? { cookiesFile: parsed.cookiesFile } : {}),\n })\n )\n\n // A `scrape` MCP server (e.g. the browser project's tiered router) handles\n // walled / JS-rendered pages with stealth + auto-escalation and returns\n // clean Markdown. Sits ahead of the cheaper fallbacks.\n if (parsed.scrapeMcp) {\n try {\n const client = await connectBrowserMcp({ endpoint: parsed.scrapeMcp })\n chain.push(new ScrapeMcpFetcher({ client }))\n } catch (e) {\n return fail(`could not connect to scrape MCP at ${parsed.scrapeMcp}: ${msg(e)}`, 1)\n }\n }\n\n if (parsed.browserMcp) {\n let browser: BrowserMcpLike\n try {\n browser = await connectBrowserMcp({ endpoint: parsed.browserMcp })\n chain.push(new BrowserMcpFetcher({ browser }))\n } catch (e) {\n return fail(`could not connect to browser MCP at ${parsed.browserMcp}: ${msg(e)}`, 1)\n }\n }\n\n // Browser-free article fallback always available.\n chain.push(new HttpReadabilityFetcher())\n\n if (chain.length === 0) {\n return fail(\"no fetchers available — set OPENAI_API_KEY (videos) and/or --browser-mcp.\", 2)\n }\n\n const fetcher = new ThrottleFetcher(new CompositeFetcher(chain), {\n minIntervalMs: parsed.throttleMs,\n })\n const importer = new WebImporter({ fetcher })\n\n const runner = new ImporterRunner({\n // The fs is rooted AT the workspace, so corpus paths are relative to\n // it — workspacePath is \"\" (root), NOT the absolute target (which\n // would double-nest under the fs root).\n fs: new NodeFsAdapter({ root: target }),\n clock: systemClock,\n identity: new OsIdentityAdapter({ workspaceRoot: target }),\n workspacePath: \"\",\n })\n\n let report\n try {\n report = await runner.run(importer, {\n importerId: parsed.importerId,\n config: {\n urls: batch,\n ...(parsed.tags.length ? { tags: parsed.tags } : {}),\n ...(parsed.lang ? { language: parsed.lang } : {}),\n },\n })\n } catch (e) {\n return fail(`import failed: ${msg(e)}`, 1)\n }\n\n process.stdout.write(\n `import-web → ${target}\\n` +\n ` batch: ${report.batchId}\\n` +\n ` archived: ${report.archivedSlugs.length}\\n` +\n ` duplicates: ${report.duplicateSlugs.length}\\n` +\n ` candidates: ${report.candidateIds.length}\\n`\n )\n for (const w of report.warnings.slice(0, 20)) process.stdout.write(` ! ${w}\\n`)\n process.stdout.write(\n `\\nNext: review candidates, then promote them — promotion pushes chunks into the\\n` +\n `knowledge engine (RAG) via the WriterPort. Import only stages the sources.\\n`\n )\n return 0\n}\n\nfunction msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e)\n}\n","/**\n * AnthropicDistiller — a DistillPort backed by Claude over the Messages API.\n * Extracts refined AIP-10 items (principle/pattern/critique/summary/example)\n * from a raw source. Returns self-contained insights, not quote dumps.\n *\n * Hand-rolled over the HTTP API (no SDK dep), mirroring the other corpus-cli\n * port adapters. Prompt + parse are the shared `distill-prompt` core; this\n * adapter owns only the metered-API transport. For the subscription-billed\n * alternative see CliAgentDistiller + the `claude-code` engine.\n */\n\nimport { z } from \"zod\"\nimport type { DistillPort, DistillInput, DistilledItem } from \"@agentproto/corpus\"\nimport { buildDistillPrompt, parseItems } from \"./distill-prompt.js\"\nimport type { DistillUsage } from \"./usage-telemetry.js\"\n\n/** The Messages API response — text content blocks plus model + token usage. */\nconst ANTHROPIC_RESPONSE = z\n .object({\n model: z.string().optional(),\n content: z\n .array(z.object({ type: z.string(), text: z.string().optional() }).loose())\n .optional(),\n usage: z\n .object({ input_tokens: z.number(), output_tokens: z.number() })\n .loose()\n .optional(),\n })\n .loose()\n\nexport interface AnthropicDistillerOptions {\n readonly apiKey: string\n /** Default a current Claude model id. */\n readonly model?: string\n readonly baseUrl?: string\n /** Max refined items to extract per source. */\n readonly maxItems?: number\n /** Optional sink for per-call token usage (cost + Langfuse export). */\n readonly onUsage?: (usage: DistillUsage) => void\n}\n\nexport class AnthropicDistiller implements DistillPort {\n private readonly apiKey: string\n private readonly model: string\n private readonly baseUrl: string\n private readonly maxItems: number\n private readonly onUsage: ((usage: DistillUsage) => void) | undefined\n\n constructor(opts: AnthropicDistillerOptions) {\n this.apiKey = opts.apiKey\n this.model = opts.model ?? \"claude-sonnet-4-6\"\n this.baseUrl = (opts.baseUrl ?? \"https://api.anthropic.com/v1\").replace(/\\/+$/, \"\")\n this.maxItems = opts.maxItems ?? 8\n this.onUsage = opts.onUsage\n }\n\n async distill(input: DistillInput): Promise<readonly DistilledItem[]> {\n const prompt = buildDistillPrompt(input, this.maxItems)\n const startedAt = new Date().toISOString()\n const res = await fetch(`${this.baseUrl}/messages`, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 4096,\n messages: [{ role: \"user\", content: prompt }],\n }),\n })\n if (!res.ok) {\n throw new Error(`Anthropic distill ${res.status}: ${(await res.text()).slice(0, 200)}`)\n }\n const parsed = ANTHROPIC_RESPONSE.safeParse(await res.json())\n const text = parsed.success\n ? (parsed.data.content ?? []).find(c => c.type === \"text\")?.text ?? \"\"\n : \"\"\n if (parsed.success && parsed.data.usage && this.onUsage) {\n this.onUsage({\n model: parsed.data.model ?? this.model,\n inputTokens: parsed.data.usage.input_tokens,\n outputTokens: parsed.data.usage.output_tokens,\n label: input.title,\n startedAt,\n endedAt: new Date().toISOString(),\n })\n }\n return parseItems(text)\n }\n}\n","/**\n * CliAgentDistiller — a DistillPort backed by any local agent CLI running in\n * one-shot mode (prompt on stdin, response on stdout). The transport is generic;\n * the per-CLI specifics (command, argv, output parse) come from a CliEngine\n * descriptor, so claude / gemini / goose / … are one descriptor each.\n *\n * Same DistillPort contract + same prompt/parse as AnthropicDistiller (both use\n * the shared `distill-prompt` core), so the two are drop-in swappable behind the\n * `corpus distill --engine` flag.\n *\n * TRADE-OFFS vs the metered API:\n * - Subscription rate caps — slower for big batches; pace with --throttle and\n * let the runner skip+retry on non-zero exits.\n * - Output is CLI text, not API structured output — same tolerant parse.\n * - One process spawn per source — higher per-call overhead than fetch().\n */\n\nimport { tmpdir } from \"node:os\"\nimport { spawnWithStdin } from \"@agentproto/cli-exec\"\nimport type { DistillPort, DistillInput, DistilledItem } from \"@agentproto/corpus\"\nimport { buildDistillPrompt, parseItems } from \"./distill-prompt.js\"\nimport type { CliEngine } from \"./cli-engines.js\"\n\nexport interface CliAgentDistillerOptions {\n /** The CLI engine descriptor (command + argv + output parse). */\n readonly engine: CliEngine\n /** Optional model override passed to the engine, e.g. \"haiku\" to spend less quota. */\n readonly model?: string\n /** Max refined items per source (feeds the shared prompt). */\n readonly maxItems?: number\n /** Hard per-source timeout; kills a wedged CLI call. Default 120s. */\n readonly timeoutMs?: number\n /** Working dir. Default os.tmpdir() — neutral, no project CLAUDE.md / repo. */\n readonly cwd?: string\n}\n\nexport class CliAgentDistiller implements DistillPort {\n private readonly engine: CliEngine\n private readonly model?: string\n private readonly maxItems: number\n private readonly timeoutMs: number\n private readonly cwd: string\n\n constructor(opts: CliAgentDistillerOptions) {\n this.engine = opts.engine\n this.model = opts.model\n this.maxItems = opts.maxItems ?? 8\n this.timeoutMs = opts.timeoutMs ?? 120_000\n this.cwd = opts.cwd ?? tmpdir()\n }\n\n async distill(input: DistillInput): Promise<readonly DistilledItem[]> {\n const prompt = buildDistillPrompt(input, this.maxItems)\n // A non-zero exit (often a rate cap) rejects here; the runner skips + retries\n // the source on the next pass.\n const stdout = await spawnWithStdin({\n command: this.engine.command,\n args: this.engine.buildArgs({ ...(this.model ? { model: this.model } : {}) }),\n stdin: prompt,\n cwd: this.cwd,\n timeoutMs: this.timeoutMs,\n })\n const text = this.engine.parseOutput(stdout) ?? stdout\n return parseItems(text)\n }\n}\n","/**\n * CLI agent engines — descriptors for distilling through a local agent CLI in\n * headless one-shot mode (prompt on stdin, response on stdout), instead of a\n * metered API. Each engine declares its `command`, how to `buildArgs` (model\n * injection, output format, tool/MCP lockdown), and how to `parseOutput` of the\n * captured stdout into the model's text.\n *\n * WHY: distillation is a high-volume batch (hundreds of sources × ~8 items). On\n * the API that bills per token; routed through an authenticated agent-CLI\n * subscription (e.g. Claude Max) it draws on a flat monthly plan — ~$0 marginal\n * cost. Same DistillPort contract + same prompt/parse, swappable transport.\n *\n * Engines register full descriptors and are dispatched by id (no `engineId ===`\n * branching at the call site). Add a CLI by adding a descriptor below; gemini /\n * goose / codex etc. each become one entry.\n */\n\nimport { parseClaudeJsonOutput } from \"@agentproto/cli-exec\"\n\n/** What a CLI engine needs to drive one stdin→stdout completion. */\nexport interface CliEngine {\n /** Stable id, used by `corpus distill --engine <id>`. */\n readonly id: string\n /** Whether this engine bills a subscription (no API key needed). Surfaced in help. */\n readonly subscriptionBilled: boolean\n /** Executable to invoke — must be on PATH and logged in. */\n readonly command: string\n /** Build the argv for one completion. The prompt is fed over stdin, not argv. */\n buildArgs(opts: { readonly model?: string }): string[]\n /** Extract the model's text from captured stdout; null → fall back to raw stdout. */\n parseOutput(stdout: string): string | null\n}\n\n/**\n * Claude Code in headless print mode, billed against the logged-in subscription.\n *\n * Flags (verified against `claude -p --help`):\n * -p non-interactive print mode\n * --output-format json single-result JSON envelope ({ result, is_error, … })\n * --strict-mcp-config ignore all MCP servers (no --mcp-config ⇒ none load)\n * --model <m> optional alias (\"haiku\"/\"sonnet\") or full id\n * Deliberately NOT --bare: that flag forces ANTHROPIC_API_KEY auth and never\n * reads OAuth/keychain — which would bypass the subscription we're here to use.\n * Pair with cwd=os.tmpdir() (CliAgentDistiller default) so no project CLAUDE.md\n * is auto-discovered and the agent can't wander a repo.\n */\nconst CLAUDE_CODE: CliEngine = {\n id: \"claude-code\",\n subscriptionBilled: true,\n command: \"claude\",\n buildArgs: ({ model }) => [\n \"-p\",\n \"--output-format\",\n \"json\",\n \"--strict-mcp-config\",\n ...(model ? [\"--model\", model] : []),\n ],\n parseOutput: parseClaudeJsonOutput,\n}\n\n/** Registry of CLI engines, keyed by id. */\nexport const CLI_ENGINES: Readonly<Record<string, CliEngine>> = {\n [CLAUDE_CODE.id]: CLAUDE_CODE,\n}\n","/**\n * Usage telemetry for the metered distill path — cost visibility + optional\n * Langfuse export. SDK-free (raw fetch to Langfuse's ingestion API), mirroring\n * the distiller's own no-client-lib ethos and keeping corpus-cli lean.\n *\n * Two outputs, both best-effort (telemetry must never break a distill run):\n * 1. a per-run cost summary printed to stderr (always);\n * 2. one Langfuse trace with a GENERATION observation per LLM call, when\n * LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY (+ LANGFUSE_BASE_URL) are set.\n *\n * Langfuse runs (test/prod/local) share one project, filtered by the\n * `environment` tag (LANGFUSE_TRACING_ENVIRONMENT) — same convention as the\n * Mastra agent tracing in @agstudio/agent-framework.\n */\n\nimport { randomUUID } from \"node:crypto\"\n\n/** One metered LLM call's usage, reported by a distiller. */\nexport interface DistillUsage {\n /** Model id as returned by the API (falls back to the requested model). */\n readonly model: string\n readonly inputTokens: number\n readonly outputTokens: number\n /** Human label for the call — the source title. */\n readonly label: string\n readonly startedAt: string\n readonly endedAt: string\n}\n\n/** A sink a distiller calls once per metered LLM call. `flush` ships + reports. */\nexport interface UsageSink {\n record(usage: DistillUsage): void\n flush(): Promise<void>\n}\n\n/** USD per million tokens, matched by model-id substring. Estimate only — */\n/** Langfuse prices authoritatively from its own model table when exporting. */\nconst PRICING: ReadonlyArray<{\n readonly match: string\n readonly inPerM: number\n readonly outPerM: number\n}> = [\n { match: \"opus\", inPerM: 15, outPerM: 75 },\n { match: \"haiku\", inPerM: 1, outPerM: 5 },\n { match: \"sonnet\", inPerM: 3, outPerM: 15 },\n]\n\nfunction priceFor(model: string): { inPerM: number; outPerM: number } {\n const m = model.toLowerCase()\n return PRICING.find(p => m.includes(p.match)) ?? { inPerM: 3, outPerM: 15 }\n}\n\nfunction costUsd(u: DistillUsage): { input: number; output: number; total: number } {\n const { inPerM, outPerM } = priceFor(u.model)\n const input = (u.inputTokens / 1_000_000) * inPerM\n const output = (u.outputTokens / 1_000_000) * outPerM\n return { input, output, total: input + output }\n}\n\ninterface LangfuseConfig {\n readonly baseUrl: string\n readonly publicKey: string\n readonly secretKey: string\n readonly environment: string | undefined\n}\n\nfunction readLangfuseConfig(): LangfuseConfig | undefined {\n const publicKey = process.env.LANGFUSE_PUBLIC_KEY\n const secretKey = process.env.LANGFUSE_SECRET_KEY\n if (!publicKey || !secretKey) return undefined\n return {\n baseUrl: (process.env.LANGFUSE_BASE_URL ?? \"https://cloud.langfuse.com\").replace(/\\/+$/, \"\"),\n publicKey,\n secretKey,\n environment: process.env.LANGFUSE_TRACING_ENVIRONMENT,\n }\n}\n\nconst fmt = (n: number) => n.toLocaleString(\"en-US\")\nconst usd = (n: number) => `$${n.toFixed(n < 1 ? 4 : 2)}`\n\n/**\n * Build a usage sink. Pass a `runName` (e.g. the workspace) for the Langfuse\n * trace name. Langfuse export is enabled automatically when its env keys exist.\n */\nexport function createUsageSink(opts: { runName: string }): UsageSink {\n const records: DistillUsage[] = []\n const lf = readLangfuseConfig()\n\n async function shipToLangfuse(cfg: LangfuseConfig, traceId: string): Promise<number> {\n const auth = Buffer.from(`${cfg.publicKey}:${cfg.secretKey}`).toString(\"base64\")\n const now = new Date().toISOString()\n const batch: unknown[] = [\n {\n id: randomUUID(),\n type: \"trace-create\",\n timestamp: now,\n body: {\n id: traceId,\n name: `corpus-distill: ${opts.runName}`,\n timestamp: now,\n ...(cfg.environment ? { environment: cfg.environment } : {}),\n metadata: { tool: \"corpus-cli\", phase: \"distill\", calls: records.length },\n },\n },\n ...records.map(u => {\n const c = costUsd(u)\n return {\n id: randomUUID(),\n type: \"generation-create\",\n timestamp: u.endedAt,\n body: {\n id: randomUUID(),\n traceId,\n type: \"GENERATION\",\n name: u.label,\n model: u.model,\n startTime: u.startedAt,\n endTime: u.endedAt,\n ...(cfg.environment ? { environment: cfg.environment } : {}),\n usage: {\n input: u.inputTokens,\n output: u.outputTokens,\n total: u.inputTokens + u.outputTokens,\n unit: \"TOKENS\",\n inputCost: c.input,\n outputCost: c.output,\n totalCost: c.total,\n },\n },\n }\n }),\n ]\n const res = await fetch(`${cfg.baseUrl}/api/public/ingestion`, {\n method: \"POST\",\n headers: { authorization: `Basic ${auth}`, \"content-type\": \"application/json\" },\n body: JSON.stringify({ batch }),\n })\n if (!res.ok) {\n throw new Error(`${res.status}: ${(await res.text()).slice(0, 160)}`)\n }\n return records.length\n }\n\n return {\n record(u) {\n records.push(u)\n },\n async flush() {\n if (records.length === 0) return\n\n // Per-model rollup for the stderr summary.\n const byModel = new Map<\n string,\n { input: number; output: number; cost: number; calls: number }\n >()\n let grandTotal = 0\n for (const u of records) {\n const c = costUsd(u)\n grandTotal += c.total\n const m = byModel.get(u.model) ?? { input: 0, output: 0, cost: 0, calls: 0 }\n m.input += u.inputTokens\n m.output += u.outputTokens\n m.cost += c.total\n m.calls += 1\n byModel.set(u.model, m)\n }\n\n process.stderr.write(`\\nusage — ${records.length} metered call(s):\\n`)\n for (const [model, m] of byModel) {\n process.stderr.write(\n ` ${model} ${m.calls} call(s) · in ${fmt(m.input)} · out ${fmt(m.output)} · ~${usd(m.cost)} est.\\n`\n )\n }\n process.stderr.write(` total ~${usd(grandTotal)} est.\\n`)\n\n if (!lf) {\n process.stderr.write(\n \" langfuse: not configured (set LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY to export traces).\\n\"\n )\n return\n }\n const traceId = randomUUID()\n try {\n const n = await shipToLangfuse(lf, traceId)\n process.stderr.write(\n ` langfuse: shipped ${n} generation(s) → trace ${traceId}` +\n `${lf.environment ? ` (env: ${lf.environment})` : \"\"}\\n`\n )\n } catch (e) {\n process.stderr.write(\n ` langfuse: export failed — ${e instanceof Error ? e.message : String(e)}\\n`\n )\n }\n },\n }\n}\n","/**\n * `corpus distill [workspace]` — raw sources → refined AIP-10 entries.\n *\n * corpus distill <ws> [--engine id] [--source <id>] [--max n] [--throttle ms] [--model m]\n *\n * Reads sources/**/*.md, distills each via the selected engine into refined\n * entries (principle/pattern/critique/summary/example) written under entries/,\n * each carrying `sources: [<sourceId>]` (provenance) + inherited `access`.\n * Resumable: skips sources that already have entries derived from them.\n *\n * Engines (`--engine`, default `anthropic-api`):\n * anthropic-api metered Messages API (needs ANTHROPIC_API_KEY)\n * claude-code local `claude` CLI, billed against the logged-in subscription\n * (no API key) — cheaper for large batches, subject to rate caps\n */\n\nimport { readFile, readdir } from \"node:fs/promises\"\nimport type { Dirent } from \"node:fs\"\nimport { basename, join } from \"node:path\"\nimport { z } from \"zod\"\n\n/** Lenient zod view of a source's frontmatter (each field degrades to undefined). */\nconst SOURCE_FRONTMATTER = z\n .object({\n id: z.string().optional().catch(undefined),\n title: z.string().optional().catch(undefined),\n tags: z.array(z.string()).optional().catch(undefined),\n language: z.string().optional().catch(undefined),\n metadata: z\n .object({\n corpus: z\n .object({\n access: z.string().optional().catch(undefined),\n domain: z.string().optional().catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\n\n/** An entry's `sources:` provenance — used to mark a source already distilled. */\nconst ENTRY_SOURCES_FRONTMATTER = z\n .object({ sources: z.array(z.string()).optional().catch(undefined) })\n .loose()\nimport matter from \"gray-matter\"\nimport {\n DistillRunner,\n systemClock,\n type DistillSource,\n type DistillPort,\n type EntryLayout,\n} from \"@agentproto/corpus\"\nimport { AnthropicDistiller } from \"../ports/anthropic-distiller.js\"\nimport { CliAgentDistiller } from \"../ports/cli-agent-distiller.js\"\nimport { CLI_ENGINES } from \"../ports/cli-engines.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { createUsageSink, type DistillUsage } from \"../ports/usage-telemetry.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nconst DEFAULT_ENGINE = \"anthropic-api\"\n\n/**\n * Read the corpus's preferred entry layout from KNOWLEDGE.md\n * (`metadata.corpus.entryLayout: flat | dated`). Absent / unreadable → undefined\n * (the runner defaults to \"dated\"). Lives in freeform `metadata`, so no spec change.\n */\nasync function readEntryLayout(target: string): Promise<EntryLayout | undefined> {\n try {\n const raw = await readFile(join(target, \"KNOWLEDGE.md\"), \"utf8\")\n const layout = (matter(raw).data as Record<string, unknown>)?.metadata\n const corpus = (layout as Record<string, unknown> | undefined)?.[\"corpus\"] as\n | Record<string, unknown>\n | undefined\n const v = corpus?.[\"entryLayout\"]\n return v === \"flat\" || v === \"dated\" ? v : undefined\n } catch {\n return undefined\n }\n}\n\n/** A selectable distill engine: whether it needs an API key + how to build it. */\ninterface DistillerEngine {\n readonly id: string\n readonly needsApiKey: boolean\n create(opts: {\n apiKey?: string\n model?: string\n onUsage?: (usage: DistillUsage) => void\n }): DistillPort\n}\n\n/**\n * Engine registry — the metered API plus every CLI engine, dispatched by id (no\n * `engine === \"...\"` branching at the call site). Add a CLI engine in\n * cli-engines.ts and it appears here automatically.\n */\nconst DISTILLER_ENGINES: Readonly<Record<string, DistillerEngine>> = {\n [DEFAULT_ENGINE]: {\n id: DEFAULT_ENGINE,\n needsApiKey: true,\n create: ({ apiKey, model, onUsage }) =>\n new AnthropicDistiller({\n apiKey: apiKey!,\n ...(model ? { model } : {}),\n ...(onUsage ? { onUsage } : {}),\n }),\n },\n ...Object.fromEntries(\n Object.values(CLI_ENGINES).map(engine => [\n engine.id,\n {\n id: engine.id,\n needsApiKey: false,\n create: ({ model }) =>\n new CliAgentDistiller({ engine, ...(model ? { model } : {}) }),\n } satisfies DistillerEngine,\n ])\n ),\n}\n\ninterface ParsedArgs {\n workspace: string | undefined\n sourceId: string | undefined\n max: number | undefined\n throttleMs: number\n model: string | undefined\n engine: string\n}\n\nfunction parse(args: readonly string[]): ParsedArgs {\n const out: ParsedArgs = {\n workspace: undefined,\n sourceId: undefined,\n max: undefined,\n throttleMs: 1000,\n model: undefined,\n engine: DEFAULT_ENGINE,\n }\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--source\": out.sourceId = next(); break\n case \"--max\": { const v = next(); if (v) out.max = Number(v); break }\n case \"--throttle\": { const v = next(); if (v) out.throttleMs = Number(v); break }\n case \"--model\": out.model = next(); break\n case \"--engine\": { const v = next(); if (v) out.engine = v; break }\n default:\n if (!a.startsWith(\"-\") && out.workspace === undefined) out.workspace = a\n }\n }\n return out\n}\n\ninterface RawSource extends DistillSource {\n readonly path: string\n}\n\n/** Parse every sources/**/*.md into a DistillSource. */\nasync function readSources(root: string): Promise<RawSource[]> {\n const dir = join(root, \"sources\")\n let entries: Dirent[]\n try {\n entries = await readdir(dir, { recursive: true, withFileTypes: true })\n } catch {\n return []\n }\n const out: RawSource[] = []\n for (const e of entries) {\n if (!e.isFile() || !e.name.endsWith(\".md\")) continue\n const path = join(e.parentPath, e.name)\n try {\n const parsed = matter(await readFile(path, \"utf-8\"))\n const fm = SOURCE_FRONTMATTER.parse(parsed.data)\n if (!fm.id || !parsed.content.trim()) continue\n out.push({\n path,\n id: fm.id,\n title: fm.title ?? fm.id,\n body: parsed.content.trim(),\n ...(fm.tags ? { tags: fm.tags } : {}),\n ...(fm.metadata?.corpus?.access ? { access: fm.metadata.corpus.access } : {}),\n ...(fm.metadata?.corpus?.domain ? { domain: fm.metadata.corpus.domain } : {}),\n })\n } catch {\n // skip unreadable / non-frontmatter\n }\n }\n return out\n}\n\n/** Source ids that already have at least one entry derived from them. */\nasync function scanDistilledSourceIds(root: string): Promise<Set<string>> {\n const seen = new Set<string>()\n const dir = join(root, \"entries\")\n let entries: Dirent[]\n try {\n entries = await readdir(dir, { recursive: true, withFileTypes: true })\n } catch {\n return seen\n }\n for (const e of entries) {\n if (!e.isFile() || !e.name.endsWith(\".md\")) continue\n try {\n const fm = ENTRY_SOURCES_FRONTMATTER.parse(\n matter(await readFile(join(e.parentPath, e.name), \"utf-8\")).data\n )\n if (fm.sources) for (const s of fm.sources) seen.add(s)\n } catch {\n /* ignore */\n }\n }\n return seen\n}\n\nconst sleep = (ms: number) => new Promise(r => setTimeout(r, ms))\n\nexport async function runDistill(args: readonly string[]): Promise<ExitCode> {\n const parsed = parse(args)\n const target = resolveWorkspacePath(parsed.workspace)\n\n const engine = DISTILLER_ENGINES[parsed.engine]\n if (!engine) {\n return fail(\n `unknown --engine \"${parsed.engine}\". Valid: ${Object.keys(DISTILLER_ENGINES).join(\", \")}.`,\n 2\n )\n }\n const apiKey = process.env.ANTHROPIC_API_KEY\n if (engine.needsApiKey && !apiKey) {\n return fail(`distill engine \"${engine.id}\" needs ANTHROPIC_API_KEY in the environment.`, 2)\n }\n\n const all = await readSources(target)\n if (all.length === 0) return fail(\"no sources found under sources/ — run import-web first.\", 2)\n\n const done = await scanDistilledSourceIds(target)\n const pool = parsed.sourceId\n ? all.filter(s => s.id === parsed.sourceId)\n : all.filter(s => !done.has(s.id))\n const batch = parsed.max !== undefined ? pool.slice(0, parsed.max) : pool\n\n process.stdout.write(\n `distill → ${target}\\n` +\n ` engine: ${engine.id}\\n` +\n ` sources: ${all.length} total · ${all.length - pool.length} already distilled · ${pool.length} to do\\n` +\n ` this run: ${batch.length}${parsed.max !== undefined ? ` (--max ${parsed.max})` : \"\"}\\n`\n )\n if (batch.length === 0) {\n process.stdout.write(\" nothing to do.\\n\")\n return 0\n }\n\n const usage = createUsageSink({ runName: basename(target) })\n const layout = await readEntryLayout(target)\n const runner = new DistillRunner({\n fs: new NodeFsAdapter({ root: target }),\n clock: systemClock,\n ...(layout ? { layout } : {}),\n distiller: engine.create({\n ...(apiKey ? { apiKey } : {}),\n ...(parsed.model ? { model: parsed.model } : {}),\n onUsage: usage.record,\n }),\n })\n\n let totalEntries = 0\n for (let i = 0; i < batch.length; i++) {\n const src = batch[i]!\n if (i > 0 && parsed.throttleMs > 0) await sleep(parsed.throttleMs)\n try {\n const report = await runner.run(src)\n totalEntries += report.entryPaths.length\n process.stdout.write(` ✓ ${src.id} → ${report.entryPaths.length} entries\\n`)\n } catch (e) {\n process.stdout.write(` ! ${src.id} — ${e instanceof Error ? e.message : String(e)}\\n`)\n }\n }\n process.stdout.write(`\\n${totalEntries} refined entries written (each with sources:[<id>] provenance).\\n`)\n await usage.flush()\n return 0\n}\n","/**\n * `corpus knowledge [workspace] --tags a,b [--kind k] [--access scope] [--max n]`\n *\n * Previews what a skill's `knowledge:` binding resolves to — the refined\n * entries (with provenance) an operator would pull. Filesystem-first: scans\n * entries/ on disk, no graph engine.\n */\n\nimport {\n resolveKnowledge,\n isRefinedKind,\n type CorpusEntryQuery,\n type RefinedKind,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runKnowledge(args: readonly string[]): Promise<ExitCode> {\n let workspace: string | undefined\n const tags: string[] = []\n const kinds: RefinedKind[] = []\n let access: string | undefined\n let max: number | undefined\n\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--tags\": { const v = next(); if (v) tags.push(...v.split(\",\").map(s => s.trim()).filter(Boolean)); break }\n case \"--kind\": { const v = next(); if (v && isRefinedKind(v)) kinds.push(v); break }\n case \"--access\": access = next(); break\n case \"--max\": { const v = next(); if (v) max = Number(v); break }\n default: if (!a.startsWith(\"-\") && workspace === undefined) workspace = a\n }\n }\n\n const target = resolveWorkspacePath(workspace)\n if (tags.length === 0 && kinds.length === 0) {\n return fail(\"knowledge needs --tags a,b and/or --kind <k>.\", 2)\n }\n\n const query: CorpusEntryQuery = {\n ...(tags.length ? { tags } : {}),\n ...(kinds.length ? { kinds } : {}),\n ...(max !== undefined ? { maxResults: max } : {}),\n }\n const hits = await resolveKnowledge({\n fs: new NodeFsAdapter({ root: target }),\n query,\n ...(access ? { allowedAccess: new Set([access, \"public\"]) } : {}),\n })\n\n process.stdout.write(\n `knowledge ${tags.length ? `tags=[${tags.join(\",\")}] ` : \"\"}${kinds.length ? `kinds=[${kinds.join(\",\")}] ` : \"\"}→ ${hits.length} refined entries\\n\\n`\n )\n for (const h of hits) {\n process.stdout.write(\n ` • [${h.kind}] ${h.title} (conf ${h.confidence})\\n` +\n ` ↳ derivedFrom: ${h.sources.join(\", \") || \"—\"}${h.access ? ` · access: ${h.access}` : \"\"}\\n` +\n ` ${h.body.slice(0, 120).replace(/\\s+/g, \" \")}…\\n\\n`\n )\n }\n return 0\n}\n","/**\n * Minimal streamable-HTTP MCP client (host-agnostic). Used by config-driven\n * sinks/sources to call ANY MCP server's tools — the corpus never names a\n * specific host; the endpoint + tool come from a manifest.\n *\n * Handles both JSON and SSE (`text/event-stream`) responses, optional\n * `Mcp-Session-Id`, and the initialize handshake.\n */\n\nimport { z } from \"zod\"\n\n/** JSON-RPC envelope (result/error opaque). */\nconst RPC_RESPONSE = z\n .object({ result: z.unknown().optional(), error: z.unknown().optional() })\n .loose()\n\n/** A JSON-RPC message with an id (SSE-delivered responses). */\nconst RPC_MESSAGE = z\n .object({\n id: z.number().optional(),\n result: z.unknown().optional(),\n error: z.unknown().optional(),\n })\n .loose()\n\n/** An MCP `tools/call` result (content blocks left opaque). */\nconst CALL_RESULT = z\n .object({\n content: z.unknown().optional(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n })\n .loose()\n\nexport interface McpClientLike {\n callTool(name: string, args: Record<string, unknown>): Promise<{\n content?: unknown\n structuredContent?: unknown\n isError?: boolean\n }>\n}\n\nexport interface ConnectMcpHttpOptions {\n readonly endpoint: string\n readonly headers?: Record<string, string>\n readonly protocolVersion?: string\n /** \"streamable-http\" (POST, default) or \"sse\" (legacy GET stream + POST messages). */\n readonly transport?: \"streamable-http\" | \"sse\"\n}\n\nexport async function connectMcpHttp(\n opts: ConnectMcpHttpOptions\n): Promise<McpClientLike> {\n if (opts.transport === \"sse\") {\n const sse = new SseMcpClient(opts)\n await sse.connect()\n return sse\n }\n const client = new StreamableHttpMcpClient(opts)\n await client.initialize()\n return client\n}\n\nclass StreamableHttpMcpClient implements McpClientLike {\n private id = 0\n private sessionId: string | undefined\n private readonly endpoint: string\n private readonly headers: Record<string, string>\n private readonly protocolVersion: string\n\n constructor(opts: ConnectMcpHttpOptions) {\n this.endpoint = opts.endpoint\n this.headers = opts.headers ?? {}\n this.protocolVersion = opts.protocolVersion ?? \"2025-06-18\"\n }\n\n async initialize(): Promise<void> {\n const res = await this.rpc({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"initialize\",\n params: {\n protocolVersion: this.protocolVersion,\n capabilities: {},\n clientInfo: { name: \"corpus-cli\", version: \"0.1.0\" },\n },\n })\n await this.rpc({ jsonrpc: \"2.0\", method: \"notifications/initialized\", params: {} }, false)\n if (res?.error) throw new Error(`initialize failed: ${JSON.stringify(res.error)}`)\n }\n\n async callTool(name: string, args: Record<string, unknown>) {\n const res = await this.rpc({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"tools/call\",\n params: { name, arguments: args },\n })\n if (res?.error) throw new Error(`tools/call ${name}: ${JSON.stringify(res.error)}`)\n const parsed = CALL_RESULT.safeParse(res?.result ?? {})\n return parsed.success ? parsed.data : {}\n }\n\n private async rpc(\n body: Record<string, unknown>,\n expectResponse = true\n ): Promise<{ result?: unknown; error?: unknown } | null> {\n const res = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n ...(this.sessionId ? { \"mcp-session-id\": this.sessionId } : {}),\n ...this.headers,\n },\n body: JSON.stringify(body),\n })\n const sid = res.headers.get(\"mcp-session-id\")\n if (sid) this.sessionId = sid\n if (!expectResponse) return null\n if (!res.ok) throw new Error(`MCP HTTP ${res.status} ${res.statusText}`)\n return parseRpc(await res.text(), res.headers.get(\"content-type\"))\n }\n}\n\n/**\n * Legacy HTTP+SSE MCP transport: GET the stream → first `endpoint` event gives\n * the POST URL → POST JSON-RPC requests there; responses arrive back on the\n * stream (correlated by id). Used for servers like Guilde's `/guilde/mcp/sse`.\n */\nclass SseMcpClient implements McpClientLike {\n private id = 0\n private messagesUrl: string | undefined\n private readonly pending = new Map<number, (msg: { result?: unknown; error?: unknown }) => void>()\n private readyResolve!: () => void\n private readonly ready = new Promise<void>(r => (this.readyResolve = r))\n private readonly base: URL\n\n constructor(private readonly opts: ConnectMcpHttpOptions) {\n this.base = new URL(opts.endpoint)\n }\n\n async connect(): Promise<void> {\n const res = await fetch(this.opts.endpoint, {\n headers: { accept: \"text/event-stream\", ...(this.opts.headers ?? {}) },\n })\n if (!res.ok || !res.body) throw new Error(`SSE connect ${res.status} ${res.statusText}`)\n void this.readLoop(res.body.getReader())\n // Wait for the endpoint event (POST url), then initialize.\n await withTimeout(this.ready, 10_000, \"SSE endpoint event\")\n const init = await this.send(\"initialize\", {\n protocolVersion: this.opts.protocolVersion ?? \"2025-06-18\",\n capabilities: {},\n clientInfo: { name: \"corpus-cli\", version: \"0.1.0\" },\n })\n if (init?.error) throw new Error(`initialize failed: ${JSON.stringify(init.error)}`)\n await this.post({ jsonrpc: \"2.0\", method: \"notifications/initialized\", params: {} })\n }\n\n async callTool(name: string, args: Record<string, unknown>) {\n const res = await this.send(\"tools/call\", { name, arguments: args })\n if (res?.error) throw new Error(`tools/call ${name}: ${JSON.stringify(res.error)}`)\n const parsed = CALL_RESULT.safeParse(res?.result ?? {})\n return parsed.success ? parsed.data : {}\n }\n\n private async send(method: string, params: unknown) {\n const id = ++this.id\n const wait = new Promise<{ result?: unknown; error?: unknown }>(resolve => this.pending.set(id, resolve))\n await this.post({ jsonrpc: \"2.0\", id, method, params })\n return withTimeout(wait, 60_000, `${method} response`)\n }\n\n private async post(body: Record<string, unknown>): Promise<void> {\n if (!this.messagesUrl) throw new Error(\"SSE messages endpoint not ready\")\n const res = await fetch(this.messagesUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...(this.opts.headers ?? {}) },\n body: JSON.stringify(body),\n })\n if (!res.ok && res.status !== 202) throw new Error(`SSE POST ${res.status}`)\n }\n\n private async readLoop(reader: ReadableStreamDefaultReader<Uint8Array>): Promise<void> {\n const dec = new TextDecoder()\n let buf = \"\"\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buf += dec.decode(value, { stream: true })\n let nl: number\n while ((nl = buf.indexOf(\"\\n\\n\")) >= 0) {\n const raw = buf.slice(0, nl)\n buf = buf.slice(nl + 2)\n this.handleEvent(raw)\n }\n }\n }\n\n private handleEvent(raw: string): void {\n let event = \"message\"\n const data: string[] = []\n for (const line of raw.split(\"\\n\")) {\n if (line.startsWith(\"event:\")) event = line.slice(6).trim()\n else if (line.startsWith(\"data:\")) data.push(line.slice(5).trim())\n }\n const payload = data.join(\"\\n\")\n if (event === \"endpoint\") {\n this.messagesUrl = new URL(payload, this.base).toString()\n this.readyResolve()\n return\n }\n if (!payload) return\n try {\n const parsed = RPC_MESSAGE.safeParse(JSON.parse(payload))\n if (!parsed.success) return\n const msg = parsed.data\n if (typeof msg.id === \"number\" && this.pending.has(msg.id)) {\n this.pending.get(msg.id)!(msg)\n this.pending.delete(msg.id)\n }\n } catch {\n /* skip non-JSON */\n }\n }\n}\n\nfunction withTimeout<T>(p: Promise<T>, ms: number, what: string): Promise<T> {\n return Promise.race([\n p,\n new Promise<T>((_, rej) => setTimeout(() => rej(new Error(`timeout waiting for ${what}`)), ms)),\n ])\n}\n\nfunction parseRpc(\n text: string,\n contentType: string | null\n): { result?: unknown; error?: unknown } | null {\n if (!text.trim()) return null\n if (!(contentType ?? \"\").includes(\"text/event-stream\")) {\n const parsed = RPC_RESPONSE.safeParse(JSON.parse(text))\n return parsed.success ? parsed.data : null\n }\n let last: { result?: unknown; error?: unknown } | null = null\n for (const line of text.split(\"\\n\")) {\n const t = line.trim()\n if (!t.startsWith(\"data:\")) continue\n const p = t.slice(5).trim()\n if (!p || p === \"[DONE]\") continue\n try {\n last = JSON.parse(p)\n } catch {\n /* skip non-JSON frames */\n }\n }\n return last\n}\n","/**\n * McpSink — a config-driven SinkPort that pushes each refined entry by calling\n * a configured MCP tool. Host-agnostic: the endpoint, tool name, and the\n * entry→args mapping all come from a sink manifest, so the corpus links to ANY\n * host (a Guilde guild KB, a Notion db, a vector store) without naming it.\n *\n * The manifest's `args` is a template: string values containing `${slug}`,\n * `${title}`, `${body}`, `${sources}`, `${tags}`, `${access}`, `${uri}`,\n * `${kind}`, `${confidence}` are substituted per entry. A value that is exactly\n * one placeholder (e.g. `\"${sources}\"`) is replaced with the typed value (array\n * / number), not a string.\n */\n\nimport { z } from \"zod\"\nimport type { SinkPort, SinkItem, SinkPushResult } from \"@agentproto/corpus\"\nimport { connectMcpHttp, type McpClientLike } from \"./mcp-http-client.js\"\n\n/** Validates a sink manifest (the `--config` JSON) — single source for the type. */\nexport const SINK_CONFIG_SCHEMA = z.object({\n endpoint: z.string().min(1),\n tool: z.string().min(1),\n /** Arg template — substituted per entry. */\n args: z.record(z.string(), z.unknown()),\n headers: z.record(z.string(), z.string()).optional(),\n /** MCP transport: \"streamable-http\" (default) or \"sse\". */\n transport: z.enum([\"streamable-http\", \"sse\"]).optional(),\n /**\n * If set, calls go through `mcp_imported_call({ alias, toolName, args })`\n * (the agentproto daemon's imported-MCP proxy) instead of the tool directly.\n */\n importedAlias: z.string().optional(),\n})\n\nexport type McpSinkConfig = z.infer<typeof SINK_CONFIG_SCHEMA>\n\nexport class McpSink implements SinkPort {\n private client: McpClientLike | undefined\n constructor(\n private readonly config: McpSinkConfig,\n client?: McpClientLike // injectable for tests\n ) {\n this.client = client\n }\n\n private async ensure(): Promise<McpClientLike> {\n if (!this.client) {\n this.client = await connectMcpHttp({\n endpoint: this.config.endpoint,\n ...(this.config.headers ? { headers: this.config.headers } : {}),\n ...(this.config.transport ? { transport: this.config.transport } : {}),\n })\n }\n return this.client\n }\n\n async push(item: SinkItem): Promise<SinkPushResult> {\n let client: McpClientLike\n try {\n client = await this.ensure()\n } catch (e) {\n return { uri: item.uri, ok: false, error: `connect: ${msg(e)}` }\n }\n const args = template(this.config.args, item)\n const call = this.config.importedAlias\n ? { name: \"mcp_imported_call\", args: { alias: this.config.importedAlias, toolName: this.config.tool, args } }\n : { name: this.config.tool, args }\n try {\n const res = await client.callTool(call.name, call.args)\n if (res.isError) return { uri: item.uri, ok: false, error: \"tool returned isError\" }\n return { uri: item.uri, ok: true }\n } catch (e) {\n return { uri: item.uri, ok: false, error: msg(e) }\n }\n }\n}\n\n// ── templating ──────────────────────────────────────────────────────\n\nconst PLACEHOLDER_RE = /\\$\\{(\\w+)\\}/g\n\nfunction template(args: Record<string, unknown>, item: SinkItem): Record<string, unknown> {\n const fields: Record<string, unknown> = {\n slug: item.slug,\n title: item.title,\n body: item.body,\n sources: item.sources,\n tags: item.tags,\n access: item.access ?? \"\",\n uri: item.uri,\n kind: item.kind,\n confidence: item.confidence,\n }\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(args)) {\n out[key] = substitute(value, fields)\n }\n return out\n}\n\nfunction substitute(value: unknown, fields: Record<string, unknown>): unknown {\n if (typeof value === \"string\") {\n // Whole-value placeholder → typed substitution.\n const whole = value.match(/^\\$\\{(\\w+)\\}$/)\n if (whole && whole[1]! in fields) return fields[whole[1]!]\n // Otherwise string interpolation.\n return value.replace(PLACEHOLDER_RE, (_, k) =>\n k in fields ? stringify(fields[k]) : `\\${${k}}`\n )\n }\n if (Array.isArray(value)) return value.map(v => substitute(v, fields))\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) out[k] = substitute(v, fields)\n return out\n }\n return value\n}\n\nfunction stringify(v: unknown): string {\n if (Array.isArray(v)) return v.join(\", \")\n return v == null ? \"\" : String(v)\n}\n\nfunction msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e)\n}\n","/**\n * `corpus sync [workspace] --config <sink.json> [--tags a,b --kind k --throttle ms]`\n *\n * Pushes refined entries to an external store via a config-driven MCP sink.\n * Host-agnostic: the sink manifest names the endpoint + tool + entry→args\n * mapping (a Guilde guild KB, a vector store, …) — the CLI knows none of it.\n *\n * Sink manifest (JSON):\n * { \"endpoint\": \"https://…/mcp\", \"tool\": \"ingest_knowledge\",\n * \"headers\": { \"authorization\": \"Bearer …\" },\n * \"args\": { \"guildId\": \"…\", \"knowledgeBaseId\": \"…\", \"kind\": \"text\",\n * \"title\": \"${title}\", \"content\": \"${body}\", \"uri\": \"${uri}\",\n * \"metadata\": { \"sources\": \"${sources}\", \"access\": \"${access}\" } } }\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport {\n SyncRunner,\n isRefinedKind,\n type CorpusEntryQuery,\n type RefinedKind,\n} from \"@agentproto/corpus\"\nimport { McpSink, SINK_CONFIG_SCHEMA } from \"../ports/mcp-sink.adapter.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runSync(args: readonly string[]): Promise<ExitCode> {\n let workspace: string | undefined\n let configPath: string | undefined\n const tags: string[] = []\n const kinds: RefinedKind[] = []\n let throttleMs = 500\n\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--config\": configPath = next(); break\n case \"--tags\": { const v = next(); if (v) tags.push(...v.split(\",\").map(s => s.trim()).filter(Boolean)); break }\n case \"--kind\": { const v = next(); if (v && isRefinedKind(v)) kinds.push(v); break }\n case \"--throttle\": { const v = next(); if (v) throttleMs = Number(v); break }\n default: if (!a.startsWith(\"-\") && workspace === undefined) workspace = a\n }\n }\n\n const target = resolveWorkspacePath(workspace)\n if (!configPath) return fail(\"sync needs --config <sink-manifest.json>.\", 2)\n\n let raw: unknown\n try {\n raw = JSON.parse(await readFile(configPath, \"utf-8\"))\n } catch (e) {\n return fail(`could not read sink config: ${e instanceof Error ? e.message : String(e)}`, 2)\n }\n const parsedConfig = SINK_CONFIG_SCHEMA.safeParse(raw)\n if (!parsedConfig.success) {\n return fail(\n `invalid sink config (needs endpoint, tool, args): ${parsedConfig.error.issues[0]?.message ?? \"schema mismatch\"}`,\n 2\n )\n }\n const config = parsedConfig.data\n\n const select: CorpusEntryQuery = {\n ...(tags.length ? { tags } : {}),\n ...(kinds.length ? { kinds } : {}),\n }\n const report = await new SyncRunner({\n fs: new NodeFsAdapter({ root: target }),\n sink: new McpSink(config),\n select,\n throttleMs,\n }).run()\n\n process.stdout.write(\n `sync → ${config.endpoint} (tool: ${config.tool})\\n` +\n ` pushed: ${report.pushed} · skipped: ${report.skipped} · failed: ${report.failed}\\n`\n )\n for (const r of report.results.filter(r => !r.ok).slice(0, 10)) {\n process.stdout.write(` ! ${r.uri} — ${r.error}\\n`)\n }\n return report.failed > 0 && report.pushed === 0 ? 1 : 0\n}\n","/**\n * CLI version — derived from the package's own package.json at runtime,\n * so it never drifts from the published version on a release bump.\n *\n * `import.meta.url` resolves to dist/cli.mjs in the published bundle and\n * to src/version.ts under tsx/vitest; in both, package.json sits one\n * directory up. A defensive fallback keeps --version from ever throwing.\n */\nimport { readFileSync } from \"node:fs\"\nimport { dirname, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nfunction readVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url))\n const pkg = JSON.parse(\n readFileSync(resolve(here, \"../package.json\"), \"utf8\")\n ) as { version?: string }\n return pkg.version ?? \"0.0.0\"\n } catch {\n return \"0.0.0\"\n }\n}\n\nexport const VERSION: string = readVersion()\n","#!/usr/bin/env node\n/**\n * `corpus` binary entry. Dispatches to subcommands.\n *\n * No commander/yargs to keep dep footprint tight — node:util.parseArgs\n * handles ~90% of what we need, the rest is a 50-line dispatcher.\n *\n * Usage:\n * corpus init <name> [path] [--with a,b] [--preset <slug>]\n * corpus validate [path]\n * corpus lint [path]\n * corpus events:emit <kind> --payload <json> [path]\n * corpus events:tail [path]\n * corpus --help\n * corpus --version\n */\n\nimport { runInit } from \"./commands/init.js\"\nimport { runValidate } from \"./commands/validate.js\"\nimport { runLint } from \"./commands/lint.js\"\nimport { runEventsEmit, runEventsTail } from \"./commands/events.js\"\nimport { runImportWeb } from \"./commands/import-web.js\"\nimport { runDistill } from \"./commands/distill.js\"\nimport { runKnowledge } from \"./commands/knowledge.js\"\nimport { runSync } from \"./commands/sync.js\"\nimport { VERSION } from \"./version.js\"\n\nexport type ExitCode = 0 | 1 | 2\n\nconst HELP = `corpus — AIP-10 corpus workspace operator (v${VERSION})\n\nCommands:\n init <name> [path] [--with a,b] [--preset <slug>]\n Scaffold a corpus — bare AIP-10 by default\n (--preset seeds a full vertical; --list shows them)\n validate [path] JSON Schema check across every AIP file\n lint [path] Run lints declared in KNOWLEDGE.md\n events:emit <kind> --payload <json> [path]\n Append an event to _log.md\n events:tail [path] Print _log.md\n import-web [path] --urls-file <f> [--max n --max-duration s --throttle ms --tags t --lang l --force --diarize]\n Import URLs as sources (video→Whisper, article→\n readability). Resumable: skips already-ingested\n URLs, so re-run with --max N to batch through.\n --max-duration: skip videos longer than s seconds\n (no download); omit for no cap (long media is\n segmented under Whisper's 25 MB limit).\n --cookies-from-browser <b>: auth yt-dlp from a\n local browser (chrome/firefox) to dodge YouTube's\n bot-check; --cookies <file> for a cookies.txt.\n --scrape-mcp <url>: delegate article fetching to a\n scrape MCP server (stealth + clean Markdown) for\n walled/JS pages, ahead of plain readability.\n --diarize: AssemblyAI speaker labels (interviews).\n distill [path] [--source id --max n --throttle ms --model m]\n Distill raw sources → refined entries\n (principle/pattern/…) with sources:[id] provenance.\n Resumable: skips already-distilled sources.\n knowledge [path] --tags a,b [--kind k --access scope --max n]\n Preview what a skill's knowledge: binding resolves to\n — refined entries + their provenance (filesystem).\n sync [path] --config <sink.json> [--tags a,b --kind k --throttle ms]\n Push refined entries to an external store via a\n config-driven MCP sink (host-agnostic).\n -h, --help Show this help\n -v, --version Show version\n\nConventions:\n [path] defaults to the current working directory.\n All commands target the workspace whose root contains KNOWLEDGE.md\n (except 'init' which creates one).\n`\n\nasync function main(argv: readonly string[]): Promise<ExitCode> {\n const [cmd, ...rest] = argv\n\n if (!cmd || cmd === \"-h\" || cmd === \"--help\") {\n process.stdout.write(HELP)\n return 0\n }\n if (cmd === \"-v\" || cmd === \"--version\") {\n process.stdout.write(`corpus v${VERSION}\\n`)\n return 0\n }\n\n switch (cmd) {\n case \"init\":\n return await runInit(rest)\n case \"validate\":\n return await runValidate(rest)\n case \"lint\":\n return await runLint(rest)\n case \"events:emit\":\n return await runEventsEmit(rest)\n case \"events:tail\":\n return await runEventsTail(rest)\n case \"import-web\":\n return await runImportWeb(rest)\n case \"distill\":\n return await runDistill(rest)\n case \"knowledge\":\n return await runKnowledge(rest)\n case \"sync\":\n return await runSync(rest)\n default:\n process.stderr.write(`corpus: unknown command \"${cmd}\". Try --help.\\n`)\n return 2\n }\n}\n\nconst argv = process.argv.slice(2)\nmain(argv)\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(\n `corpus: unhandled error — ${err instanceof Error ? err.message : String(err)}\\n`\n )\n process.exit(1)\n })\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/registry/preset-manifest.ts","../src/registry/preset-loader.ts","../src/ports/local-fs.adapter.ts","../src/scaffold/bare.ts","../src/commands/_shared.ts","../src/commands/init.ts","../src/commands/validate.ts","../src/commands/lint.ts","../src/ports/os-identity.adapter.ts","../src/commands/events.ts","../src/ports/video-hosts.ts","../src/ports/browser-fetcher.adapter.ts","../src/ports/scrape-mcp-fetcher.adapter.ts","../src/ports/ytdlp-whisper-fetcher.adapter.ts","../src/ports/stt.port.ts","../src/ports/assemblyai-stt.adapter.ts","../src/ports/chunked-stt.adapter.ts","../src/ports/http-readability-fetcher.adapter.ts","../src/ports/composite-fetcher.ts","../src/ports/throttle-fetcher.adapter.ts","../src/ports/browser-mcp-connect.ts","../src/commands/import-web.ts","../src/ports/anthropic-distiller.ts","../src/ports/cli-agent-distiller.ts","../src/ports/cli-engines.ts","../src/ports/usage-telemetry.ts","../src/commands/distill.ts","../src/commands/knowledge.ts","../src/ports/mcp-http-client.ts","../src/ports/mcp-sink.adapter.ts","../src/commands/sync.ts","../src/version.ts","../src/cli.ts"],"names":["path","readFile","__filename","__dirname","msg","count","CorpusWorkspaceReader","systemClock","z","MCP_TEXT_BLOCK","join","rm","readdir","resolve","execFileAsync","promisify","execFile","stat","mkdtemp","tmpdir","matter","parse","basename","RPC_RESPONSE","CALL_RESULT","StreamableHttpMcpClient","isRefinedKind","r","dirname","fileURLToPath","readFileSync","argv"],"mappings":"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","file":"cli.mjs","sourcesContent":["/**\n * Corpus preset manifest — `agentproto/corpus-preset/v1`.\n *\n * Preset packages declare what they provide in either:\n * - their `package.json` under the `agentproto-corpus-preset` key, OR\n * - a standalone `agentproto-corpus-preset.json` next to package.json.\n *\n * Example (in @agentproto/corpus-presets's package.json):\n *\n * {\n * \"name\": \"@agentproto/corpus-presets\",\n * \"agentproto-corpus-preset\": {\n * \"schema\": \"agentproto/corpus-preset/v1\",\n * \"presets\": [\n * {\n * \"slug\": \"marketing\",\n * \"entry\": \"./dist/marketing/index.mjs\",\n * \"export\": \"MarketingCorpusPreset\",\n * \"description\": \"Marketing knowledge corpus — principles, patterns, critiques.\"\n * }\n * ]\n * }\n * }\n *\n * The corpus CLI walks every package listed in\n * `~/.agentproto/config.json` under `corpusPresetPackages[]` (default:\n * `[\"@agentproto/corpus-presets\"]`), collects every preset they\n * declare, and resolves `corpus init <slug>` against the merged set.\n */\n\nimport { z } from \"zod\"\n\nexport const CORPUS_PRESET_MANIFEST_SCHEMA = \"agentproto/corpus-preset/v1\" as const\n\nconst PresetEntrySchema = z\n .object({\n /** The slug `corpus init <slug>` matches. */\n slug: z.string().regex(/^[a-z][a-z0-9-]*$/),\n /** Path to the entry module, relative to the preset package root. */\n entry: z.string().min(1),\n /** Named export inside `entry` — the CorpusPreset constant. */\n export: z.string().min(1),\n /** Free-form description; shown when listing available slugs. */\n description: z.string().optional(),\n })\n .loose()\n\nexport const CorpusPresetManifestSchema = z\n .object({\n schema: z.literal(CORPUS_PRESET_MANIFEST_SCHEMA),\n presets: z.array(PresetEntrySchema).default([]),\n })\n .loose()\n\nexport type CorpusPresetManifest = z.infer<typeof CorpusPresetManifestSchema>\nexport type CorpusPresetEntry = z.infer<typeof PresetEntrySchema>\n","/**\n * Preset discovery — walk every configured preset package, read its\n * manifest, build a flat slug → preset-entry map.\n *\n * Configured packages come from `~/.agentproto/config.json`:\n *\n * { \"corpusPresetPackages\": [\"@agentproto/corpus-presets\",\n * \"@vendor/corpus-presets\"] }\n *\n * Default when the config is missing or empty: just\n * `@agentproto/corpus-presets`.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { homedir } from \"node:os\"\nimport { createRequire } from \"node:module\"\nimport { dirname, join } from \"node:path\"\nimport { pathToFileURL } from \"node:url\"\nimport type { CorpusPreset } from \"@agentproto/corpus\"\nimport {\n CorpusPresetManifestSchema,\n type CorpusPresetEntry,\n type CorpusPresetManifest,\n} from \"./preset-manifest.js\"\n\nconst DEFAULT_PRESET_PACKAGES = [\"@agentproto/corpus-presets\"] as const\n\nexport interface ResolvedPresetEntry extends CorpusPresetEntry {\n /** npm package the entry was discovered in. */\n readonly packageName: string\n /** Absolute path to the package root (where the manifest was read from). */\n readonly packageRoot: string\n}\n\n/**\n * Discover every preset declared across the configured preset\n * packages. Returns a flat map slug → entry. If two packages declare\n * the same slug, last-write-wins (later packages in the config override).\n */\nexport async function discoverPresets(): Promise<\n Map<string, ResolvedPresetEntry>\n> {\n const packages = await readConfiguredPresetPackages()\n const out = new Map<string, ResolvedPresetEntry>()\n for (const pkg of packages) {\n const result = await readPresetManifest(pkg)\n if (!result) continue\n const { manifest, packageRoot } = result\n for (const entry of manifest.presets) {\n out.set(entry.slug, {\n ...entry,\n packageName: pkg,\n packageRoot,\n })\n }\n }\n return out\n}\n\n/**\n * Load a single preset by slug. Returns null if no configured package\n * declares it. Throws if the entry exists but its module/export\n * doesn't load.\n */\nexport async function loadPreset(\n slug: string\n): Promise<CorpusPreset | null> {\n const presets = await discoverPresets()\n const entry = presets.get(slug)\n if (!entry) return null\n\n const abs = entry.entry.startsWith(\".\")\n ? join(entry.packageRoot, entry.entry)\n : entry.entry\n const url = entry.entry.startsWith(\".\") ? pathToFileURL(abs).href : entry.entry\n const mod = (await import(url)) as Record<string, unknown>\n const exported = mod[entry.export]\n if (!exported || typeof exported !== \"object\") {\n throw new Error(\n `corpus-presets: '${entry.packageName}' entry '${entry.entry}' has no object export '${entry.export}' (got ${typeof exported}).`\n )\n }\n return exported as CorpusPreset\n}\n\n/**\n * Resolve `<pkg>/package.json` from both the CLI's own location AND\n * the user's cwd, so locally-installed preset packages work.\n */\nasync function readPresetManifest(\n packageName: string\n): Promise<{ manifest: CorpusPresetManifest; packageRoot: string } | null> {\n const packageJsonPath = resolvePackageJson(packageName)\n if (!packageJsonPath) return null\n const packageRoot = dirname(packageJsonPath)\n\n // 1. Standalone agentproto-corpus-preset.json wins if present.\n const standalonePath = join(packageRoot, \"agentproto-corpus-preset.json\")\n const standalone = await readJsonIfExists(standalonePath)\n if (standalone !== undefined) {\n return {\n manifest: CorpusPresetManifestSchema.parse(standalone),\n packageRoot,\n }\n }\n\n // 2. Fall back to package.json#agentproto-corpus-preset.\n const pkgJson = (await readJsonIfExists(packageJsonPath)) as\n | { \"agentproto-corpus-preset\"?: unknown }\n | undefined\n const block = pkgJson?.[\"agentproto-corpus-preset\"]\n if (block && typeof block === \"object\") {\n return {\n manifest: CorpusPresetManifestSchema.parse(block),\n packageRoot,\n }\n }\n\n return null\n}\n\nfunction resolvePackageJson(packageName: string): string | null {\n const candidates = [\n import.meta.url,\n pathToFileURL(join(process.cwd(), \"package.json\")).href,\n ]\n for (const root of candidates) {\n try {\n return createRequire(root).resolve(`${packageName}/package.json`)\n } catch {\n // try next root\n }\n }\n return null\n}\n\nasync function readJsonIfExists(path: string): Promise<unknown> {\n try {\n const raw = await readFile(path, \"utf8\")\n return JSON.parse(raw)\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return undefined\n throw err\n }\n}\n\ninterface AgentprotoConfig {\n corpusPresetPackages?: readonly string[]\n}\n\nasync function readConfiguredPresetPackages(): Promise<readonly string[]> {\n const base = process.env[\"AGENTPROTO_HOME\"] ?? join(homedir(), \".agentproto\")\n const path = join(base, \"config.json\")\n try {\n const raw = await readFile(path, \"utf8\")\n const parsed = JSON.parse(raw) as AgentprotoConfig\n const list = parsed.corpusPresetPackages\n if (Array.isArray(list) && list.length > 0) return list\n } catch {\n // ENOENT or parse error — fall through to default\n }\n return DEFAULT_PRESET_PACKAGES\n}\n","/**\n * NodeFsAdapter — `FsPort` implementation backed by node:fs.\n *\n * Atomic writes via temp + rename (the same posix pattern every\n * mature tool uses). Recursive `walk` skips hidden segments\n * (anything beginning with `.`). Advisory locks via lockfiles in\n * `.corpus-locks/` next to the target — single-process safe; for\n * multi-process the lockfile owner pid is recorded so callers can\n * see who holds the lock.\n */\n\nimport { randomBytes } from \"node:crypto\"\nimport {\n appendFile,\n mkdir,\n readFile,\n readdir,\n rename,\n rm,\n stat,\n writeFile,\n} from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { existsSync } from \"node:fs\"\nimport type {\n FsPort,\n FsLockHandle,\n FsStat,\n} from \"@agentproto/corpus\"\n\nexport interface NodeFsAdapterOptions {\n /**\n * Absolute path to the workspace root. All FsPort paths are\n * resolved relative to this — the kit never sees host filesystem\n * paths.\n */\n readonly root: string\n}\n\nexport class NodeFsAdapter implements FsPort {\n private readonly root: string\n\n constructor(opts: NodeFsAdapterOptions) {\n this.root = opts.root\n }\n\n async exists(p: string): Promise<boolean> {\n try {\n await stat(this.resolve(p))\n return true\n } catch {\n return false\n }\n }\n\n async readFile(p: string): Promise<string> {\n return await readFile(this.resolve(p), \"utf8\")\n }\n\n /**\n * Atomic write: write to `${target}.tmp-{nonce}`, fsync, rename.\n * Rename is atomic on the same filesystem. Creates parent dirs as\n * needed (most callers expect mkdir -p semantics).\n */\n async writeFile(p: string, content: string): Promise<void> {\n const target = this.resolve(p)\n await mkdir(path.dirname(target), { recursive: true })\n const tmp = `${target}.tmp-${randomBytes(8).toString(\"hex\")}`\n await writeFile(tmp, content, \"utf8\")\n await rename(tmp, target)\n }\n\n async appendFile(p: string, content: string): Promise<void> {\n const target = this.resolve(p)\n await mkdir(path.dirname(target), { recursive: true })\n await appendFile(target, content, \"utf8\")\n }\n\n async readdir(p: string): Promise<readonly string[]> {\n const target = this.resolve(p)\n const entries = await readdir(target)\n return entries\n }\n\n async walk(p: string): Promise<readonly string[]> {\n const out: string[] = []\n const start = this.resolve(p)\n const rootForRelative = start\n const visit = async (dir: string): Promise<void> => {\n let entries: string[] = []\n try {\n entries = await readdir(dir)\n } catch {\n return\n }\n for (const ent of entries) {\n // Skip hidden segments — matches the FsPort contract.\n if (ent.startsWith(\".\")) continue\n const full = path.join(dir, ent)\n const s = await stat(full)\n if (s.isDirectory()) {\n await visit(full)\n } else if (s.isFile()) {\n const rel = path.relative(rootForRelative, full).split(path.sep).join(\"/\")\n out.push(rel)\n }\n }\n }\n await visit(start)\n return out\n }\n\n async stat(p: string): Promise<FsStat | null> {\n try {\n const s = await stat(this.resolve(p))\n return {\n kind: s.isDirectory() ? \"directory\" : \"file\",\n bytes: s.isFile() ? s.size : undefined,\n modifiedAt: s.mtime,\n }\n } catch {\n return null\n }\n }\n\n /**\n * Advisory lock via a lockfile. Spins waiting for the lockfile to\n * disappear, then creates it with exclusive flag. Released by\n * deleting it. Single-process safe; multi-process semi-safe (the\n * write is best-effort exclusive — adequate for the corpus's\n * promote-entry transaction which is rare and short-lived).\n */\n async lock(p: string): Promise<FsLockHandle> {\n const target = this.resolve(p)\n const lockDir = path.join(path.dirname(target), \".corpus-locks\")\n await mkdir(lockDir, { recursive: true })\n const lockFile = path.join(lockDir, path.basename(target) + \".lock\")\n const myToken = `${process.pid}-${randomBytes(4).toString(\"hex\")}`\n\n // Spin until we acquire. Cheap polling is fine for corpus\n // workloads — transactions are < 1s.\n while (true) {\n if (!existsSync(lockFile)) {\n try {\n await writeFile(lockFile, myToken, { encoding: \"utf8\", flag: \"wx\" })\n // Race: verify our token is the one that landed.\n const written = await readFile(lockFile, \"utf8\").catch(() => \"\")\n if (written === myToken) break\n } catch {\n // Lost the race — fall through and retry.\n }\n }\n await new Promise((r) => setTimeout(r, 25))\n }\n return {\n release: async () => {\n try {\n await rm(lockFile, { force: true })\n } catch {\n // Lockfile already gone — no-op.\n }\n },\n }\n }\n\n // ── Helpers ────────────────────────────────────────────────────\n\n /**\n * Resolve a workspace-relative path to an absolute host path.\n * Refuses to climb out of the workspace root (defense against\n * `../../etc/passwd`-style abuse) — the corpus kit's paths must\n * stay inside the workspace.\n */\n private resolve(p: string): string {\n const normalized = path.posix.normalize(\"/\" + p.replace(/^\\/+/, \"\"))\n // Drop the leading \"/\" so path.join joins correctly under root.\n const rel = normalized.slice(1)\n if (rel.startsWith(\"..\")) {\n throw new Error(\n `NodeFsAdapter: path \"${p}\" escapes the workspace root \"${this.root}\"`\n )\n }\n return path.join(this.root, rel)\n }\n}\n","/**\n * Bare corpus scaffold — the domain-agnostic starting point for `corpus init`.\n *\n * Emits ONLY the AIP-10 skeleton: a neutral `knowledge.workspace/v1` manifest +\n * the standard folder structure (kept by `.gitkeep`). No operators, playbooks,\n * workflows, routines, or seed entries — those are opt-in starters (`--with`) or\n * a full preset (`--preset`). This is what you want for a fresh research corpus:\n * structure without someone else's domain boilerplate.\n */\n\n/** kebab/slug → Title Case for the manifest title. */\nfunction titleCase(name: string): string {\n return name\n .replace(/[-_]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, c => c.toUpperCase())\n}\n\n/** The six generic AIP-10 entry kinds (no domain-specific PlaybookCase). */\nconst ENTRY_KINDS = [\n \"principles\",\n \"patterns\",\n \"critiques\",\n \"examples\",\n \"summaries\",\n \"timelines\",\n] as const\n\n/** Neutral, schema-valid `knowledge.workspace/v1` manifest. */\nfunction bareManifest(name: string): string {\n const title = titleCase(name)\n return `---\nschema: knowledge.workspace/v1\nname: ${name}\ntitle: ${title}\ndescription: >-\n ${title} knowledge corpus (AIP-10). Sources are scraped + content-hashed and\n immutable; entries are distilled, curated, mutable claims that cite them.\n This manifest is intentionally domain-agnostic — tune entityTypes, lints, and\n metadata.corpus to fit the domain.\nversion: 1.0.0\nentityTypes:\n - { name: Principle, description: \"Durable expert rule\" }\n - { name: Example, description: \"Concrete source-derived example\" }\n - { name: Pattern, description: \"Reusable transferable mechanic\" }\n - { name: Critique, description: \"Negative example or failure mode\" }\n - { name: Summary, description: \"Compressed source synthesis\" }\n - { name: Timeline, description: \"Time-sensitive evolution\" }\nsources:\n retention: forever\n signing: optional\n hashAlgo: sha256\n authorityDefault: secondary\nlints:\n - { id: require-source-on-examples, kind: require-source, appliesTo: Example, severity: error }\n - { id: broken-ref-all, kind: broken-ref, appliesTo: \"*\", severity: error }\n - { id: orphan-all, kind: orphan, appliesTo: \"*\", severity: info }\ncuration:\n tone: \"neutral, expert, source-backed\"\n depth: medium\n autoLink: byName\n conflictResolution: authority\nqueryHints:\n preferRecent: true\n preferAuthoritative: true\nmetadata:\n corpus:\n # \"flat\" → entries/<kind>/<slug>.md (matches the scaffolded dirs).\n # Set \"dated\" for entries/<kind>/<year>/<slug>.md on high-volume corpora.\n entryLayout: flat\n---\n\n# ${title}\n\nNeutral AIP-10 knowledge workspace.\n\n- \\`sources/\\` — scraped source snapshots (immutable provenance: \\`captured_at\\` + \\`content_hash\\`)\n- \\`entries/<kind>/\\` — distilled, curated claims that cite sources\n- \\`collections/\\` — AIP-18 curation collections (candidates, etc.)\n\nPopulate with \\`corpus import-web\\` → \\`corpus distill\\` → \\`corpus knowledge\\`.\n`\n}\n\n/** Opt-in starter surfaces (`--with`): the AIP integration dirs. */\nexport const STARTER_SURFACES: Record<string, { dir: string; aip: string }> = {\n operators: { dir: \"operators\", aip: \"AIP-9 (OPERATOR.md per operator)\" },\n playbooks: { dir: \"playbooks\", aip: \"AIP-12 (PLAYBOOK.md per playbook)\" },\n workflows: { dir: \"workflows\", aip: \"AIP-15 (WORKFLOW.md per workflow)\" },\n routines: { dir: \"routines\", aip: \"AIP-41 (ROUTINE.md per routine)\" },\n}\n\n/**\n * Build the bare workspace file set (path → content). Dirs are materialised via\n * `.gitkeep`. `withStarters` adds opt-in integration surfaces, each kept with a\n * `.gitkeep` + a README pointing at its AIP.\n */\nexport function buildBareWorkspace(\n name: string,\n withStarters: readonly string[] = []\n): Record<string, string> {\n const files: Record<string, string> = {\n \"KNOWLEDGE.md\": bareManifest(name),\n \"sources/.gitkeep\": \"\",\n \"collections/.gitkeep\": \"\",\n }\n for (const kind of ENTRY_KINDS) files[`entries/${kind}/.gitkeep`] = \"\"\n\n for (const s of withStarters) {\n const surface = STARTER_SURFACES[s]\n if (!surface) continue\n files[`${surface.dir}/.gitkeep`] = \"\"\n files[`${surface.dir}/README.md`] =\n `# ${titleCase(s)}\\n\\n` +\n `Opt-in starter surface. Add one file per item: ${surface.aip}.\\n`\n }\n return files\n}\n","/**\n * Shared helpers across CLI commands. Schema bundle loading +\n * common path resolution.\n */\n\nimport { readFileSync } from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport type { AipSchemaBundle } from \"@agentproto/corpus\"\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\n/**\n * Resolve the AgentProto specs root. When running from source (vitest,\n * pnpm dev), the specs live a few levels up alongside the TS packages.\n * When running from a published binary, the schemas are bundled next\n * to the CLI under `share/schemas/aip-XX/draft/`. We try both.\n */\nfunction findSpecsRoot(): string {\n const candidates = [\n // published binary: schemas bundled beside the CLI at dist/specs/resources\n // (copied from the repo's specs/resources by scripts/bundle-specs.mjs at build).\n path.resolve(__dirname, \"specs/resources\"),\n // source-tree (vendored): packages/corpus-cli/src/commands → ts repo's own specs/resources\n path.resolve(__dirname, \"../../../../specs/resources\"),\n // dist-tree (vendored): packages/corpus-cli/dist → ts repo's own specs/resources\n path.resolve(__dirname, \"../../../specs/resources\"),\n // source-tree (sibling agentproto repo): up to projects/agentproto/agentproto/specs/resources\n path.resolve(__dirname, \"../../../../../agentproto/specs/resources\"),\n // dist-tree (sibling agentproto repo): up to projects/agentproto/agentproto/specs/resources\n path.resolve(__dirname, \"../../../../agentproto/specs/resources\"),\n // global install: share/agentproto-specs/resources next to the bin\n path.resolve(__dirname, \"../share/agentproto-specs/resources\"),\n ]\n for (const c of candidates) {\n try {\n readFileSync(path.join(c, \"aip-10\", \"draft\", \"KNOWLEDGE.schema.json\"))\n return c\n } catch {\n // not this candidate\n }\n }\n throw new Error(\n \"corpus-cli: could not locate AgentProto spec schemas. Re-install or set CORPUS_SPECS_ROOT.\"\n )\n}\n\nlet _specsRoot: string | undefined\n/**\n * Resolve the specs root lazily and memoize it. Commands that never read\n * schemas (init, --help, --version) must not trip the \"not found\" error\n * just by importing this module, so resolution is deferred to first use.\n */\nfunction getSpecsRoot(): string {\n if (_specsRoot === undefined) {\n _specsRoot = process.env.CORPUS_SPECS_ROOT || findSpecsRoot()\n }\n return _specsRoot\n}\n\nfunction loadSchema(aip: number, doctype: string): unknown {\n return JSON.parse(\n readFileSync(\n path.join(getSpecsRoot(), `aip-${aip}`, \"draft\", `${doctype}.schema.json`),\n \"utf8\"\n )\n )\n}\n\nexport function loadAipSchemaBundle(): AipSchemaBundle {\n return {\n schemas: {\n knowledge: loadSchema(10, \"KNOWLEDGE\"),\n collection: loadSchema(18, \"COLLECTION\"),\n playbook: loadSchema(12, \"PLAYBOOK\"),\n operator: loadSchema(9, \"OPERATOR\"),\n workflow: loadSchema(15, \"WORKFLOW\"),\n routine: loadSchema(41, \"ROUTINE\"),\n },\n externals: [loadSchema(16, \"IO\"), loadSchema(17, \"RUNNER\")],\n }\n}\n\n/**\n * Resolve the workspace path argument. Accepts an explicit path or\n * defaults to cwd. Returns absolute path.\n */\nexport function resolveWorkspacePath(arg: string | undefined): string {\n if (!arg) return process.cwd()\n return path.resolve(process.cwd(), arg)\n}\n\nexport type ExitCode = 0 | 1 | 2\n\nexport function fail(msg: string, code: ExitCode = 1): ExitCode {\n process.stderr.write(`corpus: ${msg}\\n`)\n return code\n}\n","/**\n * `corpus init <name> [path]` — scaffold a new AIP-10 corpus.\n *\n * BARE BY DEFAULT: emits a neutral `knowledge.workspace/v1` manifest + the\n * AIP-10 folder structure (kept by `.gitkeep`), nothing else. This is what you\n * want for a fresh research corpus — structure without a domain's boilerplate.\n *\n * corpus init <name> [path] # bare scaffold\n * corpus init <name> [path] --with operators,playbooks # + opt-in surfaces\n * corpus init <name> [path] --preset marketing # seed a full preset\n * corpus init --list # list available presets\n *\n * Presets are discovered via manifests:\n * - Default: scans `@agentproto/corpus-presets`.\n * - Configurable: `corpusPresetPackages[]` in `~/.agentproto/config.json`.\n */\n\nimport {\n discoverPresets,\n loadPreset,\n} from \"../registry/preset-loader.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { buildBareWorkspace, STARTER_SURFACES } from \"../scaffold/bare.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runInit(args: readonly string[]): Promise<ExitCode> {\n const positionals: string[] = []\n let listOnly = false\n let presetSlug: string | undefined\n const withStarters: string[] = []\n for (let i = 0; i < args.length; i++) {\n const a = args[i]\n if (a === undefined) continue\n if (a === \"--list\" || a === \"-l\") {\n listOnly = true\n } else if (a === \"--preset\" || a === \"-p\") {\n presetSlug = args[++i]\n } else if (a.startsWith(\"--preset=\")) {\n presetSlug = a.slice(\"--preset=\".length)\n } else if (a === \"--with\" || a === \"-w\") {\n withStarters.push(...splitList(args[++i]))\n } else if (a.startsWith(\"--with=\")) {\n withStarters.push(...splitList(a.slice(\"--with=\".length)))\n } else {\n positionals.push(a)\n }\n }\n\n if (listOnly) {\n return runList()\n }\n\n const [name, pathArg] = positionals\n if (!name) {\n return fail(\n `init requires a <name> argument.\\n` +\n ` corpus init <name> [path] # bare AIP-10 scaffold (default)\\n` +\n ` corpus init <name> [path] --with operators,playbooks\\n` +\n ` corpus init <name> [path] --preset <slug> # seed a full preset\\n` +\n `Run \\`corpus init --list\\` for available presets.`,\n 2\n )\n }\n\n // Validate any requested starter surfaces up front.\n const unknown = withStarters.filter(s => !(s in STARTER_SURFACES))\n if (unknown.length) {\n return fail(\n `init: unknown --with surface(s): ${unknown.join(\", \")}. ` +\n `Known: ${Object.keys(STARTER_SURFACES).join(\", \")}.`,\n 2\n )\n }\n\n // The bare scaffold writes <name> straight into the knowledge.workspace/v1\n // manifest, whose `.name` is a constrained kebab-case identifier. Reject an\n // invalid name up front so `init` never emits a corpus that fails its own\n // `corpus validate`. Presets carry their own manifest, so name is unused there.\n if (!presetSlug) {\n const nameErr = invalidCorpusName(name)\n if (nameErr) return fail(nameErr, 2)\n }\n\n const target = resolveWorkspacePath(pathArg)\n const fs = new NodeFsAdapter({ root: target })\n\n // Guard: refuse to clobber a workspace that already exists.\n if (await fs.exists(\"KNOWLEDGE.md\")) {\n return fail(\n `init: refusing to overwrite an existing workspace at ${target}. Delete KNOWLEDGE.md first if you really want to re-init.`,\n 1\n )\n }\n\n // ── Preset path (opt-in) ──\n if (presetSlug) {\n const preset = await loadPreset(presetSlug)\n if (!preset) {\n const available = await formatAvailable()\n return fail(\n `init: preset \"${presetSlug}\" not found in any configured package.\\n${available}`,\n 2\n )\n }\n let count = 0\n for (const [rel, content] of Object.entries(preset.files)) {\n await fs.writeFile(rel, content)\n count++\n }\n // Optional bootstrap hook for presets that need more than file writes.\n if (preset.bootstrap) {\n await preset.bootstrap({\n workspacePath: \"\",\n write: (rel, content) => fs.writeFile(rel, content),\n })\n }\n process.stdout.write(\n `corpus: initialized \"${preset.slug}\" preset (${preset.title}) at ${target}\\n` +\n ` ${count} files written\\n` +\n `Try: corpus validate ${pathArg ?? \".\"}\\n` +\n ` corpus lint ${pathArg ?? \".\"}\\n`\n )\n return 0\n }\n\n // ── Bare path (default) ──\n const files = buildBareWorkspace(name, withStarters)\n let count = 0\n for (const [rel, content] of Object.entries(files)) {\n await fs.writeFile(rel, content)\n count++\n }\n const withNote = withStarters.length\n ? ` (+ starters: ${withStarters.join(\", \")})`\n : \"\"\n process.stdout.write(\n `corpus: initialized bare corpus \"${name}\"${withNote} at ${target}\\n` +\n ` ${count} files written — neutral KNOWLEDGE.md + AIP-10 structure\\n` +\n `Try: corpus import-web ${pathArg ?? \".\"} --urls-file urls.txt\\n` +\n ` corpus validate ${pathArg ?? \".\"}\\n`\n )\n return 0\n}\n\n// knowledge.workspace/v1 `.name`: kebab-case, 2–96 chars. Mirror of the AIP-10\n// schema constraint so `corpus init` can never scaffold a self-invalid corpus.\nconst CORPUS_NAME_RE = /^[a-z][a-z0-9-]*[a-z0-9]$/\n\nfunction invalidCorpusName(name: string): string | null {\n if (name.length >= 2 && name.length <= 96 && CORPUS_NAME_RE.test(name)) {\n return null\n }\n const suggestion = slugifyName(name)\n const hint =\n suggestion.length >= 2 && CORPUS_NAME_RE.test(suggestion)\n ? `\\nDid you mean: ${suggestion}`\n : \"\"\n return (\n `init: invalid corpus name \"${name}\". A corpus name is a kebab-case ` +\n `identifier — lowercase letters, digits and hyphens, 2–96 chars, starting ` +\n `with a letter and ending alphanumerically (^[a-z][a-z0-9-]*[a-z0-9]$).${hint}`\n )\n}\n\nfunction slugifyName(raw: string): string {\n return raw\n .normalize(\"NFKD\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nfunction splitList(v: string | undefined): string[] {\n return (v ?? \"\")\n .split(\",\")\n .map(s => s.trim())\n .filter(Boolean)\n}\n\nasync function runList(): Promise<ExitCode> {\n const presets = await discoverPresets()\n if (presets.size === 0) {\n process.stdout.write(\n \"corpus init: no presets discovered. Configure corpusPresetPackages[] in ~/.agentproto/config.json or install @agentproto/corpus-presets.\\n\"\n )\n return 0\n }\n for (const entry of presets.values()) {\n process.stdout.write(`• ${entry.slug} (${entry.packageName})\\n`)\n if (entry.description) {\n process.stdout.write(` ${entry.description}\\n`)\n }\n }\n return 0\n}\n\nasync function formatAvailable(): Promise<string> {\n const presets = await discoverPresets()\n if (presets.size === 0) {\n return \"No presets discovered. Configure corpusPresetPackages[] in ~/.agentproto/config.json or install @agentproto/corpus-presets.\"\n }\n const slugs = [...presets.keys()].sort()\n return `Available slugs: ${slugs.join(\", \")} (run \\`corpus init --list\\` for details).`\n}\n","/**\n * `corpus validate [path]` — JSON Schema check across every AIP file.\n */\n\nimport {\n CorpusValidator,\n CorpusWorkspaceReader,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, loadAipSchemaBundle, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runValidate(args: readonly string[]): Promise<ExitCode> {\n const target = resolveWorkspacePath(args[0])\n const fs = new NodeFsAdapter({ root: target })\n\n if (!(await fs.exists(\"KNOWLEDGE.md\"))) {\n return fail(\n `validate: no KNOWLEDGE.md at ${target}. Run \\`corpus init marketing\\` to scaffold one.`,\n 1\n )\n }\n\n const snapshot = await new CorpusWorkspaceReader({ fs }).read(\"\")\n const validator = new CorpusValidator({ bundle: loadAipSchemaBundle() })\n const result = validator.validateWorkspace(snapshot)\n\n const counts = countBucket(snapshot)\n process.stdout.write(\n `corpus: scanned ${counts.total} files (${counts.summary})\\n`\n )\n\n if (result.issues.length === 0) {\n process.stdout.write(\"corpus: all files conform to AIP schemas ✓\\n\")\n return 0\n }\n\n const errors = result.issues.filter((i) => i.severity === \"error\")\n const warns = result.issues.filter((i) => i.severity === \"warn\")\n const infos = result.issues.filter((i) => i.severity === \"info\")\n\n for (const i of result.issues) {\n const tag = i.severity === \"error\" ? \"ERROR\" : i.severity === \"warn\" ? \"WARN \" : \"INFO \"\n process.stdout.write(` ${tag} ${i.path}${i.instancePath}: ${i.message}\\n`)\n }\n process.stdout.write(\n `corpus: ${errors.length} error${errors.length === 1 ? \"\" : \"s\"}, ` +\n `${warns.length} warning${warns.length === 1 ? \"\" : \"s\"}, ` +\n `${infos.length} info\\n`\n )\n return result.valid ? 0 : 1\n}\n\nfunction countBucket(s: {\n workspace: unknown\n sources: readonly unknown[]\n entries: readonly unknown[]\n collections: readonly unknown[]\n collectionItems: readonly unknown[]\n playbooks: readonly unknown[]\n operators: readonly unknown[]\n workflows: readonly unknown[]\n routines: readonly unknown[]\n unknown: readonly unknown[]\n}): { total: number; summary: string } {\n const parts: string[] = []\n if (s.workspace) parts.push(\"1 workspace\")\n if (s.sources.length) parts.push(`${s.sources.length} sources`)\n if (s.entries.length) parts.push(`${s.entries.length} entries`)\n if (s.collections.length) parts.push(`${s.collections.length} collections`)\n if (s.collectionItems.length)\n parts.push(`${s.collectionItems.length} items`)\n if (s.playbooks.length) parts.push(`${s.playbooks.length} playbooks`)\n if (s.operators.length) parts.push(`${s.operators.length} operators`)\n if (s.workflows.length) parts.push(`${s.workflows.length} workflows`)\n if (s.routines.length) parts.push(`${s.routines.length} routines`)\n if (s.unknown.length) parts.push(`${s.unknown.length} unknown`)\n const total =\n (s.workspace ? 1 : 0) +\n s.sources.length +\n s.entries.length +\n s.collections.length +\n s.collectionItems.length +\n s.playbooks.length +\n s.operators.length +\n s.workflows.length +\n s.routines.length +\n s.unknown.length\n return { total, summary: parts.join(\", \") }\n}\n","/**\n * `corpus lint [path]` — run lints declared in KNOWLEDGE.md.\n */\n\nimport {\n CorpusLinter,\n CorpusWorkspaceReader,\n systemClock,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runLint(args: readonly string[]): Promise<ExitCode> {\n const target = resolveWorkspacePath(args[0])\n const fs = new NodeFsAdapter({ root: target })\n\n if (!(await fs.exists(\"KNOWLEDGE.md\"))) {\n return fail(\n `lint: no KNOWLEDGE.md at ${target}. Run \\`corpus init marketing\\` to scaffold one.`,\n 1\n )\n }\n\n const snapshot = await new CorpusWorkspaceReader({ fs }).read(\"\")\n const report = new CorpusLinter({ clock: systemClock }).lint(snapshot)\n\n if (report.issues.length === 0) {\n process.stdout.write(\"corpus: lint clean ✓\\n\")\n return 0\n }\n\n for (const i of report.issues) {\n const tag =\n i.severity === \"error\"\n ? \"ERROR\"\n : i.severity === \"warn\"\n ? \"WARN \"\n : \"INFO \"\n process.stdout.write(` ${tag} [${i.lintId}] ${i.path}: ${i.message}\\n`)\n }\n process.stdout.write(\n `corpus: ${report.errorCount} error${report.errorCount === 1 ? \"\" : \"s\"}, ` +\n `${report.warnCount} warning${report.warnCount === 1 ? \"\" : \"s\"}, ` +\n `${report.infoCount} info\\n`\n )\n // Non-zero exit only on errors — warnings/infos don't fail CI by default.\n return report.errorCount > 0 ? 1 : 0\n}\n","/**\n * OsIdentityAdapter — `IdentityPort` resolved from OS user + cwd.\n *\n * Local-topology identity model:\n * - principal = `ws://users/{os-user}`\n * - identityTree = [\n * `ws://users/{os-user}`,\n * `ws://workspaces/{workspace-dir-name}`,\n * ]\n *\n * Roles + guilds + orgs don't exist locally — single-user, single-\n * workspace machine. Scope-policy in the corpus adapter matches\n * against this minimal tree, so AIP-10 `appliesTo` entries scoped\n * narrower than `ws://users/...` or `ws://workspaces/...` are\n * invisible to the local user. That's the intended local-topology\n * semantics: you only see what's scoped to you or your workspace.\n */\n\nimport os from \"node:os\"\nimport path from \"node:path\"\nimport type {\n CallerIdentity,\n IdentityPort,\n} from \"@agentproto/corpus\"\n\nexport interface OsIdentityAdapterOptions {\n readonly workspaceRoot: string\n /** Override the OS user (useful for tests). Falls back to os.userInfo(). */\n readonly userOverride?: string\n}\n\nexport class OsIdentityAdapter implements IdentityPort {\n private readonly cached: CallerIdentity\n\n constructor(opts: OsIdentityAdapterOptions) {\n // Env vars win over os.userInfo() — matches Unix convention (env is\n // explicit intent, OS detection is fallback). Also keeps tests\n // deterministic across CI environments where the OS user differs.\n const user =\n opts.userOverride ??\n process.env.USER ??\n process.env.USERNAME ??\n safeGetUser() ??\n \"anonymous\"\n const wsName = path.basename(opts.workspaceRoot) || \"default\"\n this.cached = Object.freeze({\n principal: `ws://users/${slugify(user)}`,\n identityTree: Object.freeze([\n `ws://users/${slugify(user)}`,\n `ws://workspaces/${slugify(wsName)}`,\n ]),\n displayName: user,\n })\n }\n\n async resolve(): Promise<CallerIdentity> {\n return this.cached\n }\n}\n\nfunction safeGetUser(): string | undefined {\n try {\n return os.userInfo().username\n } catch {\n return undefined\n }\n}\n\nfunction slugify(s: string): string {\n return s\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .replace(/-{2,}/g, \"-\")\n .slice(0, 64) || \"anonymous\"\n}\n","/**\n * `corpus events:emit <kind> --payload <json> [path]` — append to _log.md\n * `corpus events:tail [path]` — print _log.md\n */\n\nimport {\n CorpusEventEmitter,\n systemClock,\n type CorpusEventKind,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { OsIdentityAdapter } from \"../ports/os-identity.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nconst KNOWN_EVENT_KINDS: ReadonlySet<string> = new Set<CorpusEventKind>([\n \"corpus.candidate.discovered\",\n \"corpus.candidate.analyzed\",\n \"corpus.candidate.approved\",\n \"corpus.candidate.rejected\",\n \"corpus.entry.promoted\",\n \"corpus.entry.deprecated\",\n \"corpus.entry.archived\",\n \"corpus.gap.opened\",\n \"corpus.gap.resolved\",\n \"playbook.shadow.registered\",\n \"playbook.activated\",\n \"playbook.archived\",\n])\n\nexport async function runEventsEmit(\n args: readonly string[]\n): Promise<ExitCode> {\n // First positional = kind, last positional = path (optional), rest in --flags\n const positionals: string[] = []\n let payloadStr: string | undefined\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n if (a === \"--payload\") {\n payloadStr = args[++i]\n } else if (a.startsWith(\"--payload=\")) {\n payloadStr = a.slice(\"--payload=\".length)\n } else if (a.startsWith(\"--\")) {\n return fail(`events:emit: unknown flag ${a}`, 2)\n } else {\n positionals.push(a)\n }\n }\n\n const [kind, pathArg] = positionals\n if (!kind) {\n return fail(\n \"events:emit requires a <kind> argument. Try `corpus events:emit corpus.entry.promoted --payload '{\\\"slug\\\":\\\"foo\\\"}'`.\",\n 2\n )\n }\n if (!KNOWN_EVENT_KINDS.has(kind)) {\n process.stderr.write(\n `corpus: warning — \"${kind}\" is not in the standard event taxonomy. Emitting anyway.\\n`\n )\n }\n if (!payloadStr) {\n return fail(\n \"events:emit requires --payload <json>. Pass at least `--payload '{}'`.\",\n 2\n )\n }\n let payload: Record<string, unknown>\n try {\n payload = JSON.parse(payloadStr)\n } catch (e) {\n return fail(\n `events:emit: --payload must be valid JSON (${\n e instanceof Error ? e.message : String(e)\n })`,\n 2\n )\n }\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) {\n return fail(\"events:emit: --payload must be a JSON object\", 2)\n }\n\n const target = resolveWorkspacePath(pathArg)\n const fs = new NodeFsAdapter({ root: target })\n if (!(await fs.exists(\"KNOWLEDGE.md\"))) {\n return fail(\n `events:emit: no KNOWLEDGE.md at ${target}. Run \\`corpus init marketing\\` first.`,\n 1\n )\n }\n\n const emitter = new CorpusEventEmitter({\n fs,\n clock: systemClock,\n identity: new OsIdentityAdapter({ workspaceRoot: target }),\n workspaceRoot: \"\",\n })\n const event = await emitter.emit(kind as CorpusEventKind, payload)\n process.stdout.write(\n `corpus: emitted ${event.kind} at ${event.at} by ${event.actor}\\n`\n )\n return 0\n}\n\nexport async function runEventsTail(\n args: readonly string[]\n): Promise<ExitCode> {\n const target = resolveWorkspacePath(args[0])\n const fs = new NodeFsAdapter({ root: target })\n if (!(await fs.exists(\"_log.md\"))) {\n process.stdout.write(\n `corpus: _log.md does not exist yet at ${target}. Emit an event to create it.\\n`\n )\n return 0\n }\n const content = await fs.readFile(\"_log.md\")\n process.stdout.write(content)\n if (!content.endsWith(\"\\n\")) process.stdout.write(\"\\n\")\n return 0\n}\n\n","/**\n * Shared video-host detection. Video URLs belong to the transcription\n * fetcher (yt-dlp → STT); the readability fetchers MUST refuse them, so a\n * failed transcription is skipped-and-retried rather than silently\n * falling through to scrape a JS-rendered watch page (which yields the\n * page chrome — \"About Press Copyright…\" — not the talk).\n */\n\nexport const VIDEO_HOSTS: ReadonlySet<string> = new Set([\n \"youtube.com\",\n \"www.youtube.com\",\n \"m.youtube.com\",\n \"music.youtube.com\",\n \"youtu.be\",\n \"vimeo.com\",\n])\n\nexport function isVideoUrl(\n url: string,\n extraHosts?: ReadonlySet<string>\n): boolean {\n let host: string\n try {\n host = new URL(url).hostname\n } catch {\n return false\n }\n const bare = host.replace(/^www\\./, \"\")\n return (\n VIDEO_HOSTS.has(host) ||\n VIDEO_HOSTS.has(bare) ||\n (extraHosts?.has(host) ?? false) ||\n (extraHosts?.has(bare) ?? false)\n )\n}\n","/**\n * BrowserMcpFetcher — a FetcherPort that extracts ARTICLE text through\n * the user's authenticated browser (chrome-devtools-mcp). Use it for\n * pages that a plain HTTP fetch can't read: login-walled, consent-walled,\n * or JS-rendered (SPA) content. For public static articles the cheaper\n * HttpReadabilityFetcher suffices; for video, YtDlpWhisperFetcher handles\n * transcription — this fetcher does NOT touch video.\n *\n * navigate_page(url) → evaluate_script(readability) → { title, text }\n *\n * (It used to also scrape YouTube captions, but YouTube's caption APIs\n * are pot/SABR-gated and unreliable; transcription via YtDlpWhisperFetcher\n * replaced that path entirely.)\n *\n * The browser is injected as a minimal structural `BrowserMcpLike` (just\n * `callTool`, matching `@agentproto/driver-mcp`'s `McpClient`), so this\n * adapter has no hard MCP-SDK dependency and is unit-testable with a fake\n * client. The CLI wires the real chrome-devtools-mcp client.\n */\n\nimport { z } from \"zod\"\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\n/** The fetched-source payload the in-browser script returns. */\nconst FETCHED_PAYLOAD = z\n .object({\n title: z.string(),\n text: z.string(),\n kind: z.enum([\"video\", \"article\", \"page\", \"unknown\"]).catch(\"unknown\"),\n language: z.string().optional().catch(undefined),\n via: z.string().optional().catch(undefined),\n })\n .loose()\n\n/** An MCP `content` text block. */\nconst MCP_TEXT_BLOCK = z.object({ type: z.literal(\"text\"), text: z.string() }).loose()\n\n/** Minimal MCP client surface — matches `@agentproto/driver-mcp`'s `McpClient`. */\nexport interface BrowserMcpLike {\n callTool(args: {\n name: string\n arguments: Record<string, unknown>\n }): Promise<{ content?: unknown; structuredContent?: unknown; isError?: boolean }>\n}\n\nexport interface BrowserMcpFetcherOptions {\n readonly browser: BrowserMcpLike\n /** chrome-devtools-mcp tool names — overridable if a host renames them. */\n readonly navigateToolName?: string\n readonly evaluateToolName?: string\n}\n\n// In-page readability extraction, serialised for evaluate_script. Runs in\n// the navigated page's context (cookies/session apply).\nconst READABILITY_FN = `() => {\n const title = document.title || \"\";\n const article = document.querySelector(\"article\") || document.querySelector(\"main\");\n const root = article || document.body;\n const text = (root?.innerText || \"\").replace(/\\\\n{3,}/g, \"\\\\n\\\\n\").trim().slice(0, 200000);\n const lang = document.documentElement.getAttribute(\"lang\") || undefined;\n return { title, text, kind: \"article\", language: lang, via: \"readability\" };\n}`\n\nexport class BrowserMcpFetcher implements FetcherPort {\n private readonly browser: BrowserMcpLike\n private readonly navigateTool: string\n private readonly evaluateTool: string\n\n constructor(opts: BrowserMcpFetcherOptions) {\n this.browser = opts.browser\n this.navigateTool = opts.navigateToolName ?? \"navigate_page\"\n this.evaluateTool = opts.evaluateToolName ?? \"evaluate_script\"\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (isVideoUrl(url)) return null // videos → transcription, not page scrape\n\n await this.browser.callTool({\n name: this.navigateTool,\n arguments: { url },\n })\n const result = await this.browser.callTool({\n name: this.evaluateTool,\n arguments: { function: READABILITY_FN },\n })\n const extracted = parseEvaluateResult(result)\n if (!extracted || !extracted.text.trim()) return null\n return extracted\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\n/**\n * chrome-devtools-mcp returns the script's return value either as\n * `structuredContent`, or serialised inside a `content` text block.\n * Parse defensively across both shapes.\n */\nfunction parseEvaluateResult(result: {\n content?: unknown\n structuredContent?: unknown\n}): FetchedSource | null {\n return (\n coerceFetched(result.structuredContent) ??\n coerceFetched(extractText(result.content))\n )\n}\n\nfunction coerceFetched(value: unknown): FetchedSource | null {\n let obj = value\n if (typeof obj === \"string\") {\n try {\n obj = JSON.parse(obj)\n } catch {\n return null\n }\n }\n const parsed = FETCHED_PAYLOAD.safeParse(obj)\n if (!parsed.success) return null\n const { title, text, kind, language, via } = parsed.data\n return {\n title,\n text,\n kind,\n ...(language ? { language } : {}),\n ...(via ? { via } : {}),\n }\n}\n\n/** Pull a text payload out of an MCP `content` array (or string). */\nfunction extractText(content: unknown): string | null {\n if (typeof content === \"string\") return content\n if (Array.isArray(content)) {\n for (const block of content) {\n const parsed = MCP_TEXT_BLOCK.safeParse(block)\n if (parsed.success) return parsed.data.text\n }\n }\n return null\n}\n","/**\n * ScrapeMcpFetcher — a FetcherPort that delegates article/page fetching to\n * any MCP server exposing a `scrape(url)` tool (e.g. the browser project's\n * tiered router: HTTP → Chromium → Camofox stealth → agent, with cookie\n * injection and auto-escalation on bot-walls). The browser stack is reached\n * over MCP, so this stays vendor-neutral — corpus-cli never imports it.\n *\n * scrape(url) → { title, markdown } → FetchedSource\n *\n * It does NOT touch video URLs (YtDlpWhisperFetcher owns those) and returns\n * `null` for a blocked / empty page so the importer skips-with-warning\n * rather than aborting the batch.\n *\n * The MCP client is injected as the minimal structural `BrowserMcpLike`\n * (just `callTool`), the same surface `BrowserMcpFetcher` consumes — so this\n * adapter has no MCP-SDK dependency and is unit-testable with a fake client.\n */\n\nimport { z } from \"zod\"\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport type { BrowserMcpLike } from \"./browser-fetcher.adapter.js\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\n/**\n * The fields we read off the `scrape` tool's result. A purifying scrape\n * server returns `title` + `markdown`; we tolerate a raw-`html`-only server\n * by stripping tags as a last resort. Everything else is left opaque.\n */\nconst SCRAPE_PAYLOAD = z\n .object({\n title: z.string().optional().catch(undefined),\n markdown: z.string().optional().catch(undefined),\n html: z.string().optional().catch(undefined),\n language: z.string().optional().catch(undefined),\n tierUsed: z.union([z.string(), z.number()]).optional().catch(undefined),\n })\n .loose()\n\nconst MCP_TEXT_BLOCK = z\n .object({ type: z.literal(\"text\"), text: z.string() })\n .loose()\n\nexport interface ScrapeMcpFetcherOptions {\n readonly client: BrowserMcpLike\n /** Tool name on the MCP server — overridable if a host renames it. */\n readonly scrapeToolName?: string\n}\n\nexport class ScrapeMcpFetcher implements FetcherPort {\n private readonly client: BrowserMcpLike\n private readonly toolName: string\n\n constructor(opts: ScrapeMcpFetcherOptions) {\n this.client = opts.client\n this.toolName = opts.scrapeToolName ?? \"scrape\"\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (isVideoUrl(url)) return null // let the transcription fetcher handle video\n\n let res: Awaited<ReturnType<BrowserMcpLike[\"callTool\"]>>\n try {\n res = await this.client.callTool({\n name: this.toolName,\n arguments: { url },\n })\n } catch {\n // Transient MCP/transport failure → skip this URL (resumable re-run\n // retries it), don't abort the whole batch.\n return null\n }\n if (res.isError) return null\n\n const payload = extractPayload(res)\n if (!payload) return null\n\n const text = (payload.markdown?.trim() || stripTags(payload.html)).trim()\n if (!text) return null // blocked / empty page → skip\n\n return {\n title: payload.title?.trim() || url,\n text,\n kind: \"article\",\n ...(payload.language ? { language: payload.language } : {}),\n via: payload.tierUsed ? `scrape:${payload.tierUsed}` : \"scrape\",\n }\n }\n}\n\n/** Read the scrape result from `structuredContent`, else a JSON text block. */\nfunction extractPayload(res: {\n content?: unknown\n structuredContent?: unknown\n}): z.infer<typeof SCRAPE_PAYLOAD> | null {\n if (res.structuredContent && typeof res.structuredContent === \"object\") {\n const parsed = SCRAPE_PAYLOAD.safeParse(res.structuredContent)\n if (parsed.success) return parsed.data\n }\n if (Array.isArray(res.content)) {\n for (const block of res.content) {\n const text = MCP_TEXT_BLOCK.safeParse(block)\n if (!text.success) continue\n try {\n const parsed = SCRAPE_PAYLOAD.safeParse(JSON.parse(text.data.text))\n if (parsed.success) return parsed.data\n } catch {\n // Non-JSON text block — treat the raw text as the content itself.\n return { markdown: text.data.text }\n }\n }\n }\n return null\n}\n\n/** Last-resort tag strip for a server that returns only raw HTML. */\nfunction stripTags(html: string | undefined): string {\n if (!html) return \"\"\n return html\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \"\")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \"\")\n .replace(/<[^>]+>/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n}\n","/**\n * YtDlpWhisperFetcher — a FetcherPort for video URLs that does NOT rely\n * on captions (YouTube's caption/transcript APIs are pot/SABR-gated and\n * frequently unavailable). Instead it pulls the audio with yt-dlp and\n * transcribes it with an injected SttPort (Whisper). Captions-independent\n * and robust: works whether or not the video has subtitles.\n *\n * video URL → yt-dlp -f bestaudio -x (mp3) → SttPort.transcribe → text\n *\n * yt-dlp handles the pot token / SABR negotiation / signature itself, so\n * no browser or cookies are needed for public videos. Non-video URLs\n * resolve to `null` so this fetcher composes ahead of a readability\n * fetcher (see CompositeFetcher).\n *\n * The yt-dlp invocation is injected as `download` so the adapter is unit-\n * testable with a fake downloader + fake SttPort — no binary, no network.\n */\n\nimport { execFile } from \"node:child_process\"\nimport { mkdtemp, readdir, readFile, rm } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { promisify } from \"node:util\"\nimport { z } from \"zod\"\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport type { SttPort } from \"./stt.port.js\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\nconst execFileAsync = promisify(execFile)\n\n/** yt-dlp's `.info.json` — only the fields we use. */\nconst YTDLP_INFO = z\n .object({ title: z.string().optional(), language: z.string().optional() })\n .loose()\n\nexport interface AudioDownload {\n readonly audioPath: string\n readonly title: string\n readonly language?: string\n /** Remove the temp working dir. Always called by the fetcher. */\n cleanup(): Promise<void>\n}\n\n/** Pull a URL's audio to a local file. Injectable for tests. */\nexport type AudioDownloader = (url: string) => Promise<AudioDownload>\n\nexport interface YtDlpWhisperFetcherOptions {\n readonly stt: SttPort\n /** Defaults to a yt-dlp subprocess downloader. */\n readonly download?: AudioDownloader\n /** Path to the yt-dlp binary (default: \"yt-dlp\" on PATH). */\n readonly ytDlpBin?: string\n /** Treat these hostnames as video (in addition to the YouTube/Vimeo set). */\n readonly extraVideoHosts?: readonly string[]\n /**\n * Skip videos longer than this many seconds, BEFORE downloading\n * (yt-dlp `--match-filter \"duration <= N\"`). A filtered video pulls no\n * bytes and resolves to `null` (skipped), so a stray 40-hour stream\n * can't blow up the batch. Omit for no cap — long media is segmented by\n * `ChunkedStt`, so length alone is not a blocker.\n */\n readonly maxDurationSec?: number\n /**\n * Read cookies from a local browser (`chrome`, `firefox`, `chrome:Profile 1`)\n * — passed to yt-dlp as `--cookies-from-browser`. Authenticated requests\n * sidestep YouTube's \"confirm you're not a bot\" rate-limit that public\n * fetches hit after a burst of downloads.\n */\n readonly cookiesFromBrowser?: string\n /** Path to a Netscape cookies.txt — passed to yt-dlp as `--cookies`. */\n readonly cookiesFile?: string\n}\n\nexport class YtDlpWhisperFetcher implements FetcherPort {\n private readonly stt: SttPort\n private readonly download: AudioDownloader\n private readonly extraHosts: ReadonlySet<string> | undefined\n\n constructor(opts: YtDlpWhisperFetcherOptions) {\n this.stt = opts.stt\n this.download =\n opts.download ??\n defaultYtDlpDownloader(opts.ytDlpBin ?? \"yt-dlp\", {\n maxDurationSec: opts.maxDurationSec,\n cookiesFromBrowser: opts.cookiesFromBrowser,\n cookiesFile: opts.cookiesFile,\n })\n this.extraHosts = opts.extraVideoHosts\n ? new Set(opts.extraVideoHosts)\n : undefined\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (!isVideoUrl(url, this.extraHosts)) return null // let a readability fetcher handle it\n\n let dl: AudioDownload\n try {\n dl = await this.download(url)\n } catch (e) {\n // Per-video download failure (geo-block, private, removed, or a\n // YouTube bot-check) → skip, don't abort the batch. Surface it so a\n // run that silently downloads nothing is diagnosable (e.g. the\n // bot-check that --cookies-from-browser fixes) rather than looking\n // like \"0 videos found\".\n process.stderr.write(`corpus: download failed for ${url} — skipped (${msg(e)})\\n`)\n return null\n }\n try {\n const t = await this.stt.transcribe(dl.audioPath)\n if (!t.text.trim()) return null\n return {\n title: dl.title || url,\n text: t.text,\n kind: \"video\",\n ...(t.language ?? dl.language\n ? { language: t.language ?? dl.language }\n : {}),\n via: \"transcription\",\n }\n } catch (e) {\n // A transcription failure on ONE video must not abort the whole\n // batch (the STT layer already retries transient blips). Skip it and\n // let the resumable importer retry on the next run — EXCEPT for an\n // auth/config error, which would fail every video, so we surface it\n // loudly rather than silently dropping the entire run.\n if (isAuthError(e)) throw e\n process.stderr.write(\n `corpus: transcription failed for ${url} — skipped (${msg(e)})\\n`\n )\n return null\n } finally {\n await dl.cleanup().catch(() => {})\n }\n }\n}\n\nfunction msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e)\n}\n\n/** A 401/403 or \"api key\" error fails every video — abort, don't skip. */\nfunction isAuthError(e: unknown): boolean {\n const m = msg(e).toLowerCase()\n return (\n m.includes(\" 401\") ||\n m.includes(\" 403\") ||\n m.includes(\"unauthorized\") ||\n m.includes(\"forbidden\") ||\n m.includes(\"api key\") ||\n m.includes(\"api_key\")\n )\n}\n\n// ── Default yt-dlp subprocess downloader ────────────────────────────\n\nfunction defaultYtDlpDownloader(\n bin: string,\n opts?: {\n readonly maxDurationSec?: number\n readonly cookiesFromBrowser?: string\n readonly cookiesFile?: string\n }\n): AudioDownloader {\n return async (url: string): Promise<AudioDownload> => {\n const dir = await mkdtemp(join(tmpdir(), \"corpus-ytdlp-\"))\n const cleanup = () => rm(dir, { recursive: true, force: true })\n try {\n // `--match-filter` is evaluated before the media is fetched, so an\n // over-length video pulls zero bytes — it just yields no output file,\n // which the caller treats as a skip.\n const durationGuard =\n opts?.maxDurationSec && opts.maxDurationSec > 0\n ? [\"--match-filter\", `duration <= ${Math.floor(opts.maxDurationSec)}`]\n : []\n // Authenticate via local browser cookies (or a cookies.txt) to dodge\n // YouTube's bot-check rate-limit on bursts of public downloads.\n const cookieArgs = opts?.cookiesFromBrowser\n ? [\"--cookies-from-browser\", opts.cookiesFromBrowser]\n : opts?.cookiesFile\n ? [\"--cookies\", opts.cookiesFile]\n : []\n await execFileAsync(\n bin,\n [\n \"-f\", \"bestaudio\",\n \"-x\", \"--audio-format\", \"mp3\", \"--audio-quality\", \"64K\",\n \"--no-playlist\", \"--no-progress\",\n ...durationGuard,\n ...cookieArgs,\n \"--write-info-json\",\n \"-o\", join(dir, \"track.%(ext)s\"),\n url,\n ],\n { maxBuffer: 16 * 1024 * 1024 }\n )\n const files = await readdir(dir)\n const audio = files.find(f => f === \"track.mp3\") ??\n files.find(f => /\\.(mp3|m4a|opus|webm|ogg|wav)$/i.test(f))\n if (!audio) throw new Error(\"yt-dlp produced no audio file\")\n\n let title = url\n let language: string | undefined\n const infoName = files.find(f => f.endsWith(\".info.json\"))\n if (infoName) {\n try {\n const info = YTDLP_INFO.parse(\n JSON.parse(await readFile(join(dir, infoName), \"utf-8\"))\n )\n if (info.title) title = info.title\n if (info.language) language = info.language\n } catch {\n // info json optional — fall back to url as title\n }\n }\n return {\n audioPath: join(dir, audio),\n title,\n ...(language ? { language } : {}),\n cleanup,\n }\n } catch (e) {\n await cleanup().catch(() => {})\n throw e\n }\n }\n}\n","/**\n * SttPort — speech-to-text boundary the YtDlpWhisperFetcher consumes.\n *\n * Keeps the fetcher pure of any STT-vendor specifics: it hands a local\n * audio file path to `transcribe()` and gets back text. The CLI wires a\n * concrete impl (OpenAI Whisper here; swap for a self-hosted whisper.cpp\n * or Deepgram impl without touching the fetcher).\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { basename } from \"node:path\"\nimport { normalizeLanguageTag } from \"@agentproto/corpus\"\nimport { z } from \"zod\"\n\n/** The Whisper verbose_json fields we read. */\nconst WHISPER_RESPONSE = z\n .object({ text: z.string().optional(), language: z.string().optional() })\n .loose()\n\nexport interface Transcript {\n readonly text: string\n /** BCP-47 language, when the engine detects it. */\n readonly language?: string\n}\n\nexport interface SttPort {\n transcribe(audioPath: string): Promise<Transcript>\n}\n\nconst WHISPER_MAX_BYTES = 25 * 1024 * 1024 // OpenAI hard cap\n\nexport interface OpenAiWhisperSttOptions {\n readonly apiKey: string\n /** Default \"whisper-1\". */\n readonly model?: string\n /** Override base URL (proxy / Azure). Default OpenAI. */\n readonly baseUrl?: string\n}\n\n/**\n * OpenAI Whisper STT. Posts the audio file to /audio/transcriptions with\n * `response_format=verbose_json` so we recover the detected language.\n *\n * Files above OpenAI's 25 MB cap throw a clear error — the caller should\n * have downloaded at a lower bitrate (the fetcher uses 64 kbps mono) or\n * chunk long media. We surface the size rather than letting the API 413.\n */\nexport class OpenAiWhisperStt implements SttPort {\n private readonly apiKey: string\n private readonly model: string\n private readonly baseUrl: string\n\n constructor(opts: OpenAiWhisperSttOptions) {\n this.apiKey = opts.apiKey\n this.model = opts.model ?? \"whisper-1\"\n this.baseUrl = (opts.baseUrl ?? \"https://api.openai.com/v1\").replace(/\\/+$/, \"\")\n }\n\n async transcribe(audioPath: string): Promise<Transcript> {\n const bytes = await readFile(audioPath)\n if (bytes.byteLength > WHISPER_MAX_BYTES) {\n throw new Error(\n `audio ${basename(audioPath)} is ${(bytes.byteLength / 1024 / 1024).toFixed(1)} MB — over Whisper's 25 MB cap. Lower the bitrate or chunk the media.`\n )\n }\n const form = new FormData()\n form.append(\"file\", new Blob([bytes]), basename(audioPath))\n form.append(\"model\", this.model)\n form.append(\"response_format\", \"verbose_json\")\n\n const res = await this.postWithRetry(form)\n if (!res.ok) {\n const body = await res.text().catch(() => \"\")\n throw new Error(`Whisper STT ${res.status} ${res.statusText}: ${body.slice(0, 200)}`)\n }\n const data = WHISPER_RESPONSE.parse(await res.json())\n const language = normalizeLanguageTag(data.language)\n return {\n text: (data.text ?? \"\").trim(),\n ...(language ? { language } : {}),\n }\n }\n\n /**\n * POST the audio with bounded retry. Transcribing a long talk fans out\n * into many segment uploads (see ChunkedStt), so a single transient\n * network blip (\"fetch failed\") or a 429 / 5xx must not abort the whole\n * batch. Network errors and retryable statuses back off and retry;\n * client errors (401 auth, 400 bad request) return immediately so a real\n * misconfiguration still surfaces loudly.\n */\n private async postWithRetry(form: FormData, attempts = 4): Promise<Response> {\n const url = `${this.baseUrl}/audio/transcriptions`\n let lastErr: unknown\n for (let i = 0; i < attempts; i++) {\n try {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { authorization: `Bearer ${this.apiKey}` },\n body: form,\n })\n if (res.status !== 429 && res.status < 500) return res\n lastErr = new Error(`Whisper STT ${res.status} ${res.statusText}`)\n } catch (e) {\n lastErr = e // network-level failure (undici \"fetch failed\", reset, timeout)\n }\n if (i < attempts - 1) await delay(500 * 2 ** i) // 0.5s, 1s, 2s\n }\n throw lastErr instanceof Error ? lastErr : new Error(String(lastErr))\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","/**\n * AssemblyAiStt — a diarizing SttPort. Where OpenAiWhisperStt returns a\n * flat transcript, this returns SPEAKER-LABELLED text (`Speaker A: … /\n * Speaker B: …`) via AssemblyAI's `speaker_labels`. Use it ad-hoc for\n * multi-speaker videos (interviews, mock interviews, panels, \"day in the\n * life\") where the content only makes sense if you know who said what.\n *\n * Same `SttPort` contract — the diarized layout lives in `text`, so it\n * drops straight into YtDlpWhisperFetcher without any other change.\n *\n * Flow: upload audio → create transcript(speaker_labels) → poll → format\n * utterances. No 25 MB cap (unlike Whisper), so long videos are fine; the\n * trade-off is latency (~a third of audio duration) — slower than Whisper.\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport { z } from \"zod\"\nimport type { SttPort, Transcript } from \"./stt.port.js\"\n\nexport interface AssemblyAiSttOptions {\n readonly apiKey: string\n readonly baseUrl?: string\n readonly pollIntervalMs?: number\n readonly maxWaitMs?: number\n readonly sleep?: (ms: number) => Promise<void>\n}\n\nconst UPLOAD_RESPONSE = z.object({ upload_url: z.string() })\n\nconst AAI_TRANSCRIPT = z\n .object({\n id: z.string(),\n status: z.enum([\"queued\", \"processing\", \"completed\", \"error\"]),\n text: z.string().optional(),\n language_code: z.string().optional(),\n error: z.string().optional(),\n utterances: z\n .array(z.object({ speaker: z.string(), text: z.string() }))\n .nullish(),\n })\n .loose()\n\ntype AaiTranscript = z.infer<typeof AAI_TRANSCRIPT>\n\nexport class AssemblyAiStt implements SttPort {\n private readonly apiKey: string\n private readonly baseUrl: string\n private readonly pollIntervalMs: number\n private readonly maxWaitMs: number\n private readonly sleep: (ms: number) => Promise<void>\n\n constructor(opts: AssemblyAiSttOptions) {\n this.apiKey = opts.apiKey\n this.baseUrl = (opts.baseUrl ?? \"https://api.assemblyai.com/v2\").replace(/\\/+$/, \"\")\n this.pollIntervalMs = opts.pollIntervalMs ?? 3000\n this.maxWaitMs = opts.maxWaitMs ?? 15 * 60 * 1000\n this.sleep = opts.sleep ?? ((ms: number) => new Promise(r => setTimeout(r, ms)))\n }\n\n async transcribe(audioPath: string): Promise<Transcript> {\n const bytes = await readFile(audioPath)\n\n // 1. Upload the audio bytes.\n const up = await fetch(`${this.baseUrl}/upload`, {\n method: \"POST\",\n headers: { authorization: this.apiKey, \"content-type\": \"application/octet-stream\" },\n body: bytes,\n })\n if (!up.ok) throw new Error(`AssemblyAI upload ${up.status}: ${(await up.text()).slice(0, 200)}`)\n const { upload_url } = UPLOAD_RESPONSE.parse(await up.json())\n\n // 2. Create a diarized transcript job.\n const created = await this.post(\"/transcript\", {\n audio_url: upload_url,\n speaker_labels: true,\n language_detection: true,\n })\n const id = created.id\n\n // 3. Poll until done.\n const deadline = this.maxWaitMs\n let waited = 0\n let job = created\n while (job.status !== \"completed\" && job.status !== \"error\") {\n if (waited >= deadline) throw new Error(`AssemblyAI transcript ${id} timed out after ${deadline} ms`)\n await this.sleep(this.pollIntervalMs)\n waited += this.pollIntervalMs\n job = await this.get(`/transcript/${id}`)\n }\n if (job.status === \"error\") throw new Error(`AssemblyAI transcript failed: ${job.error ?? \"unknown\"}`)\n\n return {\n text: formatDiarized(job),\n ...(job.language_code ? { language: job.language_code } : {}),\n }\n }\n\n private async post(path: string, body: unknown): Promise<AaiTranscript> {\n const r = await fetch(`${this.baseUrl}${path}`, {\n method: \"POST\",\n headers: { authorization: this.apiKey, \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n })\n if (!r.ok) throw new Error(`AssemblyAI POST ${path} ${r.status}: ${(await r.text()).slice(0, 200)}`)\n return AAI_TRANSCRIPT.parse(await r.json())\n }\n\n private async get(path: string): Promise<AaiTranscript> {\n const r = await fetch(`${this.baseUrl}${path}`, { headers: { authorization: this.apiKey } })\n if (!r.ok) throw new Error(`AssemblyAI GET ${path} ${r.status}: ${(await r.text()).slice(0, 200)}`)\n return AAI_TRANSCRIPT.parse(await r.json())\n }\n}\n\n/** Join utterances as `Speaker A: …` blocks; fall back to flat text. */\nfunction formatDiarized(job: AaiTranscript): string {\n if (job.utterances && job.utterances.length > 0) {\n return job.utterances\n .map(u => `Speaker ${u.speaker}: ${u.text.trim()}`)\n .join(\"\\n\\n\")\n .trim()\n }\n return (job.text ?? \"\").trim()\n}\n","/**\n * ChunkedStt — a SttPort decorator that makes a capped engine handle\n * arbitrarily long audio. Whisper rejects files over 25 MB, so a\n * multi-hour talk (full course, masterclass, panel) can't be sent in one\n * request. This wrapper splits oversized audio into time segments with\n * ffmpeg, transcribes each through the wrapped engine, and concatenates\n * the text back into a single transcript.\n *\n * transcribe(path) → ≤cap ? base.transcribe(path)\n * : ffmpeg segment → base.transcribe(eachPart) → join\n *\n * The cap is a vendor concern (Whisper's limit), so handling it belongs in\n * the STT layer rather than the fetcher — the fetcher stays pure and the\n * concrete `OpenAiWhisperStt` stays a single-request transcriber. Splitting\n * is injected as `split` so the decorator is unit-testable with a fake\n * splitter + fake base engine — no ffmpeg, no network.\n *\n * Segmenting uses `-c copy` (stream copy, no re-encode): fast, and each\n * segment is a self-contained valid file. At the fetcher's 64 kbps a 20-min\n * segment is ~9.6 MB — comfortably under the 25 MB cap with margin for\n * VBR drift.\n */\n\nimport { execFile } from \"node:child_process\"\nimport { mkdtemp, readdir, rm, stat } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { extname, join } from \"node:path\"\nimport { promisify } from \"node:util\"\nimport type { SttPort, Transcript } from \"./stt.port.js\"\n\nconst execFileAsync = promisify(execFile)\n\n/**\n * Split a local audio file into ≤`segmentSeconds` parts inside `outDir`,\n * returning the segment paths in playback order. Injectable for tests.\n */\nexport type AudioSplitter = (\n audioPath: string,\n segmentSeconds: number,\n outDir: string\n) => Promise<string[]>\n\nexport interface ChunkedSttOptions {\n /** The engine each (sub-cap) part is transcribed through. */\n readonly base: SttPort\n /**\n * Split anything strictly larger than this. Default 24 MB — just under\n * Whisper's 25 MB hard cap so VBR drift never pushes a part over.\n */\n readonly maxBytes?: number\n /** Segment length when splitting. Default 1200 s (20 min). */\n readonly segmentSeconds?: number\n /** Defaults to an ffmpeg segment-muxer splitter. */\n readonly split?: AudioSplitter\n /** Path to the ffmpeg binary (default: \"ffmpeg\" on PATH). */\n readonly ffmpegBin?: string\n}\n\nconst DEFAULT_MAX_BYTES = 24 * 1024 * 1024\nconst DEFAULT_SEGMENT_SECONDS = 1200\n\nexport class ChunkedStt implements SttPort {\n private readonly base: SttPort\n private readonly maxBytes: number\n private readonly segmentSeconds: number\n private readonly split: AudioSplitter\n\n constructor(opts: ChunkedSttOptions) {\n this.base = opts.base\n this.maxBytes = opts.maxBytes ?? DEFAULT_MAX_BYTES\n this.segmentSeconds = opts.segmentSeconds ?? DEFAULT_SEGMENT_SECONDS\n this.split = opts.split ?? defaultFfmpegSplitter(opts.ffmpegBin ?? \"ffmpeg\")\n }\n\n async transcribe(audioPath: string): Promise<Transcript> {\n const { size } = await stat(audioPath)\n if (size <= this.maxBytes) return this.base.transcribe(audioPath)\n\n const dir = await mkdtemp(join(tmpdir(), \"corpus-stt-chunk-\"))\n try {\n const parts = await this.split(audioPath, this.segmentSeconds, dir)\n if (parts.length === 0) {\n // Splitter produced nothing — fall back to a single attempt so the\n // base engine surfaces its own (clear) over-cap error rather than\n // us silently dropping the source.\n return this.base.transcribe(audioPath)\n }\n const texts: string[] = []\n let language: string | undefined\n let failed = 0\n let firstErr: unknown\n for (const part of parts) {\n try {\n const t = await this.base.transcribe(part)\n if (t.text.trim()) texts.push(t.text.trim())\n language ??= t.language\n } catch (e) {\n // One segment failing (after the base engine's own retries) must\n // not discard the whole multi-hour transcript — keep the rest.\n failed++\n firstErr ??= e\n }\n }\n // Every segment failing usually means a systemic error (auth, quota) —\n // rethrow so the caller can surface/skip it, rather than silently\n // writing an empty transcript.\n if (texts.length === 0) {\n throw firstErr ?? new Error(\"all audio segments failed transcription\")\n }\n if (failed > 0) {\n process.stderr.write(\n `corpus: ${failed}/${parts.length} audio segments failed — partial transcript\\n`\n )\n }\n return {\n text: texts.join(\"\\n\\n\"),\n ...(language ? { language } : {}),\n }\n } finally {\n await rm(dir, { recursive: true, force: true }).catch(() => {})\n }\n }\n}\n\n// ── Default ffmpeg segment-muxer splitter ───────────────────────────\n\nfunction defaultFfmpegSplitter(bin: string): AudioSplitter {\n return async (audioPath, segmentSeconds, outDir) => {\n const ext = extname(audioPath) || \".mp3\"\n await execFileAsync(\n bin,\n [\n \"-hide_banner\", \"-loglevel\", \"error\",\n \"-i\", audioPath,\n \"-f\", \"segment\",\n \"-segment_time\", String(segmentSeconds),\n \"-c\", \"copy\",\n join(outDir, `part%03d${ext}`),\n ],\n { maxBuffer: 16 * 1024 * 1024 }\n )\n // ffmpeg names parts part000, part001, … — lexical sort = playback order.\n const files = (await readdir(outDir))\n .filter(f => f.startsWith(\"part\") && f.endsWith(ext))\n .sort()\n return files.map(f => join(outDir, f))\n }\n}\n","/**\n * HttpReadabilityFetcher — a browser-free FetcherPort for articles:\n * plain `fetch` + a lightweight readability extraction (prefer\n * <article>/<main>, strip chrome). Validated to pull ~35k chars from a\n * real corpus article. Returns `null` for non-HTML or empty bodies so a\n * video or authed-browser fetcher can take those.\n *\n * No JS execution — so it won't get SPA-only content; for login-walled\n * or JS-rendered pages, compose a BrowserMcpFetcher ahead of/after this.\n */\n\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\nimport { isVideoUrl } from \"./video-hosts.js\"\n\nexport interface HttpReadabilityFetcherOptions {\n readonly userAgent?: string\n readonly maxChars?: number\n}\n\nconst DEFAULT_UA =\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0 Safari/537.36\"\n\nexport class HttpReadabilityFetcher implements FetcherPort {\n private readonly ua: string\n private readonly maxChars: number\n\n constructor(opts: HttpReadabilityFetcherOptions = {}) {\n this.ua = opts.userAgent ?? DEFAULT_UA\n this.maxChars = opts.maxChars ?? 200_000\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n // Video URLs belong to the transcription fetcher. Never scrape a\n // watch page here — a failed transcription must skip, not fall\n // through to YouTube's page chrome.\n if (isVideoUrl(url)) return null\n\n let res: Response\n try {\n res = await fetch(url, {\n headers: { \"user-agent\": this.ua, \"accept-language\": \"en,fr;q=0.8\" },\n redirect: \"follow\",\n })\n } catch {\n return null\n }\n if (!res.ok) return null\n const ct = res.headers.get(\"content-type\") ?? \"\"\n if (!ct.includes(\"text/html\") && !ct.includes(\"application/xhtml\")) return null\n\n const html = await res.text()\n const title = decodeEntities(\n (html.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i)?.[1] ?? \"\").trim()\n )\n const lang = html.match(/<html[^>]*\\blang=[\"']?([a-zA-Z-]+)/i)?.[1]\n const text = extractReadable(html).slice(0, this.maxChars)\n if (!text.trim()) return null\n\n return {\n title: title || url,\n text,\n kind: \"article\",\n ...(lang ? { language: lang } : {}),\n via: \"readability\",\n }\n }\n}\n\n// ── Helpers ─────────────────────────────────────────────────────────\n\nfunction extractReadable(html: string): string {\n // Prefer the main content region; fall back to <body>.\n const region =\n html.match(/<article[\\s\\S]*?<\\/article>/i)?.[0] ??\n html.match(/<main[\\s\\S]*?<\\/main>/i)?.[0] ??\n html.match(/<body[\\s\\S]*?<\\/body>/i)?.[0] ??\n html\n return decodeEntities(\n region\n .replace(/<script[\\s\\S]*?<\\/script>/gi, \" \")\n .replace(/<style[\\s\\S]*?<\\/style>/gi, \" \")\n .replace(/<(nav|header|footer|aside|form)[\\s\\S]*?<\\/\\1>/gi, \" \")\n .replace(/<[^>]+>/g, \" \")\n .replace(/[ \\t]+/g, \" \")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n ).trim()\n}\n\nfunction decodeEntities(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/ /g, \" \")\n .replace(/&#(\\d+);/g, (_, n) => String.fromCharCode(Number(n)))\n}\n","/**\n * CompositeFetcher — tries child fetchers in order, first non-null wins.\n *\n * Lets the importer route by URL without itself knowing the routing:\n * new CompositeFetcher([ ytDlpWhisper, browserReadability ])\n * sends videos to whisper (the readability one returns null for them is\n * never reached because whisper handled it) and everything else falls\n * through to readability. A child that THROWS aborts (hard failure);\n * a child that returns null means \"not mine, try the next\".\n */\n\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\n\nexport class CompositeFetcher implements FetcherPort {\n private readonly children: readonly FetcherPort[]\n\n constructor(children: readonly FetcherPort[]) {\n this.children = children\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n for (const child of this.children) {\n const result = await child.fetch(url)\n if (result) return result\n }\n return null\n }\n}\n","/**\n * ThrottleFetcher — wraps a FetcherPort to enforce a minimum interval\n * between fetches (rate limiting). The importer already calls fetch\n * serially (one URL at a time), so this adds the *pacing* that protects\n * against YouTube anti-abuse blocks and Whisper RPM limits when running\n * a large batch.\n *\n * `now` + `sleep` are injectable so the throttle is unit-testable without\n * real timers.\n */\n\nimport type { FetcherPort, FetchedSource } from \"@agentproto/corpus\"\n\nexport interface ThrottleFetcherOptions {\n /** Minimum milliseconds between the START of consecutive fetches. */\n readonly minIntervalMs: number\n readonly now?: () => number\n readonly sleep?: (ms: number) => Promise<void>\n}\n\nexport class ThrottleFetcher implements FetcherPort {\n private readonly inner: FetcherPort\n private readonly minIntervalMs: number\n private readonly now: () => number\n private readonly sleep: (ms: number) => Promise<void>\n private lastStart = 0\n private started = false\n\n constructor(inner: FetcherPort, opts: ThrottleFetcherOptions) {\n this.inner = inner\n this.minIntervalMs = Math.max(0, opts.minIntervalMs)\n this.now = opts.now ?? (() => Date.now())\n this.sleep =\n opts.sleep ?? ((ms: number) => new Promise(r => setTimeout(r, ms)))\n }\n\n async fetch(url: string): Promise<FetchedSource | null> {\n if (this.minIntervalMs > 0 && this.started) {\n const wait = this.minIntervalMs - (this.now() - this.lastStart)\n if (wait > 0) await this.sleep(wait)\n }\n this.started = true\n this.lastStart = this.now()\n return this.inner.fetch(url)\n }\n}\n","/**\n * connectBrowserMcp — connect to a chrome-devtools-mcp server over MCP\n * streamable-HTTP and return a `BrowserMcpLike` (just `callTool`).\n *\n * ────────────────────────────────────────────────────────────────────\n * TODO(live): this is the ONE environment-coupled seam. It implements a\n * minimal JSON-RPC-over-HTTP client good enough for the common daemon\n * setup, but the exact transport details depend on how YOUR daemon\n * exposes chrome-devtools-mcp. Verify against the running daemon:\n *\n * 1. Response framing — streamable HTTP MAY reply with `text/event-\n * stream` (SSE) rather than a single JSON body. `parseRpcResponse`\n * handles both, but confirm the SSE `data:` framing matches.\n * 2. Session header — the spec uses `Mcp-Session-Id`; some servers\n * omit it (stateless). We echo it back when present.\n * 3. initialize params — protocolVersion / clientInfo may need to\n * match the server's expected version.\n *\n * If your daemon proxies the browser through a different surface (e.g.\n * the @guilde/tunnel `/mcp` or an agentproto driver), swap this file's\n * impl — the `BrowserMcpLike` contract the fetcher consumes is stable.\n * ────────────────────────────────────────────────────────────────────\n */\n\nimport { z } from \"zod\"\nimport type { BrowserMcpLike } from \"./browser-fetcher.adapter.js\"\n\n/** A JSON-RPC response envelope (result/error opaque). */\nconst RPC_RESPONSE = z\n .object({ result: z.unknown().optional(), error: z.unknown().optional() })\n .loose()\n\n/** An MCP `tools/call` result (content blocks left opaque). */\nconst CALL_RESULT = z\n .object({\n content: z.unknown().optional(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n })\n .loose()\n\nexport interface ConnectBrowserMcpOptions {\n /** chrome-devtools-mcp streamable-HTTP endpoint, e.g. http://127.0.0.1:9223/mcp */\n readonly endpoint: string\n /** Extra headers (auth tokens, etc.). */\n readonly headers?: Record<string, string>\n readonly protocolVersion?: string\n}\n\nconst PROTOCOL_VERSION = \"2025-06-18\"\n\nexport async function connectBrowserMcp(\n opts: ConnectBrowserMcpOptions\n): Promise<BrowserMcpLike> {\n const client = new StreamableHttpMcpClient(opts)\n await client.initialize()\n return client\n}\n\nclass StreamableHttpMcpClient implements BrowserMcpLike {\n private id = 0\n private sessionId: string | undefined\n private readonly endpoint: string\n private readonly headers: Record<string, string>\n private readonly protocolVersion: string\n\n constructor(opts: ConnectBrowserMcpOptions) {\n this.endpoint = opts.endpoint\n this.headers = opts.headers ?? {}\n this.protocolVersion = opts.protocolVersion ?? PROTOCOL_VERSION\n }\n\n async initialize(): Promise<void> {\n const res = await this.post({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"initialize\",\n params: {\n protocolVersion: this.protocolVersion,\n capabilities: {},\n clientInfo: { name: \"corpus-cli\", version: \"0.1.0\" },\n },\n })\n // initialized notification (no id, no response expected)\n await this.post(\n { jsonrpc: \"2.0\", method: \"notifications/initialized\", params: {} },\n { expectResponse: false }\n )\n if (res?.error) {\n throw new Error(`initialize failed: ${JSON.stringify(res.error)}`)\n }\n }\n\n async callTool(args: {\n name: string\n arguments: Record<string, unknown>\n }): Promise<{ content?: unknown; structuredContent?: unknown; isError?: boolean }> {\n const res = await this.post({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"tools/call\",\n params: { name: args.name, arguments: args.arguments },\n })\n if (res?.error) {\n throw new Error(`tools/call ${args.name} failed: ${JSON.stringify(res.error)}`)\n }\n const parsed = CALL_RESULT.safeParse(res?.result ?? {})\n return parsed.success ? parsed.data : {}\n }\n\n private async post(\n body: Record<string, unknown>,\n opts: { expectResponse?: boolean } = {}\n ): Promise<{ result?: unknown; error?: unknown } | null> {\n const res = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n ...(this.sessionId ? { \"mcp-session-id\": this.sessionId } : {}),\n ...this.headers,\n },\n body: JSON.stringify(body),\n })\n\n const sid = res.headers.get(\"mcp-session-id\")\n if (sid) this.sessionId = sid\n\n if (opts.expectResponse === false) return null\n if (!res.ok) {\n throw new Error(`MCP HTTP ${res.status} ${res.statusText}`)\n }\n return parseRpcResponse(await res.text(), res.headers.get(\"content-type\"))\n }\n}\n\n/** Handle both a single JSON body and SSE (`event:`/`data:`) framing. */\nfunction parseRpcResponse(\n text: string,\n contentType: string | null\n): { result?: unknown; error?: unknown } | null {\n if (!text.trim()) return null\n const isSse = (contentType ?? \"\").includes(\"text/event-stream\")\n if (!isSse) {\n const parsed = RPC_RESPONSE.safeParse(JSON.parse(text))\n return parsed.success ? parsed.data : null\n }\n // SSE: take the last `data:` line that parses to a JSON-RPC response.\n let last: { result?: unknown; error?: unknown } | null = null\n for (const line of text.split(\"\\n\")) {\n const trimmed = line.trim()\n if (!trimmed.startsWith(\"data:\")) continue\n const payload = trimmed.slice(\"data:\".length).trim()\n if (!payload || payload === \"[DONE]\") continue\n try {\n last = JSON.parse(payload)\n } catch {\n // skip non-JSON data frames\n }\n }\n return last\n}\n","/**\n * `corpus import-web [workspace]` — import a list of URLs into the\n * corpus workspace as AIP-10 sources + discovered candidates, fetching\n * each URL's text through the user's authenticated browser.\n *\n * corpus import-web ./corpora/recruiting \\\n * --urls-file ./urls.txt \\\n * --browser-mcp http://127.0.0.1:9223/mcp \\\n * --tags recruiting --lang en\n *\n * Pipeline: WebImporter (FetcherPort ← BrowserMcpFetcher) → ImporterRunner\n * writes `sources/web/<batch>/<slug>.md` + appends `_candidates.yaml`.\n * Pushing the resulting candidates into a knowledge engine (RAG) is the\n * SEPARATE corpus promote/WriterPort step — not this command.\n *\n * The only external connection is the chrome-devtools-mcp browser\n * endpoint; everything else is local filesystem.\n */\n\nimport { readFile, readdir } from \"node:fs/promises\"\nimport type { Dirent } from \"node:fs\"\nimport { z } from \"zod\"\n\n/** Source frontmatter — just the URL provenance used for resume de-dup. */\nconst SOURCE_URL_FRONTMATTER = z\n .object({\n metadata: z\n .object({\n corpus: z\n .object({\n originalUrl: z.string().optional().catch(undefined),\n importerSourceUrl: z.string().optional().catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\nimport { join } from \"node:path\"\nimport matter from \"gray-matter\"\nimport {\n ImporterRunner,\n WebImporter,\n systemClock,\n} from \"@agentproto/corpus\"\nimport type { FetcherPort } from \"@agentproto/corpus\"\nimport {\n BrowserMcpFetcher,\n type BrowserMcpLike,\n} from \"../ports/browser-fetcher.adapter.js\"\nimport { ScrapeMcpFetcher } from \"../ports/scrape-mcp-fetcher.adapter.js\"\nimport { YtDlpWhisperFetcher } from \"../ports/ytdlp-whisper-fetcher.adapter.js\"\nimport { OpenAiWhisperStt, type SttPort } from \"../ports/stt.port.js\"\nimport { AssemblyAiStt } from \"../ports/assemblyai-stt.adapter.js\"\nimport { ChunkedStt } from \"../ports/chunked-stt.adapter.js\"\nimport { HttpReadabilityFetcher } from \"../ports/http-readability-fetcher.adapter.js\"\nimport { CompositeFetcher } from \"../ports/composite-fetcher.js\"\nimport { ThrottleFetcher } from \"../ports/throttle-fetcher.adapter.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { OsIdentityAdapter } from \"../ports/os-identity.adapter.js\"\nimport { connectBrowserMcp } from \"../ports/browser-mcp-connect.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\ninterface ParsedArgs {\n workspace: string | undefined\n urlsFile: string | undefined\n urls: string[]\n tags: string[]\n lang: string | undefined\n max: number | undefined\n maxDurationSec: number | undefined\n cookiesFromBrowser: string | undefined\n cookiesFile: string | undefined\n throttleMs: number\n force: boolean\n diarize: boolean\n browserMcp: string | undefined\n scrapeMcp: string | undefined\n importerId: string\n dryRun: boolean\n}\n\nfunction parse(args: readonly string[]): ParsedArgs {\n const out: ParsedArgs = {\n workspace: undefined,\n urlsFile: undefined,\n urls: [],\n tags: [],\n lang: undefined,\n max: undefined,\n maxDurationSec: undefined,\n cookiesFromBrowser: undefined,\n cookiesFile: undefined,\n throttleMs: 2000,\n force: false,\n diarize: false,\n browserMcp: process.env.BROWSER_MCP_URL,\n scrapeMcp: process.env.SCRAPE_MCP_URL,\n importerId: \"web\",\n dryRun: false,\n }\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--urls-file\": out.urlsFile = next(); break\n case \"--url\": { const v = next(); if (v) out.urls.push(v); break }\n case \"--tags\": { const v = next(); if (v) out.tags.push(...v.split(\",\").map(s => s.trim()).filter(Boolean)); break }\n case \"--lang\": out.lang = next(); break\n case \"--max\": { const v = next(); if (v) out.max = Number(v); break }\n case \"--max-duration\": { const v = next(); if (v) out.maxDurationSec = Number(v); break }\n case \"--cookies-from-browser\": out.cookiesFromBrowser = next(); break\n case \"--cookies\": out.cookiesFile = next(); break\n case \"--throttle\": { const v = next(); if (v) out.throttleMs = Number(v); break }\n case \"--force\": out.force = true; break\n case \"--diarize\": out.diarize = true; break\n case \"--browser-mcp\": out.browserMcp = next(); break\n case \"--scrape-mcp\": out.scrapeMcp = next(); break\n case \"--importer-id\": out.importerId = next() ?? \"web\"; break\n case \"--dry-run\": out.dryRun = true; break\n default:\n if (!a.startsWith(\"-\") && out.workspace === undefined) out.workspace = a\n }\n }\n return out\n}\n\nasync function readUrls(parsed: ParsedArgs): Promise<string[]> {\n const fromFile: string[] = []\n if (parsed.urlsFile) {\n const raw = await readFile(parsed.urlsFile, \"utf-8\")\n for (const line of raw.split(\"\\n\")) {\n const url = line.trim()\n // Tolerate \"Title — https://…\" lines (the brief's format): take the URL.\n const m = url.match(/https?:\\/\\/\\S+/)\n if (m) fromFile.push(m[0])\n }\n }\n // Dedupe input while preserving order.\n const seen = new Set<string>()\n return [...fromFile, ...parsed.urls].filter(u => (seen.has(u) ? false : seen.add(u)))\n}\n\n/**\n * Scan already-ingested source URLs from the workspace — the corpus is\n * the source of truth for \"what's done\". Reads every `sources/**/*.md`\n * frontmatter and collects `metadata.corpus.originalUrl`. Re-running\n * import-web skips these, so batching is just \"re-run with --max N until\n * empty\" — resumable by construction, no separate state file.\n */\nasync function scanIngestedUrls(workspaceRoot: string): Promise<Set<string>> {\n const seen = new Set<string>()\n const sourcesDir = join(workspaceRoot, \"sources\")\n let entries: Dirent[]\n try {\n entries = await readdir(sourcesDir, {\n recursive: true,\n withFileTypes: true,\n })\n } catch {\n return seen // no sources/ yet\n }\n for (const e of entries) {\n if (!e.isFile() || !e.name.endsWith(\".md\")) continue\n try {\n const raw = await readFile(join(e.parentPath, e.name), \"utf-8\")\n const fm = SOURCE_URL_FRONTMATTER.parse(matter(raw).data)\n const url =\n fm.metadata?.corpus?.originalUrl ?? fm.metadata?.corpus?.importerSourceUrl\n if (url) seen.add(url)\n } catch {\n // unreadable / non-frontmatter file — ignore\n }\n }\n return seen\n}\n\nexport async function runImportWeb(args: readonly string[]): Promise<ExitCode> {\n const parsed = parse(args)\n const target = resolveWorkspacePath(parsed.workspace)\n const urls = await readUrls(parsed)\n\n if (urls.length === 0) {\n return fail(\"import-web requires --urls-file <path> and/or one or more --url <u>.\", 2)\n }\n\n // Resume: skip URLs already ingested (their source records originalUrl).\n // --force re-fetches everything.\n const done = parsed.force ? new Set<string>() : await scanIngestedUrls(target)\n const todo = urls.filter(u => !done.has(u))\n const batch = parsed.max !== undefined ? todo.slice(0, parsed.max) : todo\n const remaining = todo.length - batch.length\n\n const plan =\n ` workspace: ${target}\\n` +\n ` urls: ${urls.length} total · ${done.size && !parsed.force ? `${urls.length - todo.length} already ingested · ` : \"\"}${todo.length} to do\\n` +\n ` this run: ${batch.length}${parsed.max !== undefined ? ` (--max ${parsed.max})` : \"\"} · ${remaining} remaining after\\n` +\n ` video stt: ${parsed.diarize ? \"AssemblyAI (speaker-labelled)\" : \"Whisper\"}\\n` +\n ` throttle: ${parsed.throttleMs} ms between fetches\\n`\n\n if (batch.length === 0) {\n process.stdout.write(`import-web → ${target}\\n nothing to do — all ${urls.length} URLs already ingested.\\n`)\n return 0\n }\n\n if (parsed.dryRun) {\n process.stdout.write(`import-web (dry run)\\n${plan}`)\n for (const u of batch.slice(0, 20)) process.stdout.write(` - ${u}\\n`)\n if (batch.length > 20) process.stdout.write(` … +${batch.length - 20} more\\n`)\n return 0\n }\n process.stdout.write(`import-web\\n${plan}`)\n\n // Build the fetcher chain (first non-null wins):\n // 1. videos → yt-dlp audio → Whisper (captions-independent; needs OPENAI_API_KEY)\n // 2. articles→ authed browser readability (only if --browser-mcp given)\n // 3. articles→ plain HTTP readability (browser-free fallback)\n const chain: FetcherPort[] = []\n\n // Pick the video STT: --diarize → AssemblyAI (speaker-labelled, for\n // multi-speaker interviews/panels), else OpenAI Whisper (flat, cheaper,\n // faster). Both satisfy SttPort, so the fetcher is identical.\n let stt: SttPort | undefined\n if (parsed.diarize) {\n const aaiKey = process.env.ASSEMBLYAI_API_KEY\n if (aaiKey) stt = new AssemblyAiStt({ apiKey: aaiKey })\n else\n process.stderr.write(\n \"corpus: --diarize needs ASSEMBLYAI_API_KEY — video URLs will be skipped.\\n\"\n )\n } else {\n const openaiKey = process.env.OPENAI_API_KEY\n // Wrap Whisper in ChunkedStt so multi-hour media (full courses,\n // masterclasses) gets ffmpeg-segmented under the 25 MB cap instead of\n // being rejected. AssemblyAI has no such cap, so it stays unwrapped.\n if (openaiKey)\n stt = new ChunkedStt({ base: new OpenAiWhisperStt({ apiKey: openaiKey }) })\n else\n process.stderr.write(\n \"corpus: OPENAI_API_KEY not set — video URLs will be skipped (no transcription).\\n\"\n )\n }\n if (stt)\n chain.push(\n new YtDlpWhisperFetcher({\n stt,\n ...(parsed.maxDurationSec\n ? { maxDurationSec: parsed.maxDurationSec }\n : {}),\n ...(parsed.cookiesFromBrowser\n ? { cookiesFromBrowser: parsed.cookiesFromBrowser }\n : {}),\n ...(parsed.cookiesFile ? { cookiesFile: parsed.cookiesFile } : {}),\n })\n )\n\n // A `scrape` MCP server (e.g. the browser project's tiered router) handles\n // walled / JS-rendered pages with stealth + auto-escalation and returns\n // clean Markdown. Sits ahead of the cheaper fallbacks.\n if (parsed.scrapeMcp) {\n try {\n const client = await connectBrowserMcp({ endpoint: parsed.scrapeMcp })\n chain.push(new ScrapeMcpFetcher({ client }))\n } catch (e) {\n return fail(`could not connect to scrape MCP at ${parsed.scrapeMcp}: ${msg(e)}`, 1)\n }\n }\n\n if (parsed.browserMcp) {\n let browser: BrowserMcpLike\n try {\n browser = await connectBrowserMcp({ endpoint: parsed.browserMcp })\n chain.push(new BrowserMcpFetcher({ browser }))\n } catch (e) {\n return fail(`could not connect to browser MCP at ${parsed.browserMcp}: ${msg(e)}`, 1)\n }\n }\n\n // Browser-free article fallback always available.\n chain.push(new HttpReadabilityFetcher())\n\n if (chain.length === 0) {\n return fail(\"no fetchers available — set OPENAI_API_KEY (videos) and/or --browser-mcp.\", 2)\n }\n\n const fetcher = new ThrottleFetcher(new CompositeFetcher(chain), {\n minIntervalMs: parsed.throttleMs,\n })\n const importer = new WebImporter({ fetcher })\n\n const runner = new ImporterRunner({\n // The fs is rooted AT the workspace, so corpus paths are relative to\n // it — workspacePath is \"\" (root), NOT the absolute target (which\n // would double-nest under the fs root).\n fs: new NodeFsAdapter({ root: target }),\n clock: systemClock,\n identity: new OsIdentityAdapter({ workspaceRoot: target }),\n workspacePath: \"\",\n })\n\n let report\n try {\n report = await runner.run(importer, {\n importerId: parsed.importerId,\n config: {\n urls: batch,\n ...(parsed.tags.length ? { tags: parsed.tags } : {}),\n ...(parsed.lang ? { language: parsed.lang } : {}),\n },\n })\n } catch (e) {\n return fail(`import failed: ${msg(e)}`, 1)\n }\n\n process.stdout.write(\n `import-web → ${target}\\n` +\n ` batch: ${report.batchId}\\n` +\n ` archived: ${report.archivedSlugs.length}\\n` +\n ` duplicates: ${report.duplicateSlugs.length}\\n` +\n ` candidates: ${report.candidateIds.length}\\n`\n )\n for (const w of report.warnings.slice(0, 20)) process.stdout.write(` ! ${w}\\n`)\n process.stdout.write(\n `\\nNext: review candidates, then promote them — promotion pushes chunks into the\\n` +\n `knowledge engine (RAG) via the WriterPort. Import only stages the sources.\\n`\n )\n return 0\n}\n\nfunction msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e)\n}\n","/**\n * AnthropicDistiller — a DistillPort backed by Claude over the Messages API.\n * Extracts refined AIP-10 items (principle/pattern/critique/summary/example)\n * from a raw source. Returns self-contained insights, not quote dumps.\n *\n * Hand-rolled over the HTTP API (no SDK dep), mirroring the other corpus-cli\n * port adapters. Prompt + parse are the shared `distill-prompt` core; this\n * adapter owns only the metered-API transport. For the subscription-billed\n * alternative see CliAgentDistiller + the `claude-code` engine.\n */\n\nimport { z } from \"zod\"\nimport type { DistillPort, DistillInput, DistilledItem } from \"@agentproto/corpus\"\nimport { buildDistillPrompt, parseItems } from \"./distill-prompt.js\"\nimport type { DistillUsage } from \"./usage-telemetry.js\"\n\n/** The Messages API response — text content blocks plus model + token usage. */\nconst ANTHROPIC_RESPONSE = z\n .object({\n model: z.string().optional(),\n content: z\n .array(z.object({ type: z.string(), text: z.string().optional() }).loose())\n .optional(),\n usage: z\n .object({ input_tokens: z.number(), output_tokens: z.number() })\n .loose()\n .optional(),\n })\n .loose()\n\nexport interface AnthropicDistillerOptions {\n readonly apiKey: string\n /** Default a current Claude model id. */\n readonly model?: string\n readonly baseUrl?: string\n /** Max refined items to extract per source. */\n readonly maxItems?: number\n /** Optional sink for per-call token usage (cost + Langfuse export). */\n readonly onUsage?: (usage: DistillUsage) => void\n}\n\nexport class AnthropicDistiller implements DistillPort {\n private readonly apiKey: string\n private readonly model: string\n private readonly baseUrl: string\n private readonly maxItems: number\n private readonly onUsage: ((usage: DistillUsage) => void) | undefined\n\n constructor(opts: AnthropicDistillerOptions) {\n this.apiKey = opts.apiKey\n this.model = opts.model ?? \"claude-sonnet-4-6\"\n this.baseUrl = (opts.baseUrl ?? \"https://api.anthropic.com/v1\").replace(/\\/+$/, \"\")\n this.maxItems = opts.maxItems ?? 8\n this.onUsage = opts.onUsage\n }\n\n async distill(input: DistillInput): Promise<readonly DistilledItem[]> {\n const prompt = buildDistillPrompt(input, this.maxItems)\n const startedAt = new Date().toISOString()\n const res = await fetch(`${this.baseUrl}/messages`, {\n method: \"POST\",\n headers: {\n \"x-api-key\": this.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: 4096,\n messages: [{ role: \"user\", content: prompt }],\n }),\n })\n if (!res.ok) {\n throw new Error(`Anthropic distill ${res.status}: ${(await res.text()).slice(0, 200)}`)\n }\n const parsed = ANTHROPIC_RESPONSE.safeParse(await res.json())\n const text = parsed.success\n ? (parsed.data.content ?? []).find(c => c.type === \"text\")?.text ?? \"\"\n : \"\"\n if (parsed.success && parsed.data.usage && this.onUsage) {\n this.onUsage({\n model: parsed.data.model ?? this.model,\n inputTokens: parsed.data.usage.input_tokens,\n outputTokens: parsed.data.usage.output_tokens,\n label: input.title,\n startedAt,\n endedAt: new Date().toISOString(),\n })\n }\n return parseItems(text)\n }\n}\n","/**\n * CliAgentDistiller — a DistillPort backed by any local agent CLI running in\n * one-shot mode (prompt on stdin, response on stdout). The transport is generic;\n * the per-CLI specifics (command, argv, output parse) come from a CliEngine\n * descriptor, so claude / gemini / goose / … are one descriptor each.\n *\n * Same DistillPort contract + same prompt/parse as AnthropicDistiller (both use\n * the shared `distill-prompt` core), so the two are drop-in swappable behind the\n * `corpus distill --engine` flag.\n *\n * TRADE-OFFS vs the metered API:\n * - Subscription rate caps — slower for big batches; pace with --throttle and\n * let the runner skip+retry on non-zero exits.\n * - Output is CLI text, not API structured output — same tolerant parse.\n * - One process spawn per source — higher per-call overhead than fetch().\n */\n\nimport { tmpdir } from \"node:os\"\nimport { spawnWithStdin } from \"@agentproto/cli-exec\"\nimport type { DistillPort, DistillInput, DistilledItem } from \"@agentproto/corpus\"\nimport { buildDistillPrompt, parseItems } from \"./distill-prompt.js\"\nimport type { CliEngine } from \"./cli-engines.js\"\n\nexport interface CliAgentDistillerOptions {\n /** The CLI engine descriptor (command + argv + output parse). */\n readonly engine: CliEngine\n /** Optional model override passed to the engine, e.g. \"haiku\" to spend less quota. */\n readonly model?: string\n /** Max refined items per source (feeds the shared prompt). */\n readonly maxItems?: number\n /** Hard per-source timeout; kills a wedged CLI call. Default 120s. */\n readonly timeoutMs?: number\n /** Working dir. Default os.tmpdir() — neutral, no project CLAUDE.md / repo. */\n readonly cwd?: string\n}\n\nexport class CliAgentDistiller implements DistillPort {\n private readonly engine: CliEngine\n private readonly model?: string\n private readonly maxItems: number\n private readonly timeoutMs: number\n private readonly cwd: string\n\n constructor(opts: CliAgentDistillerOptions) {\n this.engine = opts.engine\n this.model = opts.model\n this.maxItems = opts.maxItems ?? 8\n this.timeoutMs = opts.timeoutMs ?? 120_000\n this.cwd = opts.cwd ?? tmpdir()\n }\n\n async distill(input: DistillInput): Promise<readonly DistilledItem[]> {\n const prompt = buildDistillPrompt(input, this.maxItems)\n // A non-zero exit (often a rate cap) rejects here; the runner skips + retries\n // the source on the next pass.\n const stdout = await spawnWithStdin({\n command: this.engine.command,\n args: this.engine.buildArgs({ ...(this.model ? { model: this.model } : {}) }),\n stdin: prompt,\n cwd: this.cwd,\n timeoutMs: this.timeoutMs,\n })\n const text = this.engine.parseOutput(stdout) ?? stdout\n return parseItems(text)\n }\n}\n","/**\n * CLI agent engines — descriptors for distilling through a local agent CLI in\n * headless one-shot mode (prompt on stdin, response on stdout), instead of a\n * metered API. Each engine declares its `command`, how to `buildArgs` (model\n * injection, output format, tool/MCP lockdown), and how to `parseOutput` of the\n * captured stdout into the model's text.\n *\n * WHY: distillation is a high-volume batch (hundreds of sources × ~8 items). On\n * the API that bills per token; routed through an authenticated agent-CLI\n * subscription (e.g. Claude Max) it draws on a flat monthly plan — ~$0 marginal\n * cost. Same DistillPort contract + same prompt/parse, swappable transport.\n *\n * Engines register full descriptors and are dispatched by id (no `engineId ===`\n * branching at the call site). Add a CLI by adding a descriptor below; gemini /\n * goose / codex etc. each become one entry.\n */\n\nimport { parseClaudeJsonOutput } from \"@agentproto/cli-exec\"\n\n/** What a CLI engine needs to drive one stdin→stdout completion. */\nexport interface CliEngine {\n /** Stable id, used by `corpus distill --engine <id>`. */\n readonly id: string\n /** Whether this engine bills a subscription (no API key needed). Surfaced in help. */\n readonly subscriptionBilled: boolean\n /** Executable to invoke — must be on PATH and logged in. */\n readonly command: string\n /** Build the argv for one completion. The prompt is fed over stdin, not argv. */\n buildArgs(opts: { readonly model?: string }): string[]\n /** Extract the model's text from captured stdout; null → fall back to raw stdout. */\n parseOutput(stdout: string): string | null\n}\n\n/**\n * Claude Code in headless print mode, billed against the logged-in subscription.\n *\n * Flags (verified against `claude -p --help`):\n * -p non-interactive print mode\n * --output-format json single-result JSON envelope ({ result, is_error, … })\n * --strict-mcp-config ignore all MCP servers (no --mcp-config ⇒ none load)\n * --model <m> optional alias (\"haiku\"/\"sonnet\") or full id\n * Deliberately NOT --bare: that flag forces ANTHROPIC_API_KEY auth and never\n * reads OAuth/keychain — which would bypass the subscription we're here to use.\n * Pair with cwd=os.tmpdir() (CliAgentDistiller default) so no project CLAUDE.md\n * is auto-discovered and the agent can't wander a repo.\n */\nconst CLAUDE_CODE: CliEngine = {\n id: \"claude-code\",\n subscriptionBilled: true,\n command: \"claude\",\n buildArgs: ({ model }) => [\n \"-p\",\n \"--output-format\",\n \"json\",\n \"--strict-mcp-config\",\n ...(model ? [\"--model\", model] : []),\n ],\n parseOutput: parseClaudeJsonOutput,\n}\n\n/** Registry of CLI engines, keyed by id. */\nexport const CLI_ENGINES: Readonly<Record<string, CliEngine>> = {\n [CLAUDE_CODE.id]: CLAUDE_CODE,\n}\n","/**\n * Usage telemetry for the metered distill path — cost visibility + optional\n * Langfuse export. SDK-free (raw fetch to Langfuse's ingestion API), mirroring\n * the distiller's own no-client-lib ethos and keeping corpus-cli lean.\n *\n * Two outputs, both best-effort (telemetry must never break a distill run):\n * 1. a per-run cost summary printed to stderr (always);\n * 2. one Langfuse trace with a GENERATION observation per LLM call, when\n * LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY (+ LANGFUSE_BASE_URL) are set.\n *\n * Langfuse runs (test/prod/local) share one project, filtered by the\n * `environment` tag (LANGFUSE_TRACING_ENVIRONMENT) — same convention as the\n * Mastra agent tracing in @agstudio/agent-framework.\n */\n\nimport { randomUUID } from \"node:crypto\"\n\n/** One metered LLM call's usage, reported by a distiller. */\nexport interface DistillUsage {\n /** Model id as returned by the API (falls back to the requested model). */\n readonly model: string\n readonly inputTokens: number\n readonly outputTokens: number\n /** Human label for the call — the source title. */\n readonly label: string\n readonly startedAt: string\n readonly endedAt: string\n}\n\n/** A sink a distiller calls once per metered LLM call. `flush` ships + reports. */\nexport interface UsageSink {\n record(usage: DistillUsage): void\n flush(): Promise<void>\n}\n\n/** USD per million tokens, matched by model-id substring. Estimate only — */\n/** Langfuse prices authoritatively from its own model table when exporting. */\nconst PRICING: ReadonlyArray<{\n readonly match: string\n readonly inPerM: number\n readonly outPerM: number\n}> = [\n { match: \"opus\", inPerM: 15, outPerM: 75 },\n { match: \"haiku\", inPerM: 1, outPerM: 5 },\n { match: \"sonnet\", inPerM: 3, outPerM: 15 },\n]\n\nfunction priceFor(model: string): { inPerM: number; outPerM: number } {\n const m = model.toLowerCase()\n return PRICING.find(p => m.includes(p.match)) ?? { inPerM: 3, outPerM: 15 }\n}\n\nfunction costUsd(u: DistillUsage): { input: number; output: number; total: number } {\n const { inPerM, outPerM } = priceFor(u.model)\n const input = (u.inputTokens / 1_000_000) * inPerM\n const output = (u.outputTokens / 1_000_000) * outPerM\n return { input, output, total: input + output }\n}\n\ninterface LangfuseConfig {\n readonly baseUrl: string\n readonly publicKey: string\n readonly secretKey: string\n readonly environment: string | undefined\n}\n\nfunction readLangfuseConfig(): LangfuseConfig | undefined {\n const publicKey = process.env.LANGFUSE_PUBLIC_KEY\n const secretKey = process.env.LANGFUSE_SECRET_KEY\n if (!publicKey || !secretKey) return undefined\n return {\n baseUrl: (process.env.LANGFUSE_BASE_URL ?? \"https://cloud.langfuse.com\").replace(/\\/+$/, \"\"),\n publicKey,\n secretKey,\n environment: process.env.LANGFUSE_TRACING_ENVIRONMENT,\n }\n}\n\nconst fmt = (n: number) => n.toLocaleString(\"en-US\")\nconst usd = (n: number) => `$${n.toFixed(n < 1 ? 4 : 2)}`\n\n/**\n * Build a usage sink. Pass a `runName` (e.g. the workspace) for the Langfuse\n * trace name. Langfuse export is enabled automatically when its env keys exist.\n */\nexport function createUsageSink(opts: { runName: string }): UsageSink {\n const records: DistillUsage[] = []\n const lf = readLangfuseConfig()\n\n async function shipToLangfuse(cfg: LangfuseConfig, traceId: string): Promise<number> {\n const auth = Buffer.from(`${cfg.publicKey}:${cfg.secretKey}`).toString(\"base64\")\n const now = new Date().toISOString()\n const batch: unknown[] = [\n {\n id: randomUUID(),\n type: \"trace-create\",\n timestamp: now,\n body: {\n id: traceId,\n name: `corpus-distill: ${opts.runName}`,\n timestamp: now,\n ...(cfg.environment ? { environment: cfg.environment } : {}),\n metadata: { tool: \"corpus-cli\", phase: \"distill\", calls: records.length },\n },\n },\n ...records.map(u => {\n const c = costUsd(u)\n return {\n id: randomUUID(),\n type: \"generation-create\",\n timestamp: u.endedAt,\n body: {\n id: randomUUID(),\n traceId,\n type: \"GENERATION\",\n name: u.label,\n model: u.model,\n startTime: u.startedAt,\n endTime: u.endedAt,\n ...(cfg.environment ? { environment: cfg.environment } : {}),\n usage: {\n input: u.inputTokens,\n output: u.outputTokens,\n total: u.inputTokens + u.outputTokens,\n unit: \"TOKENS\",\n inputCost: c.input,\n outputCost: c.output,\n totalCost: c.total,\n },\n },\n }\n }),\n ]\n const res = await fetch(`${cfg.baseUrl}/api/public/ingestion`, {\n method: \"POST\",\n headers: { authorization: `Basic ${auth}`, \"content-type\": \"application/json\" },\n body: JSON.stringify({ batch }),\n })\n if (!res.ok) {\n throw new Error(`${res.status}: ${(await res.text()).slice(0, 160)}`)\n }\n return records.length\n }\n\n return {\n record(u) {\n records.push(u)\n },\n async flush() {\n if (records.length === 0) return\n\n // Per-model rollup for the stderr summary.\n const byModel = new Map<\n string,\n { input: number; output: number; cost: number; calls: number }\n >()\n let grandTotal = 0\n for (const u of records) {\n const c = costUsd(u)\n grandTotal += c.total\n const m = byModel.get(u.model) ?? { input: 0, output: 0, cost: 0, calls: 0 }\n m.input += u.inputTokens\n m.output += u.outputTokens\n m.cost += c.total\n m.calls += 1\n byModel.set(u.model, m)\n }\n\n process.stderr.write(`\\nusage — ${records.length} metered call(s):\\n`)\n for (const [model, m] of byModel) {\n process.stderr.write(\n ` ${model} ${m.calls} call(s) · in ${fmt(m.input)} · out ${fmt(m.output)} · ~${usd(m.cost)} est.\\n`\n )\n }\n process.stderr.write(` total ~${usd(grandTotal)} est.\\n`)\n\n if (!lf) {\n process.stderr.write(\n \" langfuse: not configured (set LANGFUSE_PUBLIC_KEY / LANGFUSE_SECRET_KEY to export traces).\\n\"\n )\n return\n }\n const traceId = randomUUID()\n try {\n const n = await shipToLangfuse(lf, traceId)\n process.stderr.write(\n ` langfuse: shipped ${n} generation(s) → trace ${traceId}` +\n `${lf.environment ? ` (env: ${lf.environment})` : \"\"}\\n`\n )\n } catch (e) {\n process.stderr.write(\n ` langfuse: export failed — ${e instanceof Error ? e.message : String(e)}\\n`\n )\n }\n },\n }\n}\n","/**\n * `corpus distill [workspace]` — raw sources → refined AIP-10 entries.\n *\n * corpus distill <ws> [--engine id] [--source <id>] [--max n] [--throttle ms] [--model m]\n *\n * Reads sources/**/*.md, distills each via the selected engine into refined\n * entries (principle/pattern/critique/summary/example) written under entries/,\n * each carrying `sources: [<sourceId>]` (provenance) + inherited `access`.\n * Resumable: skips sources that already have entries derived from them.\n *\n * Engines (`--engine`, default `anthropic-api`):\n * anthropic-api metered Messages API (needs ANTHROPIC_API_KEY)\n * claude-code local `claude` CLI, billed against the logged-in subscription\n * (no API key) — cheaper for large batches, subject to rate caps\n */\n\nimport { readFile, readdir } from \"node:fs/promises\"\nimport type { Dirent } from \"node:fs\"\nimport { basename, join } from \"node:path\"\nimport { z } from \"zod\"\n\n/** Lenient zod view of a source's frontmatter (each field degrades to undefined). */\nconst SOURCE_FRONTMATTER = z\n .object({\n id: z.string().optional().catch(undefined),\n title: z.string().optional().catch(undefined),\n tags: z.array(z.string()).optional().catch(undefined),\n language: z.string().optional().catch(undefined),\n metadata: z\n .object({\n corpus: z\n .object({\n access: z.string().optional().catch(undefined),\n domain: z.string().optional().catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\n .optional()\n .catch(undefined),\n })\n .loose()\n\n/** An entry's `sources:` provenance — used to mark a source already distilled. */\nconst ENTRY_SOURCES_FRONTMATTER = z\n .object({ sources: z.array(z.string()).optional().catch(undefined) })\n .loose()\nimport matter from \"gray-matter\"\nimport {\n DistillRunner,\n systemClock,\n type DistillSource,\n type DistillPort,\n type EntryLayout,\n} from \"@agentproto/corpus\"\nimport { AnthropicDistiller } from \"../ports/anthropic-distiller.js\"\nimport { CliAgentDistiller } from \"../ports/cli-agent-distiller.js\"\nimport { CLI_ENGINES } from \"../ports/cli-engines.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { createUsageSink, type DistillUsage } from \"../ports/usage-telemetry.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nconst DEFAULT_ENGINE = \"anthropic-api\"\n\n/**\n * Read the corpus's preferred entry layout from KNOWLEDGE.md\n * (`metadata.corpus.entryLayout: flat | dated`). Absent / unreadable → undefined\n * (the runner defaults to \"dated\"). Lives in freeform `metadata`, so no spec change.\n */\nasync function readEntryLayout(target: string): Promise<EntryLayout | undefined> {\n try {\n const raw = await readFile(join(target, \"KNOWLEDGE.md\"), \"utf8\")\n const layout = (matter(raw).data as Record<string, unknown>)?.metadata\n const corpus = (layout as Record<string, unknown> | undefined)?.[\"corpus\"] as\n | Record<string, unknown>\n | undefined\n const v = corpus?.[\"entryLayout\"]\n return v === \"flat\" || v === \"dated\" ? v : undefined\n } catch {\n return undefined\n }\n}\n\n/** A selectable distill engine: whether it needs an API key + how to build it. */\ninterface DistillerEngine {\n readonly id: string\n readonly needsApiKey: boolean\n create(opts: {\n apiKey?: string\n model?: string\n onUsage?: (usage: DistillUsage) => void\n }): DistillPort\n}\n\n/**\n * Engine registry — the metered API plus every CLI engine, dispatched by id (no\n * `engine === \"...\"` branching at the call site). Add a CLI engine in\n * cli-engines.ts and it appears here automatically.\n */\nconst DISTILLER_ENGINES: Readonly<Record<string, DistillerEngine>> = {\n [DEFAULT_ENGINE]: {\n id: DEFAULT_ENGINE,\n needsApiKey: true,\n create: ({ apiKey, model, onUsage }) =>\n new AnthropicDistiller({\n apiKey: apiKey!,\n ...(model ? { model } : {}),\n ...(onUsage ? { onUsage } : {}),\n }),\n },\n ...Object.fromEntries(\n Object.values(CLI_ENGINES).map(engine => [\n engine.id,\n {\n id: engine.id,\n needsApiKey: false,\n create: ({ model }) =>\n new CliAgentDistiller({ engine, ...(model ? { model } : {}) }),\n } satisfies DistillerEngine,\n ])\n ),\n}\n\ninterface ParsedArgs {\n workspace: string | undefined\n sourceId: string | undefined\n max: number | undefined\n throttleMs: number\n model: string | undefined\n engine: string\n}\n\nfunction parse(args: readonly string[]): ParsedArgs {\n const out: ParsedArgs = {\n workspace: undefined,\n sourceId: undefined,\n max: undefined,\n throttleMs: 1000,\n model: undefined,\n engine: DEFAULT_ENGINE,\n }\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--source\": out.sourceId = next(); break\n case \"--max\": { const v = next(); if (v) out.max = Number(v); break }\n case \"--throttle\": { const v = next(); if (v) out.throttleMs = Number(v); break }\n case \"--model\": out.model = next(); break\n case \"--engine\": { const v = next(); if (v) out.engine = v; break }\n default:\n if (!a.startsWith(\"-\") && out.workspace === undefined) out.workspace = a\n }\n }\n return out\n}\n\ninterface RawSource extends DistillSource {\n readonly path: string\n}\n\n/** Parse every sources/**/*.md into a DistillSource. */\nasync function readSources(root: string): Promise<RawSource[]> {\n const dir = join(root, \"sources\")\n let entries: Dirent[]\n try {\n entries = await readdir(dir, { recursive: true, withFileTypes: true })\n } catch {\n return []\n }\n const out: RawSource[] = []\n for (const e of entries) {\n if (!e.isFile() || !e.name.endsWith(\".md\")) continue\n const path = join(e.parentPath, e.name)\n try {\n const parsed = matter(await readFile(path, \"utf-8\"))\n const fm = SOURCE_FRONTMATTER.parse(parsed.data)\n if (!fm.id || !parsed.content.trim()) continue\n out.push({\n path,\n id: fm.id,\n title: fm.title ?? fm.id,\n body: parsed.content.trim(),\n ...(fm.tags ? { tags: fm.tags } : {}),\n ...(fm.metadata?.corpus?.access ? { access: fm.metadata.corpus.access } : {}),\n ...(fm.metadata?.corpus?.domain ? { domain: fm.metadata.corpus.domain } : {}),\n })\n } catch {\n // skip unreadable / non-frontmatter\n }\n }\n return out\n}\n\n/** Source ids that already have at least one entry derived from them. */\nasync function scanDistilledSourceIds(root: string): Promise<Set<string>> {\n const seen = new Set<string>()\n const dir = join(root, \"entries\")\n let entries: Dirent[]\n try {\n entries = await readdir(dir, { recursive: true, withFileTypes: true })\n } catch {\n return seen\n }\n for (const e of entries) {\n if (!e.isFile() || !e.name.endsWith(\".md\")) continue\n try {\n const fm = ENTRY_SOURCES_FRONTMATTER.parse(\n matter(await readFile(join(e.parentPath, e.name), \"utf-8\")).data\n )\n if (fm.sources) for (const s of fm.sources) seen.add(s)\n } catch {\n /* ignore */\n }\n }\n return seen\n}\n\nconst sleep = (ms: number) => new Promise(r => setTimeout(r, ms))\n\nexport async function runDistill(args: readonly string[]): Promise<ExitCode> {\n const parsed = parse(args)\n const target = resolveWorkspacePath(parsed.workspace)\n\n const engine = DISTILLER_ENGINES[parsed.engine]\n if (!engine) {\n return fail(\n `unknown --engine \"${parsed.engine}\". Valid: ${Object.keys(DISTILLER_ENGINES).join(\", \")}.`,\n 2\n )\n }\n const apiKey = process.env.ANTHROPIC_API_KEY\n if (engine.needsApiKey && !apiKey) {\n return fail(`distill engine \"${engine.id}\" needs ANTHROPIC_API_KEY in the environment.`, 2)\n }\n\n const all = await readSources(target)\n if (all.length === 0) return fail(\"no sources found under sources/ — run import-web first.\", 2)\n\n const done = await scanDistilledSourceIds(target)\n const pool = parsed.sourceId\n ? all.filter(s => s.id === parsed.sourceId)\n : all.filter(s => !done.has(s.id))\n const batch = parsed.max !== undefined ? pool.slice(0, parsed.max) : pool\n\n process.stdout.write(\n `distill → ${target}\\n` +\n ` engine: ${engine.id}\\n` +\n ` sources: ${all.length} total · ${all.length - pool.length} already distilled · ${pool.length} to do\\n` +\n ` this run: ${batch.length}${parsed.max !== undefined ? ` (--max ${parsed.max})` : \"\"}\\n`\n )\n if (batch.length === 0) {\n process.stdout.write(\" nothing to do.\\n\")\n return 0\n }\n\n const usage = createUsageSink({ runName: basename(target) })\n const layout = await readEntryLayout(target)\n const runner = new DistillRunner({\n fs: new NodeFsAdapter({ root: target }),\n clock: systemClock,\n ...(layout ? { layout } : {}),\n distiller: engine.create({\n ...(apiKey ? { apiKey } : {}),\n ...(parsed.model ? { model: parsed.model } : {}),\n onUsage: usage.record,\n }),\n })\n\n let totalEntries = 0\n for (let i = 0; i < batch.length; i++) {\n const src = batch[i]!\n if (i > 0 && parsed.throttleMs > 0) await sleep(parsed.throttleMs)\n try {\n const report = await runner.run(src)\n totalEntries += report.entryPaths.length\n process.stdout.write(` ✓ ${src.id} → ${report.entryPaths.length} entries\\n`)\n } catch (e) {\n process.stdout.write(` ! ${src.id} — ${e instanceof Error ? e.message : String(e)}\\n`)\n }\n }\n process.stdout.write(`\\n${totalEntries} refined entries written (each with sources:[<id>] provenance).\\n`)\n await usage.flush()\n return 0\n}\n","/**\n * `corpus knowledge [workspace] --tags a,b [--kind k] [--access scope] [--max n]`\n *\n * Previews what a skill's `knowledge:` binding resolves to — the refined\n * entries (with provenance) an operator would pull. Filesystem-first: scans\n * entries/ on disk, no graph engine.\n */\n\nimport {\n resolveKnowledge,\n isRefinedKind,\n type CorpusEntryQuery,\n type RefinedKind,\n} from \"@agentproto/corpus\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runKnowledge(args: readonly string[]): Promise<ExitCode> {\n let workspace: string | undefined\n const tags: string[] = []\n const kinds: RefinedKind[] = []\n let access: string | undefined\n let max: number | undefined\n\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--tags\": { const v = next(); if (v) tags.push(...v.split(\",\").map(s => s.trim()).filter(Boolean)); break }\n case \"--kind\": { const v = next(); if (v && isRefinedKind(v)) kinds.push(v); break }\n case \"--access\": access = next(); break\n case \"--max\": { const v = next(); if (v) max = Number(v); break }\n default: if (!a.startsWith(\"-\") && workspace === undefined) workspace = a\n }\n }\n\n const target = resolveWorkspacePath(workspace)\n if (tags.length === 0 && kinds.length === 0) {\n return fail(\"knowledge needs --tags a,b and/or --kind <k>.\", 2)\n }\n\n const query: CorpusEntryQuery = {\n ...(tags.length ? { tags } : {}),\n ...(kinds.length ? { kinds } : {}),\n ...(max !== undefined ? { maxResults: max } : {}),\n }\n const hits = await resolveKnowledge({\n fs: new NodeFsAdapter({ root: target }),\n query,\n ...(access ? { allowedAccess: new Set([access, \"public\"]) } : {}),\n })\n\n process.stdout.write(\n `knowledge ${tags.length ? `tags=[${tags.join(\",\")}] ` : \"\"}${kinds.length ? `kinds=[${kinds.join(\",\")}] ` : \"\"}→ ${hits.length} refined entries\\n\\n`\n )\n for (const h of hits) {\n process.stdout.write(\n ` • [${h.kind}] ${h.title} (conf ${h.confidence})\\n` +\n ` ↳ derivedFrom: ${h.sources.join(\", \") || \"—\"}${h.access ? ` · access: ${h.access}` : \"\"}\\n` +\n ` ${h.body.slice(0, 120).replace(/\\s+/g, \" \")}…\\n\\n`\n )\n }\n return 0\n}\n","/**\n * Minimal streamable-HTTP MCP client (host-agnostic). Used by config-driven\n * sinks/sources to call ANY MCP server's tools — the corpus never names a\n * specific host; the endpoint + tool come from a manifest.\n *\n * Handles both JSON and SSE (`text/event-stream`) responses, optional\n * `Mcp-Session-Id`, and the initialize handshake.\n */\n\nimport { z } from \"zod\"\n\n/** JSON-RPC envelope (result/error opaque). */\nconst RPC_RESPONSE = z\n .object({ result: z.unknown().optional(), error: z.unknown().optional() })\n .loose()\n\n/** A JSON-RPC message with an id (SSE-delivered responses). */\nconst RPC_MESSAGE = z\n .object({\n id: z.number().optional(),\n result: z.unknown().optional(),\n error: z.unknown().optional(),\n })\n .loose()\n\n/** An MCP `tools/call` result (content blocks left opaque). */\nconst CALL_RESULT = z\n .object({\n content: z.unknown().optional(),\n structuredContent: z.unknown().optional(),\n isError: z.boolean().optional(),\n })\n .loose()\n\nexport interface McpClientLike {\n callTool(name: string, args: Record<string, unknown>): Promise<{\n content?: unknown\n structuredContent?: unknown\n isError?: boolean\n }>\n}\n\nexport interface ConnectMcpHttpOptions {\n readonly endpoint: string\n readonly headers?: Record<string, string>\n readonly protocolVersion?: string\n /** \"streamable-http\" (POST, default) or \"sse\" (legacy GET stream + POST messages). */\n readonly transport?: \"streamable-http\" | \"sse\"\n}\n\nexport async function connectMcpHttp(\n opts: ConnectMcpHttpOptions\n): Promise<McpClientLike> {\n if (opts.transport === \"sse\") {\n const sse = new SseMcpClient(opts)\n await sse.connect()\n return sse\n }\n const client = new StreamableHttpMcpClient(opts)\n await client.initialize()\n return client\n}\n\nclass StreamableHttpMcpClient implements McpClientLike {\n private id = 0\n private sessionId: string | undefined\n private readonly endpoint: string\n private readonly headers: Record<string, string>\n private readonly protocolVersion: string\n\n constructor(opts: ConnectMcpHttpOptions) {\n this.endpoint = opts.endpoint\n this.headers = opts.headers ?? {}\n this.protocolVersion = opts.protocolVersion ?? \"2025-06-18\"\n }\n\n async initialize(): Promise<void> {\n const res = await this.rpc({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"initialize\",\n params: {\n protocolVersion: this.protocolVersion,\n capabilities: {},\n clientInfo: { name: \"corpus-cli\", version: \"0.1.0\" },\n },\n })\n await this.rpc({ jsonrpc: \"2.0\", method: \"notifications/initialized\", params: {} }, false)\n if (res?.error) throw new Error(`initialize failed: ${JSON.stringify(res.error)}`)\n }\n\n async callTool(name: string, args: Record<string, unknown>) {\n const res = await this.rpc({\n jsonrpc: \"2.0\",\n id: ++this.id,\n method: \"tools/call\",\n params: { name, arguments: args },\n })\n if (res?.error) throw new Error(`tools/call ${name}: ${JSON.stringify(res.error)}`)\n const parsed = CALL_RESULT.safeParse(res?.result ?? {})\n return parsed.success ? parsed.data : {}\n }\n\n private async rpc(\n body: Record<string, unknown>,\n expectResponse = true\n ): Promise<{ result?: unknown; error?: unknown } | null> {\n const res = await fetch(this.endpoint, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json, text/event-stream\",\n ...(this.sessionId ? { \"mcp-session-id\": this.sessionId } : {}),\n ...this.headers,\n },\n body: JSON.stringify(body),\n })\n const sid = res.headers.get(\"mcp-session-id\")\n if (sid) this.sessionId = sid\n if (!expectResponse) return null\n if (!res.ok) throw new Error(`MCP HTTP ${res.status} ${res.statusText}`)\n return parseRpc(await res.text(), res.headers.get(\"content-type\"))\n }\n}\n\n/**\n * Legacy HTTP+SSE MCP transport: GET the stream → first `endpoint` event gives\n * the POST URL → POST JSON-RPC requests there; responses arrive back on the\n * stream (correlated by id). Used for servers like Guilde's `/guilde/mcp/sse`.\n */\nclass SseMcpClient implements McpClientLike {\n private id = 0\n private messagesUrl: string | undefined\n private readonly pending = new Map<number, (msg: { result?: unknown; error?: unknown }) => void>()\n private readyResolve!: () => void\n private readonly ready = new Promise<void>(r => (this.readyResolve = r))\n private readonly base: URL\n\n constructor(private readonly opts: ConnectMcpHttpOptions) {\n this.base = new URL(opts.endpoint)\n }\n\n async connect(): Promise<void> {\n const res = await fetch(this.opts.endpoint, {\n headers: { accept: \"text/event-stream\", ...(this.opts.headers ?? {}) },\n })\n if (!res.ok || !res.body) throw new Error(`SSE connect ${res.status} ${res.statusText}`)\n void this.readLoop(res.body.getReader())\n // Wait for the endpoint event (POST url), then initialize.\n await withTimeout(this.ready, 10_000, \"SSE endpoint event\")\n const init = await this.send(\"initialize\", {\n protocolVersion: this.opts.protocolVersion ?? \"2025-06-18\",\n capabilities: {},\n clientInfo: { name: \"corpus-cli\", version: \"0.1.0\" },\n })\n if (init?.error) throw new Error(`initialize failed: ${JSON.stringify(init.error)}`)\n await this.post({ jsonrpc: \"2.0\", method: \"notifications/initialized\", params: {} })\n }\n\n async callTool(name: string, args: Record<string, unknown>) {\n const res = await this.send(\"tools/call\", { name, arguments: args })\n if (res?.error) throw new Error(`tools/call ${name}: ${JSON.stringify(res.error)}`)\n const parsed = CALL_RESULT.safeParse(res?.result ?? {})\n return parsed.success ? parsed.data : {}\n }\n\n private async send(method: string, params: unknown) {\n const id = ++this.id\n const wait = new Promise<{ result?: unknown; error?: unknown }>(resolve => this.pending.set(id, resolve))\n await this.post({ jsonrpc: \"2.0\", id, method, params })\n return withTimeout(wait, 60_000, `${method} response`)\n }\n\n private async post(body: Record<string, unknown>): Promise<void> {\n if (!this.messagesUrl) throw new Error(\"SSE messages endpoint not ready\")\n const res = await fetch(this.messagesUrl, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...(this.opts.headers ?? {}) },\n body: JSON.stringify(body),\n })\n if (!res.ok && res.status !== 202) throw new Error(`SSE POST ${res.status}`)\n }\n\n private async readLoop(reader: ReadableStreamDefaultReader<Uint8Array>): Promise<void> {\n const dec = new TextDecoder()\n let buf = \"\"\n for (;;) {\n const { done, value } = await reader.read()\n if (done) break\n buf += dec.decode(value, { stream: true })\n let nl: number\n while ((nl = buf.indexOf(\"\\n\\n\")) >= 0) {\n const raw = buf.slice(0, nl)\n buf = buf.slice(nl + 2)\n this.handleEvent(raw)\n }\n }\n }\n\n private handleEvent(raw: string): void {\n let event = \"message\"\n const data: string[] = []\n for (const line of raw.split(\"\\n\")) {\n if (line.startsWith(\"event:\")) event = line.slice(6).trim()\n else if (line.startsWith(\"data:\")) data.push(line.slice(5).trim())\n }\n const payload = data.join(\"\\n\")\n if (event === \"endpoint\") {\n this.messagesUrl = new URL(payload, this.base).toString()\n this.readyResolve()\n return\n }\n if (!payload) return\n try {\n const parsed = RPC_MESSAGE.safeParse(JSON.parse(payload))\n if (!parsed.success) return\n const msg = parsed.data\n if (typeof msg.id === \"number\" && this.pending.has(msg.id)) {\n this.pending.get(msg.id)!(msg)\n this.pending.delete(msg.id)\n }\n } catch {\n /* skip non-JSON */\n }\n }\n}\n\nfunction withTimeout<T>(p: Promise<T>, ms: number, what: string): Promise<T> {\n return Promise.race([\n p,\n new Promise<T>((_, rej) => setTimeout(() => rej(new Error(`timeout waiting for ${what}`)), ms)),\n ])\n}\n\nfunction parseRpc(\n text: string,\n contentType: string | null\n): { result?: unknown; error?: unknown } | null {\n if (!text.trim()) return null\n if (!(contentType ?? \"\").includes(\"text/event-stream\")) {\n const parsed = RPC_RESPONSE.safeParse(JSON.parse(text))\n return parsed.success ? parsed.data : null\n }\n let last: { result?: unknown; error?: unknown } | null = null\n for (const line of text.split(\"\\n\")) {\n const t = line.trim()\n if (!t.startsWith(\"data:\")) continue\n const p = t.slice(5).trim()\n if (!p || p === \"[DONE]\") continue\n try {\n last = JSON.parse(p)\n } catch {\n /* skip non-JSON frames */\n }\n }\n return last\n}\n","/**\n * McpSink — a config-driven SinkPort that pushes each refined entry by calling\n * a configured MCP tool. Host-agnostic: the endpoint, tool name, and the\n * entry→args mapping all come from a sink manifest, so the corpus links to ANY\n * host (a Guilde guild KB, a Notion db, a vector store) without naming it.\n *\n * The manifest's `args` is a template: string values containing `${slug}`,\n * `${title}`, `${body}`, `${sources}`, `${tags}`, `${access}`, `${uri}`,\n * `${kind}`, `${confidence}` are substituted per entry. A value that is exactly\n * one placeholder (e.g. `\"${sources}\"`) is replaced with the typed value (array\n * / number), not a string.\n */\n\nimport { z } from \"zod\"\nimport type { SinkPort, SinkItem, SinkPushResult } from \"@agentproto/corpus\"\nimport { connectMcpHttp, type McpClientLike } from \"./mcp-http-client.js\"\n\n/** Validates a sink manifest (the `--config` JSON) — single source for the type. */\nexport const SINK_CONFIG_SCHEMA = z.object({\n endpoint: z.string().min(1),\n tool: z.string().min(1),\n /** Arg template — substituted per entry. */\n args: z.record(z.string(), z.unknown()),\n headers: z.record(z.string(), z.string()).optional(),\n /** MCP transport: \"streamable-http\" (default) or \"sse\". */\n transport: z.enum([\"streamable-http\", \"sse\"]).optional(),\n /**\n * If set, calls go through `mcp_imported_call({ alias, toolName, args })`\n * (the agentproto daemon's imported-MCP proxy) instead of the tool directly.\n */\n importedAlias: z.string().optional(),\n})\n\nexport type McpSinkConfig = z.infer<typeof SINK_CONFIG_SCHEMA>\n\nexport class McpSink implements SinkPort {\n private client: McpClientLike | undefined\n constructor(\n private readonly config: McpSinkConfig,\n client?: McpClientLike // injectable for tests\n ) {\n this.client = client\n }\n\n private async ensure(): Promise<McpClientLike> {\n if (!this.client) {\n this.client = await connectMcpHttp({\n endpoint: this.config.endpoint,\n ...(this.config.headers ? { headers: this.config.headers } : {}),\n ...(this.config.transport ? { transport: this.config.transport } : {}),\n })\n }\n return this.client\n }\n\n async push(item: SinkItem): Promise<SinkPushResult> {\n let client: McpClientLike\n try {\n client = await this.ensure()\n } catch (e) {\n return { uri: item.uri, ok: false, error: `connect: ${msg(e)}` }\n }\n const args = template(this.config.args, item)\n const call = this.config.importedAlias\n ? { name: \"mcp_imported_call\", args: { alias: this.config.importedAlias, toolName: this.config.tool, args } }\n : { name: this.config.tool, args }\n try {\n const res = await client.callTool(call.name, call.args)\n if (res.isError) return { uri: item.uri, ok: false, error: \"tool returned isError\" }\n return { uri: item.uri, ok: true }\n } catch (e) {\n return { uri: item.uri, ok: false, error: msg(e) }\n }\n }\n}\n\n// ── templating ──────────────────────────────────────────────────────\n\nconst PLACEHOLDER_RE = /\\$\\{(\\w+)\\}/g\n\nfunction template(args: Record<string, unknown>, item: SinkItem): Record<string, unknown> {\n const fields: Record<string, unknown> = {\n slug: item.slug,\n title: item.title,\n body: item.body,\n sources: item.sources,\n tags: item.tags,\n access: item.access ?? \"\",\n uri: item.uri,\n kind: item.kind,\n confidence: item.confidence,\n }\n const out: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(args)) {\n out[key] = substitute(value, fields)\n }\n return out\n}\n\nfunction substitute(value: unknown, fields: Record<string, unknown>): unknown {\n if (typeof value === \"string\") {\n // Whole-value placeholder → typed substitution.\n const whole = value.match(/^\\$\\{(\\w+)\\}$/)\n if (whole && whole[1]! in fields) return fields[whole[1]!]\n // Otherwise string interpolation.\n return value.replace(PLACEHOLDER_RE, (_, k) =>\n k in fields ? stringify(fields[k]) : `\\${${k}}`\n )\n }\n if (Array.isArray(value)) return value.map(v => substitute(v, fields))\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) out[k] = substitute(v, fields)\n return out\n }\n return value\n}\n\nfunction stringify(v: unknown): string {\n if (Array.isArray(v)) return v.join(\", \")\n return v == null ? \"\" : String(v)\n}\n\nfunction msg(e: unknown): string {\n return e instanceof Error ? e.message : String(e)\n}\n","/**\n * `corpus sync [workspace] --config <sink.json> [--tags a,b --kind k --throttle ms]`\n *\n * Pushes refined entries to an external store via a config-driven MCP sink.\n * Host-agnostic: the sink manifest names the endpoint + tool + entry→args\n * mapping (a Guilde guild KB, a vector store, …) — the CLI knows none of it.\n *\n * Sink manifest (JSON):\n * { \"endpoint\": \"https://…/mcp\", \"tool\": \"ingest_knowledge\",\n * \"headers\": { \"authorization\": \"Bearer …\" },\n * \"args\": { \"guildId\": \"…\", \"knowledgeBaseId\": \"…\", \"kind\": \"text\",\n * \"title\": \"${title}\", \"content\": \"${body}\", \"uri\": \"${uri}\",\n * \"metadata\": { \"sources\": \"${sources}\", \"access\": \"${access}\" } } }\n */\n\nimport { readFile } from \"node:fs/promises\"\nimport {\n SyncRunner,\n isRefinedKind,\n type CorpusEntryQuery,\n type RefinedKind,\n} from \"@agentproto/corpus\"\nimport { McpSink, SINK_CONFIG_SCHEMA } from \"../ports/mcp-sink.adapter.js\"\nimport { NodeFsAdapter } from \"../ports/local-fs.adapter.js\"\nimport { fail, resolveWorkspacePath, type ExitCode } from \"./_shared.js\"\n\nexport async function runSync(args: readonly string[]): Promise<ExitCode> {\n let workspace: string | undefined\n let configPath: string | undefined\n const tags: string[] = []\n const kinds: RefinedKind[] = []\n let throttleMs = 500\n\n for (let i = 0; i < args.length; i++) {\n const a = args[i]!\n const next = () => args[++i]\n switch (a) {\n case \"--config\": configPath = next(); break\n case \"--tags\": { const v = next(); if (v) tags.push(...v.split(\",\").map(s => s.trim()).filter(Boolean)); break }\n case \"--kind\": { const v = next(); if (v && isRefinedKind(v)) kinds.push(v); break }\n case \"--throttle\": { const v = next(); if (v) throttleMs = Number(v); break }\n default: if (!a.startsWith(\"-\") && workspace === undefined) workspace = a\n }\n }\n\n const target = resolveWorkspacePath(workspace)\n if (!configPath) return fail(\"sync needs --config <sink-manifest.json>.\", 2)\n\n let raw: unknown\n try {\n raw = JSON.parse(await readFile(configPath, \"utf-8\"))\n } catch (e) {\n return fail(`could not read sink config: ${e instanceof Error ? e.message : String(e)}`, 2)\n }\n const parsedConfig = SINK_CONFIG_SCHEMA.safeParse(raw)\n if (!parsedConfig.success) {\n return fail(\n `invalid sink config (needs endpoint, tool, args): ${parsedConfig.error.issues[0]?.message ?? \"schema mismatch\"}`,\n 2\n )\n }\n const config = parsedConfig.data\n\n const select: CorpusEntryQuery = {\n ...(tags.length ? { tags } : {}),\n ...(kinds.length ? { kinds } : {}),\n }\n const report = await new SyncRunner({\n fs: new NodeFsAdapter({ root: target }),\n sink: new McpSink(config),\n select,\n throttleMs,\n }).run()\n\n process.stdout.write(\n `sync → ${config.endpoint} (tool: ${config.tool})\\n` +\n ` pushed: ${report.pushed} · skipped: ${report.skipped} · failed: ${report.failed}\\n`\n )\n for (const r of report.results.filter(r => !r.ok).slice(0, 10)) {\n process.stdout.write(` ! ${r.uri} — ${r.error}\\n`)\n }\n return report.failed > 0 && report.pushed === 0 ? 1 : 0\n}\n","/**\n * CLI version — derived from the package's own package.json at runtime,\n * so it never drifts from the published version on a release bump.\n *\n * `import.meta.url` resolves to dist/cli.mjs in the published bundle and\n * to src/version.ts under tsx/vitest; in both, package.json sits one\n * directory up. A defensive fallback keeps --version from ever throwing.\n */\nimport { readFileSync } from \"node:fs\"\nimport { dirname, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\nfunction readVersion(): string {\n try {\n const here = dirname(fileURLToPath(import.meta.url))\n const pkg = JSON.parse(\n readFileSync(resolve(here, \"../package.json\"), \"utf8\")\n ) as { version?: string }\n return pkg.version ?? \"0.0.0\"\n } catch {\n return \"0.0.0\"\n }\n}\n\nexport const VERSION: string = readVersion()\n","#!/usr/bin/env node\n/**\n * `corpus` binary entry. Dispatches to subcommands.\n *\n * No commander/yargs to keep dep footprint tight — node:util.parseArgs\n * handles ~90% of what we need, the rest is a 50-line dispatcher.\n *\n * Usage:\n * corpus init <name> [path] [--with a,b] [--preset <slug>]\n * corpus validate [path]\n * corpus lint [path]\n * corpus events:emit <kind> --payload <json> [path]\n * corpus events:tail [path]\n * corpus --help\n * corpus --version\n */\n\nimport { runInit } from \"./commands/init.js\"\nimport { runValidate } from \"./commands/validate.js\"\nimport { runLint } from \"./commands/lint.js\"\nimport { runEventsEmit, runEventsTail } from \"./commands/events.js\"\nimport { runImportWeb } from \"./commands/import-web.js\"\nimport { runDistill } from \"./commands/distill.js\"\nimport { runKnowledge } from \"./commands/knowledge.js\"\nimport { runSync } from \"./commands/sync.js\"\nimport { VERSION } from \"./version.js\"\n\nexport type ExitCode = 0 | 1 | 2\n\nconst HELP = `corpus — AIP-10 corpus workspace operator (v${VERSION})\n\nCommands:\n init <name> [path] [--with a,b] [--preset <slug>]\n Scaffold a corpus — bare AIP-10 by default\n (--preset seeds a full vertical; --list shows them)\n validate [path] JSON Schema check across every AIP file\n lint [path] Run lints declared in KNOWLEDGE.md\n events:emit <kind> --payload <json> [path]\n Append an event to _log.md\n events:tail [path] Print _log.md\n import-web [path] --urls-file <f> [--max n --max-duration s --throttle ms --tags t --lang l --force --diarize]\n Import URLs as sources (video→Whisper, article→\n readability). Resumable: skips already-ingested\n URLs, so re-run with --max N to batch through.\n --max-duration: skip videos longer than s seconds\n (no download); omit for no cap (long media is\n segmented under Whisper's 25 MB limit).\n --cookies-from-browser <b>: auth yt-dlp from a\n local browser (chrome/firefox) to dodge YouTube's\n bot-check; --cookies <file> for a cookies.txt.\n --scrape-mcp <url>: delegate article fetching to a\n scrape MCP server (stealth + clean Markdown) for\n walled/JS pages, ahead of plain readability.\n --diarize: AssemblyAI speaker labels (interviews).\n distill [path] [--source id --max n --throttle ms --model m]\n Distill raw sources → refined entries\n (principle/pattern/…) with sources:[id] provenance.\n Resumable: skips already-distilled sources.\n knowledge [path] --tags a,b [--kind k --access scope --max n]\n Preview what a skill's knowledge: binding resolves to\n — refined entries + their provenance (filesystem).\n sync [path] --config <sink.json> [--tags a,b --kind k --throttle ms]\n Push refined entries to an external store via a\n config-driven MCP sink (host-agnostic).\n -h, --help Show this help\n -v, --version Show version\n\nConventions:\n [path] defaults to the current working directory.\n All commands target the workspace whose root contains KNOWLEDGE.md\n (except 'init' which creates one).\n`\n\nasync function main(argv: readonly string[]): Promise<ExitCode> {\n const [cmd, ...rest] = argv\n\n if (!cmd || cmd === \"-h\" || cmd === \"--help\") {\n process.stdout.write(HELP)\n return 0\n }\n if (cmd === \"-v\" || cmd === \"--version\") {\n process.stdout.write(`corpus v${VERSION}\\n`)\n return 0\n }\n\n switch (cmd) {\n case \"init\":\n return await runInit(rest)\n case \"validate\":\n return await runValidate(rest)\n case \"lint\":\n return await runLint(rest)\n case \"events:emit\":\n return await runEventsEmit(rest)\n case \"events:tail\":\n return await runEventsTail(rest)\n case \"import-web\":\n return await runImportWeb(rest)\n case \"distill\":\n return await runDistill(rest)\n case \"knowledge\":\n return await runKnowledge(rest)\n case \"sync\":\n return await runSync(rest)\n default:\n process.stderr.write(`corpus: unknown command \"${cmd}\". Try --help.\\n`)\n return 2\n }\n}\n\nconst argv = process.argv.slice(2)\nmain(argv)\n .then((code) => process.exit(code))\n .catch((err) => {\n process.stderr.write(\n `corpus: unhandled error — ${err instanceof Error ? err.message : String(err)}\\n`\n )\n process.exit(1)\n })\n"]}
|