@monadeo.com/grimoire-cli 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -266,6 +266,16 @@ async function browserLogin(apiBase, openBrowser, timeoutMs = 3e5) {
266
266
  supabase_anon_key: config.supabase_anon_key
267
267
  });
268
268
  }
269
+ function tokenClaims(token) {
270
+ const payload = token.split(".")[1];
271
+ if (!payload)
272
+ return {};
273
+ try {
274
+ return JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
275
+ } catch {
276
+ return {};
277
+ }
278
+ }
269
279
 
270
280
  // ../core/dist/client.js
271
281
  var CODES = {
@@ -321,6 +331,13 @@ var GrimoireClient = class {
321
331
  async refreshSession() {
322
332
  await this.bearer();
323
333
  }
334
+ // The login email from the session token; undefined for machine tokens.
335
+ async sessionEmail() {
336
+ if (this.machineToken)
337
+ return void 0;
338
+ const email = tokenClaims(await this.bearer()).email;
339
+ return typeof email === "string" ? email : void 0;
340
+ }
324
341
  async send(path, init, auth) {
325
342
  const headers = {
326
343
  "Content-Type": "application/json",
@@ -403,6 +420,15 @@ var GrimoireClient = class {
403
420
  revokeUser(subject) {
404
421
  return this.request(`/v1/staff/users/${encodeURIComponent(subject)}`, { method: "DELETE" });
405
422
  }
423
+ mintToken(name, quotaPerDay) {
424
+ return this.request("/v1/staff/tokens", {
425
+ method: "POST",
426
+ body: JSON.stringify({ name, quota_per_day: quotaPerDay })
427
+ });
428
+ }
429
+ recrawlSource(sourceId) {
430
+ return this.request(`/v1/staff/sources/${encodeURIComponent(sourceId)}/recrawl`, { method: "POST" });
431
+ }
406
432
  rejectJob(jobId, reason) {
407
433
  return this.request(`/v1/staff/jobs/${encodeURIComponent(jobId)}/reject`, {
408
434
  method: "POST",
@@ -884,7 +910,7 @@ function parseSourceFlags(values) {
884
910
  function toSelectors(pins) {
885
911
  return pins.map((p) => ({ product: p.source, ...p.version ? { version: p.version } : {} }));
886
912
  }
887
- var VERSION = true ? "0.4.0" : "dev";
913
+ var VERSION = true ? "0.4.2" : "dev";
888
914
  var HELP = `grimoire ${VERSION} \u2014 documentation retrieval for AI agents
889
915
 
890
916
  grimoire login [--no-launch-browser] | logout | whoami
@@ -902,6 +928,7 @@ var HELP = `grimoire ${VERSION} \u2014 documentation retrieval for AI agents
902
928
  grimoire jobs <job_id> [--watch]
903
929
  grimoire staff queue [--json] | approve <job_id> | reject <job_id> --reason "..."
904
930
  grimoire staff users [--json] | grant <subject> --name "..." | revoke <subject>
931
+ grimoire staff token <name> --quota <per-day> | recrawl <source_id>
905
932
  grimoire mcp [--http]
906
933
  grimoire help | --help | -h
907
934
  grimoire version | --version | -v
@@ -931,12 +958,25 @@ var COMMAND_FLAGS = {
931
958
  report: ["verdict", "note"],
932
959
  ingest: ["product", "rolling", "fixed", "npm", "pypi", "github", "include", "exclude", "watch"],
933
960
  jobs: ["watch"],
934
- staff: ["reason", "name", "json"]
961
+ staff: ["reason", "name", "quota", "json"]
935
962
  };
936
963
  function describeError(err) {
937
964
  const detail = typeof err.body === "string" ? err.body : err.body !== void 0 && err.body !== null ? JSON.stringify(err.body) : "";
938
965
  return `error: ${err.code}${detail ? ` \u2014 ${detail}` : ""}`;
939
966
  }
967
+ async function describeIdentity(client) {
968
+ const email = await client.sessionEmail();
969
+ const who = email ?? "machine token";
970
+ try {
971
+ const me = await client.me();
972
+ return `${who} (${me.kind} ${me.subject})${me.is_staff ? " staff" : ""} quota ${me.quota_per_day}/day`;
973
+ } catch (err) {
974
+ if (err instanceof ApiError && err.status === 403) {
975
+ return `${who} \u2014 authenticated, but this account has no Grimoire access grant yet`;
976
+ }
977
+ throw err;
978
+ }
979
+ }
940
980
  function describeJob(job) {
941
981
  const extra = [job.reason ? `reason: ${job.reason}` : "", job.source_id ? `source: ${job.source_id}` : ""].filter(Boolean).join(" ");
942
982
  return `${job.state}${extra ? ` ${extra}` : ""}`;
@@ -956,7 +996,8 @@ async function main(argv) {
956
996
  const launch = !args.bools.has("no-launch-browser");
957
997
  process.stderr.write(launch ? "Opening your browser to log in\u2026\n" : "Login URL:\n");
958
998
  await browserLogin(loadGlobalConfig().apiBaseUrl, loginOpener(launch));
959
- process.stdout.write("Logged in.\n");
999
+ process.stdout.write(`Logged in as ${await describeIdentity(new GrimoireClient())}
1000
+ `);
960
1001
  return EXIT.ok;
961
1002
  }
962
1003
  case "logout":
@@ -990,11 +1031,8 @@ async function main(argv) {
990
1031
  process.stderr.write("not logged in \u2014 run `grimoire login`\n");
991
1032
  return EXIT.authRequired;
992
1033
  }
993
- const me = await client.me();
994
- process.stdout.write(
995
- `${me.kind} ${me.subject}${me.is_staff ? " staff" : ""} quota ${me.quota_per_day}/day via ${via}
996
- `
997
- );
1034
+ process.stdout.write(`${await describeIdentity(client)} via ${via}
1035
+ `);
998
1036
  return EXIT.ok;
999
1037
  }
1000
1038
  case "search": {
@@ -1085,8 +1123,24 @@ ${res.source_url}
1085
1123
  return args.bools.has("watch") ? watchJob(client, jobId) : printJob(client, jobId);
1086
1124
  }
1087
1125
  case "staff": {
1088
- const usage = 'Usage: grimoire staff queue [--json] | approve <job_id> | reject <job_id> --reason "..." | users [--json] | grant <subject> --name "..." | revoke <subject>';
1126
+ const usage = 'Usage: grimoire staff queue [--json] | approve <job_id> | reject <job_id> --reason "..." | users [--json] | grant <subject> --name "..." | revoke <subject> | token <name> --quota <per-day> | recrawl <source_id>';
1089
1127
  const [action, jobId] = args.positionals;
1128
+ if (action === "token") {
1129
+ const quota = intFlag(args, "quota", { min: 1, max: 1e6 });
1130
+ if (!jobId || quota === void 0) throw new UsageError(usage);
1131
+ const minted = await client.mintToken(jobId, quota);
1132
+ process.stderr.write(`token ${minted.id} ${minted.name} quota ${minted.quota_per_day}/day \u2014 shown once, store it now
1133
+ `);
1134
+ process.stdout.write(`${minted.token}
1135
+ `);
1136
+ return EXIT.ok;
1137
+ }
1138
+ if (action === "recrawl") {
1139
+ if (!jobId) throw new UsageError(usage);
1140
+ process.stdout.write(`${describeJob(await client.recrawlSource(jobId))}
1141
+ `);
1142
+ return EXIT.ok;
1143
+ }
1090
1144
  if (action === "users") {
1091
1145
  const users = await client.listUsers();
1092
1146
  if (json) process.stdout.write(JSON.stringify(users, null, 2) + "\n");
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/index.ts", "../../core/dist/config.js", "../../core/dist/auth.js", "../../core/dist/errors.js", "../../core/dist/http.js", "../../core/dist/client.js", "../src/args.ts", "../src/output.ts", "../src/commands/setup.ts", "../src/commands/init.ts", "../src/commands/config.ts", "../src/commands/update.ts", "../src/commands/ingest.ts", "../src/updatecheck.ts"],
4
- "sourcesContent": ["import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n GrimoireClient,\n ApiError,\n browserLogin,\n clearSession,\n readSession,\n readMachineToken,\n resolveDefaultSources,\n loadGlobalConfig,\n type JobOut,\n type SourcePin,\n type SourceSelector,\n} from \"@monadeo.com/grimoire-core\";\nimport { parseArgs, requirePositional, requireFlagOneOf, intFlag, UsageError } from \"./args.js\";\nimport { printResults, printCompact, EXIT } from \"./output.js\";\nimport { runSetup } from \"./commands/setup.js\";\nimport { runInit } from \"./commands/init.js\";\nimport { runConfig } from \"./commands/config.js\";\nimport { runUpdate } from \"./commands/update.js\";\nimport { submissionFromArgs } from \"./commands/ingest.js\";\nimport { notifyIfOutdated, refreshUpdateState } from \"./updatecheck.js\";\n\n// The authorization URL is always printed so a user on a headless or remote\n// machine can open it elsewhere; the browser launch is the default convenience.\nfunction loginOpener(launchBrowser: boolean): (url: string) => void {\n return (url: string): void => {\n process.stdout.write(`${url}\\n`);\n if (!launchBrowser) {\n process.stderr.write(\"Open the URL above in a browser to log in; waiting for the callback\u2026\\n\");\n return;\n }\n const cmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n try {\n execFileSync(cmd, [url], { stdio: \"ignore\" });\n } catch {\n process.stderr.write(\"Could not open a browser; open the URL above manually.\\n\");\n }\n };\n}\n\nfunction parseSourceFlags(values: string[] | undefined): SourcePin[] {\n return (values ?? []).map((v) => {\n const [source, version] = v.split(\"@\");\n return version ? { source, version } : { source };\n });\n}\n\nfunction toSelectors(pins: SourcePin[]): SourceSelector[] {\n return pins.map((p) => ({ product: p.source, ...(p.version ? { version: p.version } : {}) }));\n}\n\n// Injected by esbuild from package.json at build time (\"dev\" when running\n// unbundled source, e.g. under vitest).\ndeclare const __GRIMOIRE_VERSION__: string | undefined;\nconst VERSION = typeof __GRIMOIRE_VERSION__ === \"string\" ? __GRIMOIRE_VERSION__ : \"dev\";\n\nconst HELP = `grimoire ${VERSION} \u2014 documentation retrieval for AI agents\n\n grimoire login [--no-launch-browser] | logout | whoami\n grimoire setup <claude-code|cursor|windsurf|codex>\n grimoire init\n grimoire search \"<query>\" [-s nextjs@15 -s react] [--json|--compact] [--debug]\n grimoire sources [--q <kw>] [--names|--json]\n grimoire versions <product> [--json]\n grimoire config [<key>] [<value>] [--unset]\n grimoire update\n grimoire doc <point_id> [--window 2] [--json]\n grimoire report <point_id> --verdict helpful|incorrect|outdated [--note \"...\"]\n grimoire ingest <url> --product <name> (--rolling | --fixed <version> | --npm <pkg> | --pypi <pkg> | --github <owner/repo>)\n [--include <pattern>]... [--exclude <pattern>]... [--watch]\n grimoire jobs <job_id> [--watch]\n grimoire staff queue [--json] | approve <job_id> | reject <job_id> --reason \"...\"\n grimoire staff users [--json] | grant <subject> --name \"...\" | revoke <subject>\n grimoire mcp [--http]\n grimoire help | --help | -h\n grimoire version | --version | -v\n\n env: GRIMOIRE_AUTH_TOKEN \u2014 machine token (CI, instead of login)\n GRIMOIRE_API_URL \u2014 API origin without a path\n`;\n\n// Canonical flag names each command accepts; parseArgs rejects anything else.\nconst COMMAND_FLAGS: Record<string, readonly string[]> = {\n version: [], \"--version\": [], \"-v\": [],\n login: [\"no-launch-browser\"], logout: [], setup: [], init: [], whoami: [],\n help: [], \"--help\": [], \"-h\": [],\n mcp: [\"http\"],\n config: [\"unset\"],\n update: [],\n search: [\"source\", \"json\", \"compact\", \"debug\"],\n sources: [\"q\", \"names\", \"json\"],\n versions: [\"json\"],\n doc: [\"window\", \"json\"],\n report: [\"verdict\", \"note\"],\n ingest: [\"product\", \"rolling\", \"fixed\", \"npm\", \"pypi\", \"github\", \"include\", \"exclude\", \"watch\"],\n jobs: [\"watch\"],\n staff: [\"reason\", \"name\", \"json\"],\n};\n\nfunction describeError(err: ApiError): string {\n const detail =\n typeof err.body === \"string\"\n ? err.body\n : err.body !== undefined && err.body !== null\n ? JSON.stringify(err.body)\n : \"\";\n return `error: ${err.code}${detail ? ` \u2014 ${detail}` : \"\"}`;\n}\n\nfunction describeJob(job: JobOut): string {\n const extra = [job.reason ? `reason: ${job.reason}` : \"\", job.source_id ? `source: ${job.source_id}` : \"\"]\n .filter(Boolean)\n .join(\" \");\n return `${job.state}${extra ? ` ${extra}` : \"\"}`;\n}\n\nasync function main(argv: string[]): Promise<number> {\n const [command, ...rest] = argv;\n const args = parseArgs(rest, { \"-s\": \"source\", \"-q\": \"q\" }, command !== undefined ? COMMAND_FLAGS[command] : []);\n const json = args.bools.has(\"json\");\n\n switch (command) {\n case \"version\":\n case \"--version\":\n case \"-v\":\n process.stdout.write(`${VERSION}\\n`);\n return EXIT.ok;\n case \"login\": {\n const launch = !args.bools.has(\"no-launch-browser\");\n process.stderr.write(launch ? \"Opening your browser to log in\u2026\\n\" : \"Login URL:\\n\");\n await browserLogin(loadGlobalConfig().apiBaseUrl, loginOpener(launch));\n process.stdout.write(\"Logged in.\\n\");\n return EXIT.ok;\n }\n case \"logout\":\n clearSession();\n process.stdout.write(\"Logged out.\\n\");\n return EXIT.ok;\n case \"setup\":\n return runSetup(args.positionals[0]);\n case \"init\":\n return runInit();\n case \"config\":\n return runConfig(args);\n case \"update\":\n return runUpdate();\n case \"mcp\":\n process.stderr.write(\"Run the MCP server with: npx @monadeo.com/grimoire-mcp\" + (args.bools.has(\"http\") ? \" --http\\n\" : \"\\n\"));\n return EXIT.ok;\n case undefined:\n case \"help\":\n case \"--help\":\n case \"-h\":\n process.stdout.write(HELP);\n return EXIT.ok;\n }\n\n const client = new GrimoireClient();\n try {\n switch (command) {\n case \"whoami\": {\n const via = process.env.GRIMOIRE_AUTH_TOKEN\n ? \"GRIMOIRE_AUTH_TOKEN\"\n : readMachineToken()\n ? \"grimoire config auth-token\"\n : readSession()\n ? \"browser login\"\n : undefined;\n if (!via) {\n process.stderr.write(\"not logged in \u2014 run `grimoire login`\\n\");\n return EXIT.authRequired;\n }\n const me = await client.me();\n process.stdout.write(\n `${me.kind} ${me.subject}${me.is_staff ? \" staff\" : \"\"} quota ${me.quota_per_day}/day via ${via}\\n`,\n );\n return EXIT.ok;\n }\n case \"search\": {\n const query = args.positionals[0];\n if (!query) {\n process.stderr.write('Usage: grimoire search \"<query>\" -s <product>[@version]\\n');\n return EXIT.apiError;\n }\n const explicit = parseSourceFlags(args.flags.source);\n const sources = explicit.length > 0 ? explicit : resolveDefaultSources();\n if (sources.length === 0) {\n // `grimoire init` only helps when there are dependencies to pin from \u2014\n // suggesting it in an infra repo is a dead end (Astro 2026-07-18).\n const initHelps = existsSync(join(process.cwd(), \"package.json\")) || existsSync(join(process.cwd(), \"requirements.txt\"));\n process.stderr.write(\n \"No sources selected. List what is indexed:\\n\" +\n \" grimoire sources\\n\" +\n \"then scope the search:\\n\" +\n ' grimoire search \"<query>\" -s <product>[@version]\\n' +\n (initHelps ? \"or pin this project's sources from its dependencies:\\n grimoire init\\n\" : \"\"),\n );\n return EXIT.apiError;\n }\n const res = await client.search({ query, sources: toSelectors(sources), debug: args.bools.has(\"debug\") });\n if (json) process.stdout.write(JSON.stringify(res, null, 2) + \"\\n\");\n else if (args.bools.has(\"compact\")) printCompact(res);\n else printResults(res);\n return EXIT.ok;\n }\n case \"sources\": {\n const needle = args.flags.q?.[0]?.toLowerCase();\n const sources = (await client.listSources()).filter(\n (s) => !needle || s.product.toLowerCase().includes(needle) || s.base_url.toLowerCase().includes(needle),\n );\n if (json) {\n process.stdout.write(JSON.stringify(sources, null, 2) + \"\\n\");\n } else if (args.bools.has(\"names\")) {\n for (const s of sources) process.stdout.write(`${s.product}\\n`);\n } else {\n for (const s of sources) {\n const versions = s.versions.length > 0 ? s.versions.join(\", \") : \"(not indexed yet)\";\n process.stdout.write(`${s.product} ${versions} ${s.base_url}\\n`);\n }\n }\n return EXIT.ok;\n }\n case \"versions\": {\n const product = requirePositional(args, 0, \"Usage: grimoire versions <product> [--json]\");\n const res = await client.listVersions(product);\n if (json) {\n process.stdout.write(JSON.stringify(res, null, 2) + \"\\n\");\n return EXIT.ok;\n }\n for (const v of res.versions) {\n process.stdout.write(`${v.version}${v.version === res.latest ? \" latest\" : \"\"} ${v.chunk_count} chunks\\n`);\n }\n return EXIT.ok;\n }\n case \"doc\": {\n const pointId = requirePositional(args, 0, \"Usage: grimoire doc <point_id> [--window 2] [--json]\");\n const window = intFlag(args, \"window\", { min: 0, max: 5 }) ?? 2;\n const res = await client.getDoc(pointId, window);\n if (json) {\n process.stdout.write(JSON.stringify(res, null, 2) + \"\\n\");\n return EXIT.ok;\n }\n process.stderr.write(`${res.product}@${res.version} ${res.heading_path.join(\" \u203A \")}\\n${res.source_url}\\n`);\n process.stdout.write(res.text + \"\\n\");\n return EXIT.ok;\n }\n case \"report\": {\n const usage = 'Usage: grimoire report <point_id> --verdict helpful|incorrect|outdated [--note \"...\"]';\n const pointId = requirePositional(args, 0, usage);\n const verdict = requireFlagOneOf(args, \"verdict\", [\"helpful\", \"incorrect\", \"outdated\"], usage);\n await client.reportResult(pointId, verdict as \"helpful\" | \"incorrect\" | \"outdated\", args.flags.note?.[0]);\n process.stdout.write(\"Reported.\\n\");\n return EXIT.ok;\n }\n case \"ingest\": {\n const url = requirePositional(args, 0, \"Usage: grimoire ingest <url> --product <name> --rolling|--fixed|--npm|--pypi|--github\");\n const res = await client.submitSource(submissionFromArgs(url, args));\n process.stdout.write(`Job: ${res.job_id}\\n`);\n if (args.bools.has(\"watch\")) return watchJob(client, res.job_id);\n return EXIT.ok;\n }\n case \"jobs\": {\n const jobId = requirePositional(args, 0, \"Usage: grimoire jobs <job_id> [--watch]\");\n return args.bools.has(\"watch\") ? watchJob(client, jobId) : printJob(client, jobId);\n }\n case \"staff\": {\n const usage =\n 'Usage: grimoire staff queue [--json] | approve <job_id> | reject <job_id> --reason \"...\" | users [--json] | grant <subject> --name \"...\" | revoke <subject>';\n const [action, jobId] = args.positionals;\n if (action === \"users\") {\n const users = await client.listUsers();\n if (json) process.stdout.write(JSON.stringify(users, null, 2) + \"\\n\");\n else for (const u of users) process.stdout.write(`${u.subject} ${u.status} ${u.name} by ${u.granted_by}\\n`);\n return EXIT.ok;\n }\n if (action === \"grant\") {\n const name = args.flags.name?.[0];\n if (!jobId || !name) throw new UsageError(usage);\n const granted = await client.grantUser(jobId, name);\n process.stdout.write(`${granted.subject} ${granted.status} ${granted.name}\\n`);\n return EXIT.ok;\n }\n if (action === \"revoke\") {\n if (!jobId) throw new UsageError(usage);\n const revoked = await client.revokeUser(jobId);\n process.stdout.write(`${revoked.subject} ${revoked.status}\\n`);\n return EXIT.ok;\n }\n if (action === \"queue\") {\n const queue = await client.reviewQueue();\n if (json) process.stdout.write(JSON.stringify(queue, null, 2) + \"\\n\");\n else if (queue.length === 0) process.stdout.write(\"review queue is empty\\n\");\n else for (const job of queue) process.stdout.write(`${job.id} ${describeJob(job)}\\n`);\n return EXIT.ok;\n }\n if (!jobId) throw new UsageError(usage);\n if (action === \"approve\") {\n process.stdout.write(`${describeJob(await client.approveJob(jobId))}\\n`);\n return EXIT.ok;\n }\n if (action === \"reject\") {\n const reason = args.flags.reason?.[0];\n if (!reason) throw new UsageError(usage);\n process.stdout.write(`${describeJob(await client.rejectJob(jobId, reason))}\\n`);\n return EXIT.ok;\n }\n throw new UsageError(usage);\n }\n default:\n process.stderr.write(`Unknown command: ${command}\\n${HELP}`);\n return EXIT.apiError;\n }\n } catch (err) {\n if (err instanceof ApiError) {\n process.stderr.write(`${describeError(err)}\\n`);\n if (err.status === 401) return EXIT.authRequired;\n if (err.status === 403) return EXIT.authRequired;\n if (err.status === 429) return EXIT.quota;\n if (err.status === 404) return EXIT.notFound;\n return EXIT.apiError;\n }\n throw err;\n }\n}\n\nconst TERMINAL_STATES = [\"accepted\", \"done\", \"rejected\", \"failed\", \"pending_review\"];\nconst FAILED_STATES = [\"rejected\", \"failed\"];\n\nasync function printJob(client: GrimoireClient, jobId: string): Promise<number> {\n const job = await client.getJob(jobId);\n process.stdout.write(`${describeJob(job)}\\n`);\n return FAILED_STATES.includes(job.state) ? EXIT.apiError : EXIT.ok;\n}\n\nconst WATCH_POLL_MS = 5_000;\nconst WATCH_BACKOFF_CAP_MS = 30_000;\nconst WATCH_DEADLINE_MS = 30 * 60_000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nasync function watchJob(client: GrimoireClient, jobId: string): Promise<number> {\n const deadline = Date.now() + WATCH_DEADLINE_MS;\n let backoff = WATCH_POLL_MS;\n while (Date.now() < deadline) {\n try {\n const job = await client.getJob(jobId);\n process.stdout.write(`${describeJob(job)}\\n`);\n if (TERMINAL_STATES.includes(job.state)) {\n if (job.state === \"pending_review\") {\n process.stderr.write(\"Parked for staff review: grimoire staff queue\\n\");\n }\n return FAILED_STATES.includes(job.state) ? EXIT.apiError : EXIT.ok;\n }\n backoff = WATCH_POLL_MS;\n await sleep(WATCH_POLL_MS);\n } catch (err) {\n // Auth/permission/missing-job failures cannot heal on their own \u2014 bail out;\n // anything else (network, 5xx, timeout) is worth retrying with backoff.\n if (err instanceof ApiError && [401, 403, 404].includes(err.status)) throw err;\n const reason = err instanceof Error ? err.message : String(err);\n process.stderr.write(`poll failed (${reason}); retrying in ${backoff / 1000}s\\n`);\n await sleep(backoff);\n backoff = Math.min(backoff * 2, WATCH_BACKOFF_CAP_MS);\n }\n }\n process.stderr.write(\n `Watch deadline (30m) reached; the job is still running. Check later with: grimoire jobs ${jobId}\\n`,\n );\n return EXIT.apiError;\n}\n\nnotifyIfOutdated(VERSION);\nmain(process.argv.slice(2))\n .then(async (code) => {\n await refreshUpdateState(VERSION, loadGlobalConfig().updateCheckHours);\n process.exit(code);\n })\n .catch((err) => {\n if (err instanceof UsageError) {\n process.stderr.write(`${err.message}\\n`);\n process.exit(EXIT.apiError);\n }\n process.stderr.write(`fatal: ${(err as Error).message}\\n`);\n process.exit(EXIT.apiError);\n });\n", "import { readFileSync, existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n// Bare origin \u2014 API paths are absolute (/v1/...), so the base must never carry a\n// path prefix.\nexport const DEFAULT_API_BASE = \"https://cli.grimoire.monadeo.com\";\nexport function globalConfigPath() {\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"grimoire\", \"config.json\");\n}\n// Malformed config must never crash a consumer (the MCP server constructs a client\n// at import time): warn and behave as if the file were absent.\nfunction readJsonConfig(path) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n }\n catch (err) {\n process.stderr.write(`grimoire: ignoring malformed config at ${path}: ${err.message}\\n`);\n return undefined;\n }\n}\n// Precedence: env var > config file > default \u2014 a per-invocation env override\n// (CI, QA testing) must always beat persisted settings.\nexport function loadGlobalConfig() {\n const path = globalConfigPath();\n const overrides = existsSync(path) ? readJsonConfig(path) : undefined;\n return {\n apiBaseUrl: DEFAULT_API_BASE,\n ...overrides,\n ...(process.env.GRIMOIRE_API_URL ? { apiBaseUrl: process.env.GRIMOIRE_API_URL } : {}),\n };\n}\nexport function saveGlobalConfig(config) {\n const path = globalConfigPath();\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(config, null, 2));\n}\n// Read-modify-write against the FILE only (never the env-merged view, which\n// would bake a transient GRIMOIRE_API_URL into the file). `undefined` values\n// remove their key.\nexport function updateGlobalConfigFile(patch) {\n const path = globalConfigPath();\n const current = existsSync(path) ? (readJsonConfig(path) ?? {}) : {};\n const merged = { ...current, ...patch };\n for (const [key, value] of Object.entries(merged)) {\n if (value === undefined)\n delete merged[key];\n }\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(merged, null, 2));\n return merged;\n}\n// Project config (.grimoire.json in the repo root) pins a codebase's sources and\n// overrides globals \u2014 committed alongside the code it documents.\nexport function findProjectConfig(startDir = process.cwd()) {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, \".grimoire.json\");\n if (existsSync(candidate)) {\n const parsed = readJsonConfig(candidate);\n if (parsed)\n return parsed;\n }\n const parent = dirname(dir);\n if (parent === dir)\n return undefined;\n dir = parent;\n }\n}\nexport function resolveDefaultSources() {\n return findProjectConfig()?.sources ?? loadGlobalConfig().defaultSources ?? [];\n}\n", "import { createHash, randomBytes } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ApiError } from \"./errors.js\";\nimport { fetchWithTimeout } from \"./http.js\";\n// Session storage is a 0600 file, not the OS keychain (Astro 2026-07-14):\n// keychain ACLs are per binary, so every agent runtime spawning the MCP server\n// re-prompted the user \u2014 gcloud and Codex accept the same file-based model.\n// A machine token via GRIMOIRE_AUTH_TOKEN overrides interactive auth (CI only).\nfunction configDir() {\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"grimoire\");\n}\nfunction credentialsPath() {\n return join(configDir(), \"credentials.json\");\n}\nexport function storeSession(session) {\n const path = credentialsPath();\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, JSON.stringify(session) + \"\\n\", { mode: 0o600 });\n}\nexport function readSession() {\n try {\n const parsed = JSON.parse(readFileSync(credentialsPath(), \"utf8\"));\n if (typeof parsed.refresh_token === \"string\" &&\n parsed.refresh_token !== \"\" &&\n typeof parsed.supabase_url === \"string\" &&\n typeof parsed.supabase_anon_key === \"string\") {\n return {\n refresh_token: parsed.refresh_token,\n supabase_url: parsed.supabase_url,\n supabase_anon_key: parsed.supabase_anon_key,\n };\n }\n return undefined;\n }\n catch {\n return undefined;\n }\n}\nexport function clearSession() {\n if (existsSync(credentialsPath()))\n rmSync(credentialsPath());\n}\n// Persisted machine token, for users who want a `mt_` token without exporting\n// GRIMOIRE_AUTH_TOKEN in a shell profile (that env var still overrides). Same\n// 0600 model as credentials.json \u2014 never the world-readable config.json.\nfunction machineTokenPath() {\n return join(configDir(), \"machine-token\");\n}\nexport function storeMachineToken(token) {\n const path = machineTokenPath();\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, token + \"\\n\", { mode: 0o600 });\n}\nexport function readMachineToken() {\n try {\n const token = readFileSync(machineTokenPath(), \"utf8\").trim();\n return token !== \"\" ? token : undefined;\n }\n catch {\n return undefined;\n }\n}\nexport function clearMachineToken() {\n if (existsSync(machineTokenPath()))\n rmSync(machineTokenPath());\n}\n// The API publishes everything a client needs to log in: the public Supabase\n// URL, its anon key (public by design), the OAuth provider, and the loopback\n// callbacks that are allow-listed for the PKCE flow.\nexport async function fetchAuthConfig(apiBase) {\n const res = await fetchWithTimeout(`${apiBase.replace(/\\/+$/, \"\")}/v1/auth/config`);\n if (!res.ok)\n throw new ApiError(res.status, \"auth_config_unavailable\", await res.text());\n const body = (await res.json());\n if (typeof body.supabase_url !== \"string\" ||\n typeof body.supabase_anon_key !== \"string\" ||\n typeof body.oauth_provider !== \"string\" ||\n !Array.isArray(body.redirect_urls) ||\n body.redirect_urls.length === 0) {\n throw new ApiError(res.status, \"auth_config_malformed\", body);\n }\n return {\n supabase_url: body.supabase_url,\n supabase_anon_key: body.supabase_anon_key,\n oauth_provider: body.oauth_provider,\n redirect_urls: body.redirect_urls.map(String),\n };\n}\nfunction parseDetail(text) {\n try {\n return JSON.parse(text);\n }\n catch {\n return text;\n }\n}\n// Supabase Auth (GoTrue) token endpoint: POST /auth/v1/token?grant_type=\u2026, the\n// anon key in the apikey header, JSON body per grant.\nexport async function gotrueToken(supabaseUrl, anonKey, grantType, body) {\n const res = await fetchWithTimeout(`${supabaseUrl.replace(/\\/+$/, \"\")}/auth/v1/token?grant_type=${grantType}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", apikey: anonKey },\n body: JSON.stringify(body),\n });\n const text = await res.text();\n if (!res.ok) {\n throw new ApiError(res.status, grantType === \"pkce\" ? \"login_failed\" : \"refresh_failed\", parseDetail(text));\n }\n const parsed = JSON.parse(text);\n if (typeof parsed.access_token !== \"string\" ||\n typeof parsed.refresh_token !== \"string\" ||\n typeof parsed.expires_in !== \"number\") {\n throw new ApiError(res.status, \"token_malformed\", parsed);\n }\n return {\n access_token: parsed.access_token,\n refresh_token: parsed.refresh_token,\n expires_in: parsed.expires_in,\n };\n}\nfunction base64url(buf) {\n return buf.toString(\"base64url\");\n}\n// Bind the first free allow-listed loopback callback (IPv4). The bases come\n// from the API, so the client and the Supabase allow list cannot drift.\nasync function bindCallback(server, redirectUrls) {\n for (const candidate of redirectUrls) {\n const port = Number(new URL(candidate).port);\n const bound = await new Promise((resolve) => {\n const onError = () => {\n server.off(\"error\", onError);\n resolve(false);\n };\n server.once(\"error\", onError);\n server.listen(port, \"127.0.0.1\", () => {\n server.off(\"error\", onError);\n resolve(true);\n });\n });\n if (bound)\n return candidate;\n }\n throw new Error(`No free login callback port among: ${redirectUrls.join(\", \")}`);\n}\n// OAuth Authorization Code with PKCE through Supabase Auth: open the provider\n// login in the browser, receive the code on a loopback callback, exchange code +\n// verifier for tokens. No client secret exists anywhere in the client.\n//\n// Supabase Auth's /authorize carries no `state` parameter, so the per-attempt\n// state rides in the callback path (`/callback/<state>`); any other path is a\n// 404 and the server keeps waiting. The allow list holds `/callback/*`.\nexport async function browserLogin(apiBase, openBrowser, timeoutMs = 300_000) {\n const config = await fetchAuthConfig(apiBase);\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n const state = base64url(randomBytes(16));\n const code = await new Promise((resolve, reject) => {\n let timer;\n const finish = (outcome) => {\n if (timer)\n clearTimeout(timer);\n server.closeAllConnections();\n server.close();\n if (\"code\" in outcome)\n resolve(outcome.code);\n else\n reject(outcome.error);\n };\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (req.method !== \"GET\" || url.pathname !== `/callback/${state}`) {\n res.writeHead(404).end();\n return;\n }\n const failure = url.searchParams.get(\"error_description\") ?? url.searchParams.get(\"error\");\n const received = url.searchParams.get(\"code\");\n if (failure || !received) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" }).end(`Login failed: ${failure ?? \"no code\"}`);\n finish({ error: new Error(`Login failed: ${failure ?? \"no code returned\"}`) });\n return;\n }\n res\n .writeHead(200, { \"Content-Type\": \"text/plain\" })\n .end(\"Logged in to Grimoire. You can close this tab.\");\n finish({ code: received });\n });\n bindCallback(server, config.redirect_urls)\n .then((redirectBase) => {\n timer = setTimeout(() => finish({ error: new Error(\"Login timed out\") }), timeoutMs);\n const authorize = new URL(`${config.supabase_url.replace(/\\/+$/, \"\")}/auth/v1/authorize`);\n authorize.searchParams.set(\"provider\", config.oauth_provider);\n authorize.searchParams.set(\"redirect_to\", `${redirectBase.replace(/\\/+$/, \"\")}/${state}`);\n authorize.searchParams.set(\"code_challenge\", challenge);\n authorize.searchParams.set(\"code_challenge_method\", \"s256\");\n openBrowser(authorize.toString());\n })\n .catch((err) => finish({ error: err }));\n });\n const tokens = await gotrueToken(config.supabase_url, config.supabase_anon_key, \"pkce\", {\n auth_code: code,\n code_verifier: verifier,\n });\n storeSession({\n refresh_token: tokens.refresh_token,\n supabase_url: config.supabase_url,\n supabase_anon_key: config.supabase_anon_key,\n });\n}\n", "export class ApiError extends Error {\n status;\n code;\n body;\n constructor(status, code, body) {\n super(`${code} (${status})`);\n this.status = status;\n this.code = code;\n this.body = body;\n }\n}\n", "import { ApiError } from \"./errors.js\";\nexport const REQUEST_TIMEOUT_MS = 30_000;\nexport async function fetchWithTimeout(url, init = {}) {\n try {\n return await fetch(url, { ...init, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });\n }\n catch (err) {\n if (err instanceof Error && (err.name === \"TimeoutError\" || err.name === \"AbortError\")) {\n throw new ApiError(408, \"timeout\", `Request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`);\n }\n // Undici reports DNS/TLS/connection failures as `TypeError: fetch failed` with the\n // useful detail in `cause`; surface both under a consistent ApiError.\n const message = err instanceof Error ? err.message : String(err);\n const cause = err instanceof Error && err.cause instanceof Error ? `: ${err.cause.message}` : \"\";\n throw new ApiError(0, \"network_error\", `${message}${cause}`);\n }\n}\n", "import { gotrueToken, readMachineToken, readSession, storeSession } from \"./auth.js\";\nimport { loadGlobalConfig } from \"./config.js\";\nimport { ApiError } from \"./errors.js\";\nimport { fetchWithTimeout } from \"./http.js\";\nexport { ApiError } from \"./errors.js\";\nconst CODES = {\n 401: \"unauthorized\",\n 403: \"forbidden\",\n 404: \"not_found\",\n 422: \"invalid_request\",\n 429: \"quota_exceeded\",\n};\nexport class GrimoireClient {\n baseUrl;\n machineToken;\n cachedAccessToken;\n refreshInFlight;\n constructor(opts = {}) {\n this.baseUrl = (opts.baseUrl ?? loadGlobalConfig().apiBaseUrl).replace(/\\/+$/, \"\");\n this.machineToken = opts.machineToken ?? process.env.GRIMOIRE_AUTH_TOKEN ?? readMachineToken();\n }\n async bearer() {\n if (this.machineToken)\n return this.machineToken;\n if (this.cachedAccessToken && this.cachedAccessToken.expiresAt > Date.now() + 60_000) {\n return this.cachedAccessToken.token;\n }\n this.refreshInFlight ??= this.refreshAccessToken().finally(() => {\n this.refreshInFlight = undefined;\n });\n return this.refreshInFlight;\n }\n // Exchange the stored refresh token for a fresh access token. GoTrue rotates\n // refresh tokens, so the new one replaces the stored one every time.\n async refreshAccessToken() {\n const session = readSession();\n if (!session)\n throw new ApiError(401, \"not_logged_in\", \"Run `grimoire login`\");\n let tokens;\n try {\n tokens = await gotrueToken(session.supabase_url, session.supabase_anon_key, \"refresh_token\", {\n refresh_token: session.refresh_token,\n });\n }\n catch (err) {\n if (err instanceof ApiError)\n throw new ApiError(err.status, \"refresh_failed\", \"Run `grimoire login`\");\n throw err;\n }\n storeSession({ ...session, refresh_token: tokens.refresh_token });\n this.cachedAccessToken = {\n token: tokens.access_token,\n expiresAt: Date.now() + tokens.expires_in * 1000,\n };\n return tokens.access_token;\n }\n async refreshSession() {\n await this.bearer();\n }\n async send(path, init, auth) {\n const headers = {\n \"Content-Type\": \"application/json\",\n ...init.headers,\n };\n if (auth)\n headers.Authorization = `Bearer ${await this.bearer()}`;\n return fetchWithTimeout(`${this.baseUrl}${path}`, { ...init, headers });\n }\n async request(path, init = {}, auth = true) {\n let res = await this.send(path, init, auth);\n // A 401 despite a locally-unexpired access token means it was revoked\n // server-side: force one refresh and retry exactly once.\n if (res.status === 401 && auth && !this.machineToken) {\n this.cachedAccessToken = undefined;\n res = await this.send(path, init, auth);\n }\n return this.parseResponse(res);\n }\n // FastAPI errors carry {\"detail\": \"...\"} (string) or {\"detail\": [...]} (422).\n async parseResponse(res) {\n const isJson = res.headers.get(\"content-type\")?.includes(\"json\") ?? false;\n const text = await res.text();\n let body;\n let parsed = false;\n if (isJson && text) {\n try {\n body = JSON.parse(text);\n parsed = true;\n }\n catch {\n parsed = false;\n }\n }\n if (!res.ok) {\n const detail = parsed && typeof body === \"object\" && body !== null ? body.detail : undefined;\n throw new ApiError(res.status, CODES[res.status] ?? \"error\", detail ?? (parsed ? body : text));\n }\n if (isJson)\n return (parsed ? body : {});\n return text;\n }\n search(input) {\n return this.request(\"/v1/search\", { method: \"POST\", body: JSON.stringify(input) });\n }\n listSources() {\n return this.request(\"/v1/sources\");\n }\n listVersions(product) {\n return this.request(`/v1/sources/${encodeURIComponent(product)}/versions`);\n }\n getDoc(pointId, window = 2) {\n return this.request(`/v1/doc/${encodeURIComponent(pointId)}?window=${window}`);\n }\n reportResult(pointId, verdict, note) {\n const body = { point_id: pointId, verdict, ...(note ? { note } : {}) };\n return this.request(\"/v1/report\", { method: \"POST\", body: JSON.stringify(body) });\n }\n submitSource(body) {\n return this.request(\"/v1/sources\", { method: \"POST\", body: JSON.stringify(body) });\n }\n getJob(jobId) {\n return this.request(`/v1/jobs/${encodeURIComponent(jobId)}`);\n }\n me() {\n return this.request(\"/v1/me\");\n }\n reviewQueue() {\n return this.request(\"/v1/staff/review-queue\");\n }\n approveJob(jobId) {\n return this.request(`/v1/staff/jobs/${encodeURIComponent(jobId)}/approve`, { method: \"POST\" });\n }\n listUsers() {\n return this.request(\"/v1/staff/users\");\n }\n grantUser(subject, name) {\n return this.request(\"/v1/staff/users\", {\n method: \"POST\",\n body: JSON.stringify({ subject, name }),\n });\n }\n revokeUser(subject) {\n return this.request(`/v1/staff/users/${encodeURIComponent(subject)}`, { method: \"DELETE\" });\n }\n rejectJob(jobId, reason) {\n return this.request(`/v1/staff/jobs/${encodeURIComponent(jobId)}/reject`, {\n method: \"POST\",\n body: JSON.stringify({ reason }),\n });\n }\n}\n", "// Minimal flag parser: collects repeated --flag/-f values and positionals.\nexport interface ParsedArgs {\n positionals: string[];\n flags: Record<string, string[]>;\n bools: Set<string>;\n}\n\nexport class UsageError extends Error {}\n\nconst BOOL_FLAGS = new Set([\n \"json\",\n \"compact\",\n \"watch\",\n \"names\",\n \"http\",\n \"unset\",\n \"rolling\",\n \"debug\",\n \"no-launch-browser\",\n]);\n\nexport function parseArgs(\n argv: string[],\n aliases: Record<string, string> = {},\n allowed?: readonly string[],\n): ParsedArgs {\n const positionals: string[] = [];\n const flags: Record<string, string[]> = {};\n const bools = new Set<string>();\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg.startsWith(\"--\") || arg.startsWith(\"-\")) {\n const name = aliases[arg] ?? arg.replace(/^--?/, \"\");\n // A misspelled flag silently swallowing its value (`--top 4` when the\n // real flag is --top-k) must fail loudly, not act like it worked.\n if (allowed && !allowed.includes(name)) {\n throw new UsageError(`Unknown flag ${arg} \u2014 run \\`grimoire help\\` for valid flags`);\n }\n if (BOOL_FLAGS.has(name)) {\n bools.add(name);\n } else {\n const value = argv[i + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n throw new UsageError(`Flag ${arg} requires a value`);\n }\n (flags[name] ??= []).push(value);\n i++;\n }\n } else {\n positionals.push(arg);\n }\n }\n return { positionals, flags, bools };\n}\n\nexport function requirePositional(parsed: ParsedArgs, index: number, usage: string): string {\n const value = parsed.positionals[index];\n if (value === undefined) throw new UsageError(usage);\n return value;\n}\n\nexport function intFlag(\n parsed: ParsedArgs,\n name: string,\n range?: { min: number; max: number },\n): number | undefined {\n const raw = parsed.flags[name]?.[0];\n if (raw === undefined) return undefined;\n const value = Number(raw);\n if (!Number.isInteger(value)) throw new UsageError(`Flag --${name} must be an integer`);\n if (range && (value < range.min || value > range.max)) {\n throw new UsageError(`Flag --${name} must be between ${range.min} and ${range.max}`);\n }\n return value;\n}\n\nexport function requireFlagOneOf(\n parsed: ParsedArgs,\n name: string,\n allowed: readonly string[],\n usage: string,\n): string {\n const raw = parsed.flags[name]?.[0];\n if (raw === undefined || !allowed.includes(raw)) throw new UsageError(usage);\n return raw;\n}\n", "import type { SearchResponse, SearchResult } from \"@monadeo.com/grimoire-core\";\n\n// Exit codes documented for scripting (clients spec).\nexport const EXIT = { ok: 0, apiError: 1, authRequired: 2, quota: 3, notFound: 4 } as const;\n\n// The API labels result text as untrusted data; the CLI repeats that on stderr\n// so agents reading stdout never see it as an instruction.\nfunction preamble(res: SearchResponse): void {\n const versions = Object.entries(res.resolved_versions)\n .map(([product, version]) => `${product}@${version}`)\n .join(\", \");\n process.stderr.write(`sources: ${versions} \u00B7 retrievals remaining: ${res.retrievals_remaining}\\n`);\n process.stderr.write(`note: ${res.untrusted_content_notice}\\n`);\n if (res.results.length === 0) {\n process.stderr.write(\"note: no result passed the relevance threshold \u2014 the docs may not cover this.\\n\");\n }\n}\n\nfunction heading(r: SearchResult): string {\n return r.heading_path.join(\" \u203A \");\n}\n\nexport function printResults(res: SearchResponse): void {\n preamble(res);\n for (const r of res.results) {\n process.stdout.write(\n `\\n${r.score.toFixed(3)} ${r.product}@${r.version} ${heading(r)}\\n${r.source_url}\\npoint_id: ${r.point_id}\\n`,\n );\n const preview = r.text.length > 500 ? `${r.text.slice(0, 500)}\u2026` : r.text;\n process.stdout.write(`${preview}\\n`);\n }\n}\n\nexport function printCompact(res: SearchResponse): void {\n preamble(res);\n for (const r of res.results) {\n process.stdout.write(\n `${r.score.toFixed(3)} | ${r.product}@${r.version} | ${heading(r)} | ${r.source_url} | ${r.point_id}\\n`,\n );\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { readMachineToken, readSession } from \"@monadeo.com/grimoire-core\";\n\n// One-command agent onboarding (SDD decision 19 / clients spec): writes the MCP\n// registration for the named agent. `npx @monadeo.com/grimoire-mcp` needs no global install.\nconst MCP_ENTRY = { command: \"npx\", args: [\"-y\", \"@monadeo.com/grimoire-mcp\"] };\n\nconst CODEX_TABLE = `[mcp_servers.grimoire]\ncommand = \"npx\"\nargs = [\"-y\", \"@monadeo.com/grimoire-mcp\"]\n`;\n\n// Codex reads ~/.codex/config.toml. Replace our table in place (up to the next\n// [ header or EOF) without a TOML library, so the rest of the user's config\n// passes through byte-for-byte.\nexport function mergeCodexToml(existing: string): string {\n const header = existing.match(/^[ \\t]*\\[mcp_servers\\.grimoire\\][ \\t]*(\\r?\\n|$)/m);\n if (!header || header.index === undefined) {\n if (existing.trim() === \"\") return CODEX_TABLE;\n const sep = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return existing + sep + CODEX_TABLE;\n }\n const afterHeader = header.index + header[0].length;\n const nextHeader = existing.slice(afterHeader).match(/^[ \\t]*\\[/m);\n const end =\n nextHeader && nextHeader.index !== undefined ? afterHeader + nextHeader.index : existing.length;\n return existing.slice(0, header.index) + CODEX_TABLE + existing.slice(end);\n}\n\ninterface JsonAgentTarget {\n path: string;\n apply: (existing: Record<string, unknown>) => Record<string, unknown>;\n}\n\nfunction mcpServersMerge(key: string) {\n return (existing: Record<string, unknown>) => {\n const servers = (existing[key] as Record<string, unknown>) ?? {};\n return { ...existing, [key]: { ...servers, grimoire: MCP_ENTRY } };\n };\n}\n\nconst JSON_AGENTS: Record<string, JsonAgentTarget> = {\n \"claude-code\": { path: join(homedir(), \".claude.json\"), apply: mcpServersMerge(\"mcpServers\") },\n cursor: { path: join(homedir(), \".cursor\", \"mcp.json\"), apply: mcpServersMerge(\"mcpServers\") },\n windsurf: {\n path: join(homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n apply: mcpServersMerge(\"mcpServers\"),\n },\n};\n\nconst AGENT_NAMES = [...Object.keys(JSON_AGENTS), \"codex\"];\n\nfunction setupCodex(): number {\n const path = join(homedir(), \".codex\", \"config.toml\");\n const existing = existsSync(path) ? readFileSync(path, \"utf8\") : \"\";\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, mergeCodexToml(existing));\n return finish(\"codex\", path);\n}\n\n// Best-effort session probe: an unreadable credentials file must fall through\n// to the hint, never crash setup.\nfunction hasSession(): boolean {\n if (process.env.GRIMOIRE_AUTH_TOKEN) return true;\n try {\n return readMachineToken() !== undefined || readSession() !== undefined;\n } catch {\n return false;\n }\n}\n\nfunction finish(agent: string, path: string): number {\n process.stdout.write(`Configured grimoire MCP for ${agent} at ${path}\\n`);\n process.stdout.write(hasSession() ? \"Already logged in.\\n\" : \"Run `grimoire login` to authenticate.\\n\");\n return 0;\n}\n\nexport function runSetup(agent: string | undefined): number {\n if (!agent || !AGENT_NAMES.includes(agent)) {\n process.stderr.write(`Usage: grimoire setup <${AGENT_NAMES.join(\"|\")}>\\n`);\n return 1;\n }\n if (agent === \"codex\") return setupCodex();\n const target = JSON_AGENTS[agent];\n let existing: Record<string, unknown> = {};\n if (existsSync(target.path)) {\n try {\n existing = JSON.parse(readFileSync(target.path, \"utf8\")) as Record<string, unknown>;\n } catch (err) {\n process.stderr.write(\n `Cannot parse ${target.path}: ${(err as Error).message}\\nFix or remove the file, then re-run setup.\\n`,\n );\n return 1;\n }\n }\n mkdirSync(dirname(target.path), { recursive: true });\n writeFileSync(target.path, JSON.stringify(target.apply(existing), null, 2));\n return finish(agent, target.path);\n}\n", "import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SourcePin } from \"@monadeo.com/grimoire-core\";\n\nfunction parseJsonFile<T>(path: string): T {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as T;\n } catch (err) {\n throw new Error(`Cannot parse ${path}: ${(err as Error).message}`, { cause: err });\n }\n}\n\n// Scan common manifests \u2192 propose .grimoire.json source pins. Alias resolution\n// against the registry (curated to include package-ecosystem names) happens when\n// the sources are actually queried; init proposes candidate names from manifests.\nexport function detectManifestSources(dir = process.cwd()): SourcePin[] {\n const pins: SourcePin[] = [];\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = parseJsonFile<{ dependencies?: Record<string, string> }>(pkgPath);\n for (const [name, range] of Object.entries(pkg.dependencies ?? {})) {\n const major = range.match(/(\\d+)/)?.[1];\n pins.push({ source: name.replace(/^@[^/]+\\//, \"\"), ...(major ? { version: major } : {}) });\n }\n }\n const reqPath = join(dir, \"requirements.txt\");\n if (existsSync(reqPath)) {\n for (const line of readFileSync(reqPath, \"utf8\").split(\"\\n\")) {\n const m = line.match(/^([A-Za-z0-9_.-]+)\\s*==\\s*(\\d+)/);\n if (m) pins.push({ source: m[1].toLowerCase(), version: m[2] });\n }\n }\n return pins;\n}\n\nexport function runInit(): number {\n const path = join(process.cwd(), \".grimoire.json\");\n try {\n const sources = detectManifestSources();\n if (sources.length === 0) {\n process.stderr.write(\"No package.json/requirements.txt dependencies found.\\n\");\n return 1;\n }\n const existing = existsSync(path) ? parseJsonFile<Record<string, unknown>>(path) : {};\n writeFileSync(path, JSON.stringify({ ...existing, sources }, null, 2));\n process.stdout.write(`Wrote ${sources.length} source pins to .grimoire.json\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`${(err as Error).message}\\n`);\n return 1;\n }\n}\n", "import {\n DEFAULT_API_BASE,\n globalConfigPath,\n loadGlobalConfig,\n updateGlobalConfigFile,\n storeMachineToken,\n readMachineToken,\n clearMachineToken,\n type GlobalConfig,\n} from \"@monadeo.com/grimoire-core\";\nimport { UsageError, type ParsedArgs } from \"../args.js\";\nimport { EXIT } from \"../output.js\";\n\ninterface KeySpec {\n prop: keyof GlobalConfig;\n describe: string;\n parse(raw: string): GlobalConfig[keyof GlobalConfig];\n}\n\nfunction intInRange(name: string, raw: string, min: number): number {\n const value = Number(raw);\n if (!Number.isInteger(value) || value < min) {\n throw new UsageError(`${name} must be an integer >= ${min}`);\n }\n return value;\n}\n\nexport const CONFIG_KEYS: Record<string, KeySpec> = {\n \"api-url\": {\n prop: \"apiBaseUrl\",\n describe: `API origin without a path (default ${DEFAULT_API_BASE}; env GRIMOIRE_API_URL overrides)`,\n parse: (raw) => {\n if (!/^https?:\\/\\/[^/]+$/.test(raw)) {\n throw new UsageError(\"api-url must be a bare origin, e.g. https://api.example.com\");\n }\n return raw;\n },\n },\n \"update-check-hours\": {\n prop: \"updateCheckHours\",\n describe: \"hours between CLI update checks (default 24, 0 disables)\",\n parse: (raw) => intInRange(\"update-check-hours\", raw, 0),\n },\n};\n\n// auth-token is a secret and lives in a 0600 file, not the world-readable\n// config.json \u2014 so it is handled outside the CONFIG_KEYS (GlobalConfig) framework.\nconst AUTH_TOKEN_KEY = \"auth-token\";\nconst MACHINE_TOKEN_RE = /^mt_[A-Za-z0-9_-]{32,}$/;\nconst USAGE =\n \"Usage: grimoire config [<key>] [<value>] [--unset] (keys: \" +\n [...Object.keys(CONFIG_KEYS), AUTH_TOKEN_KEY].join(\", \") +\n \")\";\n\nexport function runConfig(args: ParsedArgs): number {\n const [key, value] = args.positionals;\n if (key === undefined) {\n const resolved = loadGlobalConfig();\n process.stdout.write(`config file: ${globalConfigPath()}\\n`);\n for (const [name, spec] of Object.entries(CONFIG_KEYS)) {\n const current = resolved[spec.prop];\n process.stdout.write(`${name} = ${current === undefined ? \"(unset)\" : JSON.stringify(current)} # ${spec.describe}\\n`);\n }\n process.stdout.write(\n `${AUTH_TOKEN_KEY} = ${readMachineToken() ? \"(set)\" : \"(unset)\"} # machine token, stored 0600 (env GRIMOIRE_AUTH_TOKEN overrides)\\n`,\n );\n return EXIT.ok;\n }\n if (key === AUTH_TOKEN_KEY) {\n if (args.bools.has(\"unset\")) {\n clearMachineToken();\n process.stdout.write(`${AUTH_TOKEN_KEY} unset\\n`);\n return EXIT.ok;\n }\n if (value === undefined) {\n // Never echo the secret \u2014 report presence only.\n process.stdout.write(`${readMachineToken() ? \"(set)\" : \"(unset)\"}\\n`);\n return EXIT.ok;\n }\n if (!MACHINE_TOKEN_RE.test(value)) {\n throw new UsageError(\"auth-token must be a machine token starting with mt_\");\n }\n storeMachineToken(value);\n process.stdout.write(`${AUTH_TOKEN_KEY} set\\n`);\n return EXIT.ok;\n }\n const spec = CONFIG_KEYS[key];\n if (!spec) throw new UsageError(USAGE);\n if (args.bools.has(\"unset\")) {\n updateGlobalConfigFile({ [spec.prop]: undefined });\n process.stdout.write(`${key} unset\\n`);\n return EXIT.ok;\n }\n if (value === undefined) {\n const current = loadGlobalConfig()[spec.prop];\n process.stdout.write(`${current === undefined ? \"\" : JSON.stringify(current)}\\n`);\n return EXIT.ok;\n }\n updateGlobalConfigFile({ [spec.prop]: spec.parse(value) });\n process.stdout.write(`${key} = ${value}\\n`);\n return EXIT.ok;\n}\n", "import { spawnSync } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport { EXIT } from \"../output.js\";\n\nconst BREW_CMD = [\"brew\", \"upgrade\", \"monadeo/tap/grimoire\"];\nconst NPM_CMD = [\"npm\", \"install\", \"-g\", \"@monadeo.com/grimoire-cli\"];\n\n// The running binary's real location tells us who installed it: Homebrew keeps\n// everything under a Cellar/homebrew prefix, npm under a lib/node_modules\n// global prefix. Anything else (pnpm dlx, npx cache, a repo checkout) is not\n// ours to upgrade \u2014 print the choices instead of guessing.\nexport function detectInstallKind(binPath: string): \"brew\" | \"npm\" | undefined {\n let real: string;\n try {\n real = realpathSync(binPath);\n } catch {\n return undefined;\n }\n if (/homebrew|\\/Cellar\\//i.test(real)) return \"brew\";\n if (/\\/lib\\/node_modules\\//.test(real)) return \"npm\";\n return undefined;\n}\n\n// `brew upgrade` reads the LOCAL tap clone \u2014 without pulling it first, brew\n// happily reports \"already installed\" for a version the registry has long\n// superseded (observed 2026-07-18 upgrading 0.3.4\u21920.3.5). Pull just our tap,\n// not `brew update`, which touches every tap and core. Best-effort: a pull\n// failure still proceeds to upgrade with whatever the local tap knows.\nfunction refreshTap(): void {\n const repo = spawnSync(\"brew\", [\"--repository\", \"monadeo/tap\"], { encoding: \"utf8\" });\n const tapPath = repo.status === 0 ? repo.stdout.trim() : \"\";\n if (!tapPath) return;\n spawnSync(\"git\", [\"-C\", tapPath, \"pull\", \"--ff-only\", \"--quiet\"], { stdio: \"inherit\" });\n}\n\nexport function runUpdate(): number {\n const kind = detectInstallKind(process.argv[1] ?? \"\");\n if (!kind) {\n process.stderr.write(\n `Could not detect how grimoire was installed. Update with one of:\\n ${BREW_CMD.join(\" \")}\\n ${NPM_CMD.join(\" \")}\\n`,\n );\n return EXIT.apiError;\n }\n if (kind === \"brew\") refreshTap();\n const cmd = kind === \"brew\" ? BREW_CMD : NPM_CMD;\n process.stdout.write(`${cmd.join(\" \")}\\n`);\n const result = spawnSync(cmd[0], cmd.slice(1), { stdio: \"inherit\" });\n if (result.error) {\n process.stderr.write(`update failed: ${result.error.message}\\n`);\n return EXIT.apiError;\n }\n return result.status === 0 ? EXIT.ok : EXIT.apiError;\n}\n", "import type { SubmissionIn } from \"@monadeo.com/grimoire-core\";\nimport { UsageError, type ParsedArgs } from \"../args.js\";\n\nexport function submissionFromArgs(url: string, args: ParsedArgs): SubmissionIn {\n const usage =\n \"Usage: grimoire ingest <url> --product <name> (--rolling | --fixed <version> | --npm <pkg> | --pypi <pkg> | --github <owner/repo>)\";\n const product = args.flags.product?.[0];\n if (!product) throw new UsageError(usage);\n const fixed = args.flags.fixed?.[0];\n const npm = args.flags.npm?.[0];\n const pypi = args.flags.pypi?.[0];\n const github = args.flags.github?.[0];\n const probes = [npm, pypi, github].filter(Boolean).length;\n if (probes > 1) throw new UsageError(\"Pass only one of --npm, --pypi, --github\");\n\n const body: SubmissionIn = {\n url,\n product,\n version_rule: { kind: \"rolling\" },\n include_patterns: args.flags.include ?? [],\n exclude_patterns: args.flags.exclude ?? [],\n };\n if (args.bools.has(\"rolling\")) return body;\n if (fixed) return { ...body, version_rule: { kind: \"fixed\", value: fixed } };\n if (npm) return { ...body, version_rule: { kind: \"fixed\" }, probe: { kind: \"npm\", package: npm } };\n if (pypi) return { ...body, version_rule: { kind: \"fixed\" }, probe: { kind: \"pypi\", package: pypi } };\n if (github) return { ...body, version_rule: { kind: \"fixed\" }, probe: { kind: \"github\", repo: github } };\n throw new UsageError(`${usage}\\nA version rule is mandatory: --rolling for unversioned docs, --fixed, or a release probe.`);\n}\n\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nconst REGISTRY_URL = \"https://registry.npmjs.org/@monadeo.com%2Fgrimoire-cli\";\nconst DEFAULT_INTERVAL_HOURS = 24;\nconst FETCH_TIMEOUT_MS = 1_500;\n\ninterface UpdateState {\n last_check_at?: string;\n latest?: string;\n}\n\nfunction statePath(): string {\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"grimoire\", \"update-check.json\");\n}\n\nfunction readState(): UpdateState {\n try {\n return JSON.parse(readFileSync(statePath(), \"utf8\")) as UpdateState;\n } catch {\n return {};\n }\n}\n\nexport function newerVersion(a: string, b: string): boolean {\n const A = a.split(\".\").map(Number);\n const B = b.split(\".\").map(Number);\n if (A.some(Number.isNaN) || B.some(Number.isNaN)) return false;\n for (let i = 0; i < 3; i++) {\n const diff = (A[i] ?? 0) - (B[i] ?? 0);\n if (diff !== 0) return diff > 0;\n }\n return false;\n}\n\n// Prints the notice recorded by a PREVIOUS run \u2014 the registry fetch happens\n// after the command finishes, so startup stays instant.\nexport function notifyIfOutdated(current: string): void {\n if (current === \"dev\" || !process.stderr.isTTY) return;\n const { latest } = readState();\n if (latest && newerVersion(latest, current)) {\n process.stderr.write(`grimoire ${latest} is available (you have ${current}) \u2014 run \\`grimoire update\\`\\n`);\n }\n}\n\n// Best-effort, TTY-only, and never slows a command down by more than the fetch\n// timeout: agents in CI (no TTY) and dev builds skip entirely.\nexport async function refreshUpdateState(current: string, configuredHours?: number): Promise<void> {\n const hours = configuredHours ?? DEFAULT_INTERVAL_HOURS;\n if (hours === 0 || current === \"dev\" || !process.stderr.isTTY) return;\n const state = readState();\n const last = state.last_check_at ? Date.parse(state.last_check_at) : 0;\n if (Date.now() - last < hours * 3_600_000) return;\n try {\n const res = await fetch(REGISTRY_URL, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });\n if (!res.ok) return;\n const body = (await res.json()) as { \"dist-tags\"?: { latest?: string } };\n const latest = body[\"dist-tags\"]?.latest;\n if (!latest) return;\n const path = statePath();\n if (!existsSync(dirname(path))) mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify({ last_check_at: new Date().toISOString(), latest }));\n } catch {\n return;\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { execFileSync } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport {\n GrimoireClient,\n ApiError,\n browserLogin,\n clearSession,\n readSession,\n readMachineToken,\n resolveDefaultSources,\n loadGlobalConfig,\n type JobOut,\n type SourcePin,\n type SourceSelector,\n} from \"@monadeo.com/grimoire-core\";\nimport { parseArgs, requirePositional, requireFlagOneOf, intFlag, UsageError } from \"./args.js\";\nimport { printResults, printCompact, EXIT } from \"./output.js\";\nimport { runSetup } from \"./commands/setup.js\";\nimport { runInit } from \"./commands/init.js\";\nimport { runConfig } from \"./commands/config.js\";\nimport { runUpdate } from \"./commands/update.js\";\nimport { submissionFromArgs } from \"./commands/ingest.js\";\nimport { notifyIfOutdated, refreshUpdateState } from \"./updatecheck.js\";\n\n// The authorization URL is always printed so a user on a headless or remote\n// machine can open it elsewhere; the browser launch is the default convenience.\nfunction loginOpener(launchBrowser: boolean): (url: string) => void {\n return (url: string): void => {\n process.stdout.write(`${url}\\n`);\n if (!launchBrowser) {\n process.stderr.write(\"Open the URL above in a browser to log in; waiting for the callback\u2026\\n\");\n return;\n }\n const cmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n try {\n execFileSync(cmd, [url], { stdio: \"ignore\" });\n } catch {\n process.stderr.write(\"Could not open a browser; open the URL above manually.\\n\");\n }\n };\n}\n\nfunction parseSourceFlags(values: string[] | undefined): SourcePin[] {\n return (values ?? []).map((v) => {\n const [source, version] = v.split(\"@\");\n return version ? { source, version } : { source };\n });\n}\n\nfunction toSelectors(pins: SourcePin[]): SourceSelector[] {\n return pins.map((p) => ({ product: p.source, ...(p.version ? { version: p.version } : {}) }));\n}\n\n// Injected by esbuild from package.json at build time (\"dev\" when running\n// unbundled source, e.g. under vitest).\ndeclare const __GRIMOIRE_VERSION__: string | undefined;\nconst VERSION = typeof __GRIMOIRE_VERSION__ === \"string\" ? __GRIMOIRE_VERSION__ : \"dev\";\n\nconst HELP = `grimoire ${VERSION} \u2014 documentation retrieval for AI agents\n\n grimoire login [--no-launch-browser] | logout | whoami\n grimoire setup <claude-code|cursor|windsurf|codex>\n grimoire init\n grimoire search \"<query>\" [-s nextjs@15 -s react] [--json|--compact] [--debug]\n grimoire sources [--q <kw>] [--names|--json]\n grimoire versions <product> [--json]\n grimoire config [<key>] [<value>] [--unset]\n grimoire update\n grimoire doc <point_id> [--window 2] [--json]\n grimoire report <point_id> --verdict helpful|incorrect|outdated [--note \"...\"]\n grimoire ingest <url> --product <name> (--rolling | --fixed <version> | --npm <pkg> | --pypi <pkg> | --github <owner/repo>)\n [--include <pattern>]... [--exclude <pattern>]... [--watch]\n grimoire jobs <job_id> [--watch]\n grimoire staff queue [--json] | approve <job_id> | reject <job_id> --reason \"...\"\n grimoire staff users [--json] | grant <subject> --name \"...\" | revoke <subject>\n grimoire staff token <name> --quota <per-day> | recrawl <source_id>\n grimoire mcp [--http]\n grimoire help | --help | -h\n grimoire version | --version | -v\n\n env: GRIMOIRE_AUTH_TOKEN \u2014 machine token (CI, instead of login)\n GRIMOIRE_API_URL \u2014 API origin without a path\n`;\n\n// Canonical flag names each command accepts; parseArgs rejects anything else.\nconst COMMAND_FLAGS: Record<string, readonly string[]> = {\n version: [], \"--version\": [], \"-v\": [],\n login: [\"no-launch-browser\"], logout: [], setup: [], init: [], whoami: [],\n help: [], \"--help\": [], \"-h\": [],\n mcp: [\"http\"],\n config: [\"unset\"],\n update: [],\n search: [\"source\", \"json\", \"compact\", \"debug\"],\n sources: [\"q\", \"names\", \"json\"],\n versions: [\"json\"],\n doc: [\"window\", \"json\"],\n report: [\"verdict\", \"note\"],\n ingest: [\"product\", \"rolling\", \"fixed\", \"npm\", \"pypi\", \"github\", \"include\", \"exclude\", \"watch\"],\n jobs: [\"watch\"],\n staff: [\"reason\", \"name\", \"quota\", \"json\"],\n};\n\nfunction describeError(err: ApiError): string {\n const detail =\n typeof err.body === \"string\"\n ? err.body\n : err.body !== undefined && err.body !== null\n ? JSON.stringify(err.body)\n : \"\";\n return `error: ${err.code}${detail ? ` \u2014 ${detail}` : \"\"}`;\n}\n\n// \"email (kind subject) staff quota N/day\", or the email with a plain reason\n// when the account has no Grimoire grant yet \u2014 the login itself succeeded.\nasync function describeIdentity(client: GrimoireClient): Promise<string> {\n const email = await client.sessionEmail();\n const who = email ?? \"machine token\";\n try {\n const me = await client.me();\n return `${who} (${me.kind} ${me.subject})${me.is_staff ? \" staff\" : \"\"} quota ${me.quota_per_day}/day`;\n } catch (err) {\n if (err instanceof ApiError && err.status === 403) {\n return `${who} \u2014 authenticated, but this account has no Grimoire access grant yet`;\n }\n throw err;\n }\n}\n\nfunction describeJob(job: JobOut): string {\n const extra = [job.reason ? `reason: ${job.reason}` : \"\", job.source_id ? `source: ${job.source_id}` : \"\"]\n .filter(Boolean)\n .join(\" \");\n return `${job.state}${extra ? ` ${extra}` : \"\"}`;\n}\n\nasync function main(argv: string[]): Promise<number> {\n const [command, ...rest] = argv;\n const args = parseArgs(rest, { \"-s\": \"source\", \"-q\": \"q\" }, command !== undefined ? COMMAND_FLAGS[command] : []);\n const json = args.bools.has(\"json\");\n\n switch (command) {\n case \"version\":\n case \"--version\":\n case \"-v\":\n process.stdout.write(`${VERSION}\\n`);\n return EXIT.ok;\n case \"login\": {\n const launch = !args.bools.has(\"no-launch-browser\");\n process.stderr.write(launch ? \"Opening your browser to log in\u2026\\n\" : \"Login URL:\\n\");\n await browserLogin(loadGlobalConfig().apiBaseUrl, loginOpener(launch));\n process.stdout.write(`Logged in as ${await describeIdentity(new GrimoireClient())}\\n`);\n return EXIT.ok;\n }\n case \"logout\":\n clearSession();\n process.stdout.write(\"Logged out.\\n\");\n return EXIT.ok;\n case \"setup\":\n return runSetup(args.positionals[0]);\n case \"init\":\n return runInit();\n case \"config\":\n return runConfig(args);\n case \"update\":\n return runUpdate();\n case \"mcp\":\n process.stderr.write(\"Run the MCP server with: npx @monadeo.com/grimoire-mcp\" + (args.bools.has(\"http\") ? \" --http\\n\" : \"\\n\"));\n return EXIT.ok;\n case undefined:\n case \"help\":\n case \"--help\":\n case \"-h\":\n process.stdout.write(HELP);\n return EXIT.ok;\n }\n\n const client = new GrimoireClient();\n try {\n switch (command) {\n case \"whoami\": {\n const via = process.env.GRIMOIRE_AUTH_TOKEN\n ? \"GRIMOIRE_AUTH_TOKEN\"\n : readMachineToken()\n ? \"grimoire config auth-token\"\n : readSession()\n ? \"browser login\"\n : undefined;\n if (!via) {\n process.stderr.write(\"not logged in \u2014 run `grimoire login`\\n\");\n return EXIT.authRequired;\n }\n process.stdout.write(`${await describeIdentity(client)} via ${via}\\n`);\n return EXIT.ok;\n }\n case \"search\": {\n const query = args.positionals[0];\n if (!query) {\n process.stderr.write('Usage: grimoire search \"<query>\" -s <product>[@version]\\n');\n return EXIT.apiError;\n }\n const explicit = parseSourceFlags(args.flags.source);\n const sources = explicit.length > 0 ? explicit : resolveDefaultSources();\n if (sources.length === 0) {\n // `grimoire init` only helps when there are dependencies to pin from \u2014\n // suggesting it in an infra repo is a dead end (Astro 2026-07-18).\n const initHelps = existsSync(join(process.cwd(), \"package.json\")) || existsSync(join(process.cwd(), \"requirements.txt\"));\n process.stderr.write(\n \"No sources selected. List what is indexed:\\n\" +\n \" grimoire sources\\n\" +\n \"then scope the search:\\n\" +\n ' grimoire search \"<query>\" -s <product>[@version]\\n' +\n (initHelps ? \"or pin this project's sources from its dependencies:\\n grimoire init\\n\" : \"\"),\n );\n return EXIT.apiError;\n }\n const res = await client.search({ query, sources: toSelectors(sources), debug: args.bools.has(\"debug\") });\n if (json) process.stdout.write(JSON.stringify(res, null, 2) + \"\\n\");\n else if (args.bools.has(\"compact\")) printCompact(res);\n else printResults(res);\n return EXIT.ok;\n }\n case \"sources\": {\n const needle = args.flags.q?.[0]?.toLowerCase();\n const sources = (await client.listSources()).filter(\n (s) => !needle || s.product.toLowerCase().includes(needle) || s.base_url.toLowerCase().includes(needle),\n );\n if (json) {\n process.stdout.write(JSON.stringify(sources, null, 2) + \"\\n\");\n } else if (args.bools.has(\"names\")) {\n for (const s of sources) process.stdout.write(`${s.product}\\n`);\n } else {\n for (const s of sources) {\n const versions = s.versions.length > 0 ? s.versions.join(\", \") : \"(not indexed yet)\";\n process.stdout.write(`${s.product} ${versions} ${s.base_url}\\n`);\n }\n }\n return EXIT.ok;\n }\n case \"versions\": {\n const product = requirePositional(args, 0, \"Usage: grimoire versions <product> [--json]\");\n const res = await client.listVersions(product);\n if (json) {\n process.stdout.write(JSON.stringify(res, null, 2) + \"\\n\");\n return EXIT.ok;\n }\n for (const v of res.versions) {\n process.stdout.write(`${v.version}${v.version === res.latest ? \" latest\" : \"\"} ${v.chunk_count} chunks\\n`);\n }\n return EXIT.ok;\n }\n case \"doc\": {\n const pointId = requirePositional(args, 0, \"Usage: grimoire doc <point_id> [--window 2] [--json]\");\n const window = intFlag(args, \"window\", { min: 0, max: 5 }) ?? 2;\n const res = await client.getDoc(pointId, window);\n if (json) {\n process.stdout.write(JSON.stringify(res, null, 2) + \"\\n\");\n return EXIT.ok;\n }\n process.stderr.write(`${res.product}@${res.version} ${res.heading_path.join(\" \u203A \")}\\n${res.source_url}\\n`);\n process.stdout.write(res.text + \"\\n\");\n return EXIT.ok;\n }\n case \"report\": {\n const usage = 'Usage: grimoire report <point_id> --verdict helpful|incorrect|outdated [--note \"...\"]';\n const pointId = requirePositional(args, 0, usage);\n const verdict = requireFlagOneOf(args, \"verdict\", [\"helpful\", \"incorrect\", \"outdated\"], usage);\n await client.reportResult(pointId, verdict as \"helpful\" | \"incorrect\" | \"outdated\", args.flags.note?.[0]);\n process.stdout.write(\"Reported.\\n\");\n return EXIT.ok;\n }\n case \"ingest\": {\n const url = requirePositional(args, 0, \"Usage: grimoire ingest <url> --product <name> --rolling|--fixed|--npm|--pypi|--github\");\n const res = await client.submitSource(submissionFromArgs(url, args));\n process.stdout.write(`Job: ${res.job_id}\\n`);\n if (args.bools.has(\"watch\")) return watchJob(client, res.job_id);\n return EXIT.ok;\n }\n case \"jobs\": {\n const jobId = requirePositional(args, 0, \"Usage: grimoire jobs <job_id> [--watch]\");\n return args.bools.has(\"watch\") ? watchJob(client, jobId) : printJob(client, jobId);\n }\n case \"staff\": {\n const usage =\n 'Usage: grimoire staff queue [--json] | approve <job_id> | reject <job_id> --reason \"...\" | users [--json] | grant <subject> --name \"...\" | revoke <subject> | token <name> --quota <per-day> | recrawl <source_id>';\n const [action, jobId] = args.positionals;\n if (action === \"token\") {\n const quota = intFlag(args, \"quota\", { min: 1, max: 1_000_000 });\n if (!jobId || quota === undefined) throw new UsageError(usage);\n const minted = await client.mintToken(jobId, quota);\n // The plain token is shown exactly once; the server keeps only its hash.\n process.stderr.write(`token ${minted.id} ${minted.name} quota ${minted.quota_per_day}/day \u2014 shown once, store it now\\n`);\n process.stdout.write(`${minted.token}\\n`);\n return EXIT.ok;\n }\n if (action === \"recrawl\") {\n if (!jobId) throw new UsageError(usage);\n process.stdout.write(`${describeJob(await client.recrawlSource(jobId))}\\n`);\n return EXIT.ok;\n }\n if (action === \"users\") {\n const users = await client.listUsers();\n if (json) process.stdout.write(JSON.stringify(users, null, 2) + \"\\n\");\n else for (const u of users) process.stdout.write(`${u.subject} ${u.status} ${u.name} by ${u.granted_by}\\n`);\n return EXIT.ok;\n }\n if (action === \"grant\") {\n const name = args.flags.name?.[0];\n if (!jobId || !name) throw new UsageError(usage);\n const granted = await client.grantUser(jobId, name);\n process.stdout.write(`${granted.subject} ${granted.status} ${granted.name}\\n`);\n return EXIT.ok;\n }\n if (action === \"revoke\") {\n if (!jobId) throw new UsageError(usage);\n const revoked = await client.revokeUser(jobId);\n process.stdout.write(`${revoked.subject} ${revoked.status}\\n`);\n return EXIT.ok;\n }\n if (action === \"queue\") {\n const queue = await client.reviewQueue();\n if (json) process.stdout.write(JSON.stringify(queue, null, 2) + \"\\n\");\n else if (queue.length === 0) process.stdout.write(\"review queue is empty\\n\");\n else for (const job of queue) process.stdout.write(`${job.id} ${describeJob(job)}\\n`);\n return EXIT.ok;\n }\n if (!jobId) throw new UsageError(usage);\n if (action === \"approve\") {\n process.stdout.write(`${describeJob(await client.approveJob(jobId))}\\n`);\n return EXIT.ok;\n }\n if (action === \"reject\") {\n const reason = args.flags.reason?.[0];\n if (!reason) throw new UsageError(usage);\n process.stdout.write(`${describeJob(await client.rejectJob(jobId, reason))}\\n`);\n return EXIT.ok;\n }\n throw new UsageError(usage);\n }\n default:\n process.stderr.write(`Unknown command: ${command}\\n${HELP}`);\n return EXIT.apiError;\n }\n } catch (err) {\n if (err instanceof ApiError) {\n process.stderr.write(`${describeError(err)}\\n`);\n if (err.status === 401) return EXIT.authRequired;\n if (err.status === 403) return EXIT.authRequired;\n if (err.status === 429) return EXIT.quota;\n if (err.status === 404) return EXIT.notFound;\n return EXIT.apiError;\n }\n throw err;\n }\n}\n\nconst TERMINAL_STATES = [\"accepted\", \"done\", \"rejected\", \"failed\", \"pending_review\"];\nconst FAILED_STATES = [\"rejected\", \"failed\"];\n\nasync function printJob(client: GrimoireClient, jobId: string): Promise<number> {\n const job = await client.getJob(jobId);\n process.stdout.write(`${describeJob(job)}\\n`);\n return FAILED_STATES.includes(job.state) ? EXIT.apiError : EXIT.ok;\n}\n\nconst WATCH_POLL_MS = 5_000;\nconst WATCH_BACKOFF_CAP_MS = 30_000;\nconst WATCH_DEADLINE_MS = 30 * 60_000;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nasync function watchJob(client: GrimoireClient, jobId: string): Promise<number> {\n const deadline = Date.now() + WATCH_DEADLINE_MS;\n let backoff = WATCH_POLL_MS;\n while (Date.now() < deadline) {\n try {\n const job = await client.getJob(jobId);\n process.stdout.write(`${describeJob(job)}\\n`);\n if (TERMINAL_STATES.includes(job.state)) {\n if (job.state === \"pending_review\") {\n process.stderr.write(\"Parked for staff review: grimoire staff queue\\n\");\n }\n return FAILED_STATES.includes(job.state) ? EXIT.apiError : EXIT.ok;\n }\n backoff = WATCH_POLL_MS;\n await sleep(WATCH_POLL_MS);\n } catch (err) {\n // Auth/permission/missing-job failures cannot heal on their own \u2014 bail out;\n // anything else (network, 5xx, timeout) is worth retrying with backoff.\n if (err instanceof ApiError && [401, 403, 404].includes(err.status)) throw err;\n const reason = err instanceof Error ? err.message : String(err);\n process.stderr.write(`poll failed (${reason}); retrying in ${backoff / 1000}s\\n`);\n await sleep(backoff);\n backoff = Math.min(backoff * 2, WATCH_BACKOFF_CAP_MS);\n }\n }\n process.stderr.write(\n `Watch deadline (30m) reached; the job is still running. Check later with: grimoire jobs ${jobId}\\n`,\n );\n return EXIT.apiError;\n}\n\nnotifyIfOutdated(VERSION);\nmain(process.argv.slice(2))\n .then(async (code) => {\n await refreshUpdateState(VERSION, loadGlobalConfig().updateCheckHours);\n process.exit(code);\n })\n .catch((err) => {\n if (err instanceof UsageError) {\n process.stderr.write(`${err.message}\\n`);\n process.exit(EXIT.apiError);\n }\n process.stderr.write(`fatal: ${(err as Error).message}\\n`);\n process.exit(EXIT.apiError);\n });\n", "import { readFileSync, existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n// Bare origin \u2014 API paths are absolute (/v1/...), so the base must never carry a\n// path prefix.\nexport const DEFAULT_API_BASE = \"https://cli.grimoire.monadeo.com\";\nexport function globalConfigPath() {\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"grimoire\", \"config.json\");\n}\n// Malformed config must never crash a consumer (the MCP server constructs a client\n// at import time): warn and behave as if the file were absent.\nfunction readJsonConfig(path) {\n try {\n return JSON.parse(readFileSync(path, \"utf8\"));\n }\n catch (err) {\n process.stderr.write(`grimoire: ignoring malformed config at ${path}: ${err.message}\\n`);\n return undefined;\n }\n}\n// Precedence: env var > config file > default \u2014 a per-invocation env override\n// (CI, QA testing) must always beat persisted settings.\nexport function loadGlobalConfig() {\n const path = globalConfigPath();\n const overrides = existsSync(path) ? readJsonConfig(path) : undefined;\n return {\n apiBaseUrl: DEFAULT_API_BASE,\n ...overrides,\n ...(process.env.GRIMOIRE_API_URL ? { apiBaseUrl: process.env.GRIMOIRE_API_URL } : {}),\n };\n}\nexport function saveGlobalConfig(config) {\n const path = globalConfigPath();\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(config, null, 2));\n}\n// Read-modify-write against the FILE only (never the env-merged view, which\n// would bake a transient GRIMOIRE_API_URL into the file). `undefined` values\n// remove their key.\nexport function updateGlobalConfigFile(patch) {\n const path = globalConfigPath();\n const current = existsSync(path) ? (readJsonConfig(path) ?? {}) : {};\n const merged = { ...current, ...patch };\n for (const [key, value] of Object.entries(merged)) {\n if (value === undefined)\n delete merged[key];\n }\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify(merged, null, 2));\n return merged;\n}\n// Project config (.grimoire.json in the repo root) pins a codebase's sources and\n// overrides globals \u2014 committed alongside the code it documents.\nexport function findProjectConfig(startDir = process.cwd()) {\n let dir = startDir;\n for (;;) {\n const candidate = join(dir, \".grimoire.json\");\n if (existsSync(candidate)) {\n const parsed = readJsonConfig(candidate);\n if (parsed)\n return parsed;\n }\n const parent = dirname(dir);\n if (parent === dir)\n return undefined;\n dir = parent;\n }\n}\nexport function resolveDefaultSources() {\n return findProjectConfig()?.sources ?? loadGlobalConfig().defaultSources ?? [];\n}\n", "import { createHash, randomBytes } from \"node:crypto\";\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { createServer } from \"node:http\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { ApiError } from \"./errors.js\";\nimport { fetchWithTimeout } from \"./http.js\";\n// Session storage is a 0600 file, not the OS keychain (Astro 2026-07-14):\n// keychain ACLs are per binary, so every agent runtime spawning the MCP server\n// re-prompted the user \u2014 gcloud and Codex accept the same file-based model.\n// A machine token via GRIMOIRE_AUTH_TOKEN overrides interactive auth (CI only).\nfunction configDir() {\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"grimoire\");\n}\nfunction credentialsPath() {\n return join(configDir(), \"credentials.json\");\n}\nexport function storeSession(session) {\n const path = credentialsPath();\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, JSON.stringify(session) + \"\\n\", { mode: 0o600 });\n}\nexport function readSession() {\n try {\n const parsed = JSON.parse(readFileSync(credentialsPath(), \"utf8\"));\n if (typeof parsed.refresh_token === \"string\" &&\n parsed.refresh_token !== \"\" &&\n typeof parsed.supabase_url === \"string\" &&\n typeof parsed.supabase_anon_key === \"string\") {\n return {\n refresh_token: parsed.refresh_token,\n supabase_url: parsed.supabase_url,\n supabase_anon_key: parsed.supabase_anon_key,\n };\n }\n return undefined;\n }\n catch {\n return undefined;\n }\n}\nexport function clearSession() {\n if (existsSync(credentialsPath()))\n rmSync(credentialsPath());\n}\n// Persisted machine token, for users who want a `mt_` token without exporting\n// GRIMOIRE_AUTH_TOKEN in a shell profile (that env var still overrides). Same\n// 0600 model as credentials.json \u2014 never the world-readable config.json.\nfunction machineTokenPath() {\n return join(configDir(), \"machine-token\");\n}\nexport function storeMachineToken(token) {\n const path = machineTokenPath();\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, token + \"\\n\", { mode: 0o600 });\n}\nexport function readMachineToken() {\n try {\n const token = readFileSync(machineTokenPath(), \"utf8\").trim();\n return token !== \"\" ? token : undefined;\n }\n catch {\n return undefined;\n }\n}\nexport function clearMachineToken() {\n if (existsSync(machineTokenPath()))\n rmSync(machineTokenPath());\n}\n// The API publishes everything a client needs to log in: the public Supabase\n// URL, its anon key (public by design), the OAuth provider, and the loopback\n// callbacks that are allow-listed for the PKCE flow.\nexport async function fetchAuthConfig(apiBase) {\n const res = await fetchWithTimeout(`${apiBase.replace(/\\/+$/, \"\")}/v1/auth/config`);\n if (!res.ok)\n throw new ApiError(res.status, \"auth_config_unavailable\", await res.text());\n const body = (await res.json());\n if (typeof body.supabase_url !== \"string\" ||\n typeof body.supabase_anon_key !== \"string\" ||\n typeof body.oauth_provider !== \"string\" ||\n !Array.isArray(body.redirect_urls) ||\n body.redirect_urls.length === 0) {\n throw new ApiError(res.status, \"auth_config_malformed\", body);\n }\n return {\n supabase_url: body.supabase_url,\n supabase_anon_key: body.supabase_anon_key,\n oauth_provider: body.oauth_provider,\n redirect_urls: body.redirect_urls.map(String),\n };\n}\nfunction parseDetail(text) {\n try {\n return JSON.parse(text);\n }\n catch {\n return text;\n }\n}\n// Supabase Auth (GoTrue) token endpoint: POST /auth/v1/token?grant_type=\u2026, the\n// anon key in the apikey header, JSON body per grant.\nexport async function gotrueToken(supabaseUrl, anonKey, grantType, body) {\n const res = await fetchWithTimeout(`${supabaseUrl.replace(/\\/+$/, \"\")}/auth/v1/token?grant_type=${grantType}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", apikey: anonKey },\n body: JSON.stringify(body),\n });\n const text = await res.text();\n if (!res.ok) {\n throw new ApiError(res.status, grantType === \"pkce\" ? \"login_failed\" : \"refresh_failed\", parseDetail(text));\n }\n const parsed = JSON.parse(text);\n if (typeof parsed.access_token !== \"string\" ||\n typeof parsed.refresh_token !== \"string\" ||\n typeof parsed.expires_in !== \"number\") {\n throw new ApiError(res.status, \"token_malformed\", parsed);\n }\n return {\n access_token: parsed.access_token,\n refresh_token: parsed.refresh_token,\n expires_in: parsed.expires_in,\n };\n}\nfunction base64url(buf) {\n return buf.toString(\"base64url\");\n}\n// Bind the first free allow-listed loopback callback (IPv4). The bases come\n// from the API, so the client and the Supabase allow list cannot drift.\nasync function bindCallback(server, redirectUrls) {\n for (const candidate of redirectUrls) {\n const port = Number(new URL(candidate).port);\n const bound = await new Promise((resolve) => {\n const onError = () => {\n server.off(\"error\", onError);\n resolve(false);\n };\n server.once(\"error\", onError);\n server.listen(port, \"127.0.0.1\", () => {\n server.off(\"error\", onError);\n resolve(true);\n });\n });\n if (bound)\n return candidate;\n }\n throw new Error(`No free login callback port among: ${redirectUrls.join(\", \")}`);\n}\n// OAuth Authorization Code with PKCE through Supabase Auth: open the provider\n// login in the browser, receive the code on a loopback callback, exchange code +\n// verifier for tokens. No client secret exists anywhere in the client.\n//\n// Supabase Auth's /authorize carries no `state` parameter, so the per-attempt\n// state rides in the callback path (`/callback/<state>`); any other path is a\n// 404 and the server keeps waiting. The allow list holds `/callback/*`.\nexport async function browserLogin(apiBase, openBrowser, timeoutMs = 300_000) {\n const config = await fetchAuthConfig(apiBase);\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n const state = base64url(randomBytes(16));\n const code = await new Promise((resolve, reject) => {\n let timer;\n const finish = (outcome) => {\n if (timer)\n clearTimeout(timer);\n server.closeAllConnections();\n server.close();\n if (\"code\" in outcome)\n resolve(outcome.code);\n else\n reject(outcome.error);\n };\n const server = createServer((req, res) => {\n const url = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (req.method !== \"GET\" || url.pathname !== `/callback/${state}`) {\n res.writeHead(404).end();\n return;\n }\n const failure = url.searchParams.get(\"error_description\") ?? url.searchParams.get(\"error\");\n const received = url.searchParams.get(\"code\");\n if (failure || !received) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" }).end(`Login failed: ${failure ?? \"no code\"}`);\n finish({ error: new Error(`Login failed: ${failure ?? \"no code returned\"}`) });\n return;\n }\n res\n .writeHead(200, { \"Content-Type\": \"text/plain\" })\n .end(\"Logged in to Grimoire. You can close this tab.\");\n finish({ code: received });\n });\n bindCallback(server, config.redirect_urls)\n .then((redirectBase) => {\n timer = setTimeout(() => finish({ error: new Error(\"Login timed out\") }), timeoutMs);\n const authorize = new URL(`${config.supabase_url.replace(/\\/+$/, \"\")}/auth/v1/authorize`);\n authorize.searchParams.set(\"provider\", config.oauth_provider);\n authorize.searchParams.set(\"redirect_to\", `${redirectBase.replace(/\\/+$/, \"\")}/${state}`);\n authorize.searchParams.set(\"code_challenge\", challenge);\n authorize.searchParams.set(\"code_challenge_method\", \"s256\");\n openBrowser(authorize.toString());\n })\n .catch((err) => finish({ error: err }));\n });\n const tokens = await gotrueToken(config.supabase_url, config.supabase_anon_key, \"pkce\", {\n auth_code: code,\n code_verifier: verifier,\n });\n storeSession({\n refresh_token: tokens.refresh_token,\n supabase_url: config.supabase_url,\n supabase_anon_key: config.supabase_anon_key,\n });\n}\n// Claims of an access token, read without verification \u2014 for display only\n// (the API verifies every token it receives).\nexport function tokenClaims(token) {\n const payload = token.split(\".\")[1];\n if (!payload)\n return {};\n try {\n return JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\"));\n }\n catch {\n return {};\n }\n}\n", "export class ApiError extends Error {\n status;\n code;\n body;\n constructor(status, code, body) {\n super(`${code} (${status})`);\n this.status = status;\n this.code = code;\n this.body = body;\n }\n}\n", "import { ApiError } from \"./errors.js\";\nexport const REQUEST_TIMEOUT_MS = 30_000;\nexport async function fetchWithTimeout(url, init = {}) {\n try {\n return await fetch(url, { ...init, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });\n }\n catch (err) {\n if (err instanceof Error && (err.name === \"TimeoutError\" || err.name === \"AbortError\")) {\n throw new ApiError(408, \"timeout\", `Request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`);\n }\n // Undici reports DNS/TLS/connection failures as `TypeError: fetch failed` with the\n // useful detail in `cause`; surface both under a consistent ApiError.\n const message = err instanceof Error ? err.message : String(err);\n const cause = err instanceof Error && err.cause instanceof Error ? `: ${err.cause.message}` : \"\";\n throw new ApiError(0, \"network_error\", `${message}${cause}`);\n }\n}\n", "import { gotrueToken, readMachineToken, readSession, storeSession, tokenClaims } from \"./auth.js\";\nimport { loadGlobalConfig } from \"./config.js\";\nimport { ApiError } from \"./errors.js\";\nimport { fetchWithTimeout } from \"./http.js\";\nexport { ApiError } from \"./errors.js\";\nconst CODES = {\n 401: \"unauthorized\",\n 403: \"forbidden\",\n 404: \"not_found\",\n 422: \"invalid_request\",\n 429: \"quota_exceeded\",\n};\nexport class GrimoireClient {\n baseUrl;\n machineToken;\n cachedAccessToken;\n refreshInFlight;\n constructor(opts = {}) {\n this.baseUrl = (opts.baseUrl ?? loadGlobalConfig().apiBaseUrl).replace(/\\/+$/, \"\");\n this.machineToken = opts.machineToken ?? process.env.GRIMOIRE_AUTH_TOKEN ?? readMachineToken();\n }\n async bearer() {\n if (this.machineToken)\n return this.machineToken;\n if (this.cachedAccessToken && this.cachedAccessToken.expiresAt > Date.now() + 60_000) {\n return this.cachedAccessToken.token;\n }\n this.refreshInFlight ??= this.refreshAccessToken().finally(() => {\n this.refreshInFlight = undefined;\n });\n return this.refreshInFlight;\n }\n // Exchange the stored refresh token for a fresh access token. GoTrue rotates\n // refresh tokens, so the new one replaces the stored one every time.\n async refreshAccessToken() {\n const session = readSession();\n if (!session)\n throw new ApiError(401, \"not_logged_in\", \"Run `grimoire login`\");\n let tokens;\n try {\n tokens = await gotrueToken(session.supabase_url, session.supabase_anon_key, \"refresh_token\", {\n refresh_token: session.refresh_token,\n });\n }\n catch (err) {\n if (err instanceof ApiError)\n throw new ApiError(err.status, \"refresh_failed\", \"Run `grimoire login`\");\n throw err;\n }\n storeSession({ ...session, refresh_token: tokens.refresh_token });\n this.cachedAccessToken = {\n token: tokens.access_token,\n expiresAt: Date.now() + tokens.expires_in * 1000,\n };\n return tokens.access_token;\n }\n async refreshSession() {\n await this.bearer();\n }\n // The login email from the session token; undefined for machine tokens.\n async sessionEmail() {\n if (this.machineToken)\n return undefined;\n const email = tokenClaims(await this.bearer()).email;\n return typeof email === \"string\" ? email : undefined;\n }\n async send(path, init, auth) {\n const headers = {\n \"Content-Type\": \"application/json\",\n ...init.headers,\n };\n if (auth)\n headers.Authorization = `Bearer ${await this.bearer()}`;\n return fetchWithTimeout(`${this.baseUrl}${path}`, { ...init, headers });\n }\n async request(path, init = {}, auth = true) {\n let res = await this.send(path, init, auth);\n // A 401 despite a locally-unexpired access token means it was revoked\n // server-side: force one refresh and retry exactly once.\n if (res.status === 401 && auth && !this.machineToken) {\n this.cachedAccessToken = undefined;\n res = await this.send(path, init, auth);\n }\n return this.parseResponse(res);\n }\n // FastAPI errors carry {\"detail\": \"...\"} (string) or {\"detail\": [...]} (422).\n async parseResponse(res) {\n const isJson = res.headers.get(\"content-type\")?.includes(\"json\") ?? false;\n const text = await res.text();\n let body;\n let parsed = false;\n if (isJson && text) {\n try {\n body = JSON.parse(text);\n parsed = true;\n }\n catch {\n parsed = false;\n }\n }\n if (!res.ok) {\n const detail = parsed && typeof body === \"object\" && body !== null ? body.detail : undefined;\n throw new ApiError(res.status, CODES[res.status] ?? \"error\", detail ?? (parsed ? body : text));\n }\n if (isJson)\n return (parsed ? body : {});\n return text;\n }\n search(input) {\n return this.request(\"/v1/search\", { method: \"POST\", body: JSON.stringify(input) });\n }\n listSources() {\n return this.request(\"/v1/sources\");\n }\n listVersions(product) {\n return this.request(`/v1/sources/${encodeURIComponent(product)}/versions`);\n }\n getDoc(pointId, window = 2) {\n return this.request(`/v1/doc/${encodeURIComponent(pointId)}?window=${window}`);\n }\n reportResult(pointId, verdict, note) {\n const body = { point_id: pointId, verdict, ...(note ? { note } : {}) };\n return this.request(\"/v1/report\", { method: \"POST\", body: JSON.stringify(body) });\n }\n submitSource(body) {\n return this.request(\"/v1/sources\", { method: \"POST\", body: JSON.stringify(body) });\n }\n getJob(jobId) {\n return this.request(`/v1/jobs/${encodeURIComponent(jobId)}`);\n }\n me() {\n return this.request(\"/v1/me\");\n }\n reviewQueue() {\n return this.request(\"/v1/staff/review-queue\");\n }\n approveJob(jobId) {\n return this.request(`/v1/staff/jobs/${encodeURIComponent(jobId)}/approve`, { method: \"POST\" });\n }\n listUsers() {\n return this.request(\"/v1/staff/users\");\n }\n grantUser(subject, name) {\n return this.request(\"/v1/staff/users\", {\n method: \"POST\",\n body: JSON.stringify({ subject, name }),\n });\n }\n revokeUser(subject) {\n return this.request(`/v1/staff/users/${encodeURIComponent(subject)}`, { method: \"DELETE\" });\n }\n mintToken(name, quotaPerDay) {\n return this.request(\"/v1/staff/tokens\", {\n method: \"POST\",\n body: JSON.stringify({ name, quota_per_day: quotaPerDay }),\n });\n }\n recrawlSource(sourceId) {\n return this.request(`/v1/staff/sources/${encodeURIComponent(sourceId)}/recrawl`, { method: \"POST\" });\n }\n rejectJob(jobId, reason) {\n return this.request(`/v1/staff/jobs/${encodeURIComponent(jobId)}/reject`, {\n method: \"POST\",\n body: JSON.stringify({ reason }),\n });\n }\n}\n", "// Minimal flag parser: collects repeated --flag/-f values and positionals.\nexport interface ParsedArgs {\n positionals: string[];\n flags: Record<string, string[]>;\n bools: Set<string>;\n}\n\nexport class UsageError extends Error {}\n\nconst BOOL_FLAGS = new Set([\n \"json\",\n \"compact\",\n \"watch\",\n \"names\",\n \"http\",\n \"unset\",\n \"rolling\",\n \"debug\",\n \"no-launch-browser\",\n]);\n\nexport function parseArgs(\n argv: string[],\n aliases: Record<string, string> = {},\n allowed?: readonly string[],\n): ParsedArgs {\n const positionals: string[] = [];\n const flags: Record<string, string[]> = {};\n const bools = new Set<string>();\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg.startsWith(\"--\") || arg.startsWith(\"-\")) {\n const name = aliases[arg] ?? arg.replace(/^--?/, \"\");\n // A misspelled flag silently swallowing its value (`--top 4` when the\n // real flag is --top-k) must fail loudly, not act like it worked.\n if (allowed && !allowed.includes(name)) {\n throw new UsageError(`Unknown flag ${arg} \u2014 run \\`grimoire help\\` for valid flags`);\n }\n if (BOOL_FLAGS.has(name)) {\n bools.add(name);\n } else {\n const value = argv[i + 1];\n if (value === undefined || value.startsWith(\"-\")) {\n throw new UsageError(`Flag ${arg} requires a value`);\n }\n (flags[name] ??= []).push(value);\n i++;\n }\n } else {\n positionals.push(arg);\n }\n }\n return { positionals, flags, bools };\n}\n\nexport function requirePositional(parsed: ParsedArgs, index: number, usage: string): string {\n const value = parsed.positionals[index];\n if (value === undefined) throw new UsageError(usage);\n return value;\n}\n\nexport function intFlag(\n parsed: ParsedArgs,\n name: string,\n range?: { min: number; max: number },\n): number | undefined {\n const raw = parsed.flags[name]?.[0];\n if (raw === undefined) return undefined;\n const value = Number(raw);\n if (!Number.isInteger(value)) throw new UsageError(`Flag --${name} must be an integer`);\n if (range && (value < range.min || value > range.max)) {\n throw new UsageError(`Flag --${name} must be between ${range.min} and ${range.max}`);\n }\n return value;\n}\n\nexport function requireFlagOneOf(\n parsed: ParsedArgs,\n name: string,\n allowed: readonly string[],\n usage: string,\n): string {\n const raw = parsed.flags[name]?.[0];\n if (raw === undefined || !allowed.includes(raw)) throw new UsageError(usage);\n return raw;\n}\n", "import type { SearchResponse, SearchResult } from \"@monadeo.com/grimoire-core\";\n\n// Exit codes documented for scripting (clients spec).\nexport const EXIT = { ok: 0, apiError: 1, authRequired: 2, quota: 3, notFound: 4 } as const;\n\n// The API labels result text as untrusted data; the CLI repeats that on stderr\n// so agents reading stdout never see it as an instruction.\nfunction preamble(res: SearchResponse): void {\n const versions = Object.entries(res.resolved_versions)\n .map(([product, version]) => `${product}@${version}`)\n .join(\", \");\n process.stderr.write(`sources: ${versions} \u00B7 retrievals remaining: ${res.retrievals_remaining}\\n`);\n process.stderr.write(`note: ${res.untrusted_content_notice}\\n`);\n if (res.results.length === 0) {\n process.stderr.write(\"note: no result passed the relevance threshold \u2014 the docs may not cover this.\\n\");\n }\n}\n\nfunction heading(r: SearchResult): string {\n return r.heading_path.join(\" \u203A \");\n}\n\nexport function printResults(res: SearchResponse): void {\n preamble(res);\n for (const r of res.results) {\n process.stdout.write(\n `\\n${r.score.toFixed(3)} ${r.product}@${r.version} ${heading(r)}\\n${r.source_url}\\npoint_id: ${r.point_id}\\n`,\n );\n const preview = r.text.length > 500 ? `${r.text.slice(0, 500)}\u2026` : r.text;\n process.stdout.write(`${preview}\\n`);\n }\n}\n\nexport function printCompact(res: SearchResponse): void {\n preamble(res);\n for (const r of res.results) {\n process.stdout.write(\n `${r.score.toFixed(3)} | ${r.product}@${r.version} | ${heading(r)} | ${r.source_url} | ${r.point_id}\\n`,\n );\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { readMachineToken, readSession } from \"@monadeo.com/grimoire-core\";\n\n// One-command agent onboarding (SDD decision 19 / clients spec): writes the MCP\n// registration for the named agent. `npx @monadeo.com/grimoire-mcp` needs no global install.\nconst MCP_ENTRY = { command: \"npx\", args: [\"-y\", \"@monadeo.com/grimoire-mcp\"] };\n\nconst CODEX_TABLE = `[mcp_servers.grimoire]\ncommand = \"npx\"\nargs = [\"-y\", \"@monadeo.com/grimoire-mcp\"]\n`;\n\n// Codex reads ~/.codex/config.toml. Replace our table in place (up to the next\n// [ header or EOF) without a TOML library, so the rest of the user's config\n// passes through byte-for-byte.\nexport function mergeCodexToml(existing: string): string {\n const header = existing.match(/^[ \\t]*\\[mcp_servers\\.grimoire\\][ \\t]*(\\r?\\n|$)/m);\n if (!header || header.index === undefined) {\n if (existing.trim() === \"\") return CODEX_TABLE;\n const sep = existing.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return existing + sep + CODEX_TABLE;\n }\n const afterHeader = header.index + header[0].length;\n const nextHeader = existing.slice(afterHeader).match(/^[ \\t]*\\[/m);\n const end =\n nextHeader && nextHeader.index !== undefined ? afterHeader + nextHeader.index : existing.length;\n return existing.slice(0, header.index) + CODEX_TABLE + existing.slice(end);\n}\n\ninterface JsonAgentTarget {\n path: string;\n apply: (existing: Record<string, unknown>) => Record<string, unknown>;\n}\n\nfunction mcpServersMerge(key: string) {\n return (existing: Record<string, unknown>) => {\n const servers = (existing[key] as Record<string, unknown>) ?? {};\n return { ...existing, [key]: { ...servers, grimoire: MCP_ENTRY } };\n };\n}\n\nconst JSON_AGENTS: Record<string, JsonAgentTarget> = {\n \"claude-code\": { path: join(homedir(), \".claude.json\"), apply: mcpServersMerge(\"mcpServers\") },\n cursor: { path: join(homedir(), \".cursor\", \"mcp.json\"), apply: mcpServersMerge(\"mcpServers\") },\n windsurf: {\n path: join(homedir(), \".codeium\", \"windsurf\", \"mcp_config.json\"),\n apply: mcpServersMerge(\"mcpServers\"),\n },\n};\n\nconst AGENT_NAMES = [...Object.keys(JSON_AGENTS), \"codex\"];\n\nfunction setupCodex(): number {\n const path = join(homedir(), \".codex\", \"config.toml\");\n const existing = existsSync(path) ? readFileSync(path, \"utf8\") : \"\";\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, mergeCodexToml(existing));\n return finish(\"codex\", path);\n}\n\n// Best-effort session probe: an unreadable credentials file must fall through\n// to the hint, never crash setup.\nfunction hasSession(): boolean {\n if (process.env.GRIMOIRE_AUTH_TOKEN) return true;\n try {\n return readMachineToken() !== undefined || readSession() !== undefined;\n } catch {\n return false;\n }\n}\n\nfunction finish(agent: string, path: string): number {\n process.stdout.write(`Configured grimoire MCP for ${agent} at ${path}\\n`);\n process.stdout.write(hasSession() ? \"Already logged in.\\n\" : \"Run `grimoire login` to authenticate.\\n\");\n return 0;\n}\n\nexport function runSetup(agent: string | undefined): number {\n if (!agent || !AGENT_NAMES.includes(agent)) {\n process.stderr.write(`Usage: grimoire setup <${AGENT_NAMES.join(\"|\")}>\\n`);\n return 1;\n }\n if (agent === \"codex\") return setupCodex();\n const target = JSON_AGENTS[agent];\n let existing: Record<string, unknown> = {};\n if (existsSync(target.path)) {\n try {\n existing = JSON.parse(readFileSync(target.path, \"utf8\")) as Record<string, unknown>;\n } catch (err) {\n process.stderr.write(\n `Cannot parse ${target.path}: ${(err as Error).message}\\nFix or remove the file, then re-run setup.\\n`,\n );\n return 1;\n }\n }\n mkdirSync(dirname(target.path), { recursive: true });\n writeFileSync(target.path, JSON.stringify(target.apply(existing), null, 2));\n return finish(agent, target.path);\n}\n", "import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SourcePin } from \"@monadeo.com/grimoire-core\";\n\nfunction parseJsonFile<T>(path: string): T {\n try {\n return JSON.parse(readFileSync(path, \"utf8\")) as T;\n } catch (err) {\n throw new Error(`Cannot parse ${path}: ${(err as Error).message}`, { cause: err });\n }\n}\n\n// Scan common manifests \u2192 propose .grimoire.json source pins. Alias resolution\n// against the registry (curated to include package-ecosystem names) happens when\n// the sources are actually queried; init proposes candidate names from manifests.\nexport function detectManifestSources(dir = process.cwd()): SourcePin[] {\n const pins: SourcePin[] = [];\n const pkgPath = join(dir, \"package.json\");\n if (existsSync(pkgPath)) {\n const pkg = parseJsonFile<{ dependencies?: Record<string, string> }>(pkgPath);\n for (const [name, range] of Object.entries(pkg.dependencies ?? {})) {\n const major = range.match(/(\\d+)/)?.[1];\n pins.push({ source: name.replace(/^@[^/]+\\//, \"\"), ...(major ? { version: major } : {}) });\n }\n }\n const reqPath = join(dir, \"requirements.txt\");\n if (existsSync(reqPath)) {\n for (const line of readFileSync(reqPath, \"utf8\").split(\"\\n\")) {\n const m = line.match(/^([A-Za-z0-9_.-]+)\\s*==\\s*(\\d+)/);\n if (m) pins.push({ source: m[1].toLowerCase(), version: m[2] });\n }\n }\n return pins;\n}\n\nexport function runInit(): number {\n const path = join(process.cwd(), \".grimoire.json\");\n try {\n const sources = detectManifestSources();\n if (sources.length === 0) {\n process.stderr.write(\"No package.json/requirements.txt dependencies found.\\n\");\n return 1;\n }\n const existing = existsSync(path) ? parseJsonFile<Record<string, unknown>>(path) : {};\n writeFileSync(path, JSON.stringify({ ...existing, sources }, null, 2));\n process.stdout.write(`Wrote ${sources.length} source pins to .grimoire.json\\n`);\n return 0;\n } catch (err) {\n process.stderr.write(`${(err as Error).message}\\n`);\n return 1;\n }\n}\n", "import {\n DEFAULT_API_BASE,\n globalConfigPath,\n loadGlobalConfig,\n updateGlobalConfigFile,\n storeMachineToken,\n readMachineToken,\n clearMachineToken,\n type GlobalConfig,\n} from \"@monadeo.com/grimoire-core\";\nimport { UsageError, type ParsedArgs } from \"../args.js\";\nimport { EXIT } from \"../output.js\";\n\ninterface KeySpec {\n prop: keyof GlobalConfig;\n describe: string;\n parse(raw: string): GlobalConfig[keyof GlobalConfig];\n}\n\nfunction intInRange(name: string, raw: string, min: number): number {\n const value = Number(raw);\n if (!Number.isInteger(value) || value < min) {\n throw new UsageError(`${name} must be an integer >= ${min}`);\n }\n return value;\n}\n\nexport const CONFIG_KEYS: Record<string, KeySpec> = {\n \"api-url\": {\n prop: \"apiBaseUrl\",\n describe: `API origin without a path (default ${DEFAULT_API_BASE}; env GRIMOIRE_API_URL overrides)`,\n parse: (raw) => {\n if (!/^https?:\\/\\/[^/]+$/.test(raw)) {\n throw new UsageError(\"api-url must be a bare origin, e.g. https://api.example.com\");\n }\n return raw;\n },\n },\n \"update-check-hours\": {\n prop: \"updateCheckHours\",\n describe: \"hours between CLI update checks (default 24, 0 disables)\",\n parse: (raw) => intInRange(\"update-check-hours\", raw, 0),\n },\n};\n\n// auth-token is a secret and lives in a 0600 file, not the world-readable\n// config.json \u2014 so it is handled outside the CONFIG_KEYS (GlobalConfig) framework.\nconst AUTH_TOKEN_KEY = \"auth-token\";\nconst MACHINE_TOKEN_RE = /^mt_[A-Za-z0-9_-]{32,}$/;\nconst USAGE =\n \"Usage: grimoire config [<key>] [<value>] [--unset] (keys: \" +\n [...Object.keys(CONFIG_KEYS), AUTH_TOKEN_KEY].join(\", \") +\n \")\";\n\nexport function runConfig(args: ParsedArgs): number {\n const [key, value] = args.positionals;\n if (key === undefined) {\n const resolved = loadGlobalConfig();\n process.stdout.write(`config file: ${globalConfigPath()}\\n`);\n for (const [name, spec] of Object.entries(CONFIG_KEYS)) {\n const current = resolved[spec.prop];\n process.stdout.write(`${name} = ${current === undefined ? \"(unset)\" : JSON.stringify(current)} # ${spec.describe}\\n`);\n }\n process.stdout.write(\n `${AUTH_TOKEN_KEY} = ${readMachineToken() ? \"(set)\" : \"(unset)\"} # machine token, stored 0600 (env GRIMOIRE_AUTH_TOKEN overrides)\\n`,\n );\n return EXIT.ok;\n }\n if (key === AUTH_TOKEN_KEY) {\n if (args.bools.has(\"unset\")) {\n clearMachineToken();\n process.stdout.write(`${AUTH_TOKEN_KEY} unset\\n`);\n return EXIT.ok;\n }\n if (value === undefined) {\n // Never echo the secret \u2014 report presence only.\n process.stdout.write(`${readMachineToken() ? \"(set)\" : \"(unset)\"}\\n`);\n return EXIT.ok;\n }\n if (!MACHINE_TOKEN_RE.test(value)) {\n throw new UsageError(\"auth-token must be a machine token starting with mt_\");\n }\n storeMachineToken(value);\n process.stdout.write(`${AUTH_TOKEN_KEY} set\\n`);\n return EXIT.ok;\n }\n const spec = CONFIG_KEYS[key];\n if (!spec) throw new UsageError(USAGE);\n if (args.bools.has(\"unset\")) {\n updateGlobalConfigFile({ [spec.prop]: undefined });\n process.stdout.write(`${key} unset\\n`);\n return EXIT.ok;\n }\n if (value === undefined) {\n const current = loadGlobalConfig()[spec.prop];\n process.stdout.write(`${current === undefined ? \"\" : JSON.stringify(current)}\\n`);\n return EXIT.ok;\n }\n updateGlobalConfigFile({ [spec.prop]: spec.parse(value) });\n process.stdout.write(`${key} = ${value}\\n`);\n return EXIT.ok;\n}\n", "import { spawnSync } from \"node:child_process\";\nimport { realpathSync } from \"node:fs\";\nimport { EXIT } from \"../output.js\";\n\nconst BREW_CMD = [\"brew\", \"upgrade\", \"monadeo/tap/grimoire\"];\nconst NPM_CMD = [\"npm\", \"install\", \"-g\", \"@monadeo.com/grimoire-cli\"];\n\n// The running binary's real location tells us who installed it: Homebrew keeps\n// everything under a Cellar/homebrew prefix, npm under a lib/node_modules\n// global prefix. Anything else (pnpm dlx, npx cache, a repo checkout) is not\n// ours to upgrade \u2014 print the choices instead of guessing.\nexport function detectInstallKind(binPath: string): \"brew\" | \"npm\" | undefined {\n let real: string;\n try {\n real = realpathSync(binPath);\n } catch {\n return undefined;\n }\n if (/homebrew|\\/Cellar\\//i.test(real)) return \"brew\";\n if (/\\/lib\\/node_modules\\//.test(real)) return \"npm\";\n return undefined;\n}\n\n// `brew upgrade` reads the LOCAL tap clone \u2014 without pulling it first, brew\n// happily reports \"already installed\" for a version the registry has long\n// superseded (observed 2026-07-18 upgrading 0.3.4\u21920.3.5). Pull just our tap,\n// not `brew update`, which touches every tap and core. Best-effort: a pull\n// failure still proceeds to upgrade with whatever the local tap knows.\nfunction refreshTap(): void {\n const repo = spawnSync(\"brew\", [\"--repository\", \"monadeo/tap\"], { encoding: \"utf8\" });\n const tapPath = repo.status === 0 ? repo.stdout.trim() : \"\";\n if (!tapPath) return;\n spawnSync(\"git\", [\"-C\", tapPath, \"pull\", \"--ff-only\", \"--quiet\"], { stdio: \"inherit\" });\n}\n\nexport function runUpdate(): number {\n const kind = detectInstallKind(process.argv[1] ?? \"\");\n if (!kind) {\n process.stderr.write(\n `Could not detect how grimoire was installed. Update with one of:\\n ${BREW_CMD.join(\" \")}\\n ${NPM_CMD.join(\" \")}\\n`,\n );\n return EXIT.apiError;\n }\n if (kind === \"brew\") refreshTap();\n const cmd = kind === \"brew\" ? BREW_CMD : NPM_CMD;\n process.stdout.write(`${cmd.join(\" \")}\\n`);\n const result = spawnSync(cmd[0], cmd.slice(1), { stdio: \"inherit\" });\n if (result.error) {\n process.stderr.write(`update failed: ${result.error.message}\\n`);\n return EXIT.apiError;\n }\n return result.status === 0 ? EXIT.ok : EXIT.apiError;\n}\n", "import type { SubmissionIn } from \"@monadeo.com/grimoire-core\";\nimport { UsageError, type ParsedArgs } from \"../args.js\";\n\nexport function submissionFromArgs(url: string, args: ParsedArgs): SubmissionIn {\n const usage =\n \"Usage: grimoire ingest <url> --product <name> (--rolling | --fixed <version> | --npm <pkg> | --pypi <pkg> | --github <owner/repo>)\";\n const product = args.flags.product?.[0];\n if (!product) throw new UsageError(usage);\n const fixed = args.flags.fixed?.[0];\n const npm = args.flags.npm?.[0];\n const pypi = args.flags.pypi?.[0];\n const github = args.flags.github?.[0];\n const probes = [npm, pypi, github].filter(Boolean).length;\n if (probes > 1) throw new UsageError(\"Pass only one of --npm, --pypi, --github\");\n\n const body: SubmissionIn = {\n url,\n product,\n version_rule: { kind: \"rolling\" },\n include_patterns: args.flags.include ?? [],\n exclude_patterns: args.flags.exclude ?? [],\n };\n if (args.bools.has(\"rolling\")) return body;\n if (fixed) return { ...body, version_rule: { kind: \"fixed\", value: fixed } };\n if (npm) return { ...body, version_rule: { kind: \"fixed\" }, probe: { kind: \"npm\", package: npm } };\n if (pypi) return { ...body, version_rule: { kind: \"fixed\" }, probe: { kind: \"pypi\", package: pypi } };\n if (github) return { ...body, version_rule: { kind: \"fixed\" }, probe: { kind: \"github\", repo: github } };\n throw new UsageError(`${usage}\\nA version rule is mandatory: --rolling for unversioned docs, --fixed, or a release probe.`);\n}\n\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nconst REGISTRY_URL = \"https://registry.npmjs.org/@monadeo.com%2Fgrimoire-cli\";\nconst DEFAULT_INTERVAL_HOURS = 24;\nconst FETCH_TIMEOUT_MS = 1_500;\n\ninterface UpdateState {\n last_check_at?: string;\n latest?: string;\n}\n\nfunction statePath(): string {\n return join(process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"grimoire\", \"update-check.json\");\n}\n\nfunction readState(): UpdateState {\n try {\n return JSON.parse(readFileSync(statePath(), \"utf8\")) as UpdateState;\n } catch {\n return {};\n }\n}\n\nexport function newerVersion(a: string, b: string): boolean {\n const A = a.split(\".\").map(Number);\n const B = b.split(\".\").map(Number);\n if (A.some(Number.isNaN) || B.some(Number.isNaN)) return false;\n for (let i = 0; i < 3; i++) {\n const diff = (A[i] ?? 0) - (B[i] ?? 0);\n if (diff !== 0) return diff > 0;\n }\n return false;\n}\n\n// Prints the notice recorded by a PREVIOUS run \u2014 the registry fetch happens\n// after the command finishes, so startup stays instant.\nexport function notifyIfOutdated(current: string): void {\n if (current === \"dev\" || !process.stderr.isTTY) return;\n const { latest } = readState();\n if (latest && newerVersion(latest, current)) {\n process.stderr.write(`grimoire ${latest} is available (you have ${current}) \u2014 run \\`grimoire update\\`\\n`);\n }\n}\n\n// Best-effort, TTY-only, and never slows a command down by more than the fetch\n// timeout: agents in CI (no TTY) and dev builds skip entirely.\nexport async function refreshUpdateState(current: string, configuredHours?: number): Promise<void> {\n const hours = configuredHours ?? DEFAULT_INTERVAL_HOURS;\n if (hours === 0 || current === \"dev\" || !process.stderr.isTTY) return;\n const state = readState();\n const last = state.last_check_at ? Date.parse(state.last_check_at) : 0;\n if (Date.now() - last < hours * 3_600_000) return;\n try {\n const res = await fetch(REGISTRY_URL, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });\n if (!res.ok) return;\n const body = (await res.json()) as { \"dist-tags\"?: { latest?: string } };\n const latest = body[\"dist-tags\"]?.latest;\n if (!latest) return;\n const path = statePath();\n if (!existsSync(dirname(path))) mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, JSON.stringify({ last_check_at: new Date().toISOString(), latest }));\n } catch {\n return;\n }\n}\n"],
5
+ "mappings": ";;;;AAAA,SAAS,oBAAoB;AAC7B,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;;;ACFrB,SAAS,cAAc,YAAY,WAAW,qBAAqB;AACnE,SAAS,eAAe;AACxB,SAAS,SAAS,YAAY;AAGvB,IAAM,mBAAmB;AACzB,SAAS,mBAAmB;AAC/B,SAAO,KAAK,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,GAAG,SAAS,GAAG,YAAY,aAAa;AACpG;AAGA,SAAS,eAAe,MAAM;AAC1B,MAAI;AACA,WAAO,KAAK,MAAM,aAAa,MAAM,MAAM,CAAC;AAAA,EAChD,SACO,KAAK;AACR,YAAQ,OAAO,MAAM,0CAA0C,IAAI,KAAK,IAAI,OAAO;AAAA,CAAI;AACvF,WAAO;AAAA,EACX;AACJ;AAGO,SAAS,mBAAmB;AAC/B,QAAM,OAAO,iBAAiB;AAC9B,QAAM,YAAY,WAAW,IAAI,IAAI,eAAe,IAAI,IAAI;AAC5D,SAAO;AAAA,IACH,YAAY;AAAA,IACZ,GAAG;AAAA,IACH,GAAI,QAAQ,IAAI,mBAAmB,EAAE,YAAY,QAAQ,IAAI,iBAAiB,IAAI,CAAC;AAAA,EACvF;AACJ;AASO,SAAS,uBAAuB,OAAO;AAC1C,QAAM,OAAO,iBAAiB;AAC9B,QAAM,UAAU,WAAW,IAAI,IAAK,eAAe,IAAI,KAAK,CAAC,IAAK,CAAC;AACnE,QAAM,SAAS,EAAE,GAAG,SAAS,GAAG,MAAM;AACtC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,QAAI,UAAU;AACV,aAAO,OAAO,GAAG;AAAA,EACzB;AACA,YAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,gBAAc,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AACnD,SAAO;AACX;AAGO,SAAS,kBAAkB,WAAW,QAAQ,IAAI,GAAG;AACxD,MAAI,MAAM;AACV,aAAS;AACL,UAAM,YAAY,KAAK,KAAK,gBAAgB;AAC5C,QAAI,WAAW,SAAS,GAAG;AACvB,YAAM,SAAS,eAAe,SAAS;AACvC,UAAI;AACA,eAAO;AAAA,IACf;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW;AACX,aAAO;AACX,UAAM;AAAA,EACV;AACJ;AACO,SAAS,wBAAwB;AACpC,SAAO,kBAAkB,GAAG,WAAW,iBAAiB,EAAE,kBAAkB,CAAC;AACjF;;;ACtEA,SAAS,YAAY,mBAAmB;AACxC,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,QAAQ,iBAAAC,sBAAqB;AAC3E,SAAS,oBAAoB;AAC7B,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;;;ACJvB,IAAM,WAAN,cAAuB,MAAM;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,QAAQ,MAAM,MAAM;AAC5B,UAAM,GAAG,IAAI,KAAK,MAAM,GAAG;AAC3B,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EAChB;AACJ;;;ACTO,IAAM,qBAAqB;AAClC,eAAsB,iBAAiB,KAAK,OAAO,CAAC,GAAG;AACnD,MAAI;AACA,WAAO,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,YAAY,QAAQ,kBAAkB,EAAE,CAAC;AAAA,EACxF,SACO,KAAK;AACR,QAAI,eAAe,UAAU,IAAI,SAAS,kBAAkB,IAAI,SAAS,eAAe;AACpF,YAAM,IAAI,SAAS,KAAK,WAAW,2BAA2B,qBAAqB,GAAI,GAAG;AAAA,IAC9F;AAGA,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,UAAM,QAAQ,eAAe,SAAS,IAAI,iBAAiB,QAAQ,KAAK,IAAI,MAAM,OAAO,KAAK;AAC9F,UAAM,IAAI,SAAS,GAAG,iBAAiB,GAAG,OAAO,GAAG,KAAK,EAAE;AAAA,EAC/D;AACJ;;;AFLA,SAAS,YAAY;AACjB,SAAOC,MAAK,QAAQ,IAAI,mBAAmBA,MAAKC,SAAQ,GAAG,SAAS,GAAG,UAAU;AACrF;AACA,SAAS,kBAAkB;AACvB,SAAOD,MAAK,UAAU,GAAG,kBAAkB;AAC/C;AACO,SAAS,aAAa,SAAS;AAClC,QAAM,OAAO,gBAAgB;AAC7B,EAAAE,WAAUC,SAAQ,IAAI,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACzD,EAAAC,eAAc,MAAM,KAAK,UAAU,OAAO,IAAI,MAAM,EAAE,MAAM,IAAM,CAAC;AACvE;AACO,SAAS,cAAc;AAC1B,MAAI;AACA,UAAM,SAAS,KAAK,MAAMC,cAAa,gBAAgB,GAAG,MAAM,CAAC;AACjE,QAAI,OAAO,OAAO,kBAAkB,YAChC,OAAO,kBAAkB,MACzB,OAAO,OAAO,iBAAiB,YAC/B,OAAO,OAAO,sBAAsB,UAAU;AAC9C,aAAO;AAAA,QACH,eAAe,OAAO;AAAA,QACtB,cAAc,OAAO;AAAA,QACrB,mBAAmB,OAAO;AAAA,MAC9B;AAAA,IACJ;AACA,WAAO;AAAA,EACX,QACM;AACF,WAAO;AAAA,EACX;AACJ;AACO,SAAS,eAAe;AAC3B,MAAIC,YAAW,gBAAgB,CAAC;AAC5B,WAAO,gBAAgB,CAAC;AAChC;AAIA,SAAS,mBAAmB;AACxB,SAAON,MAAK,UAAU,GAAG,eAAe;AAC5C;AACO,SAAS,kBAAkB,OAAO;AACrC,QAAM,OAAO,iBAAiB;AAC9B,EAAAE,WAAUC,SAAQ,IAAI,GAAG,EAAE,WAAW,MAAM,MAAM,IAAM,CAAC;AACzD,EAAAC,eAAc,MAAM,QAAQ,MAAM,EAAE,MAAM,IAAM,CAAC;AACrD;AACO,SAAS,mBAAmB;AAC/B,MAAI;AACA,UAAM,QAAQC,cAAa,iBAAiB,GAAG,MAAM,EAAE,KAAK;AAC5D,WAAO,UAAU,KAAK,QAAQ;AAAA,EAClC,QACM;AACF,WAAO;AAAA,EACX;AACJ;AACO,SAAS,oBAAoB;AAChC,MAAIC,YAAW,iBAAiB,CAAC;AAC7B,WAAO,iBAAiB,CAAC;AACjC;AAIA,eAAsB,gBAAgB,SAAS;AAC3C,QAAM,MAAM,MAAM,iBAAiB,GAAG,QAAQ,QAAQ,QAAQ,EAAE,CAAC,iBAAiB;AAClF,MAAI,CAAC,IAAI;AACL,UAAM,IAAI,SAAS,IAAI,QAAQ,2BAA2B,MAAM,IAAI,KAAK,CAAC;AAC9E,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,OAAO,KAAK,iBAAiB,YAC7B,OAAO,KAAK,sBAAsB,YAClC,OAAO,KAAK,mBAAmB,YAC/B,CAAC,MAAM,QAAQ,KAAK,aAAa,KACjC,KAAK,cAAc,WAAW,GAAG;AACjC,UAAM,IAAI,SAAS,IAAI,QAAQ,yBAAyB,IAAI;AAAA,EAChE;AACA,SAAO;AAAA,IACH,cAAc,KAAK;AAAA,IACnB,mBAAmB,KAAK;AAAA,IACxB,gBAAgB,KAAK;AAAA,IACrB,eAAe,KAAK,cAAc,IAAI,MAAM;AAAA,EAChD;AACJ;AACA,SAAS,YAAY,MAAM;AACvB,MAAI;AACA,WAAO,KAAK,MAAM,IAAI;AAAA,EAC1B,QACM;AACF,WAAO;AAAA,EACX;AACJ;AAGA,eAAsB,YAAY,aAAa,SAAS,WAAW,MAAM;AACrE,QAAM,MAAM,MAAM,iBAAiB,GAAG,YAAY,QAAQ,QAAQ,EAAE,CAAC,6BAA6B,SAAS,IAAI;AAAA,IAC3G,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,oBAAoB,QAAQ,QAAQ;AAAA,IAC/D,MAAM,KAAK,UAAU,IAAI;AAAA,EAC7B,CAAC;AACD,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,MAAI,CAAC,IAAI,IAAI;AACT,UAAM,IAAI,SAAS,IAAI,QAAQ,cAAc,SAAS,iBAAiB,kBAAkB,YAAY,IAAI,CAAC;AAAA,EAC9G;AACA,QAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,MAAI,OAAO,OAAO,iBAAiB,YAC/B,OAAO,OAAO,kBAAkB,YAChC,OAAO,OAAO,eAAe,UAAU;AACvC,UAAM,IAAI,SAAS,IAAI,QAAQ,mBAAmB,MAAM;AAAA,EAC5D;AACA,SAAO;AAAA,IACH,cAAc,OAAO;AAAA,IACrB,eAAe,OAAO;AAAA,IACtB,YAAY,OAAO;AAAA,EACvB;AACJ;AACA,SAAS,UAAU,KAAK;AACpB,SAAO,IAAI,SAAS,WAAW;AACnC;AAGA,eAAe,aAAa,QAAQ,cAAc;AAC9C,aAAW,aAAa,cAAc;AAClC,UAAM,OAAO,OAAO,IAAI,IAAI,SAAS,EAAE,IAAI;AAC3C,UAAM,QAAQ,MAAM,IAAI,QAAQ,CAAC,YAAY;AACzC,YAAM,UAAU,MAAM;AAClB,eAAO,IAAI,SAAS,OAAO;AAC3B,gBAAQ,KAAK;AAAA,MACjB;AACA,aAAO,KAAK,SAAS,OAAO;AAC5B,aAAO,OAAO,MAAM,aAAa,MAAM;AACnC,eAAO,IAAI,SAAS,OAAO;AAC3B,gBAAQ,IAAI;AAAA,MAChB,CAAC;AAAA,IACL,CAAC;AACD,QAAI;AACA,aAAO;AAAA,EACf;AACA,QAAM,IAAI,MAAM,sCAAsC,aAAa,KAAK,IAAI,CAAC,EAAE;AACnF;AAQA,eAAsB,aAAa,SAAS,aAAa,YAAY,KAAS;AAC1E,QAAM,SAAS,MAAM,gBAAgB,OAAO;AAC5C,QAAM,WAAW,UAAU,YAAY,EAAE,CAAC;AAC1C,QAAM,YAAY,UAAU,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AAC1E,QAAM,QAAQ,UAAU,YAAY,EAAE,CAAC;AACvC,QAAM,OAAO,MAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AAChD,QAAI;AACJ,UAAMC,UAAS,CAAC,YAAY;AACxB,UAAI;AACA,qBAAa,KAAK;AACtB,aAAO,oBAAoB;AAC3B,aAAO,MAAM;AACb,UAAI,UAAU;AACV,gBAAQ,QAAQ,IAAI;AAAA;AAEpB,eAAO,QAAQ,KAAK;AAAA,IAC5B;AACA,UAAM,SAAS,aAAa,CAAC,KAAK,QAAQ;AACtC,YAAM,MAAM,IAAI,IAAI,IAAI,OAAO,KAAK,kBAAkB;AACtD,UAAI,IAAI,WAAW,SAAS,IAAI,aAAa,aAAa,KAAK,IAAI;AAC/D,YAAI,UAAU,GAAG,EAAE,IAAI;AACvB;AAAA,MACJ;AACA,YAAM,UAAU,IAAI,aAAa,IAAI,mBAAmB,KAAK,IAAI,aAAa,IAAI,OAAO;AACzF,YAAM,WAAW,IAAI,aAAa,IAAI,MAAM;AAC5C,UAAI,WAAW,CAAC,UAAU;AACtB,YAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC,EAAE,IAAI,iBAAiB,WAAW,SAAS,EAAE;AAChG,QAAAA,QAAO,EAAE,OAAO,IAAI,MAAM,iBAAiB,WAAW,kBAAkB,EAAE,EAAE,CAAC;AAC7E;AAAA,MACJ;AACA,UACK,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC,EAC/C,IAAI,gDAAgD;AACzD,MAAAA,QAAO,EAAE,MAAM,SAAS,CAAC;AAAA,IAC7B,CAAC;AACD,iBAAa,QAAQ,OAAO,aAAa,EACpC,KAAK,CAAC,iBAAiB;AACxB,cAAQ,WAAW,MAAMA,QAAO,EAAE,OAAO,IAAI,MAAM,iBAAiB,EAAE,CAAC,GAAG,SAAS;AACnF,YAAM,YAAY,IAAI,IAAI,GAAG,OAAO,aAAa,QAAQ,QAAQ,EAAE,CAAC,oBAAoB;AACxF,gBAAU,aAAa,IAAI,YAAY,OAAO,cAAc;AAC5D,gBAAU,aAAa,IAAI,eAAe,GAAG,aAAa,QAAQ,QAAQ,EAAE,CAAC,IAAI,KAAK,EAAE;AACxF,gBAAU,aAAa,IAAI,kBAAkB,SAAS;AACtD,gBAAU,aAAa,IAAI,yBAAyB,MAAM;AAC1D,kBAAY,UAAU,SAAS,CAAC;AAAA,IACpC,CAAC,EACI,MAAM,CAAC,QAAQA,QAAO,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,EAC9C,CAAC;AACD,QAAM,SAAS,MAAM,YAAY,OAAO,cAAc,OAAO,mBAAmB,QAAQ;AAAA,IACpF,WAAW;AAAA,IACX,eAAe;AAAA,EACnB,CAAC;AACD,eAAa;AAAA,IACT,eAAe,OAAO;AAAA,IACtB,cAAc,OAAO;AAAA,IACrB,mBAAmB,OAAO;AAAA,EAC9B,CAAC;AACL;AAGO,SAAS,YAAY,OAAO;AAC/B,QAAM,UAAU,MAAM,MAAM,GAAG,EAAE,CAAC;AAClC,MAAI,CAAC;AACD,WAAO,CAAC;AACZ,MAAI;AACA,WAAO,KAAK,MAAM,OAAO,KAAK,SAAS,WAAW,EAAE,SAAS,MAAM,CAAC;AAAA,EACxE,QACM;AACF,WAAO,CAAC;AAAA,EACZ;AACJ;;;AG1NA,IAAM,QAAQ;AAAA,EACV,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACT;AACO,IAAM,iBAAN,MAAqB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,OAAO,CAAC,GAAG;AACnB,SAAK,WAAW,KAAK,WAAW,iBAAiB,EAAE,YAAY,QAAQ,QAAQ,EAAE;AACjF,SAAK,eAAe,KAAK,gBAAgB,QAAQ,IAAI,uBAAuB,iBAAiB;AAAA,EACjG;AAAA,EACA,MAAM,SAAS;AACX,QAAI,KAAK;AACL,aAAO,KAAK;AAChB,QAAI,KAAK,qBAAqB,KAAK,kBAAkB,YAAY,KAAK,IAAI,IAAI,KAAQ;AAClF,aAAO,KAAK,kBAAkB;AAAA,IAClC;AACA,SAAK,oBAAoB,KAAK,mBAAmB,EAAE,QAAQ,MAAM;AAC7D,WAAK,kBAAkB;AAAA,IAC3B,CAAC;AACD,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA,EAGA,MAAM,qBAAqB;AACvB,UAAM,UAAU,YAAY;AAC5B,QAAI,CAAC;AACD,YAAM,IAAI,SAAS,KAAK,iBAAiB,sBAAsB;AACnE,QAAI;AACJ,QAAI;AACA,eAAS,MAAM,YAAY,QAAQ,cAAc,QAAQ,mBAAmB,iBAAiB;AAAA,QACzF,eAAe,QAAQ;AAAA,MAC3B,CAAC;AAAA,IACL,SACO,KAAK;AACR,UAAI,eAAe;AACf,cAAM,IAAI,SAAS,IAAI,QAAQ,kBAAkB,sBAAsB;AAC3E,YAAM;AAAA,IACV;AACA,iBAAa,EAAE,GAAG,SAAS,eAAe,OAAO,cAAc,CAAC;AAChE,SAAK,oBAAoB;AAAA,MACrB,OAAO,OAAO;AAAA,MACd,WAAW,KAAK,IAAI,IAAI,OAAO,aAAa;AAAA,IAChD;AACA,WAAO,OAAO;AAAA,EAClB;AAAA,EACA,MAAM,iBAAiB;AACnB,UAAM,KAAK,OAAO;AAAA,EACtB;AAAA;AAAA,EAEA,MAAM,eAAe;AACjB,QAAI,KAAK;AACL,aAAO;AACX,UAAM,QAAQ,YAAY,MAAM,KAAK,OAAO,CAAC,EAAE;AAC/C,WAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,EAC/C;AAAA,EACA,MAAM,KAAK,MAAM,MAAM,MAAM;AACzB,UAAM,UAAU;AAAA,MACZ,gBAAgB;AAAA,MAChB,GAAG,KAAK;AAAA,IACZ;AACA,QAAI;AACA,cAAQ,gBAAgB,UAAU,MAAM,KAAK,OAAO,CAAC;AACzD,WAAO,iBAAiB,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,EAC1E;AAAA,EACA,MAAM,QAAQ,MAAM,OAAO,CAAC,GAAG,OAAO,MAAM;AACxC,QAAI,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI;AAG1C,QAAI,IAAI,WAAW,OAAO,QAAQ,CAAC,KAAK,cAAc;AAClD,WAAK,oBAAoB;AACzB,YAAM,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI;AAAA,IAC1C;AACA,WAAO,KAAK,cAAc,GAAG;AAAA,EACjC;AAAA;AAAA,EAEA,MAAM,cAAc,KAAK;AACrB,UAAM,SAAS,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,MAAM,KAAK;AACpE,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI;AACJ,QAAI,SAAS;AACb,QAAI,UAAU,MAAM;AAChB,UAAI;AACA,eAAO,KAAK,MAAM,IAAI;AACtB,iBAAS;AAAA,MACb,QACM;AACF,iBAAS;AAAA,MACb;AAAA,IACJ;AACA,QAAI,CAAC,IAAI,IAAI;AACT,YAAM,SAAS,UAAU,OAAO,SAAS,YAAY,SAAS,OAAO,KAAK,SAAS;AACnF,YAAM,IAAI,SAAS,IAAI,QAAQ,MAAM,IAAI,MAAM,KAAK,SAAS,WAAW,SAAS,OAAO,KAAK;AAAA,IACjG;AACA,QAAI;AACA,aAAQ,SAAS,OAAO,CAAC;AAC7B,WAAO;AAAA,EACX;AAAA,EACA,OAAO,OAAO;AACV,WAAO,KAAK,QAAQ,cAAc,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,KAAK,EAAE,CAAC;AAAA,EACrF;AAAA,EACA,cAAc;AACV,WAAO,KAAK,QAAQ,aAAa;AAAA,EACrC;AAAA,EACA,aAAa,SAAS;AAClB,WAAO,KAAK,QAAQ,eAAe,mBAAmB,OAAO,CAAC,WAAW;AAAA,EAC7E;AAAA,EACA,OAAO,SAAS,SAAS,GAAG;AACxB,WAAO,KAAK,QAAQ,WAAW,mBAAmB,OAAO,CAAC,WAAW,MAAM,EAAE;AAAA,EACjF;AAAA,EACA,aAAa,SAAS,SAAS,MAAM;AACjC,UAAM,OAAO,EAAE,UAAU,SAAS,SAAS,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC,EAAG;AACrE,WAAO,KAAK,QAAQ,cAAc,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,EACpF;AAAA,EACA,aAAa,MAAM;AACf,WAAO,KAAK,QAAQ,eAAe,EAAE,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC;AAAA,EACrF;AAAA,EACA,OAAO,OAAO;AACV,WAAO,KAAK,QAAQ,YAAY,mBAAmB,KAAK,CAAC,EAAE;AAAA,EAC/D;AAAA,EACA,KAAK;AACD,WAAO,KAAK,QAAQ,QAAQ;AAAA,EAChC;AAAA,EACA,cAAc;AACV,WAAO,KAAK,QAAQ,wBAAwB;AAAA,EAChD;AAAA,EACA,WAAW,OAAO;AACd,WAAO,KAAK,QAAQ,kBAAkB,mBAAmB,KAAK,CAAC,YAAY,EAAE,QAAQ,OAAO,CAAC;AAAA,EACjG;AAAA,EACA,YAAY;AACR,WAAO,KAAK,QAAQ,iBAAiB;AAAA,EACzC;AAAA,EACA,UAAU,SAAS,MAAM;AACrB,WAAO,KAAK,QAAQ,mBAAmB;AAAA,MACnC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,SAAS,KAAK,CAAC;AAAA,IAC1C,CAAC;AAAA,EACL;AAAA,EACA,WAAW,SAAS;AAChB,WAAO,KAAK,QAAQ,mBAAmB,mBAAmB,OAAO,CAAC,IAAI,EAAE,QAAQ,SAAS,CAAC;AAAA,EAC9F;AAAA,EACA,UAAU,MAAM,aAAa;AACzB,WAAO,KAAK,QAAQ,oBAAoB;AAAA,MACpC,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,MAAM,eAAe,YAAY,CAAC;AAAA,IAC7D,CAAC;AAAA,EACL;AAAA,EACA,cAAc,UAAU;AACpB,WAAO,KAAK,QAAQ,qBAAqB,mBAAmB,QAAQ,CAAC,YAAY,EAAE,QAAQ,OAAO,CAAC;AAAA,EACvG;AAAA,EACA,UAAU,OAAO,QAAQ;AACrB,WAAO,KAAK,QAAQ,kBAAkB,mBAAmB,KAAK,CAAC,WAAW;AAAA,MACtE,QAAQ;AAAA,MACR,MAAM,KAAK,UAAU,EAAE,OAAO,CAAC;AAAA,IACnC,CAAC;AAAA,EACL;AACJ;;;AC/JO,IAAM,aAAN,cAAyB,MAAM;AAAC;AAEvC,IAAM,aAAa,oBAAI,IAAI;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,UACd,MACA,UAAkC,CAAC,GACnC,SACY;AACZ,QAAM,cAAwB,CAAC;AAC/B,QAAM,QAAkC,CAAC;AACzC,QAAM,QAAQ,oBAAI,IAAY;AAC9B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,GAAG,GAAG;AAC/C,YAAM,OAAO,QAAQ,GAAG,KAAK,IAAI,QAAQ,QAAQ,EAAE;AAGnD,UAAI,WAAW,CAAC,QAAQ,SAAS,IAAI,GAAG;AACtC,cAAM,IAAI,WAAW,gBAAgB,GAAG,+CAA0C;AAAA,MACpF;AACA,UAAI,WAAW,IAAI,IAAI,GAAG;AACxB,cAAM,IAAI,IAAI;AAAA,MAChB,OAAO;AACL,cAAM,QAAQ,KAAK,IAAI,CAAC;AACxB,YAAI,UAAU,UAAa,MAAM,WAAW,GAAG,GAAG;AAChD,gBAAM,IAAI,WAAW,QAAQ,GAAG,mBAAmB;AAAA,QACrD;AACA,SAAC,MAAM,IAAI,MAAM,CAAC,GAAG,KAAK,KAAK;AAC/B;AAAA,MACF;AAAA,IACF,OAAO;AACL,kBAAY,KAAK,GAAG;AAAA,IACtB;AAAA,EACF;AACA,SAAO,EAAE,aAAa,OAAO,MAAM;AACrC;AAEO,SAAS,kBAAkB,QAAoB,OAAe,OAAuB;AAC1F,QAAM,QAAQ,OAAO,YAAY,KAAK;AACtC,MAAI,UAAU,OAAW,OAAM,IAAI,WAAW,KAAK;AACnD,SAAO;AACT;AAEO,SAAS,QACd,QACA,MACA,OACoB;AACpB,QAAM,MAAM,OAAO,MAAM,IAAI,IAAI,CAAC;AAClC,MAAI,QAAQ,OAAW,QAAO;AAC9B,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,CAAC,OAAO,UAAU,KAAK,EAAG,OAAM,IAAI,WAAW,UAAU,IAAI,qBAAqB;AACtF,MAAI,UAAU,QAAQ,MAAM,OAAO,QAAQ,MAAM,MAAM;AACrD,UAAM,IAAI,WAAW,UAAU,IAAI,oBAAoB,MAAM,GAAG,QAAQ,MAAM,GAAG,EAAE;AAAA,EACrF;AACA,SAAO;AACT;AAEO,SAAS,iBACd,QACA,MACA,SACA,OACQ;AACR,QAAM,MAAM,OAAO,MAAM,IAAI,IAAI,CAAC;AAClC,MAAI,QAAQ,UAAa,CAAC,QAAQ,SAAS,GAAG,EAAG,OAAM,IAAI,WAAW,KAAK;AAC3E,SAAO;AACT;;;AClFO,IAAM,OAAO,EAAE,IAAI,GAAG,UAAU,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,EAAE;AAIjF,SAAS,SAAS,KAA2B;AAC3C,QAAM,WAAW,OAAO,QAAQ,IAAI,iBAAiB,EAClD,IAAI,CAAC,CAAC,SAAS,OAAO,MAAM,GAAG,OAAO,IAAI,OAAO,EAAE,EACnD,KAAK,IAAI;AACZ,UAAQ,OAAO,MAAM,YAAY,QAAQ,+BAA4B,IAAI,oBAAoB;AAAA,CAAI;AACjG,UAAQ,OAAO,MAAM,SAAS,IAAI,wBAAwB;AAAA,CAAI;AAC9D,MAAI,IAAI,QAAQ,WAAW,GAAG;AAC5B,YAAQ,OAAO,MAAM,sFAAiF;AAAA,EACxG;AACF;AAEA,SAAS,QAAQ,GAAyB;AACxC,SAAO,EAAE,aAAa,KAAK,UAAK;AAClC;AAEO,SAAS,aAAa,KAA2B;AACtD,WAAS,GAAG;AACZ,aAAW,KAAK,IAAI,SAAS;AAC3B,YAAQ,OAAO;AAAA,MACb;AAAA,EAAK,EAAE,MAAM,QAAQ,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC;AAAA,EAAK,EAAE,UAAU;AAAA,YAAe,EAAE,QAAQ;AAAA;AAAA,IAC7G;AACA,UAAM,UAAU,EAAE,KAAK,SAAS,MAAM,GAAG,EAAE,KAAK,MAAM,GAAG,GAAG,CAAC,WAAM,EAAE;AACrE,YAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,EACrC;AACF;AAEO,SAAS,aAAa,KAA2B;AACtD,WAAS,GAAG;AACZ,aAAW,KAAK,IAAI,SAAS;AAC3B,YAAQ,OAAO;AAAA,MACb,GAAG,EAAE,MAAM,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,OAAO,MAAM,QAAQ,CAAC,CAAC,MAAM,EAAE,UAAU,MAAM,EAAE,QAAQ;AAAA;AAAA,IACrG;AAAA,EACF;AACF;;;ACxCA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAK9B,IAAM,YAAY,EAAE,SAAS,OAAO,MAAM,CAAC,MAAM,2BAA2B,EAAE;AAE9E,IAAM,cAAc;AAAA;AAAA;AAAA;AAQb,SAAS,eAAe,UAA0B;AACvD,QAAM,SAAS,SAAS,MAAM,kDAAkD;AAChF,MAAI,CAAC,UAAU,OAAO,UAAU,QAAW;AACzC,QAAI,SAAS,KAAK,MAAM,GAAI,QAAO;AACnC,UAAM,MAAM,SAAS,SAAS,IAAI,IAAI,OAAO;AAC7C,WAAO,WAAW,MAAM;AAAA,EAC1B;AACA,QAAM,cAAc,OAAO,QAAQ,OAAO,CAAC,EAAE;AAC7C,QAAM,aAAa,SAAS,MAAM,WAAW,EAAE,MAAM,YAAY;AACjE,QAAM,MACJ,cAAc,WAAW,UAAU,SAAY,cAAc,WAAW,QAAQ,SAAS;AAC3F,SAAO,SAAS,MAAM,GAAG,OAAO,KAAK,IAAI,cAAc,SAAS,MAAM,GAAG;AAC3E;AAOA,SAAS,gBAAgB,KAAa;AACpC,SAAO,CAAC,aAAsC;AAC5C,UAAM,UAAW,SAAS,GAAG,KAAiC,CAAC;AAC/D,WAAO,EAAE,GAAG,UAAU,CAAC,GAAG,GAAG,EAAE,GAAG,SAAS,UAAU,UAAU,EAAE;AAAA,EACnE;AACF;AAEA,IAAM,cAA+C;AAAA,EACnD,eAAe,EAAE,MAAMC,MAAKC,SAAQ,GAAG,cAAc,GAAG,OAAO,gBAAgB,YAAY,EAAE;AAAA,EAC7F,QAAQ,EAAE,MAAMD,MAAKC,SAAQ,GAAG,WAAW,UAAU,GAAG,OAAO,gBAAgB,YAAY,EAAE;AAAA,EAC7F,UAAU;AAAA,IACR,MAAMD,MAAKC,SAAQ,GAAG,YAAY,YAAY,iBAAiB;AAAA,IAC/D,OAAO,gBAAgB,YAAY;AAAA,EACrC;AACF;AAEA,IAAM,cAAc,CAAC,GAAG,OAAO,KAAK,WAAW,GAAG,OAAO;AAEzD,SAAS,aAAqB;AAC5B,QAAM,OAAOD,MAAKC,SAAQ,GAAG,UAAU,aAAa;AACpD,QAAM,WAAWC,YAAW,IAAI,IAAIC,cAAa,MAAM,MAAM,IAAI;AACjE,EAAAC,WAAUC,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5C,EAAAC,eAAc,MAAM,eAAe,QAAQ,CAAC;AAC5C,SAAO,OAAO,SAAS,IAAI;AAC7B;AAIA,SAAS,aAAsB;AAC7B,MAAI,QAAQ,IAAI,oBAAqB,QAAO;AAC5C,MAAI;AACF,WAAO,iBAAiB,MAAM,UAAa,YAAY,MAAM;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,OAAO,OAAe,MAAsB;AACnD,UAAQ,OAAO,MAAM,+BAA+B,KAAK,OAAO,IAAI;AAAA,CAAI;AACxE,UAAQ,OAAO,MAAM,WAAW,IAAI,yBAAyB,yCAAyC;AACtG,SAAO;AACT;AAEO,SAAS,SAAS,OAAmC;AAC1D,MAAI,CAAC,SAAS,CAAC,YAAY,SAAS,KAAK,GAAG;AAC1C,YAAQ,OAAO,MAAM,0BAA0B,YAAY,KAAK,GAAG,CAAC;AAAA,CAAK;AACzE,WAAO;AAAA,EACT;AACA,MAAI,UAAU,QAAS,QAAO,WAAW;AACzC,QAAM,SAAS,YAAY,KAAK;AAChC,MAAI,WAAoC,CAAC;AACzC,MAAIJ,YAAW,OAAO,IAAI,GAAG;AAC3B,QAAI;AACF,iBAAW,KAAK,MAAMC,cAAa,OAAO,MAAM,MAAM,CAAC;AAAA,IACzD,SAAS,KAAK;AACZ,cAAQ,OAAO;AAAA,QACb,gBAAgB,OAAO,IAAI,KAAM,IAAc,OAAO;AAAA;AAAA;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,EAAAC,WAAUC,SAAQ,OAAO,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACnD,EAAAC,eAAc,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC;AAC1E,SAAO,OAAO,OAAO,OAAO,IAAI;AAClC;;;ACpGA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxD,SAAS,QAAAC,aAAY;AAGrB,SAAS,cAAiB,MAAiB;AACzC,MAAI;AACF,WAAO,KAAK,MAAMF,cAAa,MAAM,MAAM,CAAC;AAAA,EAC9C,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,gBAAgB,IAAI,KAAM,IAAc,OAAO,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,EACnF;AACF;AAKO,SAAS,sBAAsB,MAAM,QAAQ,IAAI,GAAgB;AACtE,QAAM,OAAoB,CAAC;AAC3B,QAAM,UAAUE,MAAK,KAAK,cAAc;AACxC,MAAIH,YAAW,OAAO,GAAG;AACvB,UAAM,MAAM,cAAyD,OAAO;AAC5E,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,gBAAgB,CAAC,CAAC,GAAG;AAClE,YAAM,QAAQ,MAAM,MAAM,OAAO,IAAI,CAAC;AACtC,WAAK,KAAK,EAAE,QAAQ,KAAK,QAAQ,aAAa,EAAE,GAAG,GAAI,QAAQ,EAAE,SAAS,MAAM,IAAI,CAAC,EAAG,CAAC;AAAA,IAC3F;AAAA,EACF;AACA,QAAM,UAAUG,MAAK,KAAK,kBAAkB;AAC5C,MAAIH,YAAW,OAAO,GAAG;AACvB,eAAW,QAAQC,cAAa,SAAS,MAAM,EAAE,MAAM,IAAI,GAAG;AAC5D,YAAM,IAAI,KAAK,MAAM,iCAAiC;AACtD,UAAI,EAAG,MAAK,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC;AAAA,IAChE;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,UAAkB;AAChC,QAAM,OAAOE,MAAK,QAAQ,IAAI,GAAG,gBAAgB;AACjD,MAAI;AACF,UAAM,UAAU,sBAAsB;AACtC,QAAI,QAAQ,WAAW,GAAG;AACxB,cAAQ,OAAO,MAAM,wDAAwD;AAC7E,aAAO;AAAA,IACT;AACA,UAAM,WAAWH,YAAW,IAAI,IAAI,cAAuC,IAAI,IAAI,CAAC;AACpF,IAAAE,eAAc,MAAM,KAAK,UAAU,EAAE,GAAG,UAAU,QAAQ,GAAG,MAAM,CAAC,CAAC;AACrE,YAAQ,OAAO,MAAM,SAAS,QAAQ,MAAM;AAAA,CAAkC;AAC9E,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,YAAQ,OAAO,MAAM,GAAI,IAAc,OAAO;AAAA,CAAI;AAClD,WAAO;AAAA,EACT;AACF;;;AChCA,SAAS,WAAW,MAAc,KAAa,KAAqB;AAClE,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK;AAC3C,UAAM,IAAI,WAAW,GAAG,IAAI,0BAA0B,GAAG,EAAE;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,IAAM,cAAuC;AAAA,EAClD,WAAW;AAAA,IACT,MAAM;AAAA,IACN,UAAU,sCAAsC,gBAAgB;AAAA,IAChE,OAAO,CAAC,QAAQ;AACd,UAAI,CAAC,qBAAqB,KAAK,GAAG,GAAG;AACnC,cAAM,IAAI,WAAW,6DAA6D;AAAA,MACpF;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,sBAAsB;AAAA,IACpB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO,CAAC,QAAQ,WAAW,sBAAsB,KAAK,CAAC;AAAA,EACzD;AACF;AAIA,IAAM,iBAAiB;AACvB,IAAM,mBAAmB;AACzB,IAAM,QACJ,gEACA,CAAC,GAAG,OAAO,KAAK,WAAW,GAAG,cAAc,EAAE,KAAK,IAAI,IACvD;AAEK,SAAS,UAAU,MAA0B;AAClD,QAAM,CAAC,KAAK,KAAK,IAAI,KAAK;AAC1B,MAAI,QAAQ,QAAW;AACrB,UAAM,WAAW,iBAAiB;AAClC,YAAQ,OAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAAA,CAAI;AAC3D,eAAW,CAAC,MAAME,KAAI,KAAK,OAAO,QAAQ,WAAW,GAAG;AACtD,YAAM,UAAU,SAASA,MAAK,IAAI;AAClC,cAAQ,OAAO,MAAM,GAAG,IAAI,MAAM,YAAY,SAAY,YAAY,KAAK,UAAU,OAAO,CAAC,OAAOA,MAAK,QAAQ;AAAA,CAAI;AAAA,IACvH;AACA,YAAQ,OAAO;AAAA,MACb,GAAG,cAAc,MAAM,iBAAiB,IAAI,UAAU,SAAS;AAAA;AAAA,IACjE;AACA,WAAO,KAAK;AAAA,EACd;AACA,MAAI,QAAQ,gBAAgB;AAC1B,QAAI,KAAK,MAAM,IAAI,OAAO,GAAG;AAC3B,wBAAkB;AAClB,cAAQ,OAAO,MAAM,GAAG,cAAc;AAAA,CAAU;AAChD,aAAO,KAAK;AAAA,IACd;AACA,QAAI,UAAU,QAAW;AAEvB,cAAQ,OAAO,MAAM,GAAG,iBAAiB,IAAI,UAAU,SAAS;AAAA,CAAI;AACpE,aAAO,KAAK;AAAA,IACd;AACA,QAAI,CAAC,iBAAiB,KAAK,KAAK,GAAG;AACjC,YAAM,IAAI,WAAW,sDAAsD;AAAA,IAC7E;AACA,sBAAkB,KAAK;AACvB,YAAQ,OAAO,MAAM,GAAG,cAAc;AAAA,CAAQ;AAC9C,WAAO,KAAK;AAAA,EACd;AACA,QAAM,OAAO,YAAY,GAAG;AAC5B,MAAI,CAAC,KAAM,OAAM,IAAI,WAAW,KAAK;AACrC,MAAI,KAAK,MAAM,IAAI,OAAO,GAAG;AAC3B,2BAAuB,EAAE,CAAC,KAAK,IAAI,GAAG,OAAU,CAAC;AACjD,YAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,CAAU;AACrC,WAAO,KAAK;AAAA,EACd;AACA,MAAI,UAAU,QAAW;AACvB,UAAM,UAAU,iBAAiB,EAAE,KAAK,IAAI;AAC5C,YAAQ,OAAO,MAAM,GAAG,YAAY,SAAY,KAAK,KAAK,UAAU,OAAO,CAAC;AAAA,CAAI;AAChF,WAAO,KAAK;AAAA,EACd;AACA,yBAAuB,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,EAAE,CAAC;AACzD,UAAQ,OAAO,MAAM,GAAG,GAAG,MAAM,KAAK;AAAA,CAAI;AAC1C,SAAO,KAAK;AACd;;;ACrGA,SAAS,iBAAiB;AAC1B,SAAS,oBAAoB;AAG7B,IAAM,WAAW,CAAC,QAAQ,WAAW,sBAAsB;AAC3D,IAAM,UAAU,CAAC,OAAO,WAAW,MAAM,2BAA2B;AAM7D,SAAS,kBAAkB,SAA6C;AAC7E,MAAI;AACJ,MAAI;AACF,WAAO,aAAa,OAAO;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,uBAAuB,KAAK,IAAI,EAAG,QAAO;AAC9C,MAAI,wBAAwB,KAAK,IAAI,EAAG,QAAO;AAC/C,SAAO;AACT;AAOA,SAAS,aAAmB;AAC1B,QAAM,OAAO,UAAU,QAAQ,CAAC,gBAAgB,aAAa,GAAG,EAAE,UAAU,OAAO,CAAC;AACpF,QAAM,UAAU,KAAK,WAAW,IAAI,KAAK,OAAO,KAAK,IAAI;AACzD,MAAI,CAAC,QAAS;AACd,YAAU,OAAO,CAAC,MAAM,SAAS,QAAQ,aAAa,SAAS,GAAG,EAAE,OAAO,UAAU,CAAC;AACxF;AAEO,SAAS,YAAoB;AAClC,QAAM,OAAO,kBAAkB,QAAQ,KAAK,CAAC,KAAK,EAAE;AACpD,MAAI,CAAC,MAAM;AACT,YAAQ,OAAO;AAAA,MACb;AAAA,IAAuE,SAAS,KAAK,GAAG,CAAC;AAAA,IAAO,QAAQ,KAAK,GAAG,CAAC;AAAA;AAAA,IACnH;AACA,WAAO,KAAK;AAAA,EACd;AACA,MAAI,SAAS,OAAQ,YAAW;AAChC,QAAM,MAAM,SAAS,SAAS,WAAW;AACzC,UAAQ,OAAO,MAAM,GAAG,IAAI,KAAK,GAAG,CAAC;AAAA,CAAI;AACzC,QAAM,SAAS,UAAU,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,EAAE,OAAO,UAAU,CAAC;AACnE,MAAI,OAAO,OAAO;AAChB,YAAQ,OAAO,MAAM,kBAAkB,OAAO,MAAM,OAAO;AAAA,CAAI;AAC/D,WAAO,KAAK;AAAA,EACd;AACA,SAAO,OAAO,WAAW,IAAI,KAAK,KAAK,KAAK;AAC9C;;;ACjDO,SAAS,mBAAmB,KAAa,MAAgC;AAC9E,QAAM,QACJ;AACF,QAAM,UAAU,KAAK,MAAM,UAAU,CAAC;AACtC,MAAI,CAAC,QAAS,OAAM,IAAI,WAAW,KAAK;AACxC,QAAM,QAAQ,KAAK,MAAM,QAAQ,CAAC;AAClC,QAAM,MAAM,KAAK,MAAM,MAAM,CAAC;AAC9B,QAAM,OAAO,KAAK,MAAM,OAAO,CAAC;AAChC,QAAM,SAAS,KAAK,MAAM,SAAS,CAAC;AACpC,QAAM,SAAS,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,OAAO,EAAE;AACnD,MAAI,SAAS,EAAG,OAAM,IAAI,WAAW,0CAA0C;AAE/E,QAAM,OAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA,cAAc,EAAE,MAAM,UAAU;AAAA,IAChC,kBAAkB,KAAK,MAAM,WAAW,CAAC;AAAA,IACzC,kBAAkB,KAAK,MAAM,WAAW,CAAC;AAAA,EAC3C;AACA,MAAI,KAAK,MAAM,IAAI,SAAS,EAAG,QAAO;AACtC,MAAI,MAAO,QAAO,EAAE,GAAG,MAAM,cAAc,EAAE,MAAM,SAAS,OAAO,MAAM,EAAE;AAC3E,MAAI,IAAK,QAAO,EAAE,GAAG,MAAM,cAAc,EAAE,MAAM,QAAQ,GAAG,OAAO,EAAE,MAAM,OAAO,SAAS,IAAI,EAAE;AACjG,MAAI,KAAM,QAAO,EAAE,GAAG,MAAM,cAAc,EAAE,MAAM,QAAQ,GAAG,OAAO,EAAE,MAAM,QAAQ,SAAS,KAAK,EAAE;AACpG,MAAI,OAAQ,QAAO,EAAE,GAAG,MAAM,cAAc,EAAE,MAAM,QAAQ,GAAG,OAAO,EAAE,MAAM,UAAU,MAAM,OAAO,EAAE;AACvG,QAAM,IAAI,WAAW,GAAG,KAAK;AAAA,0FAA6F;AAC5H;;;AC5BA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,SAAS,WAAAC,UAAS,QAAAC,aAAY;AAE9B,IAAM,eAAe;AACrB,IAAM,yBAAyB;AAC/B,IAAM,mBAAmB;AAOzB,SAAS,YAAoB;AAC3B,SAAOA,MAAK,QAAQ,IAAI,mBAAmBA,MAAKF,SAAQ,GAAG,SAAS,GAAG,YAAY,mBAAmB;AACxG;AAEA,SAAS,YAAyB;AAChC,MAAI;AACF,WAAO,KAAK,MAAMF,cAAa,UAAU,GAAG,MAAM,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,aAAa,GAAW,GAAoB;AAC1D,QAAM,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AACjC,QAAM,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI,MAAM;AACjC,MAAI,EAAE,KAAK,OAAO,KAAK,KAAK,EAAE,KAAK,OAAO,KAAK,EAAG,QAAO;AACzD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,QAAQ,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK;AACpC,QAAI,SAAS,EAAG,QAAO,OAAO;AAAA,EAChC;AACA,SAAO;AACT;AAIO,SAAS,iBAAiB,SAAuB;AACtD,MAAI,YAAY,SAAS,CAAC,QAAQ,OAAO,MAAO;AAChD,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,MAAI,UAAU,aAAa,QAAQ,OAAO,GAAG;AAC3C,YAAQ,OAAO,MAAM,YAAY,MAAM,2BAA2B,OAAO;AAAA,CAA+B;AAAA,EAC1G;AACF;AAIA,eAAsB,mBAAmB,SAAiB,iBAAyC;AACjG,QAAM,QAAQ,mBAAmB;AACjC,MAAI,UAAU,KAAK,YAAY,SAAS,CAAC,QAAQ,OAAO,MAAO;AAC/D,QAAM,QAAQ,UAAU;AACxB,QAAM,OAAO,MAAM,gBAAgB,KAAK,MAAM,MAAM,aAAa,IAAI;AACrE,MAAI,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAW;AAC3C,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,cAAc,EAAE,QAAQ,YAAY,QAAQ,gBAAgB,EAAE,CAAC;AACvF,QAAI,CAAC,IAAI,GAAI;AACb,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAM,SAAS,KAAK,WAAW,GAAG;AAClC,QAAI,CAAC,OAAQ;AACb,UAAM,OAAO,UAAU;AACvB,QAAI,CAACF,YAAWK,SAAQ,IAAI,CAAC,EAAG,CAAAJ,WAAUI,SAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5E,IAAAF,eAAc,MAAM,KAAK,UAAU,EAAE,gBAAe,oBAAI,KAAK,GAAE,YAAY,GAAG,OAAO,CAAC,CAAC;AAAA,EACzF,QAAQ;AACN;AAAA,EACF;AACF;;;AbvCA,SAAS,YAAY,eAA+C;AAClE,SAAO,CAAC,QAAsB;AAC5B,YAAQ,OAAO,MAAM,GAAG,GAAG;AAAA,CAAI;AAC/B,QAAI,CAAC,eAAe;AAClB,cAAQ,OAAO,MAAM,6EAAwE;AAC7F;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,aAAa,WAAW,SAAS,QAAQ,aAAa,UAAU,UAAU;AAC9F,QAAI;AACF,mBAAa,KAAK,CAAC,GAAG,GAAG,EAAE,OAAO,SAAS,CAAC;AAAA,IAC9C,QAAQ;AACN,cAAQ,OAAO,MAAM,0DAA0D;AAAA,IACjF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,QAA2C;AACnE,UAAQ,UAAU,CAAC,GAAG,IAAI,CAAC,MAAM;AAC/B,UAAM,CAAC,QAAQ,OAAO,IAAI,EAAE,MAAM,GAAG;AACrC,WAAO,UAAU,EAAE,QAAQ,QAAQ,IAAI,EAAE,OAAO;AAAA,EAClD,CAAC;AACH;AAEA,SAAS,YAAY,MAAqC;AACxD,SAAO,KAAK,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,GAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC,EAAG,EAAE;AAC9F;AAKA,IAAM,UAAU,OAA2C,UAAuB;AAElF,IAAM,OAAO,YAAY,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BhC,IAAM,gBAAmD;AAAA,EACvD,SAAS,CAAC;AAAA,EAAG,aAAa,CAAC;AAAA,EAAG,MAAM,CAAC;AAAA,EACrC,OAAO,CAAC,mBAAmB;AAAA,EAAG,QAAQ,CAAC;AAAA,EAAG,OAAO,CAAC;AAAA,EAAG,MAAM,CAAC;AAAA,EAAG,QAAQ,CAAC;AAAA,EACxE,MAAM,CAAC;AAAA,EAAG,UAAU,CAAC;AAAA,EAAG,MAAM,CAAC;AAAA,EAC/B,KAAK,CAAC,MAAM;AAAA,EACZ,QAAQ,CAAC,OAAO;AAAA,EAChB,QAAQ,CAAC;AAAA,EACT,QAAQ,CAAC,UAAU,QAAQ,WAAW,OAAO;AAAA,EAC7C,SAAS,CAAC,KAAK,SAAS,MAAM;AAAA,EAC9B,UAAU,CAAC,MAAM;AAAA,EACjB,KAAK,CAAC,UAAU,MAAM;AAAA,EACtB,QAAQ,CAAC,WAAW,MAAM;AAAA,EAC1B,QAAQ,CAAC,WAAW,WAAW,SAAS,OAAO,QAAQ,UAAU,WAAW,WAAW,OAAO;AAAA,EAC9F,MAAM,CAAC,OAAO;AAAA,EACd,OAAO,CAAC,UAAU,QAAQ,SAAS,MAAM;AAC3C;AAEA,SAAS,cAAc,KAAuB;AAC5C,QAAM,SACJ,OAAO,IAAI,SAAS,WAChB,IAAI,OACJ,IAAI,SAAS,UAAa,IAAI,SAAS,OACrC,KAAK,UAAU,IAAI,IAAI,IACvB;AACR,SAAO,UAAU,IAAI,IAAI,GAAG,SAAS,WAAM,MAAM,KAAK,EAAE;AAC1D;AAIA,eAAe,iBAAiB,QAAyC;AACvE,QAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,QAAM,MAAM,SAAS;AACrB,MAAI;AACF,UAAM,KAAK,MAAM,OAAO,GAAG;AAC3B,WAAO,GAAG,GAAG,KAAK,GAAG,IAAI,IAAI,GAAG,OAAO,IAAI,GAAG,WAAW,YAAY,EAAE,WAAW,GAAG,aAAa;AAAA,EACpG,SAAS,KAAK;AACZ,QAAI,eAAe,YAAY,IAAI,WAAW,KAAK;AACjD,aAAO,GAAG,GAAG;AAAA,IACf;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,YAAY,KAAqB;AACxC,QAAM,QAAQ,CAAC,IAAI,SAAS,WAAW,IAAI,MAAM,KAAK,IAAI,IAAI,YAAY,WAAW,IAAI,SAAS,KAAK,EAAE,EACtG,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,SAAO,GAAG,IAAI,KAAK,GAAG,QAAQ,KAAK,KAAK,KAAK,EAAE;AACjD;AAEA,eAAe,KAAK,MAAiC;AACnD,QAAM,CAAC,SAAS,GAAG,IAAI,IAAI;AAC3B,QAAM,OAAO,UAAU,MAAM,EAAE,MAAM,UAAU,MAAM,IAAI,GAAG,YAAY,SAAY,cAAc,OAAO,IAAI,CAAC,CAAC;AAC/G,QAAM,OAAO,KAAK,MAAM,IAAI,MAAM;AAElC,UAAQ,SAAS;AAAA,IACf,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AACnC,aAAO,KAAK;AAAA,IACd,KAAK,SAAS;AACZ,YAAM,SAAS,CAAC,KAAK,MAAM,IAAI,mBAAmB;AAClD,cAAQ,OAAO,MAAM,SAAS,2CAAsC,cAAc;AAClF,YAAM,aAAa,iBAAiB,EAAE,YAAY,YAAY,MAAM,CAAC;AACrE,cAAQ,OAAO,MAAM,gBAAgB,MAAM,iBAAiB,IAAI,eAAe,CAAC,CAAC;AAAA,CAAI;AACrF,aAAO,KAAK;AAAA,IACd;AAAA,IACA,KAAK;AACH,mBAAa;AACb,cAAQ,OAAO,MAAM,eAAe;AACpC,aAAO,KAAK;AAAA,IACd,KAAK;AACH,aAAO,SAAS,KAAK,YAAY,CAAC,CAAC;AAAA,IACrC,KAAK;AACH,aAAO,QAAQ;AAAA,IACjB,KAAK;AACH,aAAO,UAAU,IAAI;AAAA,IACvB,KAAK;AACH,aAAO,UAAU;AAAA,IACnB,KAAK;AACH,cAAQ,OAAO,MAAM,4DAA4D,KAAK,MAAM,IAAI,MAAM,IAAI,cAAc,KAAK;AAC7H,aAAO,KAAK;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,OAAO,MAAM,IAAI;AACzB,aAAO,KAAK;AAAA,EAChB;AAEA,QAAM,SAAS,IAAI,eAAe;AAClC,MAAI;AACF,YAAQ,SAAS;AAAA,MACf,KAAK,UAAU;AACb,cAAM,MAAM,QAAQ,IAAI,sBACpB,wBACA,iBAAiB,IACf,+BACA,YAAY,IACV,kBACA;AACR,YAAI,CAAC,KAAK;AACR,kBAAQ,OAAO,MAAM,6CAAwC;AAC7D,iBAAO,KAAK;AAAA,QACd;AACA,gBAAQ,OAAO,MAAM,GAAG,MAAM,iBAAiB,MAAM,CAAC,SAAS,GAAG;AAAA,CAAI;AACtE,eAAO,KAAK;AAAA,MACd;AAAA,MACA,KAAK,UAAU;AACb,cAAM,QAAQ,KAAK,YAAY,CAAC;AAChC,YAAI,CAAC,OAAO;AACV,kBAAQ,OAAO,MAAM,2DAA2D;AAChF,iBAAO,KAAK;AAAA,QACd;AACA,cAAM,WAAW,iBAAiB,KAAK,MAAM,MAAM;AACnD,cAAM,UAAU,SAAS,SAAS,IAAI,WAAW,sBAAsB;AACvE,YAAI,QAAQ,WAAW,GAAG;AAGxB,gBAAM,YAAYI,YAAWC,MAAK,QAAQ,IAAI,GAAG,cAAc,CAAC,KAAKD,YAAWC,MAAK,QAAQ,IAAI,GAAG,kBAAkB,CAAC;AACvH,kBAAQ,OAAO;AAAA,YACb,kJAIG,YAAY,4EAA4E;AAAA,UAC7F;AACA,iBAAO,KAAK;AAAA,QACd;AACA,cAAM,MAAM,MAAM,OAAO,OAAO,EAAE,OAAO,SAAS,YAAY,OAAO,GAAG,OAAO,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC;AACxG,YAAI,KAAM,SAAQ,OAAO,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AAAA,iBACzD,KAAK,MAAM,IAAI,SAAS,EAAG,cAAa,GAAG;AAAA,YAC/C,cAAa,GAAG;AACrB,eAAO,KAAK;AAAA,MACd;AAAA,MACA,KAAK,WAAW;AACd,cAAM,SAAS,KAAK,MAAM,IAAI,CAAC,GAAG,YAAY;AAC9C,cAAM,WAAW,MAAM,OAAO,YAAY,GAAG;AAAA,UAC3C,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,YAAY,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,YAAY,EAAE,SAAS,MAAM;AAAA,QACxG;AACA,YAAI,MAAM;AACR,kBAAQ,OAAO,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,IAAI;AAAA,QAC9D,WAAW,KAAK,MAAM,IAAI,OAAO,GAAG;AAClC,qBAAW,KAAK,QAAS,SAAQ,OAAO,MAAM,GAAG,EAAE,OAAO;AAAA,CAAI;AAAA,QAChE,OAAO;AACL,qBAAW,KAAK,SAAS;AACvB,kBAAM,WAAW,EAAE,SAAS,SAAS,IAAI,EAAE,SAAS,KAAK,IAAI,IAAI;AACjE,oBAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,KAAK,QAAQ,KAAK,EAAE,QAAQ;AAAA,CAAI;AAAA,UACnE;AAAA,QACF;AACA,eAAO,KAAK;AAAA,MACd;AAAA,MACA,KAAK,YAAY;AACf,cAAM,UAAU,kBAAkB,MAAM,GAAG,6CAA6C;AACxF,cAAM,MAAM,MAAM,OAAO,aAAa,OAAO;AAC7C,YAAI,MAAM;AACR,kBAAQ,OAAO,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AACxD,iBAAO,KAAK;AAAA,QACd;AACA,mBAAW,KAAK,IAAI,UAAU;AAC5B,kBAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,GAAG,EAAE,YAAY,IAAI,SAAS,aAAa,EAAE,KAAK,EAAE,WAAW;AAAA,CAAW;AAAA,QAC7G;AACA,eAAO,KAAK;AAAA,MACd;AAAA,MACA,KAAK,OAAO;AACV,cAAM,UAAU,kBAAkB,MAAM,GAAG,sDAAsD;AACjG,cAAM,SAAS,QAAQ,MAAM,UAAU,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC,KAAK;AAC9D,cAAM,MAAM,MAAM,OAAO,OAAO,SAAS,MAAM;AAC/C,YAAI,MAAM;AACR,kBAAQ,OAAO,MAAM,KAAK,UAAU,KAAK,MAAM,CAAC,IAAI,IAAI;AACxD,iBAAO,KAAK;AAAA,QACd;AACA,gBAAQ,OAAO,MAAM,GAAG,IAAI,OAAO,IAAI,IAAI,OAAO,KAAK,IAAI,aAAa,KAAK,UAAK,CAAC;AAAA,EAAK,IAAI,UAAU;AAAA,CAAI;AAC1G,gBAAQ,OAAO,MAAM,IAAI,OAAO,IAAI;AACpC,eAAO,KAAK;AAAA,MACd;AAAA,MACA,KAAK,UAAU;AACb,cAAM,QAAQ;AACd,cAAM,UAAU,kBAAkB,MAAM,GAAG,KAAK;AAChD,cAAM,UAAU,iBAAiB,MAAM,WAAW,CAAC,WAAW,aAAa,UAAU,GAAG,KAAK;AAC7F,cAAM,OAAO,aAAa,SAAS,SAAiD,KAAK,MAAM,OAAO,CAAC,CAAC;AACxG,gBAAQ,OAAO,MAAM,aAAa;AAClC,eAAO,KAAK;AAAA,MACd;AAAA,MACA,KAAK,UAAU;AACb,cAAM,MAAM,kBAAkB,MAAM,GAAG,uFAAuF;AAC9H,cAAM,MAAM,MAAM,OAAO,aAAa,mBAAmB,KAAK,IAAI,CAAC;AACnE,gBAAQ,OAAO,MAAM,QAAQ,IAAI,MAAM;AAAA,CAAI;AAC3C,YAAI,KAAK,MAAM,IAAI,OAAO,EAAG,QAAO,SAAS,QAAQ,IAAI,MAAM;AAC/D,eAAO,KAAK;AAAA,MACd;AAAA,MACA,KAAK,QAAQ;AACX,cAAM,QAAQ,kBAAkB,MAAM,GAAG,yCAAyC;AAClF,eAAO,KAAK,MAAM,IAAI,OAAO,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,QAAQ,KAAK;AAAA,MACnF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QACJ;AACF,cAAM,CAAC,QAAQ,KAAK,IAAI,KAAK;AAC7B,YAAI,WAAW,SAAS;AACtB,gBAAM,QAAQ,QAAQ,MAAM,SAAS,EAAE,KAAK,GAAG,KAAK,IAAU,CAAC;AAC/D,cAAI,CAAC,SAAS,UAAU,OAAW,OAAM,IAAI,WAAW,KAAK;AAC7D,gBAAM,SAAS,MAAM,OAAO,UAAU,OAAO,KAAK;AAElD,kBAAQ,OAAO,MAAM,SAAS,OAAO,EAAE,KAAK,OAAO,IAAI,WAAW,OAAO,aAAa;AAAA,CAAmC;AACzH,kBAAQ,OAAO,MAAM,GAAG,OAAO,KAAK;AAAA,CAAI;AACxC,iBAAO,KAAK;AAAA,QACd;AACA,YAAI,WAAW,WAAW;AACxB,cAAI,CAAC,MAAO,OAAM,IAAI,WAAW,KAAK;AACtC,kBAAQ,OAAO,MAAM,GAAG,YAAY,MAAM,OAAO,cAAc,KAAK,CAAC,CAAC;AAAA,CAAI;AAC1E,iBAAO,KAAK;AAAA,QACd;AACA,YAAI,WAAW,SAAS;AACtB,gBAAM,QAAQ,MAAM,OAAO,UAAU;AACrC,cAAI,KAAM,SAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,IAAI;AAAA,cAC/D,YAAW,KAAK,MAAO,SAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,KAAK,EAAE,MAAM,KAAK,EAAE,IAAI,QAAQ,EAAE,UAAU;AAAA,CAAI;AAC7G,iBAAO,KAAK;AAAA,QACd;AACA,YAAI,WAAW,SAAS;AACtB,gBAAM,OAAO,KAAK,MAAM,OAAO,CAAC;AAChC,cAAI,CAAC,SAAS,CAAC,KAAM,OAAM,IAAI,WAAW,KAAK;AAC/C,gBAAM,UAAU,MAAM,OAAO,UAAU,OAAO,IAAI;AAClD,kBAAQ,OAAO,MAAM,GAAG,QAAQ,OAAO,KAAK,QAAQ,MAAM,KAAK,QAAQ,IAAI;AAAA,CAAI;AAC/E,iBAAO,KAAK;AAAA,QACd;AACA,YAAI,WAAW,UAAU;AACvB,cAAI,CAAC,MAAO,OAAM,IAAI,WAAW,KAAK;AACtC,gBAAM,UAAU,MAAM,OAAO,WAAW,KAAK;AAC7C,kBAAQ,OAAO,MAAM,GAAG,QAAQ,OAAO,KAAK,QAAQ,MAAM;AAAA,CAAI;AAC9D,iBAAO,KAAK;AAAA,QACd;AACA,YAAI,WAAW,SAAS;AACtB,gBAAM,QAAQ,MAAM,OAAO,YAAY;AACvC,cAAI,KAAM,SAAQ,OAAO,MAAM,KAAK,UAAU,OAAO,MAAM,CAAC,IAAI,IAAI;AAAA,mBAC3D,MAAM,WAAW,EAAG,SAAQ,OAAO,MAAM,yBAAyB;AAAA,cACtE,YAAW,OAAO,MAAO,SAAQ,OAAO,MAAM,GAAG,IAAI,EAAE,KAAK,YAAY,GAAG,CAAC;AAAA,CAAI;AACrF,iBAAO,KAAK;AAAA,QACd;AACA,YAAI,CAAC,MAAO,OAAM,IAAI,WAAW,KAAK;AACtC,YAAI,WAAW,WAAW;AACxB,kBAAQ,OAAO,MAAM,GAAG,YAAY,MAAM,OAAO,WAAW,KAAK,CAAC,CAAC;AAAA,CAAI;AACvE,iBAAO,KAAK;AAAA,QACd;AACA,YAAI,WAAW,UAAU;AACvB,gBAAM,SAAS,KAAK,MAAM,SAAS,CAAC;AACpC,cAAI,CAAC,OAAQ,OAAM,IAAI,WAAW,KAAK;AACvC,kBAAQ,OAAO,MAAM,GAAG,YAAY,MAAM,OAAO,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAC9E,iBAAO,KAAK;AAAA,QACd;AACA,cAAM,IAAI,WAAW,KAAK;AAAA,MAC5B;AAAA,MACA;AACE,gBAAQ,OAAO,MAAM,oBAAoB,OAAO;AAAA,EAAK,IAAI,EAAE;AAC3D,eAAO,KAAK;AAAA,IAChB;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,eAAe,UAAU;AAC3B,cAAQ,OAAO,MAAM,GAAG,cAAc,GAAG,CAAC;AAAA,CAAI;AAC9C,UAAI,IAAI,WAAW,IAAK,QAAO,KAAK;AACpC,UAAI,IAAI,WAAW,IAAK,QAAO,KAAK;AACpC,UAAI,IAAI,WAAW,IAAK,QAAO,KAAK;AACpC,UAAI,IAAI,WAAW,IAAK,QAAO,KAAK;AACpC,aAAO,KAAK;AAAA,IACd;AACA,UAAM;AAAA,EACR;AACF;AAEA,IAAM,kBAAkB,CAAC,YAAY,QAAQ,YAAY,UAAU,gBAAgB;AACnF,IAAM,gBAAgB,CAAC,YAAY,QAAQ;AAE3C,eAAe,SAAS,QAAwB,OAAgC;AAC9E,QAAM,MAAM,MAAM,OAAO,OAAO,KAAK;AACrC,UAAQ,OAAO,MAAM,GAAG,YAAY,GAAG,CAAC;AAAA,CAAI;AAC5C,SAAO,cAAc,SAAS,IAAI,KAAK,IAAI,KAAK,WAAW,KAAK;AAClE;AAEA,IAAM,gBAAgB;AACtB,IAAM,uBAAuB;AAC7B,IAAM,oBAAoB,KAAK;AAE/B,SAAS,MAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAC7C;AAEA,eAAe,SAAS,QAAwB,OAAgC;AAC9E,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,MAAI,UAAU;AACd,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,OAAO,KAAK;AACrC,cAAQ,OAAO,MAAM,GAAG,YAAY,GAAG,CAAC;AAAA,CAAI;AAC5C,UAAI,gBAAgB,SAAS,IAAI,KAAK,GAAG;AACvC,YAAI,IAAI,UAAU,kBAAkB;AAClC,kBAAQ,OAAO,MAAM,iDAAiD;AAAA,QACxE;AACA,eAAO,cAAc,SAAS,IAAI,KAAK,IAAI,KAAK,WAAW,KAAK;AAAA,MAClE;AACA,gBAAU;AACV,YAAM,MAAM,aAAa;AAAA,IAC3B,SAAS,KAAK;AAGZ,UAAI,eAAe,YAAY,CAAC,KAAK,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM,EAAG,OAAM;AAC3E,YAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,cAAQ,OAAO,MAAM,gBAAgB,MAAM,kBAAkB,UAAU,GAAI;AAAA,CAAK;AAChF,YAAM,MAAM,OAAO;AACnB,gBAAU,KAAK,IAAI,UAAU,GAAG,oBAAoB;AAAA,IACtD;AAAA,EACF;AACA,UAAQ,OAAO;AAAA,IACb,2FAA2F,KAAK;AAAA;AAAA,EAClG;AACA,SAAO,KAAK;AACd;AAEA,iBAAiB,OAAO;AACxB,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EACvB,KAAK,OAAO,SAAS;AACpB,QAAM,mBAAmB,SAAS,iBAAiB,EAAE,gBAAgB;AACrE,UAAQ,KAAK,IAAI;AACnB,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,MAAI,eAAe,YAAY;AAC7B,YAAQ,OAAO,MAAM,GAAG,IAAI,OAAO;AAAA,CAAI;AACvC,YAAQ,KAAK,KAAK,QAAQ;AAAA,EAC5B;AACA,UAAQ,OAAO,MAAM,UAAW,IAAc,OAAO;AAAA,CAAI;AACzD,UAAQ,KAAK,KAAK,QAAQ;AAC5B,CAAC;",
6
6
  "names": ["existsSync", "join", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "dirname", "join", "join", "homedir", "mkdirSync", "dirname", "writeFileSync", "readFileSync", "existsSync", "finish", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "dirname", "join", "join", "homedir", "existsSync", "readFileSync", "mkdirSync", "dirname", "writeFileSync", "existsSync", "readFileSync", "writeFileSync", "join", "spec", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "homedir", "dirname", "join", "existsSync", "join"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@monadeo.com/grimoire-cli",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "type": "module",
5
5
  "license": "Apache-2.0",
6
6
  "bin": {
@@ -12,7 +12,7 @@
12
12
  "devDependencies": {
13
13
  "@types/node": "^26.1.0",
14
14
  "esbuild": "^0.28.1",
15
- "@monadeo.com/grimoire-core": "0.4.0"
15
+ "@monadeo.com/grimoire-core": "0.4.2"
16
16
  },
17
17
  "description": "Grimoire CLI — version-correct documentation retrieval for AI coding agents",
18
18
  "homepage": "https://grimoire.monadeo.com",