cograph 0.1.27 → 0.1.29

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shell.ts"],"sourcesContent":["import * as readline from \"node:readline\";\nimport { stdin, stdout } from \"node:process\";\nimport { randomUUID } from \"node:crypto\";\nimport {\n Client,\n CographError,\n type TypeCount,\n type EnrichJob,\n type ConflictReview,\n type JobSummary,\n} from \"./client.js\";\nimport { renderAgentResult } from \"./agentRender.js\";\nimport { writeConfig } from \"./config.js\";\n\nconst CYAN = \"\\x1b[36m\";\nconst CYAN_BOLD = \"\\x1b[1;36m\";\nconst DIM = \"\\x1b[2m\";\nconst RED = \"\\x1b[31m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst BOLD = \"\\x1b[1m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction fmtNum(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\nfunction canRenderBlockArt(): boolean {\n // Apple_Terminal (macOS Terminal.app) treats the block-shade chars (▀█░)\n // we use in the banner as East Asian Ambiguous Width = 2 cells, so each\n // 28-char banner row renders as ~56 cells and wraps mid-letter. iTerm,\n // WezTerm, Kitty, VS Code, Cursor, etc. all treat them as 1 cell and\n // render the art correctly. Skip the banner on Apple_Terminal and show\n // a plain header instead. Force on/off via COGRAPH_BANNER=on|off.\n const force = process.env.COGRAPH_BANNER;\n if (force === \"on\") return true;\n if (force === \"off\") return false;\n if (!process.stdout.isTTY) return false;\n if (process.env.TERM_PROGRAM === \"Apple_Terminal\") return false;\n return true;\n}\n\nfunction showBanner(): void {\n if (canRenderBlockArt()) {\n const lines = [\n \"\",\n `${CYAN} ░█▀▀░█▀█░█▀▀░█▀▄░█▀█░█▀█░█░█${RESET}`,\n `${CYAN} ░█░░░█░█░█░█░█▀▄░█▀█░█▀▀░█▀█${RESET}`,\n `${CYAN} ░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀░▀░▀░░░▀░▀${RESET}`,\n \"\",\n `${DIM} The object graph for AI agents${RESET}`,\n \"\",\n ];\n for (const l of lines) stdout.write(l + \"\\n\");\n } else {\n stdout.write(`\\n ${CYAN_BOLD}cograph${RESET}\\n`);\n stdout.write(` ${DIM}The object graph for AI agents${RESET}\\n\\n`);\n }\n showCommands();\n}\n\nfunction showCommands(): void {\n const rows: Array<[string, string]> = [\n [\"/ingest <file> ...\", \"Ingest a CSV/JSON/text file\"],\n [\"/ask <question>\", \"Ask in natural language\"],\n [\"/agent <message>\", \"Unified Ask-AI agent — answers, plans, runs actions\"],\n [\"/kg list\", \"List your knowledge graphs\"],\n [\"/kg switch <name>\", \"Switch to a different KG\"],\n [\"/kg create <name>\", \"Create a new KG and switch to it\"],\n [\"/kg delete <name>\", \"Delete a KG (irreversible)\"],\n [\"/tenant list\", \"List tenants you can access\"],\n [\"/tenant use <id>\", \"Switch tenant (then pick a KG)\"],\n [\"/types [query]\", \"List types in the current KG (with entity counts)\"],\n [\"/type <name>\", \"Drill into one type — attributes, relationships, samples\"],\n [\"/type <name> --system\", \"…also include auto-attached system attributes\"],\n [\"/enrich <Type> <attr> ...\", \"Plan + run an enrichment job (interactive)\"],\n [\"/enrich watch <job_id>\", \"Live progress for a running job\"],\n [\"/enrich jobs\", \"List recent enrichment jobs\"],\n [\"/enrich review <job_id>\", \"Walk through conflicts and accept/reject\"],\n [\"/login\", \"Re-authenticate (browser)\"],\n [\"/status\", \"Show graph stats\"],\n [\"/reset\", \"Clear the current KG\"],\n [\"/help\", \"Show this command list\"],\n [\"/quit\", \"Exit\"],\n ];\n const colWidth = Math.max(...rows.map((r) => r[0].length));\n for (const [cmd, desc] of rows) {\n const pad = \" \".repeat(colWidth - cmd.length);\n stdout.write(` ${CYAN_BOLD}${cmd}${RESET}${pad} ${DIM}${desc}${RESET}\\n`);\n }\n stdout.write(\"\\n\");\n}\n\nfunction printError(msg: string): void {\n stdout.write(` ${RED}✗${RESET} ${msg}\\n`);\n}\n\ninterface KgInfo {\n name: string;\n triple_count: number;\n}\n\nasync function fetchKg(client: Client, name: string): Promise<KgInfo | null> {\n try {\n const kgs = await client.listKgs();\n const found = kgs.find((k) => (k as { name?: string }).name === name);\n if (!found) return null;\n const tc = (found as { triple_count?: number }).triple_count ?? 0;\n return { name, triple_count: typeof tc === \"number\" ? tc : 0 };\n } catch {\n return null;\n }\n}\n\nfunction ask(rl: readline.Interface, prompt: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => resolve(answer));\n });\n}\n\nasync function selectKg(\n client: Client,\n rl: readline.Interface,\n): Promise<string | null> {\n let kgs: Array<Record<string, unknown>> = [];\n try {\n kgs = await client.listKgs();\n } catch (err) {\n printError(\n `Could not list knowledge graphs: ${err instanceof Error ? err.message : String(err)}`,\n );\n return null;\n }\n\n if (kgs.length === 0) {\n stdout.write(\n ` ${DIM}No knowledge graphs found. Enter a name to create your first KG.${RESET}\\n`,\n );\n const name = (await ask(rl, \" KG name: \")).trim();\n if (!name) return null;\n // Persist immediately. Without this, the name only existed as a local\n // string until the user ran /ingest, so quitting before ingesting lost\n // the KG entirely — and the next shell session showed \"No KGs found\"\n // again.\n try {\n await client.createKg(name);\n stdout.write(` ${GREEN}✓${RESET} Created ${BOLD}${name}${RESET}\\n`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // 409 / \"already exists\" is fine — someone created it between listKgs\n // and now, or the user retried. Anything else is a real failure.\n if (!/already exists|409/i.test(msg)) {\n printError(`Could not create knowledge graph: ${msg}`);\n return null;\n }\n }\n return name;\n }\n\n if (kgs.length === 1) {\n const only = (kgs[0] as { name?: string }).name;\n if (only) {\n stdout.write(` ${DIM}Using only available KG: ${BOLD}${only}${RESET}\\n`);\n return only;\n }\n }\n\n stdout.write(` ${BOLD}Available knowledge graphs:${RESET}\\n`);\n kgs.forEach((kg, i) => {\n const n = (kg as { name?: string }).name ?? \"?\";\n const tc = (kg as { triple_count?: number }).triple_count ?? 0;\n stdout.write(` ${CYAN}${i + 1}${RESET}. ${n} ${DIM}(${fmtNum(tc)} triples)${RESET}\\n`);\n });\n const pick = (await ask(rl, \" Select KG [1]: \")).trim() || \"1\";\n const idx = Number.parseInt(pick, 10);\n if (Number.isFinite(idx) && idx >= 1 && idx <= kgs.length) {\n const name = (kgs[idx - 1] as { name?: string }).name;\n if (name) return name;\n }\n // Allow typing a name directly\n if (pick && !/^\\d+$/.test(pick)) return pick;\n printError(\"Invalid selection.\");\n return null;\n}\n\n/**\n * Tiny live-line spinner. Returns handles to update the trailing text and\n * stop. We use \\r + clear-line escape so the line redraws in place.\n */\nfunction startSpinner(initial: string): {\n setText: (text: string) => void;\n stop: () => void;\n} {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let frame = 0;\n let text = initial;\n let stopped = false;\n\n const draw = (): void => {\n if (stopped) return;\n // \\x1b[2K = clear entire line; \\r = carriage return\n stdout.write(`\\r\\x1b[2K ${CYAN}${frames[frame]}${RESET} ${text}`);\n frame = (frame + 1) % frames.length;\n };\n draw();\n const tick = setInterval(draw, 80);\n\n return {\n setText(t: string) {\n text = t;\n },\n stop() {\n stopped = true;\n clearInterval(tick);\n stdout.write(\"\\r\\x1b[2K\");\n },\n };\n}\n\nasync function cmdIngest(\n client: Client,\n kg: string,\n args: string[],\n): Promise<void> {\n if (args.length === 0) {\n stdout.write(` ${YELLOW}Usage:${RESET} /ingest <file> [<file>...]\\n`);\n return;\n }\n for (const file of args) {\n const sp = startSpinner(`Inferring schema from ${file}...`);\n try {\n const result = await client.ingest(file, {\n kg,\n onProgress: ({\n rowsProcessed,\n totalRows,\n entitiesResolved,\n triplesInserted,\n }) => {\n const pct = Math.round((rowsProcessed / totalRows) * 100);\n sp.setText(\n `Ingesting ${file} ${DIM}·${RESET} ${BOLD}${pct}%${RESET} ` +\n `${DIM}(${fmtNum(rowsProcessed)}/${fmtNum(totalRows)} rows · ` +\n `${fmtNum(entitiesResolved)} entities · ${fmtNum(triplesInserted)} triples)${RESET}`,\n );\n },\n });\n sp.stop();\n const ents =\n (result as { entities_resolved?: number }).entities_resolved ?? 0;\n const trip =\n (result as { triples_inserted?: number }).triples_inserted ?? 0;\n stdout.write(\n ` ${GREEN}✓${RESET} ${file} ${DIM}·${RESET} ${fmtNum(ents)} entities · ${fmtNum(trip)} triples\\n`,\n );\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n }\n}\n\nasync function cmdAsk(\n client: Client,\n kg: string,\n question: string,\n): Promise<void> {\n const q = question.trim();\n if (!q) {\n stdout.write(` ${YELLOW}Usage:${RESET} /ask <your question>\\n`);\n return;\n }\n try {\n const result = await client.ask(q, { kg });\n const answer =\n (result as { narrative_answer?: string }).narrative_answer ||\n (result as { answer?: string }).answer ||\n \"No answer generated.\";\n stdout.write(\"\\n\");\n stdout.write(` ${answer}\\n`);\n stdout.write(\"\\n\");\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n}\n\n/**\n * `/agent <message>` — one turn of the unified Ask-AI agent inside the REPL.\n *\n * Sends the message (threading the per-session `sessionId` for multi-turn\n * continuity), renders the kind-tagged response with the shared renderer, and —\n * because the shell IS interactive — when the response is a `plan`, prompts\n * `Confirm & run? [y/N]`. On `y` it confirms the plan (the only mutating path)\n * and renders the `result`. Mirrors the cli.ts agent command, but the confirm\n * is an inline prompt rather than --yes/--confirm.\n */\nasync function cmdAgent(\n client: Client,\n kg: string,\n rl: readline.Interface,\n sessionId: string,\n message: string,\n): Promise<void> {\n const msg = message.trim();\n if (!msg) {\n stdout.write(` ${YELLOW}Usage:${RESET} /agent <your message>\\n`);\n return;\n }\n const context = { kgName: kg, sessionId };\n const sp = startSpinner(\"Thinking...\");\n let result;\n try {\n result = await client.agent({ message: msg, ...context });\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n renderAgentResult(result);\n\n // Only a plan awaits confirmation. Prompt inline; on \"y\", confirm + execute.\n if (result.kind === \"plan\") {\n const planId =\n typeof result.plan_id === \"string\" ? result.plan_id : undefined;\n if (!planId) return;\n const ans = (await ask(rl, ` ${YELLOW}Confirm & run?${RESET} [y/N]: `))\n .trim()\n .toLowerCase();\n if (ans !== \"y\" && ans !== \"yes\") {\n stdout.write(` ${DIM}Not run. Plan ${planId} kept.${RESET}\\n`);\n return;\n }\n const sp2 = startSpinner(\"Running plan...\");\n let executed;\n try {\n executed = await client.agent({ confirmPlanId: planId, ...context });\n } catch (err) {\n sp2.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp2.stop();\n renderAgentResult(executed);\n }\n}\n\nasync function cmdStatus(client: Client, kg: string): Promise<void> {\n try {\n const info = await fetchKg(client, kg);\n stdout.write(\"\\n\");\n stdout.write(` ${BOLD}KG${RESET} ${kg}\\n`);\n if (info) {\n stdout.write(` ${BOLD}Triples${RESET} ${fmtNum(info.triple_count)}\\n`);\n } else {\n stdout.write(` ${BOLD}Triples${RESET} ${DIM}(empty)${RESET}\\n`);\n }\n try {\n const types = await client.ontologyTypes();\n const names = types\n .map((t) => (t as { name?: string }).name)\n .filter((n): n is string => Boolean(n));\n if (names.length > 0) {\n stdout.write(` ${BOLD}Types${RESET} ${names.join(\", \")}\\n`);\n } else {\n stdout.write(` ${BOLD}Types${RESET} ${DIM}(none)${RESET}\\n`);\n }\n } catch (err) {\n printError(\n `Could not list ontology types: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n stdout.write(\"\\n\");\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n}\n\nasync function cmdReset(\n client: Client,\n kg: string,\n rl: readline.Interface,\n): Promise<boolean> {\n const confirm = (\n await ask(rl, ` ${YELLOW}Delete KG \"${kg}\"?${RESET} [y/N]: `)\n )\n .trim()\n .toLowerCase();\n if (confirm !== \"y\" && confirm !== \"yes\") {\n stdout.write(` ${DIM}Cancelled.${RESET}\\n`);\n return false;\n }\n try {\n await client.deleteKg(kg);\n stdout.write(` ${GREEN}✓${RESET} Graph cleared.\\n`);\n return true;\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return false;\n }\n}\n\nasync function cmdTypes(\n client: Client,\n kg: string,\n query: string,\n): Promise<void> {\n const sp = startSpinner(\n query ? `Searching types matching \"${query}\"...` : \"Loading types...\",\n );\n let types: TypeCount[];\n try {\n types = await client.typeCounts(kg);\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n const q = query.trim().toLowerCase();\n const filtered = q\n ? types.filter((t) => t.name.toLowerCase().includes(q))\n : types;\n\n if (filtered.length === 0) {\n if (types.length === 0) {\n stdout.write(\n ` ${DIM}No types yet in ${BOLD}${kg}${RESET}${DIM}. Try ${RESET}/ingest <file>${DIM} first.${RESET}\\n`,\n );\n } else {\n stdout.write(\n ` ${DIM}No types match \"${query}\". Try ${RESET}/types${DIM} for the full list.${RESET}\\n`,\n );\n }\n return;\n }\n\n // Right-align counts; leave room for the longest name we'll print.\n const nameWidth = Math.max(\n \"Type\".length,\n ...filtered.map((t) => t.name.length),\n );\n const countWidth = Math.max(\n \"Entities\".length,\n ...filtered.map((t) => fmtNum(t.entity_count).length),\n );\n stdout.write(\"\\n\");\n stdout.write(\n ` ${BOLD}${\"Type\".padEnd(nameWidth)} ${\"Entities\".padStart(countWidth)}${RESET}\\n`,\n );\n let total = 0;\n for (const t of filtered) {\n total += t.entity_count;\n stdout.write(\n ` ${CYAN}${t.name.padEnd(nameWidth)}${RESET} ${fmtNum(t.entity_count).padStart(countWidth)}\\n`,\n );\n }\n stdout.write(\"\\n\");\n const summary = q\n ? `${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}.`\n : `${filtered.length} type${filtered.length === 1 ? \"\" : \"s\"}, ${fmtNum(total)} entities total.`;\n stdout.write(` ${DIM}${summary}${RESET}\\n`);\n stdout.write(\n ` ${DIM}Drill in: ${RESET}/type <name>${DIM} Filter: ${RESET}/types <query>${DIM}${RESET}\\n\\n`,\n );\n}\n\n/**\n * Resolve a user-supplied type name to a canonical type. Case-insensitive\n * exact match wins; otherwise we fall back to prefix match. If multiple\n * types share a prefix, prompt the user to pick from a numbered list.\n */\nasync function resolveTypeName(\n client: Client,\n kg: string,\n rl: readline.Interface,\n input: string,\n): Promise<string | null> {\n const types = await client.typeCounts(kg);\n if (types.length === 0) {\n printError(`No types in ${kg} yet. Try /ingest <file> first.`);\n return null;\n }\n const q = input.trim().toLowerCase();\n const exact = types.find((t) => t.name.toLowerCase() === q);\n if (exact) return exact.name;\n const prefix = types.filter((t) => t.name.toLowerCase().startsWith(q));\n const matches = prefix.length > 0\n ? prefix\n : types.filter((t) => t.name.toLowerCase().includes(q));\n if (matches.length === 0) {\n printError(\n `No type matches \"${input}\". Try /types to see what's available.`,\n );\n return null;\n }\n if (matches.length === 1) return matches[0]!.name;\n stdout.write(` ${DIM}Multiple types match \"${input}\":${RESET}\\n`);\n matches.forEach((t, i) => {\n stdout.write(\n ` ${CYAN}${i + 1}${RESET}. ${BOLD}${t.name}${RESET} ${DIM}(${fmtNum(t.entity_count)} entities)${RESET}\\n`,\n );\n });\n const pick = (await ask(rl, ` Pick [1]: `)).trim() || \"1\";\n const idx = Number.parseInt(pick, 10);\n if (Number.isFinite(idx) && idx >= 1 && idx <= matches.length) {\n return matches[idx - 1]!.name;\n }\n printError(\"Invalid selection.\");\n return null;\n}\n\nasync function cmdType(\n client: Client,\n kg: string,\n rl: readline.Interface,\n input: string,\n): Promise<void> {\n // Pull off any --system flag so the rest can be treated as the type name.\n // Conservative parse: only the literal flag, anywhere in the input.\n const tokens = splitArgs(input.trim());\n const includeSystem = tokens.includes(\"--system\");\n const nameTokens = tokens.filter((t) => t !== \"--system\");\n const nameInput = nameTokens.join(\" \").trim();\n if (!nameInput) {\n stdout.write(` ${YELLOW}Usage:${RESET} /type <name> [--system]\\n`);\n return;\n }\n const name = await resolveTypeName(client, kg, rl, nameInput);\n if (!name) return;\n\n const sp = startSpinner(`Loading ${name}...`);\n let usage;\n try {\n usage = await client.typeUsage(kg, name, { includeSystem });\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n const total = usage.entity_count;\n const pct = (n: number): string =>\n total > 0 ? `${Math.round((n / total) * 100).toString().padStart(3)}%` : \" —\";\n\n // Dedup: when the resolver produces both a literal attribute and a typed\n // relationship for the same column (e.g. .title literal + .title→JobTitle),\n // we collapse to a single relationship row and surface the literal count\n // as a \"(+775 string)\" annotation. The relationship row \"wins\" because\n // its count is the union upper bound (every entity with a typed link)\n // and it's the richer fact. Pure literals and pure relationships are\n // unaffected.\n const relNames = new Set(usage.relationships.map((r) => r.name));\n const attrLitByName = new Map(usage.attributes.map((a) => [a.name, a]));\n const litOnlyAttrs = usage.attributes.filter((a) => !relNames.has(a.name));\n\n stdout.write(\"\\n\");\n stdout.write(\n ` ${BOLD}${usage.name}${RESET} ${DIM}${fmtNum(total)} entities${RESET}\\n`,\n );\n if (usage.description) {\n stdout.write(` ${DIM}${usage.description}${RESET}\\n`);\n }\n if (usage.parent_type) {\n stdout.write(` ${DIM}subClassOf ${usage.parent_type}${RESET}\\n`);\n }\n\n if (litOnlyAttrs.length > 0) {\n stdout.write(\n `\\n ${BOLD}Attributes (${litOnlyAttrs.length})${RESET}\\n`,\n );\n const nameW = Math.max(\n ...litOnlyAttrs.map((a) => a.name.length + 1),\n 8,\n );\n const typeW = Math.max(\n ...litOnlyAttrs.map((a) => a.datatype.length),\n 8,\n );\n const cntW = Math.max(\n ...litOnlyAttrs.map((a) => fmtNum(a.count).length),\n 4,\n );\n for (const a of litOnlyAttrs) {\n const dotName = `.${a.name}`;\n stdout.write(\n ` ${CYAN}${dotName.padEnd(nameW)}${RESET} ${DIM}${a.datatype.padEnd(typeW)}${RESET} ${fmtNum(a.count).padStart(cntW)} ${DIM}(${pct(a.count)})${RESET}\\n`,\n );\n }\n }\n\n if (usage.relationships.length > 0) {\n stdout.write(\n `\\n ${BOLD}Relationships (${usage.relationships.length})${RESET}\\n`,\n );\n const nameW = Math.max(\n ...usage.relationships.map((r) => r.name.length + 1),\n 8,\n );\n const tgtW = Math.max(\n ...usage.relationships.map((r) => (r.target_type ?? \"?\").length),\n 6,\n );\n for (const r of usage.relationships) {\n const dotName = `.${r.name}`;\n const tgt = r.target_type ?? \"?\";\n const lit = attrLitByName.get(r.name);\n const litNote = lit\n ? ` ${DIM}(+${fmtNum(lit.count)} ${lit.datatype})${RESET}`\n : \"\";\n stdout.write(\n ` ${CYAN}${dotName.padEnd(nameW)}${RESET} ${DIM}→${RESET} ${BOLD}${tgt.padEnd(tgtW)}${RESET} ${fmtNum(r.count).padStart(6)} ${DIM}(${pct(r.count)})${RESET}${litNote}\\n`,\n );\n }\n }\n\n if (usage.samples.length > 0) {\n stdout.write(`\\n ${BOLD}Sample entities${RESET}\\n`);\n usage.samples.forEach((s, i) => {\n const label = s.label || s.uri.split(\"/\").pop() || s.uri;\n stdout.write(` ${DIM}${i + 1}.${RESET} ${label}\\n`);\n });\n }\n\n if (\n usage.attributes.length === 0 &&\n usage.relationships.length === 0 &&\n total === 0\n ) {\n stdout.write(\n `\\n ${DIM}Type defined in the ontology but no instances yet in ${kg}.${RESET}\\n`,\n );\n }\n stdout.write(\"\\n\");\n}\n\nfunction lastUriSegment(uri: string): string {\n if (!uri) return uri;\n const hash = uri.lastIndexOf(\"#\");\n if (hash >= 0 && hash < uri.length - 1) return uri.slice(hash + 1);\n const slash = uri.lastIndexOf(\"/\");\n if (slash >= 0 && slash < uri.length - 1) return uri.slice(slash + 1);\n return uri;\n}\n\nfunction relativeTime(iso: string | null | undefined): string {\n if (!iso) return \"—\";\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return \"—\";\n const diffMs = Date.now() - t;\n const s = Math.max(0, Math.floor(diffMs / 1000));\n if (s < 60) return `${s}s ago`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ago`;\n const d = Math.floor(h / 24);\n return `${d}d ago`;\n}\n\nfunction progressBar(processed: number, total: number, width = 20): string {\n if (!total || total <= 0) return \"[\" + \" \".repeat(width) + \"]\";\n const ratio = Math.max(0, Math.min(1, processed / total));\n const filled = Math.round(ratio * width);\n return \"[\" + \"█\".repeat(filled) + \"░\".repeat(width - filled) + \"]\";\n}\n\nfunction statusColor(status: string): string {\n switch (status) {\n case \"applied\":\n return GREEN;\n case \"failed\":\n return RED;\n case \"review\":\n return YELLOW;\n case \"cancelled\":\n return DIM;\n default:\n return CYAN;\n }\n}\n\nasync function cmdEnrichRun(\n client: Client,\n kg: string,\n rl: readline.Interface,\n args: string[],\n): Promise<void> {\n if (args.length < 2) {\n stdout.write(\n ` ${YELLOW}Usage:${RESET} /enrich <Type> <attr1> [<attr2> ...]\\n`,\n );\n return;\n }\n const typeInput = args[0]!;\n const attrs = args.slice(1).map((a) => a.replace(/^\\./, \"\"));\n const typeName = await resolveTypeName(client, kg, rl, typeInput);\n if (!typeName) return;\n\n const tier: \"lite\" = \"lite\";\n const policy: \"stage\" = \"stage\";\n stdout.write(\n `\\n ${BOLD}Plan:${RESET} enrich ${CYAN}${typeName}${RESET}.${attrs\n .map((a) => `${CYAN}${a}${RESET}`)\n .join(`, .`)} in ${BOLD}${kg}${RESET} ${DIM}·${RESET} tier: ${tier} ${DIM}·${RESET} policy: ${policy}\\n\\n`,\n );\n\n const sp = startSpinner(`Queueing enrichment for ${typeName}...`);\n let created;\n try {\n created = await client.enrichRun({\n type_name: typeName,\n attributes: attrs,\n tier,\n kg_name: kg,\n conflict_policy: policy,\n });\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n const cost = (created.estimated_cost_usd ?? 0).toFixed(4);\n stdout.write(\n ` ${GREEN}✓${RESET} Job queued: ${CYAN_BOLD}${created.job_id}${RESET} ${DIM}·${RESET} estimated cost ${BOLD}$${cost}${RESET} ${DIM}·${RESET} ${fmtNum(created.total_entities ?? 0)} entities\\n`,\n );\n\n const watch = (await ask(rl, ` Watch progress? [Y/n]: `)).trim().toLowerCase();\n if (watch === \"\" || watch === \"y\" || watch === \"yes\") {\n await watchJob(client, created.job_id);\n } else {\n stdout.write(\n ` ${DIM}Tip: /enrich watch ${created.job_id} to follow it.${RESET}\\n`,\n );\n }\n}\n\nasync function watchJob(client: Client, jobId: string): Promise<void> {\n const startedAt = Date.now();\n let lastJob: EnrichJob | null = null;\n // Render in place\n const draw = (job: EnrichJob): void => {\n const p = job.progress;\n const bar = progressBar(p.processed, p.total);\n const elapsed = Math.max(1, Math.floor((Date.now() - startedAt) / 1000));\n const rate = p.processed / elapsed;\n let etaStr = \"—\";\n if (rate > 0 && p.total > p.processed) {\n const remaining = Math.ceil((p.total - p.processed) / rate);\n etaStr =\n remaining < 60\n ? `${remaining}s`\n : remaining < 3600\n ? `${Math.floor(remaining / 60)}m`\n : `${Math.floor(remaining / 3600)}h`;\n }\n const sc = statusColor(job.status);\n stdout.write(\n `\\r\\x1b[2K ${sc}${job.status}${RESET} ${bar} ${fmtNum(p.processed)}/${fmtNum(p.total)} ` +\n `${DIM}·${RESET} filled ${GREEN}${fmtNum(p.filled)}${RESET} ` +\n `${DIM}·${RESET} verified ${CYAN}${fmtNum(p.verified)}${RESET} ` +\n `${DIM}·${RESET} conflicts ${YELLOW}${fmtNum(p.conflicts)}${RESET} ` +\n `${DIM}·${RESET} ETA ${etaStr}`,\n );\n };\n\n while (true) {\n let job: EnrichJob;\n try {\n job = await client.enrichJob(jobId);\n } catch (err) {\n stdout.write(\"\\r\\x1b[2K\");\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n lastJob = job;\n draw(job);\n if (job.status !== \"running\" && job.status !== \"queued\") break;\n await new Promise((r) => setTimeout(r, 1500));\n }\n\n // Final newline after the live line.\n stdout.write(\"\\n\");\n if (!lastJob) return;\n const p = lastJob.progress;\n if (lastJob.status === \"review\") {\n stdout.write(\n ` ${YELLOW}✦${RESET} ${fmtNum(p.conflicts)} conflict${p.conflicts === 1 ? \"\" : \"s\"} need review. ` +\n `${DIM}Run${RESET} /enrich review ${lastJob.id}${DIM} to walk through them.${RESET}\\n`,\n );\n } else if (lastJob.status === \"applied\") {\n stdout.write(\n ` ${GREEN}✓${RESET} Applied ${DIM}·${RESET} filled ${fmtNum(p.filled)}, verified ${fmtNum(p.verified)}, skipped ${fmtNum(p.skipped)}\\n`,\n );\n } else if (lastJob.status === \"failed\") {\n printError(`Job failed: ${lastJob.error ?? \"(no error message)\"}`);\n } else if (lastJob.status === \"cancelled\") {\n stdout.write(` ${DIM}Job cancelled.${RESET}\\n`);\n }\n}\n\nasync function cmdEnrichJobs(client: Client): Promise<void> {\n const sp = startSpinner(\"Loading enrichment jobs...\");\n let jobs: JobSummary[];\n try {\n jobs = await client.enrichJobs();\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n if (jobs.length === 0) {\n stdout.write(` ${DIM}No enrichment jobs yet.${RESET}\\n`);\n return;\n }\n\n const truncAttrs = (attrs: string[]): string => {\n const max = 30;\n const joined = attrs.join(\", \");\n if (joined.length <= max) return joined;\n return joined.slice(0, max - 1) + \"…\";\n };\n\n const rows = jobs.map((j) => ({\n id: j.id,\n type: j.type_name,\n attrs: truncAttrs(j.attributes ?? []),\n status: j.status,\n progress: `${fmtNum(j.progress?.processed ?? 0)}/${fmtNum(j.progress?.total ?? 0)}`,\n created: relativeTime(j.created_at),\n }));\n\n const w = {\n id: Math.max(\"ID\".length, ...rows.map((r) => r.id.length)),\n type: Math.max(\"Type\".length, ...rows.map((r) => r.type.length)),\n attrs: Math.max(\"Attrs\".length, ...rows.map((r) => r.attrs.length)),\n status: Math.max(\"Status\".length, ...rows.map((r) => r.status.length)),\n progress: Math.max(\"Progress\".length, ...rows.map((r) => r.progress.length)),\n };\n\n stdout.write(\"\\n\");\n stdout.write(\n ` ${BOLD}${\"ID\".padEnd(w.id)} ${\"Type\".padEnd(w.type)} ${\"Attrs\".padEnd(w.attrs)} ${\"Status\".padEnd(w.status)} ${\"Progress\".padEnd(w.progress)} Created${RESET}\\n`,\n );\n for (const r of rows) {\n const sc = statusColor(r.status);\n stdout.write(\n ` ${CYAN}${r.id.padEnd(w.id)}${RESET} ${r.type.padEnd(w.type)} ${DIM}${r.attrs.padEnd(w.attrs)}${RESET} ${sc}${r.status.padEnd(w.status)}${RESET} ${r.progress.padEnd(w.progress)} ${DIM}${r.created}${RESET}\\n`,\n );\n }\n stdout.write(\"\\n\");\n}\n\nasync function cmdEnrichReview(\n client: Client,\n rl: readline.Interface,\n jobId: string,\n): Promise<void> {\n if (!jobId) {\n stdout.write(` ${YELLOW}Usage:${RESET} /enrich review <job_id>\\n`);\n return;\n }\n const sp = startSpinner(`Loading conflicts for ${jobId}...`);\n let conflicts: ConflictReview[];\n try {\n conflicts = await client.enrichConflicts(jobId);\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n if (conflicts.length === 0) {\n stdout.write(` ${DIM}No conflicts to review.${RESET}\\n`);\n return;\n }\n\n const decisions: ConflictReview[] = [];\n let acceptAll = false;\n let quitEarly = false;\n\n for (let i = 0; i < conflicts.length; i++) {\n const c = conflicts[i]!;\n const entity = lastUriSegment(c.entity_uri);\n const conf = (c.proposed?.confidence ?? 0).toFixed(2);\n stdout.write(\"\\n\");\n stdout.write(\n ` ${DIM}[${i + 1}/${conflicts.length}]${RESET} ${BOLD}${entity}${RESET}.${CYAN}${c.attribute}${RESET}\\n`,\n );\n stdout.write(\n ` ${DIM}existing →${RESET} ${c.existing_value}\\n` +\n ` ${DIM}proposed →${RESET} ${BOLD}${c.proposed?.value ?? \"\"}${RESET} ${DIM}(conf ${conf}, src ${c.proposed?.source ?? \"?\"})${RESET}\\n`,\n );\n if (c.proposed?.source_url) {\n stdout.write(` ${DIM}url →${RESET} ${c.proposed.source_url}\\n`);\n }\n\n let decision: \"accept\" | \"reject\" | \"skip\";\n if (acceptAll) {\n decision = \"accept\";\n stdout.write(` ${GREEN}auto-accepted${RESET}\\n`);\n } else {\n const ans = (\n await ask(\n rl,\n ` [a]ccept / [r]eject / [s]kip / [A]ccept all remaining / [q]uit (saves progress) [s]: `,\n )\n ).trim();\n if (ans === \"A\") {\n acceptAll = true;\n decision = \"accept\";\n } else if (ans === \"a\") {\n decision = \"accept\";\n } else if (ans === \"r\") {\n decision = \"reject\";\n } else if (ans === \"q\") {\n quitEarly = true;\n break;\n } else {\n decision = \"skip\";\n }\n }\n decisions.push({ ...c, decision });\n }\n\n if (quitEarly) {\n if (decisions.length === 0) {\n stdout.write(` ${DIM}No decisions made — nothing to save.${RESET}\\n`);\n return;\n }\n const save = (\n await ask(rl, ` Save ${decisions.length} decision(s) so far? [Y/n]: `)\n )\n .trim()\n .toLowerCase();\n if (save !== \"\" && save !== \"y\" && save !== \"yes\") {\n stdout.write(` ${DIM}Discarded.${RESET}\\n`);\n return;\n }\n }\n\n if (decisions.length === 0) {\n stdout.write(` ${DIM}No decisions to apply.${RESET}\\n`);\n return;\n }\n\n const sp2 = startSpinner(`Applying ${decisions.length} decision(s)...`);\n try {\n const res = await client.enrichApply(jobId, decisions);\n sp2.stop();\n stdout.write(\n ` ${GREEN}✓${RESET} Applied ${BOLD}${fmtNum(res.applied)}${RESET} change${res.applied === 1 ? \"\" : \"s\"}.\\n`,\n );\n } catch (err) {\n sp2.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n}\n\nfunction urlHost(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url.replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n }\n}\n\nfunction makePrompt(\n kg: string,\n triples: number,\n mode: \"cloud\" | \"self-hosted\" = \"cloud\",\n baseUrl?: string,\n): string {\n const kgPart = `${DIM}(${kg})${RESET}`;\n const triplePart = triples > 0 ? `${DIM}[${fmtNum(triples)}]${RESET} ` : \"\";\n if (mode === \"self-hosted\" && baseUrl) {\n const host = urlHost(baseUrl);\n return ` ${CYAN_BOLD}cograph${RESET}${DIM}@${host}${RESET} ${kgPart} ${triplePart}${CYAN_BOLD}▸${RESET} `;\n }\n return ` ${CYAN_BOLD}cograph${RESET} ${kgPart} ${triplePart}${CYAN_BOLD}▸${RESET} `;\n}\n\n/**\n * Split a command-line style argument string. Supports double-quoted args.\n */\nfunction splitArgs(s: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let inQ = false;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (inQ) {\n if (c === '\"') inQ = false;\n else cur += c;\n } else {\n if (c === '\"') inQ = true;\n else if (c === \" \" || c === \"\\t\") {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n } else cur += c;\n }\n }\n if (cur) out.push(cur);\n return out;\n}\n\nexport async function runShell(opts: {\n kg?: string;\n local?: boolean;\n noLogin?: boolean;\n}): Promise<void> {\n const CLOUD_DEFAULT = \"https://api.cograph.cloud\";\n // Detection precedence: --local > --no-login > COGRAPH_API_URL pointing\n // anywhere besides the cloud default. When self-hosted we never trigger\n // login and tenant defaults to \"default\" (open-access backend behavior).\n const envUrl = process.env.COGRAPH_API_URL || process.env.OMNIX_API_URL;\n const envIsSelfHosted = !!envUrl && envUrl !== CLOUD_DEFAULT;\n const selfHostedHint = !!opts.local || !!opts.noLogin || envIsSelfHosted;\n\n // `let` rather than `const` so /login can swap in a fresh Client after\n // ~/.cograph/config.json is rewritten with the new key.\n let client = opts.local\n ? new Client({ baseUrl: \"http://localhost:8000\", tenant: \"default\" })\n : selfHostedHint\n ? new Client({ tenant: \"default\" })\n : new Client();\n\n // Probe the backend before deciding whether to trigger login. This lets\n // us distinguish \"cloud, needs auth\" from \"self-hosted, open access\" and\n // also surfaces an unreachable server with a clear error rather than a\n // confusing browser-login attempt.\n const health = await client.healthCheck();\n if (!health.ok) {\n printError(\n `Could not reach ${health.url}. Is the server running?`,\n );\n return;\n }\n\n const selfHosted = selfHostedHint || !health.requiresAuth;\n const mode: \"cloud\" | \"self-hosted\" = selfHosted ? \"self-hosted\" : \"cloud\";\n\n // Cloud / auth-required path: behave as before — if no key, log in.\n if (!selfHosted && health.requiresAuth && !client.apiKey) {\n stdout.write(\n `\\n ${DIM}Not signed in — opening your browser to log in...${RESET}\\n`,\n );\n const { runLogin } = await import(\"./login.js\");\n await runLogin();\n client = new Client();\n if (!client.apiKey) {\n // runLogin already exits the process on hard failures, so reaching\n // here means it returned without writing a key (rare). Bail rather\n // than continue into a broken shell.\n printError(\"Login did not produce an API key. Aborting.\");\n return;\n }\n }\n const rl = readline.createInterface({\n input: stdin,\n output: stdout,\n terminal: true,\n });\n\n showBanner();\n\n if (selfHosted) {\n stdout.write(\n `${DIM} Self-hosted mode · ${client.baseUrl} · tenant=${client.tenant}${RESET}\\n\\n`,\n );\n }\n\n // One agent session id per shell session — threaded across every /agent turn\n // for multi-turn continuity (the server keys conversation state on it).\n const agentSessionId = randomUUID();\n\n let kg = opts.kg;\n if (!kg) {\n const picked = await selectKg(client, rl);\n if (!picked) {\n rl.close();\n return;\n }\n kg = picked;\n }\n\n let triples = 0;\n const info = await fetchKg(client, kg);\n if (info && info.triple_count > 0) {\n triples = info.triple_count;\n stdout.write(\n ` ${DIM}Connected to${RESET} ${BOLD}${kg}${RESET}${DIM}: ${fmtNum(triples)} triples${RESET}\\n\\n`,\n );\n } else {\n stdout.write(\n ` ${DIM}Connected — ${kg} is empty (use /ingest to add data)${RESET}\\n\\n`,\n );\n }\n\n const refresh = async (): Promise<void> => {\n const fresh = await fetchKg(client, kg!);\n triples = fresh?.triple_count ?? 0;\n };\n\n let running = true;\n rl.on(\"close\", () => {\n running = false;\n });\n\n while (running) {\n let line: string;\n try {\n line = (\n await ask(rl, makePrompt(kg, triples, mode, client.baseUrl))\n ).trim();\n } catch {\n break;\n }\n if (!running) break;\n if (!line) continue;\n\n if (line === \"/quit\" || line === \"/exit\" || line === \"/q\") {\n stdout.write(` ${DIM}Bye.${RESET}\\n`);\n break;\n }\n\n if (line === \"/help\") {\n showCommands();\n continue;\n }\n\n try {\n if (line.startsWith(\"/ingest\")) {\n const args = splitArgs(line.slice(\"/ingest\".length).trim());\n await cmdIngest(client, kg, args);\n await refresh();\n } else if (line.startsWith(\"/ask \")) {\n await cmdAsk(client, kg, line.slice(\"/ask \".length));\n } else if (line === \"/ask\") {\n await cmdAsk(client, kg, \"\");\n } else if (line.startsWith(\"/agent \")) {\n await cmdAgent(\n client,\n kg,\n rl,\n agentSessionId,\n line.slice(\"/agent \".length),\n );\n await refresh();\n } else if (line === \"/agent\") {\n await cmdAgent(client, kg, rl, agentSessionId, \"\");\n } else if (line === \"/types\" || line.startsWith(\"/types \")) {\n const query = line === \"/types\" ? \"\" : line.slice(\"/types \".length);\n await cmdTypes(client, kg, query);\n } else if (line.startsWith(\"/type \") || line === \"/type\") {\n const arg = line === \"/type\" ? \"\" : line.slice(\"/type \".length);\n await cmdType(client, kg, rl, arg);\n } else if (line === \"/enrich\" || line.startsWith(\"/enrich \")) {\n const args = splitArgs(line.slice(\"/enrich\".length).trim());\n if (args.length === 0) {\n stdout.write(\n ` ${YELLOW}Usage:${RESET} /enrich <Type> <attr> ... | /enrich watch <id> | /enrich jobs | /enrich review <id>\\n`,\n );\n } else if (args[0] === \"jobs\") {\n await cmdEnrichJobs(client);\n } else if (args[0] === \"watch\") {\n const jid = args[1];\n if (!jid) {\n stdout.write(` ${YELLOW}Usage:${RESET} /enrich watch <job_id>\\n`);\n } else {\n await watchJob(client, jid);\n }\n } else if (args[0] === \"review\") {\n await cmdEnrichReview(client, rl, args[1] ?? \"\");\n } else {\n await cmdEnrichRun(client, kg, rl, args);\n await refresh();\n }\n } else if (line === \"/status\") {\n await cmdStatus(client, kg);\n await refresh();\n } else if (line === \"/reset\") {\n const did = await cmdReset(client, kg, rl);\n if (did) await refresh();\n } else if (line === \"/login\") {\n const { runLogin } = await import(\"./login.js\");\n await runLogin();\n // Pick up the new key from ~/.cograph/config.json for subsequent calls.\n client = new Client();\n await refresh();\n } else if (line === \"/tenant\" || line.startsWith(\"/tenant \")) {\n const args = splitArgs(line.slice(\"/tenant\".length).trim());\n const sub = args[0] ?? \"list\";\n const target = args.slice(1).join(\" \");\n\n if (sub === \"use\" || sub === \"switch\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /tenant use <id>\\n`);\n } else {\n writeConfig({ tenant: target });\n // Rebuild the client so it picks up the new tenant; preserve the\n // current base URL (self-hosted/local) and key.\n client = new Client({ baseUrl: client.baseUrl });\n stdout.write(\n ` ${GREEN}✓${RESET} Switched to tenant ${BOLD}${target}${RESET}\\n`,\n );\n // KGs are per-tenant — the old current KG may not exist here, so\n // pick one from the new tenant.\n const picked = await selectKg(client, rl);\n if (picked) {\n kg = picked;\n } else {\n stdout.write(\n ` ${DIM}No KGs in ${target} yet — /kg create <name>${RESET}\\n`,\n );\n }\n await refresh();\n }\n } else if (sub === \"current\") {\n stdout.write(` ${BOLD}${client.tenant}${RESET}\\n`);\n } else {\n try {\n const tenants = await client.listTenants();\n if (!tenants.length) {\n stdout.write(` ${DIM}No tenants found for your account.${RESET}\\n`);\n } else {\n for (const t of tenants) {\n const marker =\n t.id === client.tenant ? `${CYAN_BOLD}*${RESET}` : \" \";\n stdout.write(\n ` ${marker} ${BOLD}${t.id}${RESET} ${DIM}${t.label}${RESET}\\n`,\n );\n }\n stdout.write(` ${DIM}/tenant use <id> to switch${RESET}\\n`);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (err instanceof CographError && err.status === 501) {\n printError(\"Tenant management isn't configured on this backend.\");\n } else {\n printError(msg);\n }\n }\n }\n } else if (line === \"/kg\" || line.startsWith(\"/kg \")) {\n const args = splitArgs(line.slice(\"/kg\".length).trim());\n const sub = args[0] ?? \"list\";\n const target = args.slice(1).join(\" \");\n\n if (sub === \"list\") {\n const list = await client.listKgs();\n if (!list.length) {\n stdout.write(\n ` ${DIM}No knowledge graphs yet. /kg create <name>${RESET}\\n`,\n );\n } else {\n for (const k of list) {\n const n = String((k as { name?: string }).name ?? \"?\");\n const tc = Number((k as { triple_count?: number }).triple_count ?? 0);\n const marker = n === kg ? `${CYAN_BOLD}*${RESET}` : \" \";\n stdout.write(\n ` ${marker} ${BOLD}${n}${RESET} ${DIM}(${fmtNum(tc)} triples)${RESET}\\n`,\n );\n }\n }\n } else if (sub === \"switch\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /kg switch <name>\\n`);\n } else {\n const list = await client.listKgs();\n const found = list.find(\n (k) => (k as { name?: string }).name === target,\n );\n if (!found) {\n printError(`KG not found: ${target}. Try /kg list.`);\n } else {\n kg = target;\n triples = Number(\n (found as { triple_count?: number }).triple_count ?? 0,\n );\n stdout.write(\n ` ${GREEN}✓${RESET} Switched to ${BOLD}${kg}${RESET}\\n`,\n );\n }\n }\n } else if (sub === \"create\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /kg create <name>\\n`);\n } else {\n try {\n await client.createKg(target);\n kg = target;\n triples = 0;\n stdout.write(\n ` ${GREEN}✓${RESET} Created and switched to ${BOLD}${kg}${RESET}\\n`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (/already exists|409/i.test(msg)) {\n kg = target;\n await refresh();\n stdout.write(\n ` ${DIM}${target} already exists — switched to it.${RESET}\\n`,\n );\n } else {\n printError(`Could not create: ${msg}`);\n }\n }\n }\n } else if (sub === \"delete\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /kg delete <name>\\n`);\n } else {\n const isActive = target === kg;\n const tag = isActive ? \" (the active KG)\" : \"\";\n const confirm = (\n await ask(\n rl,\n ` ${YELLOW}Delete KG \"${target}\"${tag}?${RESET} [y/N]: `,\n )\n )\n .trim()\n .toLowerCase();\n if (confirm === \"y\" || confirm === \"yes\") {\n try {\n await client.deleteKg(target);\n stdout.write(` ${GREEN}✓${RESET} Deleted ${BOLD}${target}${RESET}\\n`);\n if (isActive) {\n // Active KG is gone; let the user pick (or create) a new one\n // before any further commands try to use it.\n const picked = await selectKg(client, rl);\n if (!picked) {\n running = false;\n break;\n }\n kg = picked;\n await refresh();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n printError(`Could not delete: ${msg}`);\n }\n } else {\n stdout.write(` ${DIM}Cancelled.${RESET}\\n`);\n }\n }\n } else {\n stdout.write(\n ` ${YELLOW}Unknown /kg subcommand: ${sub}.${RESET} Try /kg list, /kg switch <name>, /kg create <name>, /kg delete <name>.\\n`,\n );\n }\n } else if (line.startsWith(\"/\")) {\n stdout.write(\n ` ${YELLOW}Unknown command.${RESET} Try /ingest, /ask, /agent, /kg, /types, /type, /enrich, /login, /status, /reset, /help, /quit\\n`,\n );\n } else {\n // Bare line — auto-route to /ask\n await cmdAsk(client, kg, line);\n }\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n }\n\n rl.close();\n}\n"],"mappings":"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","names":["p"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cograph",
3
- "version": "0.1.27",
3
+ "version": "0.1.29",
4
4
  "description": "Cograph SDK and CLI — knowledge graph platform for structured data",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/client.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from \"node:fs\";\nimport { extname } from \"node:path\";\nimport { readConfig } from \"./config.js\";\n\nexport class CographError extends Error {\n status?: number;\n body?: string;\n\n constructor(message: string, opts?: { status?: number; body?: string }) {\n super(message);\n this.name = \"CographError\";\n this.status = opts?.status;\n this.body = opts?.body;\n }\n}\n\nexport interface ClientOptions {\n apiKey?: string;\n baseUrl?: string;\n tenant?: string;\n}\n\nexport interface IngestOptions {\n kg?: string;\n contentType?: \"text\" | \"csv\" | \"json\" | string;\n /** Rows per batch for CSV ingest. Default 200. Larger = fewer round-trips\n * but higher per-request memory; 200 is a good balance for typical KGs. */\n batchSize?: number;\n /** Max number of batches in flight at once. Default 4. Higher saturates\n * the backend faster but risks 429s on large ingests. */\n concurrency?: number;\n /** Called after each batch completes during CSV ingest, in batch order.\n * Use for progress UI. Not invoked for text/json ingest. */\n onProgress?: (progress: IngestProgress) => void;\n /** CSV only. Called once after schema inference and BEFORE any rows are\n * written, with the inferred mapping. Return the (possibly edited/approved)\n * mapping to ingest, or `null` to cancel without writing anything. When\n * omitted the inferred mapping is applied as-is (non-interactive). This is\n * the same confirm/override gate the Explorer surfaces in its review step. */\n onSchemaInferred?: (\n mapping: Record<string, unknown>,\n info: { totalRows: number; rowsProfiled: number },\n ) => Promise<Record<string, unknown> | null>;\n}\n\nexport interface IngestProgress {\n rowsProcessed: number;\n totalRows: number;\n entitiesResolved: number;\n triplesInserted: number;\n}\n\n/** Rows sent to schema inference. Profile fidelity = decision quality, so we\n * send the whole file up to this cap, evenly strided across it (never the\n * head — head-of-file bias is exactly what evidence-grounded inference fixes).\n * Matches the Explorer's SCHEMA_SAMPLE_CAP. */\nexport const SCHEMA_SAMPLE_CAP = 5000;\n\nfunction stridedSample<T>(rows: T[], cap: number = SCHEMA_SAMPLE_CAP): T[] {\n if (rows.length <= cap) return rows;\n const out: T[] = [];\n for (let i = 0; i < cap; i++) out.push(rows[Math.floor((i * rows.length) / cap)]!);\n return out;\n}\n\nexport interface AskOptions {\n kg?: string;\n model?: string;\n}\n\nfunction envVar(name: string, fallback?: string): string | undefined {\n // Prefer COGRAPH_, fall back to OMNIX_ so old configs keep working.\n return (\n process.env[`COGRAPH_${name}`] ||\n process.env[`OMNIX_${name}`] ||\n fallback\n );\n}\n\nconst EXT_FORMAT: Record<string, string> = {\n \".csv\": \"csv\",\n \".json\": \"json\",\n \".jsonl\": \"json\",\n \".txt\": \"text\",\n};\n\n/**\n * Parse a CSV string into an array of row objects.\n *\n * Minimal RFC-4180-ish parser: handles quoted fields with commas, escaped\n * quotes (`\"\"`), CRLF/LF line endings. Does not handle BOM stripping or\n * encoding detection — we assume UTF-8 text in.\n */\nexport function parseCsv(content: string): Record<string, string>[] {\n const rows: string[][] = [];\n let cur: string[] = [];\n let field = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < content.length; i++) {\n const ch = content[i];\n if (inQuotes) {\n if (ch === '\"') {\n if (content[i + 1] === '\"') {\n field += '\"';\n i++;\n } else {\n inQuotes = false;\n }\n } else {\n field += ch;\n }\n } else {\n if (ch === '\"') {\n inQuotes = true;\n } else if (ch === \",\") {\n cur.push(field);\n field = \"\";\n } else if (ch === \"\\n\") {\n cur.push(field);\n rows.push(cur);\n cur = [];\n field = \"\";\n } else if (ch === \"\\r\") {\n // swallow; handled by the following \\n in CRLF, or treat lone \\r as line end\n if (content[i + 1] !== \"\\n\") {\n cur.push(field);\n rows.push(cur);\n cur = [];\n field = \"\";\n }\n } else {\n field += ch;\n }\n }\n }\n // flush trailing field/row\n if (field.length > 0 || cur.length > 0) {\n cur.push(field);\n rows.push(cur);\n }\n\n if (rows.length === 0) return [];\n const headers = rows[0]!.map((h) => h.trim());\n const out: Record<string, string>[] = [];\n for (let r = 1; r < rows.length; r++) {\n const row = rows[r]!;\n // skip blank trailing lines\n if (row.length === 1 && row[0] === \"\") continue;\n const obj: Record<string, string> = {};\n for (let c = 0; c < headers.length; c++) {\n obj[headers[c]!] = row[c] ?? \"\";\n }\n out.push(obj);\n }\n return out;\n}\n\nexport class Client {\n apiKey: string | undefined;\n baseUrl: string;\n tenant: string;\n\n /**\n * Raw / passthrough API — one method per canonical backend operation, with\n * the path encoded inside the SDK. Each method returns the backend\n * {@link Response} VERBATIM: it does NOT throw on non-2xx and does NOT reshape\n * the body. This is the seam the webapp's proxy layer adopts so per-operation\n * paths live in one place (here) instead of being hand-rolled at each call\n * site. See {@link RawApi}. The typed methods on this class (which throw on\n * non-2xx and reshape some payloads) are left unchanged — this is additive.\n */\n readonly raw: RawApi;\n\n constructor(opts: ClientOptions = {}) {\n // Resolution order for each field: explicit opts → env var → ~/.cograph/config.json\n // (written by `cograph login`) → built-in default. Reading the config eagerly\n // is cheap (small JSON file) and lets users skip env vars entirely after login.\n const cfg = readConfig();\n this.apiKey = opts.apiKey ?? envVar(\"API_KEY\") ?? cfg.apiKey;\n const url =\n opts.baseUrl ?? envVar(\"API_URL\") ?? cfg.apiUrl ?? \"https://api.cograph.cloud\";\n this.baseUrl = url.replace(/\\/+$/, \"\");\n this.tenant = opts.tenant ?? envVar(\"TENANT\") ?? cfg.tenant ?? \"demo-tenant\";\n this.raw = new RawApi(this);\n }\n\n private headers(): Record<string, string> {\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (this.apiKey) h[\"X-API-Key\"] = this.apiKey;\n return h;\n }\n\n private base(): string {\n return `${this.baseUrl}/graphs/${this.tenant}`;\n }\n\n // --- Path builders -------------------------------------------------------- #\n // SINGLE source of truth for every canonical backend path. Both the raw API\n // and the new typed parsed methods build URLs through these, so a path lives\n // in exactly one place. Tenant-scoped paths hang off `base()`\n // (`{baseUrl}/graphs/{tenant}`); the handful of account-level paths\n // (e.g. tenant CRUD) hang off `baseUrl` directly.\n //\n // These are marked `@internal` (not part of the public SDK surface) but are\n // not `private`, so the sibling {@link RawApi} can build the same canonical\n // paths without duplicating them.\n\n /** @internal */\n pAgent(): string {\n return `${this.base()}/agent`;\n }\n /** @internal */ pAsk(): string {\n return `${this.base()}/ask`;\n }\n /** @internal */ pIngest(): string {\n return `${this.base()}/ingest`;\n }\n /** @internal */ pIngestCsvSchema(): string {\n return `${this.base()}/ingest/csv/schema`;\n }\n /** @internal */ pIngestCsvRows(): string {\n return `${this.base()}/ingest/csv/rows`;\n }\n /** @internal */ pEnrichJobs(): string {\n return `${this.base()}/enrich/jobs`;\n }\n /** @internal */ pEnrichJob(jobId: string): string {\n return `${this.base()}/enrich/jobs/${encodeURIComponent(jobId)}`;\n }\n /** @internal */ pEnrichJobConflicts(jobId: string): string {\n return `${this.pEnrichJob(jobId)}/conflicts`;\n }\n /** @internal */ pEnrichJobApply(jobId: string): string {\n return `${this.pEnrichJob(jobId)}/apply`;\n }\n /** @internal */ pOntologyTypes(): string {\n return `${this.base()}/ontology/types`;\n }\n /** @internal */ pOntologyResolve(): string {\n return `${this.base()}/ontology/resolve`;\n }\n /** @internal Targets the premium ontology-recommender route, mounted only on\n * deployments with the proprietary layer — 404s on bare OSS. */\n pOntologyRecommend(): string {\n return `${this.base()}/ontology/recommend`;\n }\n /** @internal */ pOntologyApply(): string {\n return `${this.base()}/ontology/apply`;\n }\n /** @internal */ pKgs(): string {\n return `${this.base()}/kgs`;\n }\n /** @internal */ pKg(name: string): string {\n return `${this.base()}/kgs/${encodeURIComponent(name)}`;\n }\n /** @internal */ pTypeCounts(kg: string): string {\n return `${this.pKg(kg)}/type-counts`;\n }\n /** @internal */ pExploreSummary(kg: string, typeName: string): string {\n return `${this.base()}/explore/kgs/${encodeURIComponent(kg)}/types/${encodeURIComponent(typeName)}/summary`;\n }\n /** @internal */ pExploreRecords(kg: string, typeName: string, query?: string): string {\n return `${this.base()}/explore/kgs/${encodeURIComponent(kg)}/types/${encodeURIComponent(typeName)}/records${query ?? \"\"}`;\n }\n /** @internal */ pExploreTypeEdges(kg: string): string {\n return `${this.base()}/explore/kgs/${encodeURIComponent(kg)}/type-edges`;\n }\n /** @internal */ pExploreSearch(query: string): string {\n return `${this.base()}/explore/search${query}`;\n }\n /** @internal */ pNormalizeSuggest(query: string): string {\n return `${this.base()}/normalize/suggest${query}`;\n }\n /** @internal */ pNormalizeRules(query?: string): string {\n return `${this.base()}/normalize/rules${query ?? \"\"}`;\n }\n /** @internal */ pNormalizeRule(ruleId: string, action: \"confirm\" | \"reject\" | \"apply\"): string {\n return `${this.base()}/normalize/rules/${encodeURIComponent(ruleId)}/${action}`;\n }\n /** @internal */ pTenants(): string {\n return `${this.baseUrl}/v1/me/tenants`;\n }\n /** @internal */ pTenant(tenantId: string): string {\n return `${this.baseUrl}/v1/me/tenants/${encodeURIComponent(tenantId)}`;\n }\n\n /**\n * Low-level passthrough request. Centralizes the absolute URL (already built\n * by a path-builder, so it carries the base URL + `/graphs/{tenant}` prefix),\n * the `X-API-Key` header, JSON content-type, body stringification, and a\n * timeout/abort — then returns the backend {@link Response} UNCHANGED.\n *\n * Unlike {@link request}, this does NOT inspect `res.ok` and does NOT parse or\n * reshape the body. A 4xx/5xx comes back as a resolved `Response` (the caller\n * reads `.status`/`.headers`/`.body`), NOT a thrown {@link CographError}. The\n * only rejection paths are a genuine network failure or a timeout abort —\n * exactly the cases where there is no HTTP response to hand back.\n *\n * `init.headers` is merged last so a caller can add/override headers; `init.body`,\n * when a non-string is passed, is JSON-stringified for convenience.\n */\n async requestRaw(\n method: string,\n path: string,\n init: { body?: unknown; headers?: Record<string, string>; timeoutMs?: number } = {},\n ): Promise<Response> {\n const timeoutMs = init.timeoutMs ?? 120_000;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n // Always a string (or undefined): we stringify non-string bodies here, so we\n // never depend on the DOM `BodyInit` type (this package builds with the Node\n // lib only, no `dom` lib).\n let body: string | undefined;\n if (init.body !== undefined) {\n body = typeof init.body === \"string\" ? init.body : JSON.stringify(init.body);\n }\n\n try {\n return await fetch(path, {\n method,\n headers: { ...this.headers(), ...(init.headers ?? {}) },\n body,\n signal: controller.signal,\n });\n } catch (err) {\n // A network error or timeout abort means there is NO Response to return,\n // so this is the one case we surface as a thrown error. A non-2xx HTTP\n // status is NOT an error here — it resolves above as a Response.\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new CographError(`Request to ${path} timed out after ${timeoutMs}ms`);\n }\n throw new CographError(\n `Network error contacting ${path}: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n clearTimeout(timer);\n }\n }\n\n /**\n * Probe the backend to determine reachability and whether endpoints\n * require an X-API-Key header. Used at shell startup to distinguish\n * cloud (auth required) from self-hosted open-access deployments.\n */\n async healthCheck(): Promise<{\n ok: boolean;\n requiresAuth: boolean;\n url: string;\n }> {\n const healthUrl = `${this.baseUrl}/health`;\n try {\n const res = await fetch(healthUrl, {\n signal: AbortSignal.timeout(5000),\n });\n if (!res.ok) return { ok: false, requiresAuth: false, url: this.baseUrl };\n } catch {\n return { ok: false, requiresAuth: false, url: this.baseUrl };\n }\n // Probe whether endpoints require auth by hitting /kgs without X-API-Key.\n // 401 = requires auth; 200/empty = open access; anything else = treat as\n // auth-required to be safe.\n try {\n const res = await fetch(`${this.base()}/kgs`, {\n headers: { \"Content-Type\": \"application/json\" },\n signal: AbortSignal.timeout(5000),\n });\n return {\n ok: true,\n requiresAuth: res.status === 401,\n url: this.baseUrl,\n };\n } catch {\n return { ok: true, requiresAuth: true, url: this.baseUrl };\n }\n }\n\n private async request<T = unknown>(\n method: string,\n url: string,\n body?: unknown,\n timeoutMs: number = 120_000,\n ): Promise<T> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n let res: Response;\n try {\n res = await fetch(url, {\n method,\n headers: this.headers(),\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new CographError(`Request to ${url} timed out after ${timeoutMs}ms`);\n }\n throw new CographError(\n `Network error contacting ${url}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n clearTimeout(timer);\n\n if (!res.ok) {\n let text = \"\";\n try {\n text = await res.text();\n } catch {\n // ignore\n }\n throw new CographError(`HTTP ${res.status}: ${text}`, {\n status: res.status,\n body: text,\n });\n }\n\n // 204 No Content\n if (res.status === 204) return undefined as T;\n\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (ct.includes(\"application/json\")) {\n return (await res.json()) as T;\n }\n // fall back to text\n const text = await res.text();\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n }\n\n /**\n * Ingest a file path or raw text into a knowledge graph.\n *\n * If `pathOrText` points to an existing file, its contents are read and the\n * format is inferred from the extension (.csv, .json, .txt) unless\n * `contentType` is given. CSV files use the two-step schema-inference + row\n * mapping flow.\n */\n async ingest(\n pathOrText: string,\n opts: IngestOptions = {},\n ): Promise<Record<string, unknown>> {\n let content: string;\n let fmt: string;\n\n let isFile = false;\n try {\n isFile = existsSync(pathOrText) && statSync(pathOrText).isFile();\n } catch {\n isFile = false;\n }\n\n if (isFile) {\n const ext = extname(pathOrText).toLowerCase();\n if (ext === \".pdf\") {\n throw new CographError(\n \"PDF ingest not yet supported in the Node CLI; use the Python CLI or POST raw bytes to the API.\",\n );\n }\n content = readFileSync(pathOrText, \"utf-8\");\n fmt = opts.contentType ?? EXT_FORMAT[ext] ?? \"text\";\n if (fmt === \"csv\") {\n return this.ingestCsv(content, opts);\n }\n } else {\n content = pathOrText;\n fmt = opts.contentType ?? \"text\";\n }\n\n const body: Record<string, unknown> = {\n content,\n content_type: fmt,\n source: \"client\",\n };\n if (opts.kg) body.kg_name = opts.kg;\n return this.request(\"POST\", `${this.base()}/ingest`, body, 120_000);\n }\n\n private async ingestCsv(\n content: string,\n opts: IngestOptions,\n ): Promise<Record<string, unknown>> {\n const kgName = opts.kg;\n const batchSize = opts.batchSize ?? 200;\n const concurrency = opts.concurrency ?? 4;\n\n const rows = parseCsv(content);\n if (rows.length === 0) throw new CographError(\"CSV is empty\");\n const headers = Object.keys(rows[0]!);\n\n // Send the whole file to the profiler, evenly strided across it (never the\n // head — head-of-file bias, e.g. a key column that goes sparse later, is\n // exactly what evidence-grounded inference fixes). Profile fidelity =\n // decision quality. Mirrors the Explorer's upload flow.\n const sampleRows = stridedSample(rows);\n\n const schemaBody = {\n headers,\n sample_rows: sampleRows,\n total_rows: rows.length,\n };\n const mapping = await this.request<Record<string, unknown>>(\n \"POST\",\n `${this.base()}/ingest/csv/schema`,\n schemaBody,\n 300_000,\n );\n\n // Confirm/override gate (same contract as the Explorer's review step): the\n // caller inspects the inferred mapping and returns what to ingest, or null\n // to cancel before any rows are written. /ingest/csv/rows applies exactly\n // what we post back. When no hook is given, apply the inference as-is.\n let mappingToPost: Record<string, unknown> = mapping;\n if (opts.onSchemaInferred) {\n const reviewed = await opts.onSchemaInferred(mapping, {\n totalRows: rows.length,\n rowsProfiled: sampleRows.length,\n });\n if (reviewed == null) {\n return { cancelled: true, message: \"Ingest cancelled before any rows were written.\" };\n }\n mappingToPost = reviewed;\n }\n\n // Slice rows into batches up front so we can fire them off in a\n // bounded worker pool. Sequential 50-row batches over 891 rows took\n // ~60s end-to-end (18 round-trips); 200-row batches × 4 in flight\n // brings that to ~5s on the same backend.\n const batches: Array<Record<string, string>[]> = [];\n for (let i = 0; i < rows.length; i += batchSize) {\n batches.push(rows.slice(i, i + batchSize));\n }\n\n let totalEntities = 0;\n let totalTriples = 0;\n let rowsProcessed = 0;\n let nextBatch = 0;\n\n const postBatch = async (batch: Record<string, string>[]) => {\n const body: Record<string, unknown> = {\n mapping: mappingToPost,\n rows: batch,\n source: \"client\",\n };\n if (kgName) body.kg_name = kgName;\n const result = await this.request<{\n entities_resolved?: number;\n triples_inserted?: number;\n }>(\"POST\", `${this.base()}/ingest/csv/rows`, body, 300_000);\n return {\n entities: result.entities_resolved ?? 0,\n triples: result.triples_inserted ?? 0,\n size: batch.length,\n };\n };\n\n const worker = async (): Promise<void> => {\n while (true) {\n const idx = nextBatch++;\n if (idx >= batches.length) return;\n const r = await postBatch(batches[idx]!);\n totalEntities += r.entities;\n totalTriples += r.triples;\n rowsProcessed += r.size;\n opts.onProgress?.({\n rowsProcessed,\n totalRows: rows.length,\n entitiesResolved: totalEntities,\n triplesInserted: totalTriples,\n });\n }\n };\n\n const workers: Array<Promise<void>> = [];\n for (let i = 0; i < Math.min(concurrency, batches.length); i++) {\n workers.push(worker());\n }\n await Promise.all(workers);\n\n // All batches are in — kick off a background recompute of the Explorer\n // type-stats for this KG so type-detail views load instantly. The endpoint\n // returns immediately (the scan runs server-side in the background); this\n // is best-effort and never fails the ingest.\n if (kgName) {\n try {\n await this.request(\n \"POST\",\n `${this.base()}/explore/kgs/${encodeURIComponent(kgName)}/recompute-stats`,\n {},\n 15_000,\n );\n } catch {\n // non-fatal — stats fall back to a live scan until the next recompute\n }\n }\n\n return {\n entities_resolved: totalEntities,\n triples_inserted: totalTriples,\n mapping,\n };\n }\n\n /** Ask a natural language question and return the parsed response. */\n async ask(\n question: string,\n opts: AskOptions = {},\n ): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = { question };\n if (opts.kg) body.kg_name = opts.kg;\n if (opts.model) body.model = opts.model;\n return this.request(\"POST\", `${this.base()}/ask`, body, 60_000);\n }\n\n /**\n * One turn of the unified Ask-AI agent — the SINGLE conversational surface\n * (`POST /graphs/{tenant}/agent`, COG-118). Mirrors the HTTP contract exactly:\n *\n * - `confirmPlanId` set → the server runs `execute_plan` (the only mutating\n * path) and returns `{kind:\"result\", steps}`.\n * - otherwise → the server runs `planner.handle(message)` and returns one of\n * `{kind:\"answer\"}` / `{kind:\"clarify\"}` / `{kind:\"plan\"}`.\n *\n * The agent classifies intent server-side and drives the underlying engines\n * through its capability registry — the client never talks to `/ask`,\n * `/enrich/*` etc. for an agent turn. ENTITLEMENT for any paid step a plan\n * contains is enforced server-side at execute time (the same authorization the\n * direct paid routes apply), so confirming a plan here cannot bypass a gate the\n * direct path enforces — the gate lives behind the endpoint, not in this client.\n */\n async agent(opts: AgentTurnOptions): Promise<AgentResult> {\n const body: Record<string, unknown> = {\n message: opts.message ?? \"\",\n context: {\n kg_name: opts.kgName ?? \"\",\n type_name: opts.typeName ?? null,\n },\n };\n if (opts.sessionId) body.session_id = opts.sessionId;\n // confirm.plan_id present → the server routes to execute_plan (mutating).\n if (opts.confirmPlanId) body.confirm = { plan_id: opts.confirmPlanId };\n return this.request<AgentResult>(\n \"POST\",\n `${this.base()}/agent`,\n body,\n // Generous: a confirmed plan can kick off enrichment/dedup work, and a\n // question turn runs an LLM round-trip server-side.\n 120_000,\n );\n }\n\n /** List the tenants the authenticated user can access (GET /v1/me/tenants).\n * Keyed by the API key (X-API-Key → user), so it's independent of the active\n * tenant. Throws CographError with status 501 on deployments without a tenant\n * provider (e.g. OSS-only). */\n async listTenants(): Promise<Array<{ id: string; label: string }>> {\n return this.request<Array<{ id: string; label: string }>>(\n \"GET\",\n `${this.baseUrl}/v1/me/tenants`,\n undefined,\n 15_000,\n );\n }\n\n /** List all knowledge graphs for the current tenant. */\n async listKgs(): Promise<Array<Record<string, unknown>>> {\n const data = await this.request<unknown>(\n \"GET\",\n `${this.base()}/kgs`,\n undefined,\n 15_000,\n );\n if (Array.isArray(data)) return data as Array<Record<string, unknown>>;\n if (data && typeof data === \"object\" && \"kgs\" in data) {\n const kgs = (data as { kgs?: unknown }).kgs;\n if (Array.isArray(kgs)) return kgs as Array<Record<string, unknown>>;\n }\n return [];\n }\n\n /** Create a knowledge graph. */\n async createKg(\n name: string,\n description?: string,\n ): Promise<Record<string, unknown>> {\n const body: Record<string, unknown> = { name };\n if (description) body.description = description;\n return this.request(\"POST\", `${this.base()}/kgs`, body, 15_000);\n }\n\n /** Delete a knowledge graph by name. */\n async deleteKg(name: string): Promise<Record<string, unknown>> {\n return this.request(\n \"DELETE\",\n `${this.base()}/kgs/${encodeURIComponent(name)}`,\n undefined,\n 30_000,\n );\n }\n\n /** List ontology types. */\n async ontologyTypes(): Promise<Array<Record<string, unknown>>> {\n const data = await this.request<unknown>(\n \"GET\",\n `${this.base()}/ontology/types`,\n undefined,\n 15_000,\n );\n return Array.isArray(data) ? (data as Array<Record<string, unknown>>) : [];\n }\n\n /**\n * Resolve a natural-language ontology change against the existing ontology.\n * The caller does not need to know exact type/attribute/relationship names —\n * the server matches the plain-language `ask` to the current schema and\n * returns auto-applied changes plus proposals that need confirmation.\n */\n async ontologyResolve(\n ask: string,\n opts: { knowledge_graph?: string } = {},\n ): Promise<OntologyResolveResult> {\n const body: Record<string, unknown> = { ask };\n if (opts.knowledge_graph) body.knowledge_graph = opts.knowledge_graph;\n return this.request<OntologyResolveResult>(\n \"POST\",\n `${this.base()}/ontology/resolve`,\n body,\n 60_000,\n );\n }\n\n /**\n * Apply a single resolved ontology change — one of the `proposals` returned\n * by {@link ontologyResolve}. Pass the proposal object through unchanged.\n */\n async ontologyApply(\n proposal: ResolvedChange,\n ): Promise<OntologyApplyResult> {\n return this.request<OntologyApplyResult>(\n \"POST\",\n `${this.base()}/ontology/apply`,\n proposal,\n 60_000,\n );\n }\n\n /**\n * Second-pass entity resolution: re-run ER over an already-ingested KG to\n * collapse intra-batch fragments. Synchronous on the server; returns a\n * per-type before/after report. Generous timeout — it rewrites triples.\n */\n async erRebuild(kg: string): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(\n \"POST\",\n `${this.base()}/explore/kgs/${encodeURIComponent(kg)}/er-rebuild`,\n {},\n 300_000,\n );\n }\n\n /** Per-KG type counts: every type with ≥1 instance, sorted desc. */\n async typeCounts(kg: string): Promise<TypeCount[]> {\n const data = await this.request<unknown>(\n \"GET\",\n `${this.base()}/kgs/${encodeURIComponent(kg)}/type-counts`,\n undefined,\n 30_000,\n );\n return Array.isArray(data) ? (data as TypeCount[]) : [];\n }\n\n /** Plan + run an enrichment job. Returns immediately with the job id. */\n async enrichRun(req: EnrichRequest): Promise<EnrichJobCreate> {\n return this.request<EnrichJobCreate>(\n \"POST\",\n `${this.base()}/enrich/jobs`,\n req,\n 30_000,\n );\n }\n\n /** List recent enrichment jobs for the current tenant. */\n async enrichJobs(): Promise<JobSummary[]> {\n const data = await this.request<unknown>(\n \"GET\",\n `${this.base()}/enrich/jobs`,\n undefined,\n 15_000,\n );\n return Array.isArray(data) ? (data as JobSummary[]) : [];\n }\n\n /** Fetch a single enrichment job (with truncated results). */\n async enrichJob(jobId: string): Promise<EnrichJob> {\n return this.request<EnrichJob>(\n \"GET\",\n `${this.base()}/enrich/jobs/${encodeURIComponent(jobId)}`,\n undefined,\n 15_000,\n );\n }\n\n /** Fetch the conflict review queue for a job. */\n async enrichConflicts(jobId: string): Promise<ConflictReview[]> {\n const data = await this.request<unknown>(\n \"GET\",\n `${this.base()}/enrich/jobs/${encodeURIComponent(jobId)}/conflicts`,\n undefined,\n 30_000,\n );\n return Array.isArray(data) ? (data as ConflictReview[]) : [];\n }\n\n /** Apply a set of conflict review decisions to a job. */\n async enrichApply(\n jobId: string,\n decisions: ConflictReview[],\n ): Promise<{ applied: number }> {\n return this.request<{ applied: number }>(\n \"POST\",\n `${this.base()}/enrich/jobs/${encodeURIComponent(jobId)}/apply`,\n { decisions },\n 60_000,\n );\n }\n\n /** Cancel an enrichment job. */\n async enrichCancel(jobId: string): Promise<void> {\n await this.request<void>(\n \"DELETE\",\n `${this.base()}/enrich/jobs/${encodeURIComponent(jobId)}`,\n undefined,\n 15_000,\n );\n }\n\n /** Per-type breakdown for one type in one KG: definition + counts + samples.\n *\n * System predicates (rdfs:label, ingested_at, source) are hidden by default\n * — they're attached to every entity at 100% and drown out the columns the\n * user cares about. Pass `includeSystem: true` to see them. */\n async typeUsage(\n kg: string,\n typeName: string,\n opts: { includeSystem?: boolean } = {},\n ): Promise<TypeUsage> {\n const qs = opts.includeSystem ? \"?include_system=true\" : \"\";\n return this.request<TypeUsage>(\n \"GET\",\n `${this.base()}/kgs/${encodeURIComponent(kg)}/types/${encodeURIComponent(typeName)}/usage${qs}`,\n undefined,\n 30_000,\n );\n }\n\n /** Explorer summary for a type — like typeUsage but adds coverage_pct + avg_degree. */\n async typeSummary(kg: string, typeName: string): Promise<TypeSummary> {\n return this.request<TypeSummary>(\n \"GET\",\n `${this.base()}/explore/kgs/${encodeURIComponent(kg)}/types/${encodeURIComponent(typeName)}/summary`,\n undefined,\n 30_000,\n );\n }\n\n /** Search types or attributes by name substring within a KG. */\n async exploreSearch(\n kg: string,\n q: string,\n kind: \"type\" | \"attr\" = \"type\",\n ): Promise<Array<Record<string, unknown>>> {\n const qs = new URLSearchParams({ kg, q, kind }).toString();\n const data = await this.request<unknown>(\n \"GET\",\n this.pExploreSearch(`?${qs}`),\n undefined,\n 15_000,\n );\n return Array.isArray(data) ? (data as Array<Record<string, unknown>>) : [];\n }\n\n // --- New typed methods (COG-128) ------------------------------------------ #\n // Parsed/throwing variants of the previously-MISSING ops, sharing the same\n // path-builders as the raw API. These follow the existing typed-method\n // contract (throw on non-2xx, light reshape) — the raw equivalents under\n // `client.raw.*` are the non-throwing, non-reshaping passthrough versions.\n\n /**\n * One page of entity instances of a type for the Explorer Data table\n * (`GET /explore/kgs/{kg}/types/{type}/records`). Keyset-paginated by entity\n * URI: pass the previous page's `next_cursor` as `cursor`. `limit` is clamped\n * server-side to 1..200 (default 50).\n */\n async exploreRecords(\n kg: string,\n typeName: string,\n opts: { limit?: number; cursor?: string } = {},\n ): Promise<TypeRecordsPage> {\n const qs = new URLSearchParams();\n if (opts.limit != null) qs.set(\"limit\", String(opts.limit));\n if (opts.cursor) qs.set(\"cursor\", opts.cursor);\n const query = qs.toString() ? `?${qs.toString()}` : \"\";\n return this.request<TypeRecordsPage>(\n \"GET\",\n this.pExploreRecords(kg, typeName, query),\n undefined,\n 30_000,\n );\n }\n\n /** Undirected type→type edges for the Explorer overview graph\n * (`GET /explore/kgs/{kg}/type-edges`). Returns `[{source, target, weight}]`. */\n async exploreTypeEdges(kg: string): Promise<TypeEdge[]> {\n const data = await this.request<unknown>(\n \"GET\",\n this.pExploreTypeEdges(kg),\n undefined,\n 30_000,\n );\n return Array.isArray(data) ? (data as TypeEdge[]) : [];\n }\n\n /** Infer + persist normalization rules for a type's predicates, returned ranked\n * by confidence desc (`POST /normalize/suggest?kg&type`). */\n async normalizeSuggest(kg: string, type: string): Promise<NormalizationRule[]> {\n const qs = new URLSearchParams({ kg, type }).toString();\n const data = await this.request<unknown>(\n \"POST\",\n this.pNormalizeSuggest(`?${qs}`),\n undefined,\n 60_000,\n );\n return Array.isArray(data) ? (data as NormalizationRule[]) : [];\n }\n\n /** List stored normalization rules, optionally filtered by KG and/or status\n * (`GET /normalize/rules?kg&status`). */\n async normalizeRules(\n opts: { kg?: string; status?: string } = {},\n ): Promise<NormalizationRule[]> {\n const qs = new URLSearchParams();\n if (opts.kg) qs.set(\"kg\", opts.kg);\n if (opts.status) qs.set(\"status\", opts.status);\n const query = qs.toString() ? `?${qs.toString()}` : \"\";\n const data = await this.request<unknown>(\n \"GET\",\n this.pNormalizeRules(query),\n undefined,\n 15_000,\n );\n return Array.isArray(data) ? (data as NormalizationRule[]) : [];\n }\n\n /** Confirm a suggested normalization rule (`POST /normalize/rules/{id}/confirm`). */\n async normalizeConfirmRule(ruleId: string): Promise<NormalizationRule> {\n return this.request<NormalizationRule>(\n \"POST\",\n this.pNormalizeRule(ruleId, \"confirm\"),\n undefined,\n 15_000,\n );\n }\n\n /** Reject a suggested normalization rule (`POST /normalize/rules/{id}/reject`). */\n async normalizeRejectRule(ruleId: string): Promise<NormalizationRule> {\n return this.request<NormalizationRule>(\n \"POST\",\n this.pNormalizeRule(ruleId, \"reject\"),\n undefined,\n 15_000,\n );\n }\n\n /** Apply a confirmed normalization rule in the background; the server acks 202\n * (`POST /normalize/rules/{id}/apply`). */\n async normalizeApplyRule(ruleId: string): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(\n \"POST\",\n this.pNormalizeRule(ruleId, \"apply\"),\n {},\n 60_000,\n );\n }\n\n /** Recommend ontology relationships/changes for the active KG\n * (`POST /ontology/recommend`). Body shape is passed through unchanged.\n *\n * NOTE: this targets the *premium* ontology-recommender route, which is only\n * mounted on deployments carrying the proprietary layer. It 404s on a bare\n * OSS deployment. */\n async ontologyRecommend(\n body: Record<string, unknown> = {},\n ): Promise<Record<string, unknown>> {\n return this.request<Record<string, unknown>>(\n \"POST\",\n this.pOntologyRecommend(),\n body,\n 60_000,\n );\n }\n}\n\n/**\n * A single ontology change resolved against the existing schema. The same\n * shape is returned under `applied`/`proposals` by {@link Client.ontologyResolve}\n * and accepted as the request body by {@link Client.ontologyApply}.\n */\nexport interface ResolvedChange {\n kind: \"attribute\" | \"relationship\";\n subject_type: string;\n name: string;\n datatype_or_target: string;\n action: \"reuse\" | \"extend\" | \"create\";\n confidence: number;\n reason: string;\n}\n\nexport interface OntologyResolveResult {\n applied: ResolvedChange[];\n proposals: ResolvedChange[];\n summary: string;\n}\n\nexport interface OntologyApplyResult {\n applied: ResolvedChange;\n operations: number;\n summary: string;\n}\n\nexport interface TypeCount {\n name: string;\n entity_count: number;\n}\n\nexport interface AttributeUsage {\n name: string;\n datatype: string;\n count: number;\n}\n\nexport interface RelationshipUsage {\n name: string;\n target_type: string | null;\n count: number;\n}\n\nexport interface EntitySample {\n uri: string;\n label: string;\n}\n\nexport interface TypeUsage {\n name: string;\n description: string;\n parent_type: string | null;\n entity_count: number;\n attributes: AttributeUsage[];\n relationships: RelationshipUsage[];\n samples: EntitySample[];\n}\n\nexport interface AttributeSummary {\n name: string;\n predicate_uri: string;\n datatype: string;\n count: number;\n coverage_pct: number;\n}\n\nexport interface RelationshipSummary {\n name: string;\n predicate_uri: string;\n target_type: string | null;\n count: number;\n coverage_pct: number;\n avg_degree: number;\n}\n\nexport interface TypeSummary {\n name: string;\n description: string;\n parent_type: string | null;\n entity_count: number;\n attributes: AttributeSummary[];\n relationships: RelationshipSummary[];\n}\n\nexport type EnrichmentTier = \"lite\" | \"base\" | \"core\" | \"pro\";\nexport type JobStatus =\n | \"queued\"\n | \"running\"\n | \"review\"\n | \"applied\"\n | \"cancelled\"\n | \"failed\";\nexport type ConflictPolicy = \"skip\" | \"verify\" | \"overwrite\" | \"stage\";\nexport type RowAction =\n | \"filled\"\n | \"verified\"\n | \"conflict\"\n | \"skipped\"\n | \"no_match\";\nexport type ReviewDecision = \"accept\" | \"reject\" | \"skip\";\n\nexport interface EnrichRequest {\n type_name: string;\n attributes: string[];\n tier?: EnrichmentTier;\n kg_name: string;\n conflict_policy?: ConflictPolicy;\n confidence_min?: number;\n limit?: number;\n}\n\nexport interface EnrichJobCreate {\n job_id: string;\n status: JobStatus;\n estimated_cost_usd: number;\n total_entities: number;\n}\n\nexport interface Verdict {\n value: string;\n confidence: number;\n source: string;\n source_url?: string | null;\n reasoning?: string | null;\n}\n\nexport interface JobProgress {\n total: number;\n processed: number;\n filled: number;\n verified: number;\n conflicts: number;\n skipped: number;\n cache_hits: number;\n}\n\nexport interface RowResult {\n entity_uri: string;\n attribute: string;\n existing_value: string | null;\n verdict: Verdict | null;\n action: RowAction;\n}\n\nexport interface JobSummary {\n id: string;\n tenant_id: string;\n kg_name: string;\n type_name: string;\n attributes: string[];\n tier: EnrichmentTier;\n status: JobStatus;\n progress: JobProgress;\n created_at: string;\n started_at?: string | null;\n completed_at?: string | null;\n conflict_policy: ConflictPolicy;\n confidence_min: number;\n error?: string | null;\n}\n\nexport interface EnrichJob extends JobSummary {\n results?: RowResult[];\n limit?: number | null;\n}\n\nexport interface ConflictReview {\n entity_uri: string;\n attribute: string;\n existing_value: string;\n proposed: Verdict;\n decision?: ReviewDecision | null;\n}\n\n// --- Unified Ask-AI agent (COG-118 / COG-125) -------------------------------- #\n\n/** Inputs to {@link Client.agent} — mirror the `/agent` HTTP body. */\nexport interface AgentTurnOptions {\n /** The user's natural-language message. Optional when `confirmPlanId` is set\n * (a confirm turn carries no new message). */\n message?: string;\n /** Knowledge graph the turn operates within. */\n kgName?: string;\n /** Optional active type scope (needed for enrich/clean/dedup planning). */\n typeName?: string;\n /** Optional conversation/session id for multi-turn continuity. */\n sessionId?: string;\n /** When set, the server CONFIRMS + EXECUTES this previously-proposed plan\n * (the only mutating path) instead of classifying a new message. */\n confirmPlanId?: string;\n}\n\n/**\n * The kind-tagged result of one agent turn. The server returns exactly one of:\n * - `answer` — a read-only answer (questions; an ontology INSPECT) with SPARQL.\n * - `clarify` — the agent needs more detail; ask the user `question`.\n * - `plan` — a proposed (un-executed) plan with `plan_id` + `steps`; confirm\n * by calling `agent({ confirmPlanId: plan_id })`.\n * - `result` — the outcome of executing a confirmed plan, per-step.\n * - `error` — e.g. an unknown/expired plan_id on confirm.\n * Extra fields vary by kind (answer/sparql/rows; question; plan_id/steps;\n * steps), so this is intentionally open beyond the discriminant.\n */\nexport interface AgentResult {\n kind: \"answer\" | \"clarify\" | \"plan\" | \"result\" | \"error\";\n [key: string]: unknown;\n}\n\n// --- New typed shapes (COG-128) ---------------------------------------------- #\n\n/** One row in the Explorer Data table — an entity instance with its attribute\n * values. `id` is the entity URI; `name` is the display name; the remaining\n * keys are per-attribute values (all stringly-typed for display). */\nexport interface TypeRecord {\n id: string;\n name: string;\n [attr: string]: string;\n}\n\n/** A page of {@link TypeRecord}s returned by {@link Client.exploreRecords}.\n * `next_cursor` is the last entity URI of this page; pass it back as `cursor`\n * to fetch the following page, or `null` when there are no more rows. */\nexport interface TypeRecordsPage {\n columns: string[];\n rows: TypeRecord[];\n total: number;\n next_cursor: string | null;\n}\n\n/** An undirected type→type edge in the Explorer overview graph, weighted by the\n * number of instance relationships it summarizes. */\nexport interface TypeEdge {\n source: string;\n target: string;\n weight: number;\n}\n\n/** A stored normalization rule (suggested / confirmed / rejected / applied).\n * Open beyond the documented fields because the rule's `params` shape varies by\n * `rule_type` (e.g. `strip_emoji`, `list_explode`). */\nexport interface NormalizationRule {\n id: string;\n kg_name: string;\n type_name: string;\n predicate: string;\n rule_type: string;\n target_kind?: string;\n params?: Record<string, unknown>;\n confidence?: number;\n rationale?: string;\n status: \"suggested\" | \"confirmed\" | \"rejected\" | \"applied\" | string;\n created_at?: string;\n applied_at?: string | null;\n [key: string]: unknown;\n}\n\n// --- Raw / passthrough API (COG-128) ----------------------------------------- #\n\n/**\n * Raw / passthrough surface — reached via {@link Client.raw}. Each method maps\n * to ONE canonical backend operation, builds the path internally (callers pass\n * NO path string), and returns the backend {@link Response} VERBATIM:\n *\n * - it does NOT throw on a non-2xx status (a 404/500 resolves as a `Response`\n * whose `.status` the caller inspects — contrast the typed methods, which\n * throw {@link CographError}); and\n * - it does NOT parse or reshape the body (the caller gets the unread stream;\n * contrast e.g. {@link Client.listKgs}, which unwraps `{kgs:[]}`).\n *\n * Every method funnels through {@link Client.requestRaw}, so the base URL,\n * `X-API-Key`, `/graphs/{tenant}` prefix, JSON content-type and timeout are\n * centralized in exactly one place. The only rejection paths are a network\n * failure or a timeout — the cases where there is no HTTP response to return.\n *\n * @example\n * ```ts\n * const client = new Client({ apiKey, tenant });\n * // Webapp proxy pattern: forward the backend response 1:1, no reshaping.\n * const res = await client.raw.enrichJobs(); // GET …/enrich/jobs\n * return new Response(res.body, { status: res.status, headers: res.headers });\n *\n * // A non-2xx is a Response, not a throw:\n * const r = await client.raw.enrichJob(\"does-not-exist\");\n * if (r.status === 404) { ... } // no try/catch needed\n * ```\n */\nexport class RawApi {\n constructor(private readonly client: Client) {}\n\n // -- agent / ask --------------------------------------------------------- #\n\n /** `POST /graphs/{tenant}/agent` — one turn of the unified Ask-AI agent. */\n agent(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pAgent(), { body, ...init });\n }\n\n /** `POST /graphs/{tenant}/ask` — natural-language question. */\n ask(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pAsk(), { body, ...init });\n }\n\n // -- ingest -------------------------------------------------------------- #\n\n /** `POST /graphs/{tenant}/ingest` — ingest text/json (or csv) content. */\n ingest(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pIngest(), { body, ...init });\n }\n\n /** `POST /graphs/{tenant}/ingest/csv/schema` — infer a CSV schema mapping. */\n ingestCsvSchema(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pIngestCsvSchema(), { body, ...init });\n }\n\n /** `POST /graphs/{tenant}/ingest/csv/rows` — write a batch of mapped rows. */\n ingestCsvRows(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pIngestCsvRows(), { body, ...init });\n }\n\n // -- enrich jobs --------------------------------------------------------- #\n\n /** `POST /graphs/{tenant}/enrich/jobs` — plan + run an enrichment job. */\n enrichCreateJob(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pEnrichJobs(), { body, ...init });\n }\n\n /** `GET /graphs/{tenant}/enrich/jobs` — list recent enrichment jobs. */\n enrichJobs(init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pEnrichJobs(), init);\n }\n\n /** `GET /graphs/{tenant}/enrich/jobs/{id}` — fetch a single job. */\n enrichJob(jobId: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pEnrichJob(jobId), init);\n }\n\n /** `GET /graphs/{tenant}/enrich/jobs/{id}/conflicts` — conflict review queue. */\n enrichConflicts(jobId: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pEnrichJobConflicts(jobId), init);\n }\n\n /** `POST /graphs/{tenant}/enrich/jobs/{id}/apply` — apply review decisions. */\n enrichApply(jobId: string, body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pEnrichJobApply(jobId), { body, ...init });\n }\n\n /** `DELETE /graphs/{tenant}/enrich/jobs/{id}` — cancel a job. */\n enrichCancel(jobId: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"DELETE\", this.client.pEnrichJob(jobId), init);\n }\n\n // -- ontology ------------------------------------------------------------ #\n\n /** `GET /graphs/{tenant}/ontology/types` — list ontology types. */\n ontologyTypes(init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pOntologyTypes(), init);\n }\n\n /** `POST /graphs/{tenant}/ontology/resolve` — resolve an NL ontology change. */\n ontologyResolve(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pOntologyResolve(), { body, ...init });\n }\n\n /** `POST /graphs/{tenant}/ontology/recommend` — recommend ontology changes.\n * Premium route: only mounted on deployments with the proprietary layer,\n * 404s on bare OSS. */\n ontologyRecommend(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pOntologyRecommend(), { body, ...init });\n }\n\n /** `POST /graphs/{tenant}/ontology/apply` — apply one resolved change. */\n ontologyApply(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pOntologyApply(), { body, ...init });\n }\n\n // -- knowledge graphs ---------------------------------------------------- #\n\n /** `GET /graphs/{tenant}/kgs` — list knowledge graphs. */\n kgs(init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pKgs(), init);\n }\n\n /** `POST /graphs/{tenant}/kgs` — create a knowledge graph. */\n createKg(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pKgs(), { body, ...init });\n }\n\n /** `DELETE /graphs/{tenant}/kgs/{name}` — delete a knowledge graph. */\n deleteKg(name: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"DELETE\", this.client.pKg(name), init);\n }\n\n // -- explore ------------------------------------------------------------- #\n\n /** `GET /graphs/{tenant}/explore/kgs/{kg}/types/{type}/summary`. */\n exploreSummary(kg: string, typeName: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pExploreSummary(kg, typeName), init);\n }\n\n /** `GET /graphs/{tenant}/explore/kgs/{kg}/types/{type}/records?limit&cursor`. */\n exploreRecords(\n kg: string,\n typeName: string,\n opts: { limit?: number; cursor?: string } = {},\n init?: RawInit,\n ): Promise<Response> {\n const qs = new URLSearchParams();\n if (opts.limit != null) qs.set(\"limit\", String(opts.limit));\n if (opts.cursor) qs.set(\"cursor\", opts.cursor);\n const query = qs.toString() ? `?${qs.toString()}` : \"\";\n return this.client.requestRaw(\"GET\", this.client.pExploreRecords(kg, typeName, query), init);\n }\n\n /** `GET /graphs/{tenant}/explore/kgs/{kg}/type-edges`. */\n exploreTypeEdges(kg: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pExploreTypeEdges(kg), init);\n }\n\n /** `GET /graphs/{tenant}/kgs/{kg}/type-counts`. */\n typeCounts(kg: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pTypeCounts(kg), init);\n }\n\n /** `GET /graphs/{tenant}/explore/search?kg&q&kind`. */\n exploreSearch(\n kg: string,\n q: string,\n kind: \"type\" | \"attr\" = \"type\",\n init?: RawInit,\n ): Promise<Response> {\n const qs = new URLSearchParams({ kg, q, kind }).toString();\n return this.client.requestRaw(\"GET\", this.client.pExploreSearch(`?${qs}`), init);\n }\n\n // -- normalize ----------------------------------------------------------- #\n\n /** `POST /graphs/{tenant}/normalize/suggest?kg&type` — infer + persist rules. */\n normalizeSuggest(kg: string, type: string, init?: RawInit): Promise<Response> {\n const qs = new URLSearchParams({ kg, type }).toString();\n return this.client.requestRaw(\"POST\", this.client.pNormalizeSuggest(`?${qs}`), init);\n }\n\n /** `GET /graphs/{tenant}/normalize/rules?kg&status` — list stored rules. */\n normalizeRules(opts: { kg?: string; status?: string } = {}, init?: RawInit): Promise<Response> {\n const qs = new URLSearchParams();\n if (opts.kg) qs.set(\"kg\", opts.kg);\n if (opts.status) qs.set(\"status\", opts.status);\n const query = qs.toString() ? `?${qs.toString()}` : \"\";\n return this.client.requestRaw(\"GET\", this.client.pNormalizeRules(query), init);\n }\n\n /** `POST /graphs/{tenant}/normalize/rules` — create a user-authored rule. */\n normalizeCreateRule(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pNormalizeRules(), { body, ...init });\n }\n\n /** `POST /graphs/{tenant}/normalize/rules/{id}/confirm`. */\n normalizeConfirmRule(ruleId: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pNormalizeRule(ruleId, \"confirm\"), init);\n }\n\n /** `POST /graphs/{tenant}/normalize/rules/{id}/reject`. */\n normalizeRejectRule(ruleId: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pNormalizeRule(ruleId, \"reject\"), init);\n }\n\n /** `POST /graphs/{tenant}/normalize/rules/{id}/apply`. */\n normalizeApplyRule(ruleId: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pNormalizeRule(ruleId, \"apply\"), init);\n }\n\n // -- tenants (account-level, NOT tenant-scoped) -------------------------- #\n\n /** `POST /v1/me/tenants` — create/grant a tenant for the authed user. */\n createTenant(body: unknown, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"POST\", this.client.pTenants(), { body, ...init });\n }\n\n /** `DELETE /v1/me/tenants/{id}` — remove a tenant grant. */\n deleteTenant(tenantId: string, init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"DELETE\", this.client.pTenant(tenantId), init);\n }\n\n /** `GET /v1/me/tenants` — list tenants the authed user can access. */\n tenants(init?: RawInit): Promise<Response> {\n return this.client.requestRaw(\"GET\", this.client.pTenants(), init);\n }\n}\n\n/** Per-call overrides for a {@link RawApi} method — extra/override headers and a\n * custom timeout. A `body` here is ignored by methods that take an explicit\n * body argument (they set it themselves). */\nexport interface RawInit {\n headers?: Record<string, string>;\n timeoutMs?: number;\n}\n"],"mappings":"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","names":["text"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/shell.ts"],"sourcesContent":["import * as readline from \"node:readline\";\nimport { stdin, stdout } from \"node:process\";\nimport {\n Client,\n CographError,\n type TypeCount,\n type EnrichJob,\n type ConflictReview,\n type JobSummary,\n} from \"./client.js\";\nimport { writeConfig } from \"./config.js\";\n\nconst CYAN = \"\\x1b[36m\";\nconst CYAN_BOLD = \"\\x1b[1;36m\";\nconst DIM = \"\\x1b[2m\";\nconst RED = \"\\x1b[31m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\nconst BOLD = \"\\x1b[1m\";\nconst RESET = \"\\x1b[0m\";\n\nfunction fmtNum(n: number): string {\n return n.toLocaleString(\"en-US\");\n}\n\nfunction canRenderBlockArt(): boolean {\n // Apple_Terminal (macOS Terminal.app) treats the block-shade chars (▀█░)\n // we use in the banner as East Asian Ambiguous Width = 2 cells, so each\n // 28-char banner row renders as ~56 cells and wraps mid-letter. iTerm,\n // WezTerm, Kitty, VS Code, Cursor, etc. all treat them as 1 cell and\n // render the art correctly. Skip the banner on Apple_Terminal and show\n // a plain header instead. Force on/off via COGRAPH_BANNER=on|off.\n const force = process.env.COGRAPH_BANNER;\n if (force === \"on\") return true;\n if (force === \"off\") return false;\n if (!process.stdout.isTTY) return false;\n if (process.env.TERM_PROGRAM === \"Apple_Terminal\") return false;\n return true;\n}\n\nfunction showBanner(): void {\n if (canRenderBlockArt()) {\n const lines = [\n \"\",\n `${CYAN} ░█▀▀░█▀█░█▀▀░█▀▄░█▀█░█▀█░█░█${RESET}`,\n `${CYAN} ░█░░░█░█░█░█░█▀▄░█▀█░█▀▀░█▀█${RESET}`,\n `${CYAN} ░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀░▀░▀░░░▀░▀${RESET}`,\n \"\",\n `${DIM} The object graph for AI agents${RESET}`,\n \"\",\n ];\n for (const l of lines) stdout.write(l + \"\\n\");\n } else {\n stdout.write(`\\n ${CYAN_BOLD}cograph${RESET}\\n`);\n stdout.write(` ${DIM}The object graph for AI agents${RESET}\\n\\n`);\n }\n showCommands();\n}\n\nfunction showCommands(): void {\n const rows: Array<[string, string]> = [\n [\"/ingest <file> ...\", \"Ingest a CSV/JSON/text file\"],\n [\"/ask <question>\", \"Ask in natural language\"],\n [\"/kg list\", \"List your knowledge graphs\"],\n [\"/kg switch <name>\", \"Switch to a different KG\"],\n [\"/kg create <name>\", \"Create a new KG and switch to it\"],\n [\"/kg delete <name>\", \"Delete a KG (irreversible)\"],\n [\"/tenant list\", \"List tenants you can access\"],\n [\"/tenant use <id>\", \"Switch tenant (then pick a KG)\"],\n [\"/types [query]\", \"List types in the current KG (with entity counts)\"],\n [\"/type <name>\", \"Drill into one type — attributes, relationships, samples\"],\n [\"/type <name> --system\", \"…also include auto-attached system attributes\"],\n [\"/enrich <Type> <attr> ...\", \"Plan + run an enrichment job (interactive)\"],\n [\"/enrich watch <job_id>\", \"Live progress for a running job\"],\n [\"/enrich jobs\", \"List recent enrichment jobs\"],\n [\"/enrich review <job_id>\", \"Walk through conflicts and accept/reject\"],\n [\"/login\", \"Re-authenticate (browser)\"],\n [\"/status\", \"Show graph stats\"],\n [\"/reset\", \"Clear the current KG\"],\n [\"/help\", \"Show this command list\"],\n [\"/quit\", \"Exit\"],\n ];\n const colWidth = Math.max(...rows.map((r) => r[0].length));\n for (const [cmd, desc] of rows) {\n const pad = \" \".repeat(colWidth - cmd.length);\n stdout.write(` ${CYAN_BOLD}${cmd}${RESET}${pad} ${DIM}${desc}${RESET}\\n`);\n }\n stdout.write(\"\\n\");\n}\n\nfunction printError(msg: string): void {\n stdout.write(` ${RED}✗${RESET} ${msg}\\n`);\n}\n\ninterface KgInfo {\n name: string;\n triple_count: number;\n}\n\nasync function fetchKg(client: Client, name: string): Promise<KgInfo | null> {\n try {\n const kgs = await client.listKgs();\n const found = kgs.find((k) => (k as { name?: string }).name === name);\n if (!found) return null;\n const tc = (found as { triple_count?: number }).triple_count ?? 0;\n return { name, triple_count: typeof tc === \"number\" ? tc : 0 };\n } catch {\n return null;\n }\n}\n\nfunction ask(rl: readline.Interface, prompt: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => resolve(answer));\n });\n}\n\nasync function selectKg(\n client: Client,\n rl: readline.Interface,\n): Promise<string | null> {\n let kgs: Array<Record<string, unknown>> = [];\n try {\n kgs = await client.listKgs();\n } catch (err) {\n printError(\n `Could not list knowledge graphs: ${err instanceof Error ? err.message : String(err)}`,\n );\n return null;\n }\n\n if (kgs.length === 0) {\n stdout.write(\n ` ${DIM}No knowledge graphs found. Enter a name to create your first KG.${RESET}\\n`,\n );\n const name = (await ask(rl, \" KG name: \")).trim();\n if (!name) return null;\n // Persist immediately. Without this, the name only existed as a local\n // string until the user ran /ingest, so quitting before ingesting lost\n // the KG entirely — and the next shell session showed \"No KGs found\"\n // again.\n try {\n await client.createKg(name);\n stdout.write(` ${GREEN}✓${RESET} Created ${BOLD}${name}${RESET}\\n`);\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n // 409 / \"already exists\" is fine — someone created it between listKgs\n // and now, or the user retried. Anything else is a real failure.\n if (!/already exists|409/i.test(msg)) {\n printError(`Could not create knowledge graph: ${msg}`);\n return null;\n }\n }\n return name;\n }\n\n if (kgs.length === 1) {\n const only = (kgs[0] as { name?: string }).name;\n if (only) {\n stdout.write(` ${DIM}Using only available KG: ${BOLD}${only}${RESET}\\n`);\n return only;\n }\n }\n\n stdout.write(` ${BOLD}Available knowledge graphs:${RESET}\\n`);\n kgs.forEach((kg, i) => {\n const n = (kg as { name?: string }).name ?? \"?\";\n const tc = (kg as { triple_count?: number }).triple_count ?? 0;\n stdout.write(` ${CYAN}${i + 1}${RESET}. ${n} ${DIM}(${fmtNum(tc)} triples)${RESET}\\n`);\n });\n const pick = (await ask(rl, \" Select KG [1]: \")).trim() || \"1\";\n const idx = Number.parseInt(pick, 10);\n if (Number.isFinite(idx) && idx >= 1 && idx <= kgs.length) {\n const name = (kgs[idx - 1] as { name?: string }).name;\n if (name) return name;\n }\n // Allow typing a name directly\n if (pick && !/^\\d+$/.test(pick)) return pick;\n printError(\"Invalid selection.\");\n return null;\n}\n\n/**\n * Tiny live-line spinner. Returns handles to update the trailing text and\n * stop. We use \\r + clear-line escape so the line redraws in place.\n */\nfunction startSpinner(initial: string): {\n setText: (text: string) => void;\n stop: () => void;\n} {\n const frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n let frame = 0;\n let text = initial;\n let stopped = false;\n\n const draw = (): void => {\n if (stopped) return;\n // \\x1b[2K = clear entire line; \\r = carriage return\n stdout.write(`\\r\\x1b[2K ${CYAN}${frames[frame]}${RESET} ${text}`);\n frame = (frame + 1) % frames.length;\n };\n draw();\n const tick = setInterval(draw, 80);\n\n return {\n setText(t: string) {\n text = t;\n },\n stop() {\n stopped = true;\n clearInterval(tick);\n stdout.write(\"\\r\\x1b[2K\");\n },\n };\n}\n\nasync function cmdIngest(\n client: Client,\n kg: string,\n args: string[],\n): Promise<void> {\n if (args.length === 0) {\n stdout.write(` ${YELLOW}Usage:${RESET} /ingest <file> [<file>...]\\n`);\n return;\n }\n for (const file of args) {\n const sp = startSpinner(`Inferring schema from ${file}...`);\n try {\n const result = await client.ingest(file, {\n kg,\n onProgress: ({\n rowsProcessed,\n totalRows,\n entitiesResolved,\n triplesInserted,\n }) => {\n const pct = Math.round((rowsProcessed / totalRows) * 100);\n sp.setText(\n `Ingesting ${file} ${DIM}·${RESET} ${BOLD}${pct}%${RESET} ` +\n `${DIM}(${fmtNum(rowsProcessed)}/${fmtNum(totalRows)} rows · ` +\n `${fmtNum(entitiesResolved)} entities · ${fmtNum(triplesInserted)} triples)${RESET}`,\n );\n },\n });\n sp.stop();\n const ents =\n (result as { entities_resolved?: number }).entities_resolved ?? 0;\n const trip =\n (result as { triples_inserted?: number }).triples_inserted ?? 0;\n stdout.write(\n ` ${GREEN}✓${RESET} ${file} ${DIM}·${RESET} ${fmtNum(ents)} entities · ${fmtNum(trip)} triples\\n`,\n );\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n }\n}\n\nasync function cmdAsk(\n client: Client,\n kg: string,\n question: string,\n): Promise<void> {\n const q = question.trim();\n if (!q) {\n stdout.write(` ${YELLOW}Usage:${RESET} /ask <your question>\\n`);\n return;\n }\n try {\n const result = await client.ask(q, { kg });\n const answer =\n (result as { narrative_answer?: string }).narrative_answer ||\n (result as { answer?: string }).answer ||\n \"No answer generated.\";\n stdout.write(\"\\n\");\n stdout.write(` ${answer}\\n`);\n stdout.write(\"\\n\");\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n}\n\nasync function cmdStatus(client: Client, kg: string): Promise<void> {\n try {\n const info = await fetchKg(client, kg);\n stdout.write(\"\\n\");\n stdout.write(` ${BOLD}KG${RESET} ${kg}\\n`);\n if (info) {\n stdout.write(` ${BOLD}Triples${RESET} ${fmtNum(info.triple_count)}\\n`);\n } else {\n stdout.write(` ${BOLD}Triples${RESET} ${DIM}(empty)${RESET}\\n`);\n }\n try {\n const types = await client.ontologyTypes();\n const names = types\n .map((t) => (t as { name?: string }).name)\n .filter((n): n is string => Boolean(n));\n if (names.length > 0) {\n stdout.write(` ${BOLD}Types${RESET} ${names.join(\", \")}\\n`);\n } else {\n stdout.write(` ${BOLD}Types${RESET} ${DIM}(none)${RESET}\\n`);\n }\n } catch (err) {\n printError(\n `Could not list ontology types: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n stdout.write(\"\\n\");\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n}\n\nasync function cmdReset(\n client: Client,\n kg: string,\n rl: readline.Interface,\n): Promise<boolean> {\n const confirm = (\n await ask(rl, ` ${YELLOW}Delete KG \"${kg}\"?${RESET} [y/N]: `)\n )\n .trim()\n .toLowerCase();\n if (confirm !== \"y\" && confirm !== \"yes\") {\n stdout.write(` ${DIM}Cancelled.${RESET}\\n`);\n return false;\n }\n try {\n await client.deleteKg(kg);\n stdout.write(` ${GREEN}✓${RESET} Graph cleared.\\n`);\n return true;\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return false;\n }\n}\n\nasync function cmdTypes(\n client: Client,\n kg: string,\n query: string,\n): Promise<void> {\n const sp = startSpinner(\n query ? `Searching types matching \"${query}\"...` : \"Loading types...\",\n );\n let types: TypeCount[];\n try {\n types = await client.typeCounts(kg);\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n const q = query.trim().toLowerCase();\n const filtered = q\n ? types.filter((t) => t.name.toLowerCase().includes(q))\n : types;\n\n if (filtered.length === 0) {\n if (types.length === 0) {\n stdout.write(\n ` ${DIM}No types yet in ${BOLD}${kg}${RESET}${DIM}. Try ${RESET}/ingest <file>${DIM} first.${RESET}\\n`,\n );\n } else {\n stdout.write(\n ` ${DIM}No types match \"${query}\". Try ${RESET}/types${DIM} for the full list.${RESET}\\n`,\n );\n }\n return;\n }\n\n // Right-align counts; leave room for the longest name we'll print.\n const nameWidth = Math.max(\n \"Type\".length,\n ...filtered.map((t) => t.name.length),\n );\n const countWidth = Math.max(\n \"Entities\".length,\n ...filtered.map((t) => fmtNum(t.entity_count).length),\n );\n stdout.write(\"\\n\");\n stdout.write(\n ` ${BOLD}${\"Type\".padEnd(nameWidth)} ${\"Entities\".padStart(countWidth)}${RESET}\\n`,\n );\n let total = 0;\n for (const t of filtered) {\n total += t.entity_count;\n stdout.write(\n ` ${CYAN}${t.name.padEnd(nameWidth)}${RESET} ${fmtNum(t.entity_count).padStart(countWidth)}\\n`,\n );\n }\n stdout.write(\"\\n\");\n const summary = q\n ? `${filtered.length} match${filtered.length === 1 ? \"\" : \"es\"}.`\n : `${filtered.length} type${filtered.length === 1 ? \"\" : \"s\"}, ${fmtNum(total)} entities total.`;\n stdout.write(` ${DIM}${summary}${RESET}\\n`);\n stdout.write(\n ` ${DIM}Drill in: ${RESET}/type <name>${DIM} Filter: ${RESET}/types <query>${DIM}${RESET}\\n\\n`,\n );\n}\n\n/**\n * Resolve a user-supplied type name to a canonical type. Case-insensitive\n * exact match wins; otherwise we fall back to prefix match. If multiple\n * types share a prefix, prompt the user to pick from a numbered list.\n */\nasync function resolveTypeName(\n client: Client,\n kg: string,\n rl: readline.Interface,\n input: string,\n): Promise<string | null> {\n const types = await client.typeCounts(kg);\n if (types.length === 0) {\n printError(`No types in ${kg} yet. Try /ingest <file> first.`);\n return null;\n }\n const q = input.trim().toLowerCase();\n const exact = types.find((t) => t.name.toLowerCase() === q);\n if (exact) return exact.name;\n const prefix = types.filter((t) => t.name.toLowerCase().startsWith(q));\n const matches = prefix.length > 0\n ? prefix\n : types.filter((t) => t.name.toLowerCase().includes(q));\n if (matches.length === 0) {\n printError(\n `No type matches \"${input}\". Try /types to see what's available.`,\n );\n return null;\n }\n if (matches.length === 1) return matches[0]!.name;\n stdout.write(` ${DIM}Multiple types match \"${input}\":${RESET}\\n`);\n matches.forEach((t, i) => {\n stdout.write(\n ` ${CYAN}${i + 1}${RESET}. ${BOLD}${t.name}${RESET} ${DIM}(${fmtNum(t.entity_count)} entities)${RESET}\\n`,\n );\n });\n const pick = (await ask(rl, ` Pick [1]: `)).trim() || \"1\";\n const idx = Number.parseInt(pick, 10);\n if (Number.isFinite(idx) && idx >= 1 && idx <= matches.length) {\n return matches[idx - 1]!.name;\n }\n printError(\"Invalid selection.\");\n return null;\n}\n\nasync function cmdType(\n client: Client,\n kg: string,\n rl: readline.Interface,\n input: string,\n): Promise<void> {\n // Pull off any --system flag so the rest can be treated as the type name.\n // Conservative parse: only the literal flag, anywhere in the input.\n const tokens = splitArgs(input.trim());\n const includeSystem = tokens.includes(\"--system\");\n const nameTokens = tokens.filter((t) => t !== \"--system\");\n const nameInput = nameTokens.join(\" \").trim();\n if (!nameInput) {\n stdout.write(` ${YELLOW}Usage:${RESET} /type <name> [--system]\\n`);\n return;\n }\n const name = await resolveTypeName(client, kg, rl, nameInput);\n if (!name) return;\n\n const sp = startSpinner(`Loading ${name}...`);\n let usage;\n try {\n usage = await client.typeUsage(kg, name, { includeSystem });\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n const total = usage.entity_count;\n const pct = (n: number): string =>\n total > 0 ? `${Math.round((n / total) * 100).toString().padStart(3)}%` : \" —\";\n\n // Dedup: when the resolver produces both a literal attribute and a typed\n // relationship for the same column (e.g. .title literal + .title→JobTitle),\n // we collapse to a single relationship row and surface the literal count\n // as a \"(+775 string)\" annotation. The relationship row \"wins\" because\n // its count is the union upper bound (every entity with a typed link)\n // and it's the richer fact. Pure literals and pure relationships are\n // unaffected.\n const relNames = new Set(usage.relationships.map((r) => r.name));\n const attrLitByName = new Map(usage.attributes.map((a) => [a.name, a]));\n const litOnlyAttrs = usage.attributes.filter((a) => !relNames.has(a.name));\n\n stdout.write(\"\\n\");\n stdout.write(\n ` ${BOLD}${usage.name}${RESET} ${DIM}${fmtNum(total)} entities${RESET}\\n`,\n );\n if (usage.description) {\n stdout.write(` ${DIM}${usage.description}${RESET}\\n`);\n }\n if (usage.parent_type) {\n stdout.write(` ${DIM}subClassOf ${usage.parent_type}${RESET}\\n`);\n }\n\n if (litOnlyAttrs.length > 0) {\n stdout.write(\n `\\n ${BOLD}Attributes (${litOnlyAttrs.length})${RESET}\\n`,\n );\n const nameW = Math.max(\n ...litOnlyAttrs.map((a) => a.name.length + 1),\n 8,\n );\n const typeW = Math.max(\n ...litOnlyAttrs.map((a) => a.datatype.length),\n 8,\n );\n const cntW = Math.max(\n ...litOnlyAttrs.map((a) => fmtNum(a.count).length),\n 4,\n );\n for (const a of litOnlyAttrs) {\n const dotName = `.${a.name}`;\n stdout.write(\n ` ${CYAN}${dotName.padEnd(nameW)}${RESET} ${DIM}${a.datatype.padEnd(typeW)}${RESET} ${fmtNum(a.count).padStart(cntW)} ${DIM}(${pct(a.count)})${RESET}\\n`,\n );\n }\n }\n\n if (usage.relationships.length > 0) {\n stdout.write(\n `\\n ${BOLD}Relationships (${usage.relationships.length})${RESET}\\n`,\n );\n const nameW = Math.max(\n ...usage.relationships.map((r) => r.name.length + 1),\n 8,\n );\n const tgtW = Math.max(\n ...usage.relationships.map((r) => (r.target_type ?? \"?\").length),\n 6,\n );\n for (const r of usage.relationships) {\n const dotName = `.${r.name}`;\n const tgt = r.target_type ?? \"?\";\n const lit = attrLitByName.get(r.name);\n const litNote = lit\n ? ` ${DIM}(+${fmtNum(lit.count)} ${lit.datatype})${RESET}`\n : \"\";\n stdout.write(\n ` ${CYAN}${dotName.padEnd(nameW)}${RESET} ${DIM}→${RESET} ${BOLD}${tgt.padEnd(tgtW)}${RESET} ${fmtNum(r.count).padStart(6)} ${DIM}(${pct(r.count)})${RESET}${litNote}\\n`,\n );\n }\n }\n\n if (usage.samples.length > 0) {\n stdout.write(`\\n ${BOLD}Sample entities${RESET}\\n`);\n usage.samples.forEach((s, i) => {\n const label = s.label || s.uri.split(\"/\").pop() || s.uri;\n stdout.write(` ${DIM}${i + 1}.${RESET} ${label}\\n`);\n });\n }\n\n if (\n usage.attributes.length === 0 &&\n usage.relationships.length === 0 &&\n total === 0\n ) {\n stdout.write(\n `\\n ${DIM}Type defined in the ontology but no instances yet in ${kg}.${RESET}\\n`,\n );\n }\n stdout.write(\"\\n\");\n}\n\nfunction lastUriSegment(uri: string): string {\n if (!uri) return uri;\n const hash = uri.lastIndexOf(\"#\");\n if (hash >= 0 && hash < uri.length - 1) return uri.slice(hash + 1);\n const slash = uri.lastIndexOf(\"/\");\n if (slash >= 0 && slash < uri.length - 1) return uri.slice(slash + 1);\n return uri;\n}\n\nfunction relativeTime(iso: string | null | undefined): string {\n if (!iso) return \"—\";\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return \"—\";\n const diffMs = Date.now() - t;\n const s = Math.max(0, Math.floor(diffMs / 1000));\n if (s < 60) return `${s}s ago`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ago`;\n const h = Math.floor(m / 60);\n if (h < 24) return `${h}h ago`;\n const d = Math.floor(h / 24);\n return `${d}d ago`;\n}\n\nfunction progressBar(processed: number, total: number, width = 20): string {\n if (!total || total <= 0) return \"[\" + \" \".repeat(width) + \"]\";\n const ratio = Math.max(0, Math.min(1, processed / total));\n const filled = Math.round(ratio * width);\n return \"[\" + \"█\".repeat(filled) + \"░\".repeat(width - filled) + \"]\";\n}\n\nfunction statusColor(status: string): string {\n switch (status) {\n case \"applied\":\n return GREEN;\n case \"failed\":\n return RED;\n case \"review\":\n return YELLOW;\n case \"cancelled\":\n return DIM;\n default:\n return CYAN;\n }\n}\n\nasync function cmdEnrichRun(\n client: Client,\n kg: string,\n rl: readline.Interface,\n args: string[],\n): Promise<void> {\n if (args.length < 2) {\n stdout.write(\n ` ${YELLOW}Usage:${RESET} /enrich <Type> <attr1> [<attr2> ...]\\n`,\n );\n return;\n }\n const typeInput = args[0]!;\n const attrs = args.slice(1).map((a) => a.replace(/^\\./, \"\"));\n const typeName = await resolveTypeName(client, kg, rl, typeInput);\n if (!typeName) return;\n\n const tier: \"lite\" = \"lite\";\n const policy: \"stage\" = \"stage\";\n stdout.write(\n `\\n ${BOLD}Plan:${RESET} enrich ${CYAN}${typeName}${RESET}.${attrs\n .map((a) => `${CYAN}${a}${RESET}`)\n .join(`, .`)} in ${BOLD}${kg}${RESET} ${DIM}·${RESET} tier: ${tier} ${DIM}·${RESET} policy: ${policy}\\n\\n`,\n );\n\n const sp = startSpinner(`Queueing enrichment for ${typeName}...`);\n let created;\n try {\n created = await client.enrichRun({\n type_name: typeName,\n attributes: attrs,\n tier,\n kg_name: kg,\n conflict_policy: policy,\n });\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n const cost = (created.estimated_cost_usd ?? 0).toFixed(4);\n stdout.write(\n ` ${GREEN}✓${RESET} Job queued: ${CYAN_BOLD}${created.job_id}${RESET} ${DIM}·${RESET} estimated cost ${BOLD}$${cost}${RESET} ${DIM}·${RESET} ${fmtNum(created.total_entities ?? 0)} entities\\n`,\n );\n\n const watch = (await ask(rl, ` Watch progress? [Y/n]: `)).trim().toLowerCase();\n if (watch === \"\" || watch === \"y\" || watch === \"yes\") {\n await watchJob(client, created.job_id);\n } else {\n stdout.write(\n ` ${DIM}Tip: /enrich watch ${created.job_id} to follow it.${RESET}\\n`,\n );\n }\n}\n\nasync function watchJob(client: Client, jobId: string): Promise<void> {\n const startedAt = Date.now();\n let lastJob: EnrichJob | null = null;\n // Render in place\n const draw = (job: EnrichJob): void => {\n const p = job.progress;\n const bar = progressBar(p.processed, p.total);\n const elapsed = Math.max(1, Math.floor((Date.now() - startedAt) / 1000));\n const rate = p.processed / elapsed;\n let etaStr = \"—\";\n if (rate > 0 && p.total > p.processed) {\n const remaining = Math.ceil((p.total - p.processed) / rate);\n etaStr =\n remaining < 60\n ? `${remaining}s`\n : remaining < 3600\n ? `${Math.floor(remaining / 60)}m`\n : `${Math.floor(remaining / 3600)}h`;\n }\n const sc = statusColor(job.status);\n stdout.write(\n `\\r\\x1b[2K ${sc}${job.status}${RESET} ${bar} ${fmtNum(p.processed)}/${fmtNum(p.total)} ` +\n `${DIM}·${RESET} filled ${GREEN}${fmtNum(p.filled)}${RESET} ` +\n `${DIM}·${RESET} verified ${CYAN}${fmtNum(p.verified)}${RESET} ` +\n `${DIM}·${RESET} conflicts ${YELLOW}${fmtNum(p.conflicts)}${RESET} ` +\n `${DIM}·${RESET} ETA ${etaStr}`,\n );\n };\n\n while (true) {\n let job: EnrichJob;\n try {\n job = await client.enrichJob(jobId);\n } catch (err) {\n stdout.write(\"\\r\\x1b[2K\");\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n lastJob = job;\n draw(job);\n if (job.status !== \"running\" && job.status !== \"queued\") break;\n await new Promise((r) => setTimeout(r, 1500));\n }\n\n // Final newline after the live line.\n stdout.write(\"\\n\");\n if (!lastJob) return;\n const p = lastJob.progress;\n if (lastJob.status === \"review\") {\n stdout.write(\n ` ${YELLOW}✦${RESET} ${fmtNum(p.conflicts)} conflict${p.conflicts === 1 ? \"\" : \"s\"} need review. ` +\n `${DIM}Run${RESET} /enrich review ${lastJob.id}${DIM} to walk through them.${RESET}\\n`,\n );\n } else if (lastJob.status === \"applied\") {\n stdout.write(\n ` ${GREEN}✓${RESET} Applied ${DIM}·${RESET} filled ${fmtNum(p.filled)}, verified ${fmtNum(p.verified)}, skipped ${fmtNum(p.skipped)}\\n`,\n );\n } else if (lastJob.status === \"failed\") {\n printError(`Job failed: ${lastJob.error ?? \"(no error message)\"}`);\n } else if (lastJob.status === \"cancelled\") {\n stdout.write(` ${DIM}Job cancelled.${RESET}\\n`);\n }\n}\n\nasync function cmdEnrichJobs(client: Client): Promise<void> {\n const sp = startSpinner(\"Loading enrichment jobs...\");\n let jobs: JobSummary[];\n try {\n jobs = await client.enrichJobs();\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n if (jobs.length === 0) {\n stdout.write(` ${DIM}No enrichment jobs yet.${RESET}\\n`);\n return;\n }\n\n const truncAttrs = (attrs: string[]): string => {\n const max = 30;\n const joined = attrs.join(\", \");\n if (joined.length <= max) return joined;\n return joined.slice(0, max - 1) + \"…\";\n };\n\n const rows = jobs.map((j) => ({\n id: j.id,\n type: j.type_name,\n attrs: truncAttrs(j.attributes ?? []),\n status: j.status,\n progress: `${fmtNum(j.progress?.processed ?? 0)}/${fmtNum(j.progress?.total ?? 0)}`,\n created: relativeTime(j.created_at),\n }));\n\n const w = {\n id: Math.max(\"ID\".length, ...rows.map((r) => r.id.length)),\n type: Math.max(\"Type\".length, ...rows.map((r) => r.type.length)),\n attrs: Math.max(\"Attrs\".length, ...rows.map((r) => r.attrs.length)),\n status: Math.max(\"Status\".length, ...rows.map((r) => r.status.length)),\n progress: Math.max(\"Progress\".length, ...rows.map((r) => r.progress.length)),\n };\n\n stdout.write(\"\\n\");\n stdout.write(\n ` ${BOLD}${\"ID\".padEnd(w.id)} ${\"Type\".padEnd(w.type)} ${\"Attrs\".padEnd(w.attrs)} ${\"Status\".padEnd(w.status)} ${\"Progress\".padEnd(w.progress)} Created${RESET}\\n`,\n );\n for (const r of rows) {\n const sc = statusColor(r.status);\n stdout.write(\n ` ${CYAN}${r.id.padEnd(w.id)}${RESET} ${r.type.padEnd(w.type)} ${DIM}${r.attrs.padEnd(w.attrs)}${RESET} ${sc}${r.status.padEnd(w.status)}${RESET} ${r.progress.padEnd(w.progress)} ${DIM}${r.created}${RESET}\\n`,\n );\n }\n stdout.write(\"\\n\");\n}\n\nasync function cmdEnrichReview(\n client: Client,\n rl: readline.Interface,\n jobId: string,\n): Promise<void> {\n if (!jobId) {\n stdout.write(` ${YELLOW}Usage:${RESET} /enrich review <job_id>\\n`);\n return;\n }\n const sp = startSpinner(`Loading conflicts for ${jobId}...`);\n let conflicts: ConflictReview[];\n try {\n conflicts = await client.enrichConflicts(jobId);\n } catch (err) {\n sp.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n return;\n }\n sp.stop();\n\n if (conflicts.length === 0) {\n stdout.write(` ${DIM}No conflicts to review.${RESET}\\n`);\n return;\n }\n\n const decisions: ConflictReview[] = [];\n let acceptAll = false;\n let quitEarly = false;\n\n for (let i = 0; i < conflicts.length; i++) {\n const c = conflicts[i]!;\n const entity = lastUriSegment(c.entity_uri);\n const conf = (c.proposed?.confidence ?? 0).toFixed(2);\n stdout.write(\"\\n\");\n stdout.write(\n ` ${DIM}[${i + 1}/${conflicts.length}]${RESET} ${BOLD}${entity}${RESET}.${CYAN}${c.attribute}${RESET}\\n`,\n );\n stdout.write(\n ` ${DIM}existing →${RESET} ${c.existing_value}\\n` +\n ` ${DIM}proposed →${RESET} ${BOLD}${c.proposed?.value ?? \"\"}${RESET} ${DIM}(conf ${conf}, src ${c.proposed?.source ?? \"?\"})${RESET}\\n`,\n );\n if (c.proposed?.source_url) {\n stdout.write(` ${DIM}url →${RESET} ${c.proposed.source_url}\\n`);\n }\n\n let decision: \"accept\" | \"reject\" | \"skip\";\n if (acceptAll) {\n decision = \"accept\";\n stdout.write(` ${GREEN}auto-accepted${RESET}\\n`);\n } else {\n const ans = (\n await ask(\n rl,\n ` [a]ccept / [r]eject / [s]kip / [A]ccept all remaining / [q]uit (saves progress) [s]: `,\n )\n ).trim();\n if (ans === \"A\") {\n acceptAll = true;\n decision = \"accept\";\n } else if (ans === \"a\") {\n decision = \"accept\";\n } else if (ans === \"r\") {\n decision = \"reject\";\n } else if (ans === \"q\") {\n quitEarly = true;\n break;\n } else {\n decision = \"skip\";\n }\n }\n decisions.push({ ...c, decision });\n }\n\n if (quitEarly) {\n if (decisions.length === 0) {\n stdout.write(` ${DIM}No decisions made — nothing to save.${RESET}\\n`);\n return;\n }\n const save = (\n await ask(rl, ` Save ${decisions.length} decision(s) so far? [Y/n]: `)\n )\n .trim()\n .toLowerCase();\n if (save !== \"\" && save !== \"y\" && save !== \"yes\") {\n stdout.write(` ${DIM}Discarded.${RESET}\\n`);\n return;\n }\n }\n\n if (decisions.length === 0) {\n stdout.write(` ${DIM}No decisions to apply.${RESET}\\n`);\n return;\n }\n\n const sp2 = startSpinner(`Applying ${decisions.length} decision(s)...`);\n try {\n const res = await client.enrichApply(jobId, decisions);\n sp2.stop();\n stdout.write(\n ` ${GREEN}✓${RESET} Applied ${BOLD}${fmtNum(res.applied)}${RESET} change${res.applied === 1 ? \"\" : \"s\"}.\\n`,\n );\n } catch (err) {\n sp2.stop();\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n}\n\nfunction urlHost(url: string): string {\n try {\n return new URL(url).host;\n } catch {\n return url.replace(/^https?:\\/\\//, \"\").replace(/\\/+$/, \"\");\n }\n}\n\nfunction makePrompt(\n kg: string,\n triples: number,\n mode: \"cloud\" | \"self-hosted\" = \"cloud\",\n baseUrl?: string,\n): string {\n const kgPart = `${DIM}(${kg})${RESET}`;\n const triplePart = triples > 0 ? `${DIM}[${fmtNum(triples)}]${RESET} ` : \"\";\n if (mode === \"self-hosted\" && baseUrl) {\n const host = urlHost(baseUrl);\n return ` ${CYAN_BOLD}cograph${RESET}${DIM}@${host}${RESET} ${kgPart} ${triplePart}${CYAN_BOLD}▸${RESET} `;\n }\n return ` ${CYAN_BOLD}cograph${RESET} ${kgPart} ${triplePart}${CYAN_BOLD}▸${RESET} `;\n}\n\n/**\n * Split a command-line style argument string. Supports double-quoted args.\n */\nfunction splitArgs(s: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let inQ = false;\n for (let i = 0; i < s.length; i++) {\n const c = s[i];\n if (inQ) {\n if (c === '\"') inQ = false;\n else cur += c;\n } else {\n if (c === '\"') inQ = true;\n else if (c === \" \" || c === \"\\t\") {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n } else cur += c;\n }\n }\n if (cur) out.push(cur);\n return out;\n}\n\nexport async function runShell(opts: {\n kg?: string;\n local?: boolean;\n noLogin?: boolean;\n}): Promise<void> {\n const CLOUD_DEFAULT = \"https://api.cograph.cloud\";\n // Detection precedence: --local > --no-login > COGRAPH_API_URL pointing\n // anywhere besides the cloud default. When self-hosted we never trigger\n // login and tenant defaults to \"default\" (open-access backend behavior).\n const envUrl = process.env.COGRAPH_API_URL || process.env.OMNIX_API_URL;\n const envIsSelfHosted = !!envUrl && envUrl !== CLOUD_DEFAULT;\n const selfHostedHint = !!opts.local || !!opts.noLogin || envIsSelfHosted;\n\n // `let` rather than `const` so /login can swap in a fresh Client after\n // ~/.cograph/config.json is rewritten with the new key.\n let client = opts.local\n ? new Client({ baseUrl: \"http://localhost:8000\", tenant: \"default\" })\n : selfHostedHint\n ? new Client({ tenant: \"default\" })\n : new Client();\n\n // Probe the backend before deciding whether to trigger login. This lets\n // us distinguish \"cloud, needs auth\" from \"self-hosted, open access\" and\n // also surfaces an unreachable server with a clear error rather than a\n // confusing browser-login attempt.\n const health = await client.healthCheck();\n if (!health.ok) {\n printError(\n `Could not reach ${health.url}. Is the server running?`,\n );\n return;\n }\n\n const selfHosted = selfHostedHint || !health.requiresAuth;\n const mode: \"cloud\" | \"self-hosted\" = selfHosted ? \"self-hosted\" : \"cloud\";\n\n // Cloud / auth-required path: behave as before — if no key, log in.\n if (!selfHosted && health.requiresAuth && !client.apiKey) {\n stdout.write(\n `\\n ${DIM}Not signed in — opening your browser to log in...${RESET}\\n`,\n );\n const { runLogin } = await import(\"./login.js\");\n await runLogin();\n client = new Client();\n if (!client.apiKey) {\n // runLogin already exits the process on hard failures, so reaching\n // here means it returned without writing a key (rare). Bail rather\n // than continue into a broken shell.\n printError(\"Login did not produce an API key. Aborting.\");\n return;\n }\n }\n const rl = readline.createInterface({\n input: stdin,\n output: stdout,\n terminal: true,\n });\n\n showBanner();\n\n if (selfHosted) {\n stdout.write(\n `${DIM} Self-hosted mode · ${client.baseUrl} · tenant=${client.tenant}${RESET}\\n\\n`,\n );\n }\n\n let kg = opts.kg;\n if (!kg) {\n const picked = await selectKg(client, rl);\n if (!picked) {\n rl.close();\n return;\n }\n kg = picked;\n }\n\n let triples = 0;\n const info = await fetchKg(client, kg);\n if (info && info.triple_count > 0) {\n triples = info.triple_count;\n stdout.write(\n ` ${DIM}Connected to${RESET} ${BOLD}${kg}${RESET}${DIM}: ${fmtNum(triples)} triples${RESET}\\n\\n`,\n );\n } else {\n stdout.write(\n ` ${DIM}Connected — ${kg} is empty (use /ingest to add data)${RESET}\\n\\n`,\n );\n }\n\n const refresh = async (): Promise<void> => {\n const fresh = await fetchKg(client, kg!);\n triples = fresh?.triple_count ?? 0;\n };\n\n let running = true;\n rl.on(\"close\", () => {\n running = false;\n });\n\n while (running) {\n let line: string;\n try {\n line = (\n await ask(rl, makePrompt(kg, triples, mode, client.baseUrl))\n ).trim();\n } catch {\n break;\n }\n if (!running) break;\n if (!line) continue;\n\n if (line === \"/quit\" || line === \"/exit\" || line === \"/q\") {\n stdout.write(` ${DIM}Bye.${RESET}\\n`);\n break;\n }\n\n if (line === \"/help\") {\n showCommands();\n continue;\n }\n\n try {\n if (line.startsWith(\"/ingest\")) {\n const args = splitArgs(line.slice(\"/ingest\".length).trim());\n await cmdIngest(client, kg, args);\n await refresh();\n } else if (line.startsWith(\"/ask \")) {\n await cmdAsk(client, kg, line.slice(\"/ask \".length));\n } else if (line === \"/ask\") {\n await cmdAsk(client, kg, \"\");\n } else if (line === \"/types\" || line.startsWith(\"/types \")) {\n const query = line === \"/types\" ? \"\" : line.slice(\"/types \".length);\n await cmdTypes(client, kg, query);\n } else if (line.startsWith(\"/type \") || line === \"/type\") {\n const arg = line === \"/type\" ? \"\" : line.slice(\"/type \".length);\n await cmdType(client, kg, rl, arg);\n } else if (line === \"/enrich\" || line.startsWith(\"/enrich \")) {\n const args = splitArgs(line.slice(\"/enrich\".length).trim());\n if (args.length === 0) {\n stdout.write(\n ` ${YELLOW}Usage:${RESET} /enrich <Type> <attr> ... | /enrich watch <id> | /enrich jobs | /enrich review <id>\\n`,\n );\n } else if (args[0] === \"jobs\") {\n await cmdEnrichJobs(client);\n } else if (args[0] === \"watch\") {\n const jid = args[1];\n if (!jid) {\n stdout.write(` ${YELLOW}Usage:${RESET} /enrich watch <job_id>\\n`);\n } else {\n await watchJob(client, jid);\n }\n } else if (args[0] === \"review\") {\n await cmdEnrichReview(client, rl, args[1] ?? \"\");\n } else {\n await cmdEnrichRun(client, kg, rl, args);\n await refresh();\n }\n } else if (line === \"/status\") {\n await cmdStatus(client, kg);\n await refresh();\n } else if (line === \"/reset\") {\n const did = await cmdReset(client, kg, rl);\n if (did) await refresh();\n } else if (line === \"/login\") {\n const { runLogin } = await import(\"./login.js\");\n await runLogin();\n // Pick up the new key from ~/.cograph/config.json for subsequent calls.\n client = new Client();\n await refresh();\n } else if (line === \"/tenant\" || line.startsWith(\"/tenant \")) {\n const args = splitArgs(line.slice(\"/tenant\".length).trim());\n const sub = args[0] ?? \"list\";\n const target = args.slice(1).join(\" \");\n\n if (sub === \"use\" || sub === \"switch\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /tenant use <id>\\n`);\n } else {\n writeConfig({ tenant: target });\n // Rebuild the client so it picks up the new tenant; preserve the\n // current base URL (self-hosted/local) and key.\n client = new Client({ baseUrl: client.baseUrl });\n stdout.write(\n ` ${GREEN}✓${RESET} Switched to tenant ${BOLD}${target}${RESET}\\n`,\n );\n // KGs are per-tenant — the old current KG may not exist here, so\n // pick one from the new tenant.\n const picked = await selectKg(client, rl);\n if (picked) {\n kg = picked;\n } else {\n stdout.write(\n ` ${DIM}No KGs in ${target} yet — /kg create <name>${RESET}\\n`,\n );\n }\n await refresh();\n }\n } else if (sub === \"current\") {\n stdout.write(` ${BOLD}${client.tenant}${RESET}\\n`);\n } else {\n try {\n const tenants = await client.listTenants();\n if (!tenants.length) {\n stdout.write(` ${DIM}No tenants found for your account.${RESET}\\n`);\n } else {\n for (const t of tenants) {\n const marker =\n t.id === client.tenant ? `${CYAN_BOLD}*${RESET}` : \" \";\n stdout.write(\n ` ${marker} ${BOLD}${t.id}${RESET} ${DIM}${t.label}${RESET}\\n`,\n );\n }\n stdout.write(` ${DIM}/tenant use <id> to switch${RESET}\\n`);\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (err instanceof CographError && err.status === 501) {\n printError(\"Tenant management isn't configured on this backend.\");\n } else {\n printError(msg);\n }\n }\n }\n } else if (line === \"/kg\" || line.startsWith(\"/kg \")) {\n const args = splitArgs(line.slice(\"/kg\".length).trim());\n const sub = args[0] ?? \"list\";\n const target = args.slice(1).join(\" \");\n\n if (sub === \"list\") {\n const list = await client.listKgs();\n if (!list.length) {\n stdout.write(\n ` ${DIM}No knowledge graphs yet. /kg create <name>${RESET}\\n`,\n );\n } else {\n for (const k of list) {\n const n = String((k as { name?: string }).name ?? \"?\");\n const tc = Number((k as { triple_count?: number }).triple_count ?? 0);\n const marker = n === kg ? `${CYAN_BOLD}*${RESET}` : \" \";\n stdout.write(\n ` ${marker} ${BOLD}${n}${RESET} ${DIM}(${fmtNum(tc)} triples)${RESET}\\n`,\n );\n }\n }\n } else if (sub === \"switch\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /kg switch <name>\\n`);\n } else {\n const list = await client.listKgs();\n const found = list.find(\n (k) => (k as { name?: string }).name === target,\n );\n if (!found) {\n printError(`KG not found: ${target}. Try /kg list.`);\n } else {\n kg = target;\n triples = Number(\n (found as { triple_count?: number }).triple_count ?? 0,\n );\n stdout.write(\n ` ${GREEN}✓${RESET} Switched to ${BOLD}${kg}${RESET}\\n`,\n );\n }\n }\n } else if (sub === \"create\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /kg create <name>\\n`);\n } else {\n try {\n await client.createKg(target);\n kg = target;\n triples = 0;\n stdout.write(\n ` ${GREEN}✓${RESET} Created and switched to ${BOLD}${kg}${RESET}\\n`,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (/already exists|409/i.test(msg)) {\n kg = target;\n await refresh();\n stdout.write(\n ` ${DIM}${target} already exists — switched to it.${RESET}\\n`,\n );\n } else {\n printError(`Could not create: ${msg}`);\n }\n }\n }\n } else if (sub === \"delete\") {\n if (!target) {\n stdout.write(` ${YELLOW}Usage:${RESET} /kg delete <name>\\n`);\n } else {\n const isActive = target === kg;\n const tag = isActive ? \" (the active KG)\" : \"\";\n const confirm = (\n await ask(\n rl,\n ` ${YELLOW}Delete KG \"${target}\"${tag}?${RESET} [y/N]: `,\n )\n )\n .trim()\n .toLowerCase();\n if (confirm === \"y\" || confirm === \"yes\") {\n try {\n await client.deleteKg(target);\n stdout.write(` ${GREEN}✓${RESET} Deleted ${BOLD}${target}${RESET}\\n`);\n if (isActive) {\n // Active KG is gone; let the user pick (or create) a new one\n // before any further commands try to use it.\n const picked = await selectKg(client, rl);\n if (!picked) {\n running = false;\n break;\n }\n kg = picked;\n await refresh();\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n printError(`Could not delete: ${msg}`);\n }\n } else {\n stdout.write(` ${DIM}Cancelled.${RESET}\\n`);\n }\n }\n } else {\n stdout.write(\n ` ${YELLOW}Unknown /kg subcommand: ${sub}.${RESET} Try /kg list, /kg switch <name>, /kg create <name>, /kg delete <name>.\\n`,\n );\n }\n } else if (line.startsWith(\"/\")) {\n stdout.write(\n ` ${YELLOW}Unknown command.${RESET} Try /ingest, /ask, /kg, /types, /type, /enrich, /login, /status, /reset, /help, /quit\\n`,\n );\n } else {\n // Bare line — auto-route to /ask\n await cmdAsk(client, kg, line);\n }\n } catch (err) {\n if (err instanceof CographError) printError(err.message);\n else printError(err instanceof Error ? err.message : String(err));\n }\n }\n\n rl.close();\n}\n"],"mappings":"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","names":["p"]}